@x-otto/cli 0.0.1-alpha.43 → 0.0.1-alpha.44
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-D_JURZdd.js +3 -0
- package/dist/build-id-D_JURZdd.js.map +1 -0
- package/dist/bundled-extensions/plugin-otto-wire-protocols/plugin-dist/meta.json +1 -1
- package/dist/bundled-extensions/plugin-otto-wire-protocols/plugin-dist/plugin.cjs +2 -1
- package/dist/bundled-extensions/plugin-otto-wire-protocols/src/openai-responses.ts +5 -1
- package/dist/{command-dispatcher-DhcLUPR5.js → command-dispatcher-Dxj41r5P.js} +4 -4
- package/dist/{command-dispatcher-DhcLUPR5.js.map → command-dispatcher-Dxj41r5P.js.map} +1 -1
- package/dist/{daemon-base-Bc9p51Um.js → daemon-base-Y1XI61JY.js} +1 -1
- package/dist/{daemon-base-Bc9p51Um.js.map → daemon-base-Y1XI61JY.js.map} +1 -1
- package/dist/{doctor-lT2QhG2q.js → doctor-DXBLkbkP.js} +9 -9
- package/dist/doctor-DXBLkbkP.js.map +1 -0
- package/dist/{doctor-attach-_zeIJewx.js → doctor-attach-DEMuyBOk.js} +2 -2
- package/dist/{doctor-attach-_zeIJewx.js.map → doctor-attach-DEMuyBOk.js.map} +1 -1
- package/dist/{doctor-cdp-K_mIFRfA.js → doctor-cdp-CnJUVNOB.js} +1 -1
- package/dist/{doctor-cdp-K_mIFRfA.js.map → doctor-cdp-CnJUVNOB.js.map} +1 -1
- package/dist/{doctor-heap-Rr2nNvcw.js → doctor-heap-Eu3LZj-F.js} +2 -2
- package/dist/{doctor-heap-Rr2nNvcw.js.map → doctor-heap-Eu3LZj-F.js.map} +1 -1
- package/dist/{doctor-ps-OL3FGQYu.js → doctor-ps-JBgCH77n.js} +2 -2
- package/dist/{doctor-ps-OL3FGQYu.js.map → doctor-ps-JBgCH77n.js.map} +1 -1
- package/dist/export-trajectory-D-BcH0Wt.js +14 -0
- package/dist/export-trajectory-D-BcH0Wt.js.map +1 -0
- package/dist/{feedback-BQ_oz5nh.js → feedback-CYFY2MC4.js} +2 -2
- package/dist/{feedback-BQ_oz5nh.js.map → feedback-CYFY2MC4.js.map} +1 -1
- package/dist/feedback-D7Po4mlE.js +2 -0
- package/dist/{feishu-setup-B6ETf-8Y.js → feishu-setup-5ZoxtH0J.js} +1 -1
- package/dist/{feishu-setup-B6ETf-8Y.js.map → feishu-setup-5ZoxtH0J.js.map} +1 -1
- package/dist/{ftue-doctor-recovery-DeAf8jVo.js → ftue-doctor-recovery-8FeDBFOc.js} +1 -1
- package/dist/{ftue-doctor-recovery-DeAf8jVo.js.map → ftue-doctor-recovery-8FeDBFOc.js.map} +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/{mcp-9P_AmnDk.js → mcp-Cm4-OhXI.js} +1 -1
- package/dist/{mcp-9P_AmnDk.js.map → mcp-Cm4-OhXI.js.map} +1 -1
- package/dist/{mcp-server-BK4L-YBN.js → mcp-server-Dpza3yn2.js} +1 -1
- package/dist/{mcp-server-BK4L-YBN.js.map → mcp-server-Dpza3yn2.js.map} +1 -1
- package/dist/{migrate-DDNkik_0.js → migrate-RlBJqJnB.js} +1 -1
- package/dist/{migrate-DDNkik_0.js.map → migrate-RlBJqJnB.js.map} +1 -1
- package/dist/{observe-CzIv09hO.js → observe-Dxfud-t7.js} +1 -1
- package/dist/{observe-CzIv09hO.js.map → observe-Dxfud-t7.js.map} +1 -1
- package/dist/parse-cli-BSJEQtBo.js +3 -0
- package/dist/parse-cli-BSJEQtBo.js.map +1 -0
- package/dist/{persistence-DOaizHMA.js → persistence-CRFhOYx6.js} +2 -2
- package/dist/{persistence-DOaizHMA.js.map → persistence-CRFhOYx6.js.map} +1 -1
- package/dist/{plugin-assembly-check-Ov17ra7G.js → plugin-assembly-check-DEozmcJ7.js} +1 -1
- package/dist/{plugin-assembly-check-Ov17ra7G.js.map → plugin-assembly-check-DEozmcJ7.js.map} +1 -1
- package/dist/{ps-BovE9XMQ.js → ps-DiKCLKbs.js} +1 -1
- package/dist/{ps-BovE9XMQ.js.map → ps-DiKCLKbs.js.map} +1 -1
- package/dist/{run-attach-z7YECztf.js → run-attach-DDpMk2_N.js} +1 -1
- package/dist/{run-attach-z7YECztf.js.map → run-attach-DDpMk2_N.js.map} +1 -1
- package/dist/{serve-DaxogAZ5.js → serve-Ke0nwN9Y.js} +2 -2
- package/dist/{serve-DaxogAZ5.js.map → serve-Ke0nwN9Y.js.map} +1 -1
- package/dist/{version-Eh8zZKgk.js → version-BKPdYoHG.js} +2 -2
- package/dist/{version-Eh8zZKgk.js.map → version-BKPdYoHG.js.map} +1 -1
- package/package.json +12 -12
- package/dist/build-id-ClyMIKLy.js +0 -3
- package/dist/build-id-ClyMIKLy.js.map +0 -1
- package/dist/doctor-lT2QhG2q.js.map +0 -1
- package/dist/feedback-C2Hdxp1y.js +0 -2
- package/dist/parse-cli-3fWEIMWc.js +0 -3
- package/dist/parse-cli-3fWEIMWc.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-id-D_JURZdd.js","names":[],"sources":["../src/build-id.ts"],"sourcesContent":["// auto-generated by scripts/gen-build-id.mjs — DO NOT EDIT\nexport const BUILD_ID = 5104\nexport const BUILD_BRANCH = 'dev'\nexport const BUILD_HASH = 'e2879c422'\n"],"mappings":";AACA,MAAa,EAAW,KAEX,EAAa"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"apiVersion":1,"compilerVersion":"0.1.0-alpha.6","sourceHash":"
|
|
1
|
+
{"apiVersion":1,"compilerVersion":"0.1.0-alpha.6","sourceHash":"28b4f7c10707642654e4b86f54be95e11a6544869c1be666c36bf9beb7b40133"}
|
|
@@ -17619,7 +17619,8 @@ function dispatchResponsesSSEEvent(type, data, state) {
|
|
|
17619
17619
|
}
|
|
17620
17620
|
const hasTool = [...state.blocks.values()].some((b3) => b3.kind === "tool_call");
|
|
17621
17621
|
if (type === "response.incomplete") {
|
|
17622
|
-
|
|
17622
|
+
const reason = response?.incomplete_details?.reason;
|
|
17623
|
+
state.stopReason = reason === "content_filter" ? "refusal" : "max_tokens";
|
|
17623
17624
|
} else {
|
|
17624
17625
|
state.stopReason = hasTool ? "tool_use" : "end_turn";
|
|
17625
17626
|
}
|
|
@@ -318,7 +318,11 @@ function dispatchResponsesSSEEvent(
|
|
|
318
318
|
}
|
|
319
319
|
const hasTool = [...state.blocks.values()].some((b) => b.kind === 'tool_call')
|
|
320
320
|
if (type === 'response.incomplete') {
|
|
321
|
-
|
|
321
|
+
// 08-14 review A1:不再无条件映射 max_tokens——读 incomplete_details.reason 区分截断根因。
|
|
322
|
+
// OpenAI Responses 的 incomplete 可能因 max_output_tokens(真截断,走引擎续写/升档路径)
|
|
323
|
+
// 或 content_filter(内容过滤,应映射 refusal 让引擎干净终止,而非误走"触顶重试"白烧一轮)。
|
|
324
|
+
const reason = (response?.incomplete_details as Record<string, unknown> | undefined)?.reason
|
|
325
|
+
state.stopReason = reason === 'content_filter' ? 'refusal' : 'max_tokens'
|
|
322
326
|
} else {
|
|
323
327
|
state.stopReason = hasTool ? 'tool_use' : 'end_turn'
|
|
324
328
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{t as e}from"./build-id-
|
|
2
|
+
import{t as e}from"./build-id-D_JURZdd.js";import{t}from"./version-BKPdYoHG.js";import{t as n}from"./discover-with-bundled-CF8qFP41.js";import{n as r,r as i,t as a}from"./service-client-Cr4sxDVM.js";import{n as o}from"./extension-DVEml5IN.js";import{t as s}from"./proxy-evg7ZvoD.js";import{i as c}from"./install-DlVJRHRT.js";import{n as l,t as u}from"./registry-BdCcwyGy.js";import{n as d,t as f}from"./feedback-CYFY2MC4.js";import{createRequire as p}from"node:module";import{arch as m,cpus as h,freemem as g,homedir as _,platform as v,release as ee,totalmem as y}from"node:os";import{execFile as b,execSync as te,spawn as x,spawnSync as S}from"node:child_process";import{DEFAULT_WORKSPACE_KEY as ne,INDUCTOR_PLUGIN_ID as C,InstallManager as w,PLUGIN_MANIFEST_FILENAME as T,POINT as re,buildExtensionContext as ie,checkUpgrades as ae,collectPluginPerfMetrics as oe,defaultPostInstallExecutor as se,detectProjectConfigGating as ce,discoverFileCommands as le,discoverPlugins as ue,dispatch as de,evaluateClaudeTrust as fe,evaluatePluginTrust as pe,findWorkspaceRoot as me,getLastAssistantText as E,grantPluginCapabilities as he,installPluginFromPackage as ge,openTarget as _e,parsePluginManifest as ve,readHighRiskCapabilities as ye,readPluginLogTail as be,readSkillLoopStatus as xe,recordPluginInstalled as Se,recordPluginUninstalled as Ce,resolveActions as we,resolvePackageDir as Te,resolveSessionTitle as Ee,runPluginScript as De,scanInstalledVersions as Oe,trustPlugin as ke,trustProject as Ae,uninstall as je,untrustPlugin as Me,untrustProject as Ne}from"@x-otto/coding";import{checkShellCommand as Pe,openBrowser as Fe,readFileCapped as Ie}from"@x-otto/shared";import{BUILD_ID as Le,OTTO_HOME as Re,SDK_VERSION as ze}from"@x-otto/env";import{dirname as D,join as O,relative as Be,resolve as Ve}from"node:path";import{closeSync as He,existsSync as k,openSync as Ue,readFileSync as We,readSync as Ge,readdirSync as Ke,statSync as qe}from"node:fs";import{FIGURES as A,buildTurnSummary as Je,createBuiltinThemeRegistry as Ye,createReducerState as Xe,deriveTurnBoundaries as Ze,detectLanguage as Qe,formatProviderUsageLimitTypeFull as $e,i18next as j,initI18n as et,insertTurnSummaries as tt,reduceToTui as nt}from"@x-otto/tui";import{createBuiltinCommands as rt}from"@x-otto/tui/compat";import{MaxToolTurnsError as it,PromptBudgetExceededError as at}from"@x-otto/agent";import{readFile as ot,readdir as st,stat as ct,unlink as lt}from"node:fs/promises";import{DEFAULT_COMPACTION_CONFIG as ut,DEFAULT_PRUNE_CONFIG as dt,estimateTokens as ft,resolveContextSize as pt}from"@x-otto/memory";import{classifyAuthErrorType as mt,computeCacheHitRatio as ht,createModelUsabilityGate as M,getProviderDescriptor as gt,getToolCallsByAssistantMessage as _t,isAuthError as vt}from"@x-otto/ai";import{promisify as yt}from"node:util";import{parseCron as bt}from"@x-otto/schedule";var xt=Object.defineProperty,St=(e,t)=>{let n={};for(var r in e)xt(n,r,{get:e[r],enumerable:!0});return t||xt(n,Symbol.toStringTag,{value:`Module`}),n},Ct=p(import.meta.url);function wt(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 Tt(e,t){let n=E(e.session.messages())||t.partialText,r=wt(t);return n?`${n}\n${r}`:r}function Et(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 Dt(e,t){let n=E(e.session.messages())||t.partialText,r=Et(t);return n?`${n}\n${r}`:r}async function Ot(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 it||t instanceof at){let n=t instanceof at,r=n?Et(t):wt(t);o?.(n?`budget-exceeded`:`max-tool-turns`,r);let l=o?E(e.session.messages())||t.partialText:n?Dt(e,t):Tt(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 kt(e,t){try{await e.prompt(t)}catch(t){if(t instanceof it)return{sessionId:e.id,status:`max_turns`,messageCount:e.session.messages().length,response:E(e.session.messages())||t.partialText};if(t instanceof at)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 At=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=rt()}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=Pe(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=te(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 Ot(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 Ot(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 jt(){return Qe()}function Mt(e=`auto`){let t=e===`auto`?Qe():e;return et(t),t}const Nt=`@x-otto/cli`;async function Pt(e){let t=process.env.OTTO_UPGRADE_MOCK;if(t){let n=t===`force`,r=/^\d+\.\d+\.\d+/.test(t)?t:n?`2.0.0`:`0.2.0`;return{latest:r,current:e,newer:N(r,Ft(e))>0}}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)=>N(t,e)>0?t:e):Object.values(i).reduce((e,t)=>e===null||N(t,e)>0?t:e,null);return o?{latest:o,current:e,newer:N(o,Ft(e))>0}:null}catch{return null}}function Ft(e){let t=/^v?\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?/.exec(e.trim());return t?t[0]:e}function It(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 N(e,t){let n=It(e),r=It(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 Lt(e){return new Promise(t=>{try{let n=x(process.platform===`win32`?`npm.cmd`:`npm`,[`install`,`-g`,e?`${Nt}@${e}`:`${Nt}@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 Rt(e){return e?Date.now()-e>216e5:!0}async function zt(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||!Rt(e.lastCheck)?null:Pt(e.currentVersion).then(async t=>t&&(e.persistLastCheck().catch(()=>{}),t.newer)?{...t,forced:!1}:null).catch(()=>null)}let P,Bt;function Vt(e){let t=e.map(e=>e.name).sort().join(`,`);if(P!==void 0&&Bt===t)return P;let n=e=>typeof e==`function`?`[fn]`:typeof e==`string`?e:``;return P=ft(JSON.stringify(e.map(e=>({name:e.name,description:n(e.description),parameters:e.parameters})))),Bt=t,P}let F,Ht;function Ut(e){return F!==void 0&&Ht===e?F:(F=ft(e),Ht=e,F)}function Wt(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=Ut(t)+Vt(n),h=a+o+r+i+p,g=Math.max(0,h-m),_=Math.max(0,s-m-g),v=pt(dt.trigger,s),ee=pt(ut.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 Gt={openai:`OpenAI`};function Kt(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 Jt(e,t,n){let r=t===void 0?void 0:{code:t},i=r!==void 0&&vt(r),a=i&&mt(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 I(e){return e?e.toLowerCase()===`xhigh`?`XHigh`:e.charAt(0).toUpperCase()+e.slice(1):``}function Yt(e,t,n){return e?`${t.on} ${n.on}`:`${t.off} ${n.off}`}function L(e,t,n){if(!t)return`(no model)`;let r=I(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 Xt(e,t){let n=[...le(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 Zt(e){return{id:e.id,type:`function`,function:{name:e.name,arguments:JSON.stringify(e.arguments)}}}function Qt(e){return{type:`thinking`,thinking:e.text}}function $t(e){return{type:`text`,text:e.text}}function en(e){return{type:`a2ui`,version:e.version,components:e.components}}function tn(e){let t=[],n=[];for(let r of e)switch(r.type){case`text`:r.text.trim()&&t.push($t(r));break;case`thinking`:r.text.trim()&&t.push(Qt(r));break;case`tool_call`:n.push(Zt(r));break;case`a2ui`:t.push(en(r));break}return{content:t,toolCalls:n}}function nn(e){return typeof e==`string`?e.trim():e.filter(e=>e.type===`text`).map(e=>e.text).join(``).trim()}function rn(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 R(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=nn(e.content);t&&i.push({role:`user`,content:t});continue}if(e.role===`assistant`){let{content:t}=tn(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:rn(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:rn(r),argsObj:r,result:nn(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 an=yt(b);function on(e,t,n){for(let r of e){if(r.role!==`assistant`)continue;let e=_t(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 sn(e,t){let n=D(e),r=e=>{let t=S(`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=We(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 cn(e,t){let n=D(e),r=async e=>{try{let{stdout:t}=await an(`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 ot(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 ln(e){return[...e].sort((e,t)=>t.savedAt-e.savedAt)}function un(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 dn(e,t,n){let r=Date.now();return{id:`${r.toString(36)}-${Math.random().toString(36).slice(2,6)}`,name:un(e,n),text:t,savedAt:r}}function fn(e){return e.length<=50?[...e]:e.slice(-50)}function z(e){let t=R(e.session.visibleMessages()),n=e.session.getTurnSummaries();return!n||n.length===0?t:tt(t,n,e.session.getTurnCount()??t.filter(e=>e.role===`user`).length)}function pn(e){let{resumedNote:t,isFound:n,session:r,projState:i,tui:a}=e,o=z(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(/^↻ /,``)),mn({session:r,projState:i,tui:a,chatMsgs:o})}function mn(e){let{session:t,projState:n,tui:r}=e,i=e.chatMsgs??z(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(Ze(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?on(e,t.toolCallId,n):{};return r.oldContent===void 0&&r.newContent===void 0&&(r=sn(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(ln(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 B=new Map;function hn(e){return B.get(e)}function V(e){B.delete(e);let t=U.get(e);t&&(clearTimeout(t),U.delete(e))}function gn(){return[...B.values()]}function H(e,t,n){let r={id:e,transcript:R(t),streaming:``,status:n?`busy`:`idle`,lastActivityAt:Date.now()};return B.set(e,r),r}function _n(e,t){let n=B.get(e);n&&(n.transcript=R(t),n.lastActivityAt=Date.now())}const vn=new Set;function yn(e){return vn.add(e),()=>{vn.delete(e)}}const U=new Map;function bn(e){let t=U.get(e.id);t&&clearTimeout(t),U.set(e.id,setTimeout(()=>{U.delete(e.id);for(let t of vn)t(e)},300))}function xn(e,t){let n=``,r=t=>{e.status!==t&&(e.status=t,bn(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`),_n(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(),bn(e);return}},()=>e]}function Sn(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 Cn(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 o=i(process.env.OTTO_SERVICE_URL??`http://127.0.0.1:8417`,globalThis.fetch,{token:process.env.OTTO_SERVICE_TOKEN}),s;try{s=await o.fetchSnapshot(n)}catch(e){if(e instanceof r){t.tui.info.showToast(`/session inspect`,`无法连接 otto serve:${e.message} —— 先 \`otto serve\`(或指定 --remote/OTTO_SERVICE_URL)`);return}if(e instanceof a){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${Sn(s)}`}]}),t.tui.info.showToast(`/session inspect`,`已查看会话 ${s.session.id}(只读快照;如需实时参与该会话请用 otto --attach ${s.session.id})`)}function wn(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 Tn=e=>`把下面的笔记归纳成一个简短标题(≤6 词)和一句话描述。严格只按此格式输出:\nTITLE: <标题>\nDESC: <一句话描述>\n\n笔记:\n${e}`;function En(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 Dn(e,t,n=8e3){let r=wn(e);if(!t)return r;let i=new AbortController,a=setTimeout(()=>i.abort(),n);a.unref?.();try{let n=En(await t(Tn(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 On(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 kn(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=wn(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,...On(n,r)});return}if(i===`project`){let e=n?n.getInjection().trim():``;t.tui.modal.openModal({kind:`memory`,projectIndex:e,userIndex:``,...On(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,...On(n,r)})}async function An(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 jn(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(L(t.app,n.id,t.state.session.thinkingLevel));let r=n?.contextWindow??2e5,i=Wt({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 Mn(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 Nn(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]=xn(H(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 H(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 At(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(L(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=hn(n.id);if(a)t.tui.messages.pushMessages(a.transcript),V(n.id);else{let e=z(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(gn().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 Pn(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 Fn(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(`
|
|
@@ -13,9 +13,9 @@ import{t as e}from"./build-id-ClyMIKLy.js";import{t}from"./version-Eh8zZKgk.js";
|
|
|
13
13
|
`)[0].replace(/\s+/g,` `).trim();return t.length>40?`${t.slice(0,39)}…`:t}function vr(e){e.pluginInput.unregisterBySource(`shortcut`);let t=(e.settings.get(`shortcuts`)??[]).map(e=>({label:`@${e.name}`,value:`[@shortcut:${e.name.replace(/]/g,`\\]`)}]`,description:_r(e.text),kind:`shortcut`,source:`shortcut`}));t.length&&e.pluginInput.register(t)}function yr(e,t){let n=e.modelRegistry.getAll();if(n.length===0)return;let r=e=>e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${Math.round(e/1e3)}k`:``,i=n.filter(e=>t.has(e.id)).sort((e,t)=>e.name.localeCompare(t.name)).map(e=>{let t=r(e.contextWindow),n=[];e.strengths&&e.strengths.length>0&&n.push(...e.strengths),t&&n.push(t);let i=n.length>0?`${e.provider} · ${n.join(` · `)}`:e.provider;return{label:e.name,value:`[@model:${e.id.replace(/]/g,`\\]`)}]`,description:i,kind:`model`,source:`builtin`}});e.pluginInput.unregisterBySource(`builtin-model`),e.pluginInput.register(i)}const br={low:`cmd.effortDescLow`,medium:`cmd.effortDescMedium`,high:`cmd.effortDescHigh`,xhigh:`cmd.effortDescXhigh`,max:`cmd.effortDescMax`};function xr(e){let t=G.map(e=>({label:I(e),value:`[@effort:${e}]`,description:j.t(br[e]??`cmd.effortDescLow`),kind:`effort`,source:`builtin-effort`}));e.pluginInput.unregisterBySource(`builtin-effort`),e.pluginInput.register(t)}async function Sr(e,t){t.tui.modal.openModal({kind:`shortcutsPanel`,shortcuts:t.app.getShortcuts(),onSave:(e,n,r)=>{t.app.saveShortcut(e,n,r).then(()=>vr(t.app)).catch(e=>{t.tui.info.showToast(`Shortcuts`,`Save failed: ${e instanceof Error?e.message:String(e)}`)})},onDelete:e=>{t.app.deleteShortcut(e).then(()=>vr(t.app)).catch(e=>{t.tui.info.showToast(`Shortcuts`,`Delete failed: ${e instanceof Error?e.message:String(e)}`)})}})}const Cr={low:{label:`Low`,desc:`节约 Token,快速响应`,intensity:.2},medium:{label:`Medium`,desc:`平衡速度与推理质量`,intensity:.4},high:{label:`High`,desc:`深度推理,延迟较高`,intensity:.6},xhigh:{label:`XHigh`,desc:`更长推理链,更全面思考`,intensity:.8},max:{label:`Max`,desc:`全力推理,最慢但最深入`,intensity:1}};function wr(e){let t=Math.round(e*8);return`━`.repeat(Math.max(0,t))+`╌`.repeat(Math.max(0,8-t))}async function Tr(e,t){let n=e[0]?.toLowerCase();if(n&&G.includes(n)){Er(t,n);return}if(n){t.tui.info.showToast(j.t(`cmd.titleEffort`),j.t(`cmd.effortUnknown`,{arg:n,levels:G.join(` / `)}));return}let r=t.state.session.thinkingLevel;t.tui.modal.openModal({kind:`select`,title:j.t(`cmd.selectEffortTitle`),options:G.map(e=>{let t=Cr[e],n=e===r,i=wr(t.intensity);return{label:t.label,value:e,detail:`${i} ${t.desc}${n?` · 当前`:``}`}}),onSelect:e=>Er(t,e),onCancel:()=>{}})}function Er(e,t){let n=e.state.session,r=n.thinkingLevel;n.thinkingLevel=t,e.app.settings.persist({thinking_level:t}),r!==t&&rr({tui:e.tui,session:n,traceStore:e.app.storage.traceStore},{from:r,to:t,label:I(t)}),n.model?.id&&e.tui.stores.tasks.setModelName(L(e.app,n.model.id,t)),e.tui.info.showToast(j.t(`cmd.titleEffort`),t)}async function Dr(e,t){let n=e[0]?.toLowerCase();if(n===`general`||n===`gen`){K(t);return}if(n===`lang`||n===`language`){zr(e.slice(1),t);return}if(n===`theme`){Br(e.slice(1),t);return}if(n===`keybindings`||n===`kb`){$n(e.slice(1),t);return}if(n===`shortcuts`){Sr(e.slice(1),t);return}if(n===`proxy`){s(e.slice(1),t);return}if(n){t.tui.info.showToast(j.t(`cmd.titlePreference`),j.t(`cmd.preferenceUsage`));return}Or(t)}function Or(e,t){let n=e.app.settings,r=n.get(`language`),i=r===`zh`?`中文 (zh)`:r===`en`?`English (en)`:`Auto`,a=e.state.themeRegistry??Ye(),o=n.get(`theme_preset`)??{},c=a.get(o.dark??`dark`)?.label??o.dark??`dark`;e.tui.modal.openModal({kind:`select`,title:j.t(`cmd.titlePreference`),detailPlacement:`inline`,options:[{label:j.t(`cmd.prefOptionGeneral`),value:`general`,detail:j.t(`cmd.prefDescGeneral`)},{label:j.t(`cmd.prefOptionLang`),trailingLabel:i,value:`lang`,detail:j.t(`cmd.prefDescLang`)},{label:j.t(`cmd.prefOptionTheme`),trailingLabel:c,value:`theme`,detail:j.t(`cmd.prefDescTheme`)},{label:`Keybindings`,value:`keybindings`,detail:`Browse, search, remap, reset shortcuts`},{label:`Shortcuts`,value:`shortcuts`,detail:`Manage custom @ text shortcuts`},{label:`Proxy`,value:`proxy`,detail:`Configure HTTP proxy`}],defaultSelectedValue:t,onSelect:t=>{t===`general`?K(e):t===`lang`?zr([],e):t===`theme`?Br([],e):t===`keybindings`?$n([],e):t===`shortcuts`?Sr([],e):t===`proxy`&&s([],e)},onCancel:()=>{}})}let kr;function K(e,t,n,r){let i=e.app.settings,a=i.get(`notification`),o=i.get(`nickname`)??``,s=a?.on_completion!==!1,c=a?.sound===!0,l=i.get(`auto_update_check`)!==!1,u=i.get(`skill_loop`)?.enabled===!0,d=e.app.activePlugins().some(e=>e.id===C),f={on:A.toggleOn,off:A.toggleOff},p={on:j.t(`cmd.toggleOn`),off:j.t(`cmd.toggleOff`)},m=e=>Yt(e,f,p);e.tui.modal.openModal({kind:`select`,title:j.t(`cmd.selectGeneralTitle`),detailPlacement:`inline`,subtitle:t,replace:r,options:[{label:j.t(`cmd.genNickname`),trailingLabel:o||`—`,value:`nickname`,detail:j.t(`cmd.genNicknameDesc`)},{label:j.t(`cmd.genCompletionNotice`),trailingLabel:m(s),value:`completion`,detail:j.t(`cmd.genCompletionNoticeDesc`)},{label:j.t(`cmd.genSound`),trailingLabel:m(c),value:`sound`,detail:j.t(`cmd.genSoundDesc`)},{label:j.t(`cmd.genUpdateCheck`),trailingLabel:m(l),value:`updateCheck`,detail:j.t(`cmd.genUpdateCheckDesc`)},{label:j.t(`cmd.genSkillLoop`),trailingLabel:d?m(u):j.t(`cmd.genSkillLoopMissing`),value:`skillLoopPanel`,detail:j.t(`cmd.genSkillLoopEntryDesc`)}],defaultSelectedValue:n??kr,onHighlight:e=>{kr=e},onSelect:t=>{if(t===`nickname`){Ar(e);return}if(t===`skillLoopPanel`){q(e);return}Rr(e,t)},onCancel:()=>{Or(e,`general`)}})}async function Ar(e){let t=await e.tui.modal.openModal({kind:`input`,title:j.t(`cmd.genNicknameInputTitle`),placeholder:j.t(`cmd.genNicknamePlaceholder`)});if(t==null){K(e);return}let n=t.trim();await e.app.settings.persist({nickname:n}),K(e,j.t(`cmd.genSaved`))}const jr=[4,6,12,20];function Mr(e){let t=typeof e==`number`?e:6,n=jr.includes(t)?`genSkillLoopThr${t}`:``;return n?j.t(`cmd.${n}`):String(t)}function Nr(e){let t=e.app.settings,n=t.get(`skill_loop`)?.min_messages??6;e.tui.modal.openModal({kind:`select`,title:j.t(`cmd.genSkillLoopThresholdTitle`),detailPlacement:`inline`,options:jr.map(e=>({label:j.t(`cmd.genSkillLoopThr${e}`),value:String(e),detail:j.t(`cmd.genSkillLoopThr${e}Desc`),trailingLabel:e===n?A.toggleOn:void 0})),onSelect:n=>{(async()=>{let r={...t.get(`skill_loop`)??{}};r.min_messages=Number(n),await t.persist({skill_loop:r}),q(e,j.t(`cmd.genSaved`),`threshold`)})()},onCancel:()=>{q(e,void 0,`threshold`)}})}const Pr=[3,14,30,365];function Fr(e){let t=typeof e==`number`?e:14;return Pr.includes(t)?j.t(`cmd.genSkillLoopCd${t}`):j.t(`cmd.genSkillLoopCdDays`,{n:t})}function Ir(e){let t=e.app.settings,n=t.get(`skill_loop`)?.dismiss_cooldown_days??14;e.tui.modal.openModal({kind:`select`,title:j.t(`cmd.genSkillLoopCooldownTitle`),detailPlacement:`inline`,options:Pr.map(e=>({label:j.t(`cmd.genSkillLoopCd${e}`),value:String(e),detail:j.t(`cmd.genSkillLoopCd${e}Desc`),trailingLabel:e===n?A.toggleOn:void 0})),onSelect:n=>{(async()=>{let r={...t.get(`skill_loop`)??{}};r.dismiss_cooldown_days=Number(n),await t.persist({skill_loop:r}),q(e,j.t(`cmd.genSaved`),`cooldown`)})()},onCancel:()=>{q(e,void 0,`cooldown`)}})}function q(e,t,n){let r=e.app.settings,i=r.get(`skill_loop`)?.enabled===!0,a=e.app.activePlugins().some(e=>e.id===C),o={on:A.toggleOn,off:A.toggleOff},s={on:j.t(`cmd.toggleOn`),off:j.t(`cmd.toggleOff`)};if(!a){e.tui.modal.openModal({kind:`select`,title:j.t(`cmd.skillLoopPanelTitle`),detailPlacement:`inline`,subtitle:j.t(`cmd.genSkillLoopMissingHint`),options:[{label:j.t(`cmd.genSkillLoopMissing`),value:`noop`,detail:``}],onSelect:()=>{K(e,void 0,`skillLoopPanel`)},onCancel:()=>{K(e,void 0,`skillLoopPanel`)}});return}e.tui.modal.openModal({kind:`select`,title:j.t(`cmd.skillLoopPanelTitle`),detailPlacement:`inline`,subtitle:t,defaultSelectedValue:n,options:[{label:j.t(`cmd.skillLoopOnOff`),trailingLabel:Yt(i,o,s),value:`toggle`,detail:j.t(`cmd.genSkillLoopEntryDesc`)},...i?[{label:j.t(`cmd.genSkillLoopThreshold`),trailingLabel:Mr(r.get(`skill_loop`)?.min_messages),value:`threshold`,detail:j.t(`cmd.genSkillLoopThresholdDesc`)},{label:j.t(`cmd.genSkillLoopCooldown`),trailingLabel:Fr(r.get(`skill_loop`)?.dismiss_cooldown_days),value:`cooldown`,detail:j.t(`cmd.genSkillLoopCooldownDesc`)},{label:j.t(`cmd.genSkillLoopStatus`),value:`status`,detail:j.t(`cmd.genSkillLoopStatusDesc`)}]:[]],onSelect:t=>{if(t===`threshold`){Nr(e);return}if(t===`cooldown`){Ir(e);return}if(t===`status`){Lr(e);return}(async()=>{let t={...r.get(`skill_loop`)??{}},n=t.enabled!==!0;t.enabled=n,await r.persist({skill_loop:t}),q(e,n?j.t(`cmd.genSkillLoopOn`):j.t(`cmd.genSkillLoopOff`),`toggle`)})()},onCancel:()=>{K(e,void 0,`skillLoopPanel`)}})}function Lr(e){let t=e.app.settings,n=e.app.activePlugins().some(e=>e.id===C),r=xe({workspaceKey:e.app.workspaceRef?.key??ne,now:Date.now(),cooldownDays:t.get(`skill_loop`)?.dismiss_cooldown_days,pluginInstalled:n}),i=e=>j.t(`cmd.skillLoopStatusCount`,{n:e}),a=[];if(!n)a.push({label:j.t(`cmd.skillLoopStatusNotInstalled`),value:`noop`,detail:j.t(`cmd.genSkillLoopMissingHint`)});else{a.push({label:j.t(`cmd.skillLoopStatusEpisodes`),trailingLabel:i(r.episodeCount),value:`noop`,detail:j.t(`cmd.skillLoopStatusSuccess`)+` `+i(r.successCount)},{label:j.t(`cmd.skillLoopStatusPending`),trailingLabel:i(r.pendingCount),value:`noop`,detail:i(r.candidateCount)+` `+j.t(`cmd.skillLoopStatusCandidates`)+` · `+i(r.coolingCount)+` `+j.t(`cmd.skillLoopStatusCooling`)});for(let e of r.pending)a.push({label:e.taskSignature,trailingLabel:j.t(`cmd.skillLoopStatusTimes`,{n:e.size}),value:`noop`,detail:j.t(`cmd.skillLoopStatusGroupPending`)});for(let e of r.recentSignatures)a.push({label:e,value:`noop`,detail:j.t(`cmd.skillLoopStatusGroupRecent`)})}let o=r.episodeCount===0?`cmd.skillLoopStatusEmpty`:{"no-episodes":`cmd.skillLoopStatusHintNoEpisodes`,"not-enough-successes":`cmd.skillLoopStatusHintNotEnough`,"no-cluster-yet":`cmd.skillLoopStatusHintNoCluster`}[r.nextProposalHint??``]??``;e.tui.modal.openModal({kind:`select`,title:j.t(`cmd.skillLoopStatusTitle`),detailPlacement:`inline`,subtitle:o?j.t(o):void 0,options:a,onSelect:()=>{q(e,void 0,`status`)},onCancel:()=>{q(e,void 0,`status`)}})}async function Rr(e,t){let n=e.app.settings;if(t===`updateCheck`){let r=n.get(`auto_update_check`)!==!1;await n.persist({auto_update_check:!r}),K(e,j.t(`cmd.genSaved`),t,!0);return}let r={...n.get(`notification`)??{}};t===`completion`?r.on_completion=r.on_completion===!1:t===`sound`&&(r.sound=r.sound!==!0),await n.persist({notification:r}),K(e,j.t(`cmd.genSaved`),t,!0)}function zr(e,t){let n=e[0]?.toLowerCase();if(n===`en`||n===`zh`||n===`auto`){Ur(t,n);return}if(n){t.tui.info.showToast(j.t(`cmd.titlePreference`),j.t(`pref.languageUsage`));return}t.tui.modal.openModal({kind:`select`,title:j.t(`cmd.selectLanguageTitle`),detailPlacement:`inline`,options:[{label:`中文 (zh)`,value:`zh`,detail:j.t(`cmd.langDescZh`)},{label:`English (en)`,value:`en`,detail:j.t(`cmd.langDescEn`)},{label:`Auto`,value:`auto`,detail:j.t(`cmd.langDescAuto`)}],onSelect:e=>Ur(t,e),onCancel:()=>{Or(t,`lang`)}})}function Br(e,t){Vr(t)}function Vr(e){let t=e.state.themeRegistry??Ye(),n=e.app.settings.get(`theme_preset`)??{},r=t.get(n.dark??`dark`)??t.get(`dark`),i=t.get(n.light??`light`)??t.get(`light`);e.tui.modal.openModal({kind:`select`,title:j.t(`cmd.prefOptionTheme`),detailPlacement:`inline`,options:[{label:j.t(`cmd.themeDarkPresetOption`),value:`preset-dark`,detail:j.t(`cmd.themeDarkPresetDesc`),trailingLabel:r?.label},{label:j.t(`cmd.themeLightPresetOption`),value:`preset-light`,detail:j.t(`cmd.themeLightPresetDesc`),trailingLabel:i?.label}],onSelect:t=>{if(t===`preset-dark`){Hr(e,`dark`);return}if(t===`preset-light`){Hr(e,`light`);return}},onCancel:()=>{Or(e,`theme`)}})}function Hr(e,t){let n=e.state.themeRegistry??Ye(),r=e.app.settings.get(`theme_preset`)??{},i=r[t]??t,a=[...n.list().filter(e=>e.appearance===t).map(e=>({label:e.label,value:e.id,detail:e.source.kind===`builtin`?j.t(`cmd.themePresetBuiltin`):j.t(`cmd.themePresetFromExtension`,{id:e.source.extensionId}),trailingLabel:e.id===i?`✓`:void 0})),{label:j.t(`cmd.themePresetReset`),value:`__reset__`,detail:j.t(`cmd.themePresetResetDesc`)}],o=n=>{let i={...r};n===void 0?delete i[t]:i[t]=n,e.tui.lifecycle.setPresetSelection?.(i)},s=()=>{e.tui.lifecycle.setPresetSelection?.(r)};e.tui.modal.openModal({kind:`select`,title:t===`dark`?j.t(`cmd.themePresetTitleDark`):j.t(`cmd.themePresetTitleLight`),options:a,onHighlight:e=>{o(e===`__reset__`?void 0:e)},onSelect:i=>{let a=i===`__reset__`?void 0:i,o={...r};a===void 0?delete o[t]:o[t]=a,e.tui.lifecycle.setPresetSelection?.(o),e.app.settings.persist({theme_preset:o},`global`);let s=a===void 0?t===`dark`?n.get(`dark`)?.label:n.get(`light`)?.label:n.get(a)?.label;e.tui.info.showToast(j.t(`cmd.titlePreference`),j.t(`cmd.themePresetSaved`,{label:s??a??t}))},onCancel:()=>{s(),e.tui.info.showToast(j.t(`cmd.titlePreference`),j.t(`cmd.selectCancelled`))}})}function Ur(e,t){e.state.currentLang=e.tui.lifecycle.setLanguage(t),Mt(t),e.tui.plugins.setCommands(e.callbacks.refreshSlashCommands()),e.app.settings.persist({language:t}),e.tui.info.showToast(j.t(`cmd.titleLanguage`),j.t(`pref.languageSwitched`,{l:e.state.currentLang,name:e.state.currentLang===`zh`?`中文`:`English`}))}async function Wr(e,t){let r=t.app.workspaceDir??process.cwd(),i=e[0]?.toLowerCase()??`status`;if(i===`plugin`){let i=e[1]?.toLowerCase()===`untrust`,a=i?e[2]:e[1];if(!a){t.tui.info.showToast(j.t(`cmd.titlePlugin`),j.t(`cmd.pluginUsage`,{seg:(i?`untrust`:`trust`)==`untrust`?`untrust `:``}));return}let o=n({cwd:r,homedir:_()}).find(e=>e.id===a);if(!o){t.tui.info.showToast(j.t(`cmd.titlePlugin`),j.t(`cmd.pluginNotFound`,{id:a}));return}if(i){try{Me(o.dir)}catch(e){t.tui.info.showToast(j.t(`cmd.titlePlugin`),`撤销信任失败,权限未收回:${e instanceof Error?e.message:String(e)}`);return}t.tui.info.showToast(j.t(`cmd.titlePlugin`),j.t(`cmd.pluginUntrusted`,{id:a}))}else si(t,o);return}if(i===`trust`){Ae(r),t.tui.info.showToast(j.t(`cmd.titleCompat`),j.t(`cmd.compatTrusting`)),t.app.reloadCapabilities().then(e=>{t.tui.plugins.setPluginRegistrations(t.app.getPluginRegistrations()),t.tui.info.showToast(j.t(`cmd.titleCompat`),j.t(`cmd.compatTrusted`,{count:e.mcpTools}))},e=>t.tui.info.showToast(j.t(`cmd.titleCompat`),j.t(`cmd.compatReloadFailed`,{err:e instanceof Error?e.message:String(e)})));return}if(i===`untrust`){Ne(r),t.tui.info.showToast(j.t(`cmd.titleCompat`),j.t(`cmd.compatUntrusted`));return}let a=fe(r),o=ce(r,{interactive:!0}),s=[];if(a.surface.any){let e=[a.surface.mcpJson?`.mcp.json`:null,a.surface.commands?`.claude/commands`:null].filter(Boolean),t=a.trusted?j.t(`cmd.compatTrustedLabel`):j.t(`cmd.compatUntrustedLabel`);s.push(`${e.join(j.t(`cmd.listSep`))} ${t}`)}if(o.highRiskKeys.length>0){let e=o.highRiskKeys.join(j.t(`cmd.listSep`));s.push(o.gated?j.t(`cmd.compatConfigGated`,{keys:e}):j.t(`cmd.compatConfigActive`,{keys:e}))}let c=n({cwd:r,homedir:_()}).filter(e=>e.scope===`project`||e.scope===`repository`);for(let e of c){let t=pe(e);if(!t.surface.any)continue;let n=t.gated?j.t(`cmd.compatUntrustedLabel`):j.t(`cmd.compatTrustedLabel`);s.push(`plugin:${e.id} ${n}${t.gated?` → /trust plugin ${e.id}`:``}`)}if(s.length===0){t.tui.info.showToast(j.t(`cmd.titleCompat`),j.t(`cmd.compatNone`));return}o.gated?t.tui.modal.openModal({kind:`info`,title:j.t(`cmd.titleCompat`),lines:s}):t.tui.info.showToast(j.t(`cmd.titleCompat`),s.join(`
|
|
14
14
|
`))}async function Gr(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 Kr(e,n){let r=t();n.tui.info.showToast(j.t(`cmd.titleUpgrade`),j.t(`cmd.upgradeChecking`,{current:r}));let i=await Pt(r);if(!i){n.tui.modal.openModal({kind:`info`,title:j.t(`cmd.titleUpgrade`),lines:[j.t(`cmd.upgradeNoNetwork`)]});return}if(!i.newer){n.tui.info.showToast(j.t(`cmd.titleUpgrade`),j.t(`cmd.upgradeLatest`,{current:r}));return}n.tui.modal.openModal({kind:`select`,title:j.t(`cmd.titleUpgrade`),subtitle:j.t(`cmd.upgradeConfirmSubtitle`,{current:r,latest:i.latest}),subtitleTone:`warning`,layout:`buttons`,options:[{label:j.t(`common.upgradeButton`),value:`upgrade`,color:`accent`},{label:j.t(`common.cancelButton`),value:`cancel`,color:`amber`}],onSelect:e=>{e===`upgrade`&&qr(n,i.latest)}})}async function qr(e,t){e.tui.info.showToast(j.t(`cmd.titleUpgrade`),j.t(`cmd.upgrading`));let{ok:n,error:r}=await Lt(t);if(!n){e.tui.info.showToast(j.t(`cmd.titleUpgrade`),j.t(`cmd.upgradeFailed`,{err:r??j.t(`cmd.unknownError`)}));return}e.state.restartRequested=!0,e.tui.lifecycle.stop()}async function Jr(e,n){if(!e.includes(`--force`))return!1;let r=await Pt(t());return r?r.newer?(await qr(n,r.latest),!0):(n.tui.info.showToast(j.t(`cmd.titleUpgrade`),j.t(`cmd.upgradeLatest`,{current:t()})),!0):(n.tui.info.showToast(j.t(`cmd.titleUpgrade`),j.t(`cmd.upgradeNoNetwork`)),!0)}async function Yr(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 Wa){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=>{Ja(e,[],t)},onCancel:()=>{}})}async function Xr(e,t){t.tui.panes.togglePane(`history`)}async function Zr(e,t){t.tui.panes.togglePane(`notifications`)}async function Qr(e,t){t.tui.panes.togglePane(`prompts`)}async function $r(e,t){t.tui.panes.setServices(!0)}async function ei(e,t){t.tui.info.showToast(j.t(`cmd.titleUpgrade`),j.t(`cmd.upgradeCheckScanning`));try{let e=Oe({workspaceDir:t.app.workspaceDir,workspaceRoot:me(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 ae(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 ti=St({confirmHighRiskCapabilities:()=>ci,formatPluginContributionsSummary:()=>ai,handleDelegatesToggle:()=>ui,handleExtension:()=>J,handleJobStart:()=>di,pluginCapabilityLabel:()=>oi,promptPluginTrust:()=>si,runPluginInstall:()=>li});function ni(e){return!e.endsWith(O(`.claude`,`skills`))}function ri(e,t){return ni(t)?e===`project`?`project`:e===`global`?`global`:null:null}function ii(e,t){let n={project:`project`,global:`global`,plugin:`plugin`,inline:`inline`}[e]??e;return t?`${n} (${t})`:n}function ai(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 oi(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 si(e,t){let n=pe(t),r=n.pendingCapabilities,i=()=>{ke(t.dir),r.length>0&&he(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=oi(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 ci(e,t,n){if(t.length===0)return!0;let r=[j.t(`cmd.pluginCapabilityIntro`)];for(let e of t){let t=oi(e);t&&r.push(`• ${t}`)}return new Promise(t=>{n.tui.modal.openModal({kind:`select`,title:j.t(`cmd.pluginInstallConfirmTitle`,{name:e}),subtitle:r.join(`
|
|
16
|
-
`),layout:`buttons`,options:[{label:j.t(`cmd.pluginInstallConfirmAction`),value:`install`,color:`accent`},{label:j.t(`cmd.commonCancel`),value:`cancel`,color:`gray`}],onSelect:e=>t(e===`install`),onCancel:()=>t(!1)})})}async function li(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 s=o[e]?.pkg??e,c=Te(s),l;if(!c)try{i?.(`Downloading from npm registry`);let e=await new w().install(s,{global:!0,as:`plugin`,postInstallExecutor:se});e.success&&e.targetPath?(c=e.targetPath,l={id:e.name??s,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:s})),!1;let u=ye(c);if(!r&&!await ci(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 ge({pkg:s})}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 Se(t.app.settings,{id:d.id,source:`npm`,sourceSpec:s,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`),ke(d.dir),he(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-
|
|
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 r=e[0]?.toLowerCase();if(r===`trust`)return Wr(e.slice(1),t);if(r===`install`)return c(e.slice(1),t);if(r===`registry`)return u(e.slice(1),t);if(r===`search`)return l(e.slice(1),t);if(r===`update`)return ei([`--check`],t);if(r===`reload`)return Pn(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;de(a,{open:e=>_e(e),runCommand:async(e,n)=>{let{dispatchSlashCommand:r}=await Promise.resolve().then(()=>Ua);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(()=>Ua);await e(`extension`,[`install`,...a],t)})().catch(e=>i(j.t(`cmd.titlePlugin`),e instanceof Error?e.message:String(e)))},onCancel:()=>o()})},d=e=>{let n=t.app.skillRegistry?.get(e);if(!n){o();return}let r=n.status!==`disabled`,s=n.definition.metadata,c=[{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:ii(n.source.type,n.source.id)}),tone:`muted`},...ni(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&&c.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`},...ri(n.source.type,n.source.root)?[{label:j.t(`cmd.uninstallActionLabel`),value:`uninstall`,color:`red`}]:[]],dataListEntries:c,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)}))}d(e);return}if(s===`uninstall`){let r=ri(n.source.type,n.source.root);if(!r)return;await Zn({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 Zn({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`?d(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,r,s,c,l)=>{let u=t.app.workspaceDir??process.cwd(),d=n({cwd:u,homedir:_()}).find(t=>t.id===e);if(!d){o();return}let f=pe(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),v=g.length?` ${g.join(`, `)}`:` —`,ee=(t.app.getPluginPanelRegistrations?.()??[]).filter(t=>t.pluginId===e),y=ai({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:r?j.t(`cmd.extDisableLabel`):j.t(`cmd.extEnableLabel`),value:`toggle`,color:r?`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=ie(d,{"extension.id":e,"extension.enabled":r,"extension.trusted":f.trusted,"extension.scope":d.scope,"extension.category":`plugin`}),x=d.manifest.contributes,S=we(re.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=>_e(e),runCommand:async(e,n)=>{let{dispatchSlashCommand:r}=await Promise.resolve().then(()=>Ua);await r(e,n?n.split(/\s+/).filter(Boolean):[],t)},runScript:async e=>{if(pe(d).gated){i(j.t(`cmd.titlePlugin`),j.t(`cmd.extPluginUntrusted`));return}await De(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(We(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 ae=()=>{let n=t.app.pluginHealthTracker?.query(e)??{hookTimeouts:0,toolTimeouts:0},r=be(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:v.trim()||`—`},...y?[{kind:`row`,label:j.t(`cmd.extPluginLabelContributions`),value:y}]:[],{kind:`row`,label:j.t(`cmd.extPluginLabelStatus`),value:r?j.t(`cmd.extEnableLabel`):j.t(`cmd.extDisableLabel`),tone:r?`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:r?`enabled`:`disabled`}),meta:`plugin · ${d.scope}`,metaStatus:{label:r?j.t(`cmd.extEnableLabel`):j.t(`cmd.extDisableLabel`),enabled:r},metaSuffix:p,actions:b,panelInfo:w?{title:w.title,modulePath:w.modulePath,exportName:w.exportName,pluginId:e}:void 0,dataListEntries:[...se,...T??oe],...ae(),onRefresh:()=>m(e,r,s,c),onAction:async n=>{if(n.startsWith(`contrib:`)){let t=ne.get(n.slice(8));if(t)try{await de(t,C)}catch(e){a(j.t(`cmd.extToggleFailed`,{err:e instanceof Error?e.message:String(e)}))}m(e,r,s,c)}else if(n===`trust`)si(t,d);else if(n===`untrust`){try{Me(d.dir)}catch(t){m(e,r,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,r,s,c,{kind:`success`,message:j.t(`cmd.pluginUntrusted`,{id:e})})})}else if(n===`toggle`)try{await t.app.extensions.setEnabled(`plugin`,e,!r);try{await t.app.reloadCapabilities(),m(e,!r,s,c,{kind:`success`,message:j.t(`cmd.extToggled`,{name:s,verb:r?`Disabled`:`Enabled`,seg:``})})}catch(t){m(e,!r,s,c,{kind:`error`,message:j.t(`cmd.extToggleReloadFailed`,{verb:r?`Disabled`:`Enabled`,name:s,err:t instanceof Error?t.message:String(t)})})}}catch(t){m(e,r,s,c,{kind:`error`,message:j.t(`cmd.extToggleFailed`,{err:t instanceof Error?t.message:String(t)})})}else if(n===`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 n===`reload`?t.app.reloadCapabilities?.().then(t=>{m(e,r,s,c,{kind:`success`,message:j.t(`cmd.pluginTrusted`,{id:e,count:t.mcpTools})})}).catch(t=>{m(e,r,s,c,{kind:`error`,message:j.t(`cmd.compatReloadFailed`,{err:t instanceof Error?t.message:String(t)})})}):n===`uninstall`&&await Zn({name:e,type:`plugin`,scope:d.scope===`project`||d.scope===`repository`?d.scope:`global`,ctx:t,onDone:()=>o()})},onClose:()=>o()})};o()}var fi=St({handleLogout:()=>yi,handleModel:()=>_i,handleProviderAuth:()=>Y,handleProviderLogout:()=>vi,handleServiceLogin:()=>bi,handleServiceLogout:()=>xi});const pi=`__otto_model_login__`,mi=`__otto_model_setkey__`,hi=`__otto_model_grant_capability__`,gi=`__otto_model_install_plugin__`;async function _i(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:gi}]:h?[{label:j.t(`model.goLogin`),value:pi},{label:j.t(`model.setKey`),value:mi}]:[],..._>0?[{label:j.t(`model.goGrantCapability`),value:hi}]:[]]: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===pi){await Y([],t,{method:`oauth`});return}if(e===mi){await Y([],t,{method:`key`});return}if(e===hi){await J([],t);return}if(e===gi){let{EXTENSION_ALIASES:e}=await import(`./extension-CTyrcdT1.js`),{runPluginInstall:n}=await Promise.resolve().then(()=>ti),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 vi(e.slice(1),t);if(e.includes(`--service`))return bi(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??gt(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(Fe(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:()=>{Fe(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 vi(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??gt(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 yi(e,t){e[0]&&e[0]!==`--service`||await xi([],t)}async function bi(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 xi(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 wi(e.slice(1),t);if(n===`cache`||n===`cache-stats`)return Ti(e.slice(1),t);if(n===`diagnose`)return Fn(e.slice(1),t);if(n===`services`)return $r(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=Ee(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 Si(){let e=process.env.OTTO_NOTIFY_COALESCE_WARN_RATIO,t=e?Number(e):NaN;return Number.isFinite(t)&&t>=1?t:1.5}function Ci(e,t){return t===0?`healthy`:e<Si()?`warning`:`healthy`}async function wi(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:Ci(r,n.coalescedCalls)}});let i=t.app.activePlugins();try{let e=await oe(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 Ti(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:ht(t,e.api)}}),i=r.some(e=>e.hitRatio!==null),a={inputTokens:n.totalInputTokens,outputTokens:0,cacheReadTokens:n.totalCacheReadTokens,cacheWriteTokens:n.totalCacheWriteTokens},o=i?ht(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 Ei(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 Di(e){return new Date(e*1e3).toLocaleString()}async function Oi(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:$e(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:Di(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 ki=async(e,t)=>{let n=e[0];switch(n){case`memory-sync`:return Ai(e.slice(1),t);default:t.tui.info.showToast(`Workspace`,`/workspace ${n??``} — unknown subcommand. Use: memory-sync [status|enable|disable]`)}};async function Ai(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 ji(t,n){let r=n.state.session,i=r.model?.id??j.t(`cmd.aboutModelNotSet`),a=h().length,o=Math.round(y()/(1024*1024*1024)),s=Math.round(g()/(1024*1024)),c=[{kind:`group`,title:j.t(`cmd.aboutGroupVersion`)},{kind:`row`,label:j.t(`cmd.aboutVersion`),value:`${ze} (build ${Le})`},{kind:`row`,label:j.t(`cmd.aboutBranch`),value:`dev`},{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} · ${v()} ${m()} · ${ee()}`,tone:`muted`},{kind:`row`,label:j.t(`cmd.aboutCPU`),value:`${a} cores`,tone:`muted`},{kind:`row`,label:j.t(`cmd.aboutMemory`),value:`${o} GB total / ${Math.round(s)} 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:i,tone:`secondary`}];r.id&&c.push({kind:`row`,label:j.t(`cmd.aboutSession`),value:r.id.slice(0,8)}),c.push({kind:`blank`},{kind:`text`,value:j.t(`cmd.aboutUpdateHint`),tone:`muted`}),n.tui.modal.openModal({kind:`info`,title:j.t(`cmd.titleAbout`),lines:[],dataListEntries:c})}async function Mi(e,t){return e.tui.modal.openModal({kind:`input`,...t})}function Ni(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 Pi(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 d({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 Mi(t,{title:j.t(`cmd.feedbackStepTitle`)});if(!o||o.trim().length===0)return;let s=await Mi(t,{title:j.t(`cmd.feedbackStepRepro`)})??void 0,c=await Mi(t,{title:j.t(`cmd.feedbackStepExpected`)})??void 0,l=await Mi(t,{title:j.t(`cmd.feedbackStepActual`)})??void 0,u=f(t.state.session.model?.id),p={title:o.trim(),reproduce:s,expected:c,actual:l,envInfo:u,repo:a},m=[s,c,l].filter(Boolean).join(`
|
|
16
|
+
`),layout:`buttons`,options:[{label:j.t(`cmd.pluginInstallConfirmAction`),value:`install`,color:`accent`},{label:j.t(`cmd.commonCancel`),value:`cancel`,color:`gray`}],onSelect:e=>t(e===`install`),onCancel:()=>t(!1)})})}async function li(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 s=o[e]?.pkg??e,c=Te(s),l;if(!c)try{i?.(`Downloading from npm registry`);let e=await new w().install(s,{global:!0,as:`plugin`,postInstallExecutor:se});e.success&&e.targetPath?(c=e.targetPath,l={id:e.name??s,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:s})),!1;let u=ye(c);if(!r&&!await ci(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 ge({pkg:s})}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 Se(t.app.settings,{id:d.id,source:`npm`,sourceSpec:s,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`),ke(d.dir),he(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-5ZoxtH0J.js`);await e(t)}catch{}return!0}if(!r){await new Promise(e=>setImmediate(e));let{handleModel:e}=await Promise.resolve().then(()=>fi);await e([],t)}return!0}async function ui(e,t){t.tui.panes.togglePane(`backgroundTasks`)}async function di(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 r=e[0]?.toLowerCase();if(r===`trust`)return Wr(e.slice(1),t);if(r===`install`)return c(e.slice(1),t);if(r===`registry`)return u(e.slice(1),t);if(r===`search`)return l(e.slice(1),t);if(r===`update`)return ei([`--check`],t);if(r===`reload`)return Pn(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;de(a,{open:e=>_e(e),runCommand:async(e,n)=>{let{dispatchSlashCommand:r}=await Promise.resolve().then(()=>Ua);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(()=>Ua);await e(`extension`,[`install`,...a],t)})().catch(e=>i(j.t(`cmd.titlePlugin`),e instanceof Error?e.message:String(e)))},onCancel:()=>o()})},d=e=>{let n=t.app.skillRegistry?.get(e);if(!n){o();return}let r=n.status!==`disabled`,s=n.definition.metadata,c=[{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:ii(n.source.type,n.source.id)}),tone:`muted`},...ni(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&&c.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`},...ri(n.source.type,n.source.root)?[{label:j.t(`cmd.uninstallActionLabel`),value:`uninstall`,color:`red`}]:[]],dataListEntries:c,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)}))}d(e);return}if(s===`uninstall`){let r=ri(n.source.type,n.source.root);if(!r)return;await Zn({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 Zn({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`?d(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,r,s,c,l)=>{let u=t.app.workspaceDir??process.cwd(),d=n({cwd:u,homedir:_()}).find(t=>t.id===e);if(!d){o();return}let f=pe(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),v=g.length?` ${g.join(`, `)}`:` —`,ee=(t.app.getPluginPanelRegistrations?.()??[]).filter(t=>t.pluginId===e),y=ai({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:r?j.t(`cmd.extDisableLabel`):j.t(`cmd.extEnableLabel`),value:`toggle`,color:r?`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=ie(d,{"extension.id":e,"extension.enabled":r,"extension.trusted":f.trusted,"extension.scope":d.scope,"extension.category":`plugin`}),x=d.manifest.contributes,S=we(re.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=>_e(e),runCommand:async(e,n)=>{let{dispatchSlashCommand:r}=await Promise.resolve().then(()=>Ua);await r(e,n?n.split(/\s+/).filter(Boolean):[],t)},runScript:async e=>{if(pe(d).gated){i(j.t(`cmd.titlePlugin`),j.t(`cmd.extPluginUntrusted`));return}await De(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(We(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 ae=()=>{let n=t.app.pluginHealthTracker?.query(e)??{hookTimeouts:0,toolTimeouts:0},r=be(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:v.trim()||`—`},...y?[{kind:`row`,label:j.t(`cmd.extPluginLabelContributions`),value:y}]:[],{kind:`row`,label:j.t(`cmd.extPluginLabelStatus`),value:r?j.t(`cmd.extEnableLabel`):j.t(`cmd.extDisableLabel`),tone:r?`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:r?`enabled`:`disabled`}),meta:`plugin · ${d.scope}`,metaStatus:{label:r?j.t(`cmd.extEnableLabel`):j.t(`cmd.extDisableLabel`),enabled:r},metaSuffix:p,actions:b,panelInfo:w?{title:w.title,modulePath:w.modulePath,exportName:w.exportName,pluginId:e}:void 0,dataListEntries:[...se,...T??oe],...ae(),onRefresh:()=>m(e,r,s,c),onAction:async n=>{if(n.startsWith(`contrib:`)){let t=ne.get(n.slice(8));if(t)try{await de(t,C)}catch(e){a(j.t(`cmd.extToggleFailed`,{err:e instanceof Error?e.message:String(e)}))}m(e,r,s,c)}else if(n===`trust`)si(t,d);else if(n===`untrust`){try{Me(d.dir)}catch(t){m(e,r,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,r,s,c,{kind:`success`,message:j.t(`cmd.pluginUntrusted`,{id:e})})})}else if(n===`toggle`)try{await t.app.extensions.setEnabled(`plugin`,e,!r);try{await t.app.reloadCapabilities(),m(e,!r,s,c,{kind:`success`,message:j.t(`cmd.extToggled`,{name:s,verb:r?`Disabled`:`Enabled`,seg:``})})}catch(t){m(e,!r,s,c,{kind:`error`,message:j.t(`cmd.extToggleReloadFailed`,{verb:r?`Disabled`:`Enabled`,name:s,err:t instanceof Error?t.message:String(t)})})}}catch(t){m(e,r,s,c,{kind:`error`,message:j.t(`cmd.extToggleFailed`,{err:t instanceof Error?t.message:String(t)})})}else if(n===`feishu-reconfigure`)try{let{launchFeishuSetup:e}=await import(`./feishu-setup-5ZoxtH0J.js`);await e(t),i(`plugin-feishu-use`,`配置完成。`)}catch(e){a(`feishu-use 配置向导失败:${e instanceof Error?e.message:String(e)}`)}else n===`reload`?t.app.reloadCapabilities?.().then(t=>{m(e,r,s,c,{kind:`success`,message:j.t(`cmd.pluginTrusted`,{id:e,count:t.mcpTools})})}).catch(t=>{m(e,r,s,c,{kind:`error`,message:j.t(`cmd.compatReloadFailed`,{err:t instanceof Error?t.message:String(t)})})}):n===`uninstall`&&await Zn({name:e,type:`plugin`,scope:d.scope===`project`||d.scope===`repository`?d.scope:`global`,ctx:t,onDone:()=>o()})},onClose:()=>o()})};o()}var fi=St({handleLogout:()=>yi,handleModel:()=>_i,handleProviderAuth:()=>Y,handleProviderLogout:()=>vi,handleServiceLogin:()=>bi,handleServiceLogout:()=>xi});const pi=`__otto_model_login__`,mi=`__otto_model_setkey__`,hi=`__otto_model_grant_capability__`,gi=`__otto_model_install_plugin__`;async function _i(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:gi}]:h?[{label:j.t(`model.goLogin`),value:pi},{label:j.t(`model.setKey`),value:mi}]:[],..._>0?[{label:j.t(`model.goGrantCapability`),value:hi}]:[]]: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===pi){await Y([],t,{method:`oauth`});return}if(e===mi){await Y([],t,{method:`key`});return}if(e===hi){await J([],t);return}if(e===gi){let{EXTENSION_ALIASES:e}=await import(`./extension-CTyrcdT1.js`),{runPluginInstall:n}=await Promise.resolve().then(()=>ti),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 vi(e.slice(1),t);if(e.includes(`--service`))return bi(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??gt(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(Fe(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:()=>{Fe(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 vi(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??gt(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 yi(e,t){e[0]&&e[0]!==`--service`||await xi([],t)}async function bi(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 xi(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 wi(e.slice(1),t);if(n===`cache`||n===`cache-stats`)return Ti(e.slice(1),t);if(n===`diagnose`)return Fn(e.slice(1),t);if(n===`services`)return $r(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=Ee(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 Si(){let e=process.env.OTTO_NOTIFY_COALESCE_WARN_RATIO,t=e?Number(e):NaN;return Number.isFinite(t)&&t>=1?t:1.5}function Ci(e,t){return t===0?`healthy`:e<Si()?`warning`:`healthy`}async function wi(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:Ci(r,n.coalescedCalls)}});let i=t.app.activePlugins();try{let e=await oe(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 Ti(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:ht(t,e.api)}}),i=r.some(e=>e.hitRatio!==null),a={inputTokens:n.totalInputTokens,outputTokens:0,cacheReadTokens:n.totalCacheReadTokens,cacheWriteTokens:n.totalCacheWriteTokens},o=i?ht(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 Ei(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 Di(e){return new Date(e*1e3).toLocaleString()}async function Oi(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:$e(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:Di(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 ki=async(e,t)=>{let n=e[0];switch(n){case`memory-sync`:return Ai(e.slice(1),t);default:t.tui.info.showToast(`Workspace`,`/workspace ${n??``} — unknown subcommand. Use: memory-sync [status|enable|disable]`)}};async function Ai(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 ji(t,n){let r=n.state.session,i=r.model?.id??j.t(`cmd.aboutModelNotSet`),a=h().length,o=Math.round(y()/(1024*1024*1024)),s=Math.round(g()/(1024*1024)),c=[{kind:`group`,title:j.t(`cmd.aboutGroupVersion`)},{kind:`row`,label:j.t(`cmd.aboutVersion`),value:`${ze} (build ${Le})`},{kind:`row`,label:j.t(`cmd.aboutBranch`),value:`dev`},{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} · ${v()} ${m()} · ${ee()}`,tone:`muted`},{kind:`row`,label:j.t(`cmd.aboutCPU`),value:`${a} cores`,tone:`muted`},{kind:`row`,label:j.t(`cmd.aboutMemory`),value:`${o} GB total / ${Math.round(s)} 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:i,tone:`secondary`}];r.id&&c.push({kind:`row`,label:j.t(`cmd.aboutSession`),value:r.id.slice(0,8)}),c.push({kind:`blank`},{kind:`text`,value:j.t(`cmd.aboutUpdateHint`),tone:`muted`}),n.tui.modal.openModal({kind:`info`,title:j.t(`cmd.titleAbout`),lines:[],dataListEntries:c})}async function Mi(e,t){return e.tui.modal.openModal({kind:`input`,...t})}function Ni(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 Pi(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 d({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 Mi(t,{title:j.t(`cmd.feedbackStepTitle`)});if(!o||o.trim().length===0)return;let s=await Mi(t,{title:j.t(`cmd.feedbackStepRepro`)})??void 0,c=await Mi(t,{title:j.t(`cmd.feedbackStepExpected`)})??void 0,l=await Mi(t,{title:j.t(`cmd.feedbackStepActual`)})??void 0,u=f(t.state.session.model?.id),p={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 Ni(t,j.t(`cmd.feedbackConfirmTitle`),j.t(`cmd.feedbackConfirmMessage`,{title:p.title,bodyPreview:m})))return;if(t.tui.info.showToast(j.t(`cmd.titleFeedback`),j.t(`cmd.feedbackChannelSubmitting`)),n.submitIssueViaGh){let e=await n.submitIssueViaGh(p);if(e.ok){t.tui.info.showToast(j.t(`cmd.titleFeedback`),j.t(`cmd.feedbackCreated`,{url:e.url}));return}}let h=n.buildIssueUrl?.(p);if(!h){t.tui.info.showToast(j.t(`cmd.titleFeedback`),j.t(`cmd.feedbackUnavailable`));return}Fe(h),t.tui.info.showToast(j.t(`cmd.titleFeedback`),j.t(`cmd.feedbackCreated`,{url:h}))}function Fi(e,t,n){let r=Te(e,t);if(r)return r;let i=e.split(`/`).pop();if(i)return ue({cwd:t??process.cwd(),homedir:n??_()}).find(e=>e.id===i)?.dir}function Ii(e,t,n){try{let r=Fi(e,t,n);if(!r)return;let i=O(r,T),a=ve(We(i,`utf-8`),i);return a?a.codeProviderIds?.[0]??a.contributes?.providers?.[0]?.id??a.contributes?.oauth?.[0]?.id:void 0}catch{return}}function Li(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 Ri={provider:`install-provider`,authentication:`connect-provider`,model:`choose-model`,ready:`send-first-prompt`,"first-prompt":`none`};function zi(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 Bi(e){let t=zi(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:Ri[t],stage:t,autoOpen:o}}}function Vi(e){return e.stage===`ready`||e.stage===`first-prompt`}function Hi(e,t){return e.get(t)===!0}function Ui(e){return{personalizationSeen:Hi(e,`has_completed_onboarding`),dismissed:Hi(e,`has_completed_wizard`)||Hi(e,`wizard_dont_show_again`),firstPromptSubmitted:typeof e.get(`first_prompt_submitted_at`)==`number`}}const Wi=`__otto_setup__`;async function Gi(e){let t=Ui(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!==Wi),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!==Wi?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 Bi({providerInstalled:e.hasProviderPlugin(),...e.providerCandidates?{providerCandidates:e.providerCandidates}:{},connectedProviderIds:r,usableModelIds:a,...o!==void 0&&o!==Wi?{selectedModelId:o}:{},...c===void 0?{}:{selectedModelUsableInMainSession:c},firstPromptSubmitted:t.firstPromptSubmitted,dismissed:t.dismissed})}function Ki(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 qi=class{snapshot=null;listeners=new Set;constructor(e){this.deps=e}current(){return this.snapshot}async refresh(){let e=await Gi(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 Ji(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 Yi(e,t){return e.map((e,n)=>({provider:e,index:n,rank:Ji(e,t)})).sort((e,t)=>e.rank-t.rank||e.index-t.index).map(e=>e.provider)}function Xi(e){try{let{createRequire:t}=Ct(`node:module`),{readFileSync:n}=Ct(`node:fs`),{dirname:r,join:i}=Ct(`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 Zi(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=Qi(t);return t.map(e=>({...e,recommended:e.usable&&e.id===n}))}function Qi(e){return e.find(e=>e.usable)?.id}const $i={hasReadme:!1,hasPackageManifest:!1,hasTestConfig:!1,isEmpty:!1},ea=new Set([`node_modules`,`.git`,`.hg`,`.svn`,`.venv`,`venv`,`__pycache__`,`.pytest_cache`,`.mypy_cache`,`.tox`,`dist`,`build`,`.next`,`.nuxt`,`.cache`,`.DS_Store`]),ta=/^readme(\.(md|markdown|txt|rst))?$/i,na=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`]),ra=/^(jest\.config|vitest\.config|karma\.conf|\.mocharc)(\.(js|ts|mjs|cjs|json))?$/i,ia=new Set([`pytest.ini`,`tox.ini`,`phpunit.xml`,`phpunit.xml.dist`,`setup.cfg`]);async function aa(e,t){let n;try{n=await t.readdir(e)}catch{return $i}let r=n.filter(e=>!ea.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&&ta.test(e.name)&&(a=!0),!o&&na.has(e.name)&&(o=!0),!s&&(ia.has(e.name)||ra.test(e.name))&&(s=!0),a&&o&&s)))break;return{hasReadme:a,hasPackageManifest:o,hasTestConfig:s,isEmpty:i}}function oa(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 sa=`oxygen-provider`,ca=new Set([`plugin-oxygen`,sa]);async function la(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=>ca.has(e.id)||e.source===`@x-otto/plugin-oxygen`||e.source.includes(`/plugin-oxygen`)||e.subPath?.endsWith(`plugin-oxygen`)))}catch{return!1}}async function ua(e){let t=e.tui,n=e.app,r=await Gi(Ki({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 s=(()=>{for(let e=0;e<3;e++)if(!a.includes(e))return e;return 3})(),c=await la(e),l=Object.entries(o).filter(([e,t])=>t.capabilities.includes(`provider`)&&(e!==sa||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=Yi(l.map(([e,t])=>({id:e,...Xi(t.pkg)})),process.env).map(({id:e})=>({label:e,value:e,detail:u[e]??o[e]?.pkg??e})),f=e=>Li(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 Gi(Ki({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 Zi((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=oa(await aa(n.workspaceDir,{readdir:e=>st(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:s,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(()=>ti),i=!1,a=await r(t,e,{autoTrust:!0,onProgress:e=>n(`${e}…`),onPendingCapabilities:()=>{i=!0}}),s=o[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=Fi(s);t&&(c=e(t))}catch{}return{ok:!0,providerId:Ii(s),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 da(e,t){await ua(t)}let fa;function pa(e){fa=e}const ma=async(e,t)=>{let n=fa;if(!n){t.tui.info.showToast(`Schedule`,`Schedule system not available`);return}let r=e[0];switch(r){case void 0:return ha(t);case`list`:return ga(n,t);case`add`:return va(e.slice(1),n,t);case`remove`:return ya(e[1],n,t);case`run`:return ba(e[1],n,t);case`enable`:return Sa(e[1],!0,n,t);case`disable`:return Sa(e[1],!1,n,t);case`logs`:return Ca(e[1],t);case`cancel`:return xa(e[1],t);default:t.tui.info.showToast(`Schedule`,`/schedule ${r} — unknown subcommand. Use: add|list|remove|run|enable|disable|cancel|logs`)}};async function ha(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 ga(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 _a(e){if(e.length>=5){let t=e.slice(0,5).join(` `);try{return bt(t),{cron:t,prompt:e.slice(5).join(` `)}}catch{}}return{cron:e[0]??``,prompt:e.slice(1).join(` `)}}async function va(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`),ha(n);return}let{cron:c,prompt:l}=_a(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 ya(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 ba(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 xa(e,t){let n=fa;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 Sa(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 Ca(e,t){let n=Ve(Re,`schedule-logs`),r;try{r=Ke(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=We(Ve(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 ln(e.state.session.session.getDrafts()??[])}function wa(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 Ta=async(e,t)=>{let n=e[0];switch(n){case void 0:case`list`:return Ea(e.slice(1),t);case`save`:return Da(e.slice(1),t);case`load`:return Oa(e.slice(1),t);case`delete`:case`remove`:return ka(e.slice(1),t);default:t.tui.info.showToast(`Draft`,`/draft ${n} — unknown subcommand. Use: save|list|load|delete`)}};async function Ea(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 Da(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=dn(a,o,s),l=fn([...s,c]);try{wa(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 Oa(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 ka(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{wa(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 Aa=async(e,t)=>{let n=e[0];switch(n){case void 0:case`list`:return ja(t);case`remove`:return Ma(e[1],t);case`move`:return Na(e[1],e[2],t);case`clear`:return Pa(t);default:t.tui.info.showToast(`Queue`,`/queue ${n} — unknown subcommand. Use: list|remove|move|clear`)}};async function ja(e){e.tui.panes.togglePane(`queuePane`,!0)}async function Ma(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 Na(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 Pa(e){e.tui.panes.clearQueue(),e.tui.info.showToast(`Queue`,`Queue cleared`)}const Fa=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`)),Ia(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`))),Ia(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`)),Ia(t);return}t.tui.info.showToast(j.t(`cmd.titleInfo`),j.t(`cmd.nothingToPause`))};function Ia(e){let t=e.callbacks.refreshSlashCommands?.();t&&e.tui.plugins.setCommands(t)}function La(e){let t;try{let n=Ue(e,`r`);try{t=Buffer.alloc(512);let e=Ge(n,t,0,512,0);t=t.subarray(0,e)}finally{He(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 Ra(e){return e>=1048576?`${(e/1048576).toFixed(1)} MB`:e>=1024?`${(e/1024).toFixed(1)} KB`:`${e} B`}function za(e){let t;try{t=Ke(e)}catch{return[]}let n=[];for(let r of t)try{let t=qe(O(e,r));n.push({name:r,isDir:t.isDirectory(),size:t.isDirectory()?void 0:t.size})}catch{}return n}function Ba(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=Ba(za(n)),a=Be(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:Ra(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=qe(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}Va(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 Va(e,t,n,r){if(La(t)){e.tui.info.showToast(j.t(`cmd.titleOpen`),j.t(`cmd.openBinaryRejected`,{path:n}));return}let{content:i,truncated:a}=await Ie(t);e.tui.modal.openModal({kind:`fileViewer`,path:n,content:i,preTruncated:a,onDismiss:r??(()=>{})})}async function Ha(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=Ve(n,r),o=Be(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)&&qe(e).isDirectory()){Q(t,n,e,i);return}t.tui.info.showToast(j.t(`cmd.titleOpen`),j.t(`cmd.openNotFound`,{path:r}));return}if(qe(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 Va(t,a,r)}var Ua=St({DISPATCHABLE_COMMAND_NAMES:()=>qa,ENGINE_BUILTIN_COMMANDS:()=>Ka,HELP_GROUP_ORDER:()=>Wa,SAFE_COMMAND_NAMES:()=>Ga,SLASH_COMMANDS:()=>$,dispatchSlashCommand:()=>Ja,handleMemory:()=>kn});const Wa=[`session`,`model`,`agent`,`debug`,`ui`,`other`],$=[{name:`clear`,handler:jn,engineBuiltin:!0,group:`session`,description:`Clear screen and reset interface state`},{name:`compact`,handler:(e,t)=>W([`compact`,...e],t),group:`session`,tuiHidden:!0,deprecated:!0,description:`/session compact (deprecated alias)`},{name:`memory`,aliases:[`mem`],handler:kn,group:`session`,description:`Project + user memory: /memory [user|project|<name>|forget <name>]`},{name:`workspace`,handler:ki,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:Ha,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:_i,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:Oi,safe:!0,engineBuiltin:!0,group:`model`,description:`Show provider usage quota snapshot (Anthropic OAuth subscription plans only)`},{name:`logout`,handler:yi,group:`model`,description:`Sign out of your otto account (removes local account identity); /logout`},{name:`job`,handler:di,safe:!0,group:`agent`,description:`Start a background agent job: /job <directive> (worktree-isolated, full tools incl. MCP)`},{name:`schedule`,handler:ma,safe:!0,group:`agent`,description:`Manage scheduled tasks: /schedule add|list|remove|run|enable|disable <args>`},{name:`delegates`,handler:ui,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)=>W([`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:Ei,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:Wn,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:Kn,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:Tr,safe:!0,group:`ui`,description:`Switch reasoning effort level (/effort [low|medium|high|xhigh|max])`},{name:`preference`,aliases:[`pref`],handler:Dr,safe:!0,group:`ui`,description:`Preferences: /preference [general|lang|theme|keybindings|shortcuts|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:Zr,group:`ui`,description:`Toggle the notification center panel (≡ ctrl+n)`},{name:`draft`,handler:Ta,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:Aa,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)=>Dr([`keybindings`,...e],t),safe:!0,group:`ui`,tuiHidden:!0,deprecated:!0,description:`/preference keybindings (deprecated alias)`},{name:`shortcuts`,handler:(e,t)=>Dr([`shortcuts`,...e],t),safe:!0,group:`ui`,tuiHidden:!0,deprecated:!0,description:`/preference shortcuts (deprecated alias)`},{name:`proxy`,handler:(e,t)=>Dr([`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)=>Yr(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:Fa,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)=>W([`resume`,...e],t),group:`other`,tuiHidden:!0,deprecated:!0,description:`/session resume (deprecated alias)`},{name:`rename`,handler:Mn,safe:!0,group:`session`,description:`Set a custom title for the current session (/rename <new title>)`},{name:`a2ui-action`,handler:Un,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 ei(e,t);return}await Jr(e,t)||await Kr(e,t)}},{name:`about`,handler:ji,safe:!0,group:`other`,description:`Show version, build, and environment info (/about)`},{name:`setup`,handler:da,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:Gr,safe:!0,group:`other`,description:`View / clear the always-allow list (/permissions [clear])`},{name:`feedback`,handler:Pi,group:`other`,description:`Report an issue or send feedback via GitHub (/feedback [--repo <owner/repo>])`},{name:`archive`,aliases:[`unarchive`],handler:(e,t)=>W([`archive`,...e],t),safe:!0,tuiHidden:!0,deprecated:!0,description:`/session archive (deprecated alias)`},{name:`session`,handler:W,description:`Session management: /session [fork|unlock|kill|inspect|pin|archive|resume|compact|context] (RFC-369)`},{name:`fork`,handler:Jn,safe:!0,description:`Fork current session into a named branch`},{name:`pin`,aliases:[`unpin`],handler:(e,t)=>W([`pin`,...e],t),safe:!0,tuiHidden:!0,deprecated:!0,description:`/session pin (deprecated alias)`},{name:`history`,aliases:[`hist`],handler:Xr,safe:!0,description:`Open history search panel (same panel as Ctrl+R)`},{name:`prompts`,handler:Qr,safe:!0,description:`View prompt log (list of submitted prompts this session)`}],Ga=new Set($.filter(e=>e.safe).flatMap(e=>[e.name,...e.aliases??[]])),Ka=new Set($.filter(e=>e.engineBuiltin).flatMap(e=>[e.name,...e.aliases??[]])),qa=new Set($.filter(e=>e.handler).flatMap(e=>[e.name,...e.aliases??[]]));async function Ja(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{ft as $,or as A,Je as B,pr as C,sr as D,hr as E,mn as F,nn as G,nt as H,fn as I,L as J,Gt as K,dn as L,yn as M,V as N,ar as O,pn as P,Wt as Q,ln as R,G as S,mr as T,R as U,Xe as V,rn as W,qt as X,Kt as Y,Xt as Z,Er as _,Ua as a,Ot as at,yr as b,aa as c,Ki as d,zt as et,Vi as f,ti as g,fi as h,$ as i,kt as it,Dn as j,ir as k,oa as l,Y as m,Ka as n,Mt as nt,Ja as o,St as ot,_i as p,Jt as q,Ga as r,At as rt,pa as s,qa as t,jt as tt,qi as u,vr as v,dr as w,gr as x,xr as y,cn as z};
|
|
21
|
-
//# sourceMappingURL=command-dispatcher-
|
|
21
|
+
//# sourceMappingURL=command-dispatcher-Dxj41r5P.js.map
|