@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.
Files changed (60) hide show
  1. package/dist/build-id-D_JURZdd.js +3 -0
  2. package/dist/build-id-D_JURZdd.js.map +1 -0
  3. package/dist/bundled-extensions/plugin-otto-wire-protocols/plugin-dist/meta.json +1 -1
  4. package/dist/bundled-extensions/plugin-otto-wire-protocols/plugin-dist/plugin.cjs +2 -1
  5. package/dist/bundled-extensions/plugin-otto-wire-protocols/src/openai-responses.ts +5 -1
  6. package/dist/{command-dispatcher-DhcLUPR5.js → command-dispatcher-Dxj41r5P.js} +4 -4
  7. package/dist/{command-dispatcher-DhcLUPR5.js.map → command-dispatcher-Dxj41r5P.js.map} +1 -1
  8. package/dist/{daemon-base-Bc9p51Um.js → daemon-base-Y1XI61JY.js} +1 -1
  9. package/dist/{daemon-base-Bc9p51Um.js.map → daemon-base-Y1XI61JY.js.map} +1 -1
  10. package/dist/{doctor-lT2QhG2q.js → doctor-DXBLkbkP.js} +9 -9
  11. package/dist/doctor-DXBLkbkP.js.map +1 -0
  12. package/dist/{doctor-attach-_zeIJewx.js → doctor-attach-DEMuyBOk.js} +2 -2
  13. package/dist/{doctor-attach-_zeIJewx.js.map → doctor-attach-DEMuyBOk.js.map} +1 -1
  14. package/dist/{doctor-cdp-K_mIFRfA.js → doctor-cdp-CnJUVNOB.js} +1 -1
  15. package/dist/{doctor-cdp-K_mIFRfA.js.map → doctor-cdp-CnJUVNOB.js.map} +1 -1
  16. package/dist/{doctor-heap-Rr2nNvcw.js → doctor-heap-Eu3LZj-F.js} +2 -2
  17. package/dist/{doctor-heap-Rr2nNvcw.js.map → doctor-heap-Eu3LZj-F.js.map} +1 -1
  18. package/dist/{doctor-ps-OL3FGQYu.js → doctor-ps-JBgCH77n.js} +2 -2
  19. package/dist/{doctor-ps-OL3FGQYu.js.map → doctor-ps-JBgCH77n.js.map} +1 -1
  20. package/dist/export-trajectory-D-BcH0Wt.js +14 -0
  21. package/dist/export-trajectory-D-BcH0Wt.js.map +1 -0
  22. package/dist/{feedback-BQ_oz5nh.js → feedback-CYFY2MC4.js} +2 -2
  23. package/dist/{feedback-BQ_oz5nh.js.map → feedback-CYFY2MC4.js.map} +1 -1
  24. package/dist/feedback-D7Po4mlE.js +2 -0
  25. package/dist/{feishu-setup-B6ETf-8Y.js → feishu-setup-5ZoxtH0J.js} +1 -1
  26. package/dist/{feishu-setup-B6ETf-8Y.js.map → feishu-setup-5ZoxtH0J.js.map} +1 -1
  27. package/dist/{ftue-doctor-recovery-DeAf8jVo.js → ftue-doctor-recovery-8FeDBFOc.js} +1 -1
  28. package/dist/{ftue-doctor-recovery-DeAf8jVo.js.map → ftue-doctor-recovery-8FeDBFOc.js.map} +1 -1
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +4 -4
  31. package/dist/index.js.map +1 -1
  32. package/dist/{mcp-9P_AmnDk.js → mcp-Cm4-OhXI.js} +1 -1
  33. package/dist/{mcp-9P_AmnDk.js.map → mcp-Cm4-OhXI.js.map} +1 -1
  34. package/dist/{mcp-server-BK4L-YBN.js → mcp-server-Dpza3yn2.js} +1 -1
  35. package/dist/{mcp-server-BK4L-YBN.js.map → mcp-server-Dpza3yn2.js.map} +1 -1
  36. package/dist/{migrate-DDNkik_0.js → migrate-RlBJqJnB.js} +1 -1
  37. package/dist/{migrate-DDNkik_0.js.map → migrate-RlBJqJnB.js.map} +1 -1
  38. package/dist/{observe-CzIv09hO.js → observe-Dxfud-t7.js} +1 -1
  39. package/dist/{observe-CzIv09hO.js.map → observe-Dxfud-t7.js.map} +1 -1
  40. package/dist/parse-cli-BSJEQtBo.js +3 -0
  41. package/dist/parse-cli-BSJEQtBo.js.map +1 -0
  42. package/dist/{persistence-DOaizHMA.js → persistence-CRFhOYx6.js} +2 -2
  43. package/dist/{persistence-DOaizHMA.js.map → persistence-CRFhOYx6.js.map} +1 -1
  44. package/dist/{plugin-assembly-check-Ov17ra7G.js → plugin-assembly-check-DEozmcJ7.js} +1 -1
  45. package/dist/{plugin-assembly-check-Ov17ra7G.js.map → plugin-assembly-check-DEozmcJ7.js.map} +1 -1
  46. package/dist/{ps-BovE9XMQ.js → ps-DiKCLKbs.js} +1 -1
  47. package/dist/{ps-BovE9XMQ.js.map → ps-DiKCLKbs.js.map} +1 -1
  48. package/dist/{run-attach-z7YECztf.js → run-attach-DDpMk2_N.js} +1 -1
  49. package/dist/{run-attach-z7YECztf.js.map → run-attach-DDpMk2_N.js.map} +1 -1
  50. package/dist/{serve-DaxogAZ5.js → serve-Ke0nwN9Y.js} +2 -2
  51. package/dist/{serve-DaxogAZ5.js.map → serve-Ke0nwN9Y.js.map} +1 -1
  52. package/dist/{version-Eh8zZKgk.js → version-BKPdYoHG.js} +2 -2
  53. package/dist/{version-Eh8zZKgk.js.map → version-BKPdYoHG.js.map} +1 -1
  54. package/package.json +12 -12
  55. package/dist/build-id-ClyMIKLy.js +0 -3
  56. package/dist/build-id-ClyMIKLy.js.map +0 -1
  57. package/dist/doctor-lT2QhG2q.js.map +0 -1
  58. package/dist/feedback-C2Hdxp1y.js +0 -2
  59. package/dist/parse-cli-3fWEIMWc.js +0 -3
  60. package/dist/parse-cli-3fWEIMWc.js.map +0 -1
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ const e=5104,t=`e2879c422`;export{e as n,t};
3
+ //# sourceMappingURL=build-id-D_JURZdd.js.map
@@ -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":"831e810b41c3acebde9f13d0dd7806e131e5416a6e5839634af534ace7f0a693"}
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
- state.stopReason = "max_tokens";
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
- state.stopReason = 'max_tokens'
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-ClyMIKLy.js";import{t}from"./version-Eh8zZKgk.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-BQ_oz5nh.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+`
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-B6ETf-8Y.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-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-DhcLUPR5.js.map
21
+ //# sourceMappingURL=command-dispatcher-Dxj41r5P.js.map