@x-otto/coding 0.0.1-alpha.20 → 0.0.1-alpha.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -477,7 +477,7 @@ export const TabScope = T.TabScope
477
477
  If the image is not a UI/design screenshot, give a normal concise description instead. Do not speculate beyond what's visible.`;var Pf=class{cache=new Map;constructor(e){this.deps=e}describeImages=async(e,t)=>{let n=await this.resolveVisionModel();return n?Promise.all(e.map(e=>this.describeOne(n,e,t))):e.map(()=>null)};async resolveVisionModel(){let e=this.deps.getModelRegistry(),t=this.deps.getVisionSlotCandidates()??[];for(let n of t){let t=e.tryResolve(n);if(t&&await this.isUsable(t))return t}for(let t of e.getAll())if(t.strengths?.includes(`vision`)&&await this.isUsable(t))return t}async isUsable(e){try{return(await this.deps.isModelUsable(e)).usable}catch{return!1}}async describeOne(e,t,n){let r=this.hashImage(t.source),i=this.cache.get(r);if(i)return this.formatDescription(e,i.description);try{let i=await this.callVisionModel(e,t,n);return i?(this.rememberInCache(r,i),this.formatDescription(e,i)):null}catch(t){return this.deps.logger.debug({error:t,modelId:e.id},`vision delegate describe failed`),null}}async callVisionModel(e,t,n){let r=this.deps.providerRegistry.get(e.api),i={role:`user`,timestamp:Date.now(),content:[{type:`text`,text:t.contextHint?`${Nf}\n\nContext: ${t.contextHint}`:Nf},{type:`image`,mime:t.mime,source:t.source}]},a=new AbortController,o=setTimeout(()=>a.abort(),3e4),s=n?AbortSignal.any([n,a.signal]):a.signal;try{return(await te(e,r,{model:e,systemPrompt:``,messages:[i],maxTokens:800},{signal:s})).content.filter(e=>e.type===`text`).map(e=>e.text).join(``).trim()||void 0}finally{clearTimeout(o)}}formatDescription(e,t){return`[image seen by vision model ${e.id}]\n${t}`}hashImage(e){return Fi(`sha256`).update(e).digest(`hex`)}rememberInCache(e,t){if(this.cache.size>=100){let e=this.cache.keys().next().value;e!==void 0&&this.cache.delete(e)}this.cache.set(e,{description:t})}};function Ff(e){let t=e?.slots?.vision;if(t)return Array.isArray(t)?t:[t]}function If(e,t){globalThis[e]||Object.defineProperty(globalThis,e,{value:Object.freeze(t()),writable:!1,configurable:!1})}var Lf=class{_callMcpTool=null;get callMcpTool(){if(!this._callMcpTool)throw Error(`PanelRuntime not installed — call installPanelRuntime() during App startup`);return this._callMcpTool}install(e){this._callMcpTool=e,If(`__ottoPanelRuntime`,()=>({callMcpTool:(e,t,n)=>this.callMcpTool(e,t,n),usePluginData:Rf(this)}))}};function Rf(e){return function(t,n,r=5e3){let i=globalThis.React;if(!i||typeof i.useState!=`function`)throw Error(`usePluginData requires React runtime. Panel components must be rendered in a React (Ink) context.`);let[a,o]=i.useState(void 0),[s,c]=i.useState(!0),[l,u]=i.useState(void 0),d=i.useCallback(async()=>{c(!0);try{let r=await e.callMcpTool(t,n,{});if(r.isError){u(`MCP tool returned error`);return}let i=r.content?.find(e=>e.type===`text`);if(i?.text){try{o(JSON.parse(i.text))}catch{o(i.text)}u(void 0)}else o(void 0),u(`MCP tool returned no text content`)}catch(e){u(e instanceof Error?e.message:String(e))}finally{c(!1)}},[t,n]);return i.useEffect(()=>{d();let e=setInterval(()=>void d(),r);return()=>clearInterval(e)},[d,r]),{data:a,loading:s,error:l,callTool:i.useCallback(async(n,r)=>{try{return{success:!(await e.callMcpTool(t,n,r??{})).isError}}catch(e){return{success:!1,error:e instanceof Error?e.message:String(e)}}},[t])}}}const zf=new Lf;function Bf(e){zf.install(e)}const Vf=`backend/`;function Hf(e){return e.startsWith(Vf)?e:`${Vf}${e}`}var Uf=class{fns=null;get(){return this.fns}install(e){this.fns=e,If(`__ottoPanelBackendRuntime`,()=>({usePanelBackend:Gf(this)}))}};function Wf(){return globalThis.__ottoCurrentPanelPluginId}function Gf(e){return function(){let t=globalThis.React;if(!t||typeof t.useState!=`function`)throw Error(`usePanelBackend requires React runtime. Panel components must be rendered in a React (Ink) context.`);let n=Wf(),r=e.get(),[i,a]=t.useState(void 0),[o,s]=t.useState(n&&r?r.getStatus(n):`disabled`);return t.useEffect(()=>{if(!n||!r)return;s(r.getStatus(n));let e=r.subscribeState(n,e=>{a(e)}),t=r.onStatusChange(n,s);return()=>{e(),t()}},[n]),{call:t.useCallback(async(e,t,i)=>{if(!n||!r)throw Error(`usePanelBackend: no plugin context available (panel must be rendered inside a plugin detail view with backend runtime installed)`);return r.call(n,Hf(e),t,i)},[n]),cancel:t.useCallback(e=>{!n||!r||r.cancel(n,e)},[n]),state:i,status:o}}}const Kf=new Uf;function qf(e){Kf.install(e)}function Jf(){let e=process.env.LC_ALL||process.env.LC_MESSAGES||process.env.LANG||``;return/zh/i.test(e)?`zh`:`en`}function Yf(e){return!e||e===`auto`?Jf():e}var Xf=class{loadedPluginIds=[];previousSnapshot=[];constructor(e){this.deps=e}async reload(){let e=0,t=0,n=[],r=new Map;for(let e of this.deps.activePlugins()){let i=!!e.manifest.contributes?.oauth?.length,a=!!e.manifest.contributes?.providers?.length;if(!i&&!a)continue;let o=O(e);if(o.gated){this.deps.logger.warn({pluginId:e.id},`project plugin not trusted, skipping declarative providers (fail-closed, RFC-124 C1)`),t+=(e.manifest.contributes?.providers?.length??0)+(e.manifest.contributes?.oauth?.length??0);continue}if(o.pendingCapabilities.includes(`provider`)){this.deps.logger.warn({pluginId:e.id},`plugin capability "provider" declared but not yet granted, skipping declarative providers (fail-closed, RFC-124 C2)`),t+=(e.manifest.contributes?.providers?.length??0)+(e.manifest.contributes?.oauth?.length??0),n.push(e.id);continue}r.set(e.id,e.manifest)}let i=e=>JSON.stringify(e),a=[],o=new Map,s=new Map;for(let e of this.previousSnapshot){let t=r.get(e.id);if(t!==void 0&&i(t)!==i(e.manifest)){let n=md(e.id,e.manifest),r=md(e.id,t),i=new Set([...n].filter(e=>r.has(e)));i.size>0&&o.set(e.id,i);let a=hd(e.id,e.manifest),c=hd(e.id,t),l=new Set([...a].filter(e=>c.has(e)));l.size>0&&s.set(e.id,l)}}for(let e of this.previousSnapshot){let t=r.get(e.id);(t===void 0||i(t)!==i(e.manifest))&&await wd(e.id,e.manifest,this.deps,o.get(e.id),s.get(e.id))}let c=new Map(this.previousSnapshot.map(e=>[e.id,i(e.manifest)]));for(let[n,l]of r){if(c.get(n)===i(l)){a.push({id:n,manifest:l}),e+=l.contributes?.providers?.length??0;continue}let r=Cd(n,l,this.deps,o.get(n),s.get(n));e+=r.registered.length,t+=r.rejected.length;for(let e of r.rejected)this.deps.onProviderRejected?.(e);a.push({id:n,manifest:l})}return this.previousSnapshot=a,this.loadedPluginIds=a.map(e=>e.id),{registered:e,rejected:t,pendingCapabilityPluginIds:n}}get activePluginIds(){return this.loadedPluginIds}async cleanup(){for(let{id:e,manifest:t}of this.previousSnapshot)await wd(e,t,this.deps);this.previousSnapshot=[],this.loadedPluginIds=[]}};function Zf(e,n){if(!e)return{devtools:null,logSubscription:null};let r=new t;return{devtools:r,logSubscription:pt(e=>{if(typeof e==`object`&&e&&`name`in e&&`level`in e&&`msg`in e){let t=e;t.name===n&&r.sendLog(t)}})}}var Qf=class{registry;auditLog;constructor(e,t){let n=Ne(e.getAll());this.auditLog=new xe,this.registry=Me({toolSets:n}),t.register(Ae(this.registry,this.auditLog))}};const $f=T(`@x-otto/coding:plugin-context-sources`),ep=64*1024;function tp(e,t,n){let r=w(t,n);if(!Ac(r,t)){$f.warn({pluginId:e,file:n},`contextSources.content.file resolves outside plugin dir, skipped`);return}try{let e=b(r,`utf8`);return Buffer.byteLength(e,`utf8`)>ep?`${e.slice(0,ep)}\n<!-- truncated -->`:e}catch(t){$f.warn({pluginId:e,file:n,err:String(t)},`contextSources.content.file read failed, skipped`);return}}function np(e){let t=[];for(let n of e){if(O(n).gated)continue;let e=n.manifest.contributes?.contextSources;if(e?.length){if(!n.manifest.capabilities?.includes(`context`)){$f.warn({pluginId:n.id},`plugin declares contextSources but not capabilities:["context"], skipped (fail-closed)`);continue}for(let r of e)t.push({id:`${n.id}:${r.id}`,priority:r.priority,contribute:()=>{let e=typeof r.content==`string`?r.content:tp(n.id,n.dir,r.content.file);if(e!=null)return`<!-- plugin:${n.id} -->\n${e}`}})}}return t}function rp(e,t,n){let r=0;for(let i of t)try{e.register(i),r+=1}catch(e){n.warn({sourceId:i.id,err:e instanceof Error?e.message:String(e)},`plugin context source skipped: duplicate id (builtin or another plugin already registered it)`)}return r}function ip(e){xn(),bn(void 0,e.repoRoot);let t=(t,n)=>{e.hasSession(n.sessionId)&&e.emitHook(t,n).catch(n=>{e.logger.warn({err:n instanceof Error?n.message:String(n),timing:t},`Failed to emit process lifecycle hook`)})};return[E.onSpawn(n=>{e.logger.info({id:n.id,pid:n.pid,command:n.command,port:n.port},`Background process started`),t(`process.spawned`,{sessionId:n.config.sessionId,processId:n.id,pid:n.pid,command:n.command,port:n.port})}),E.onExit(n=>{e.logger.info({id:n.id,pid:n.pid,status:n.status},`Background process exited`),t(`process.exited`,{sessionId:n.config.sessionId,processId:n.id,pid:n.pid,command:n.command,status:n.status})})]}const ap=2e4,op=(e,t)=>{let n=ea(`git`,[...e],{cwd:t,timeout:1e4,encoding:`utf-8`,maxBuffer:4194304});return n.error||n.status!==0?null:n.stdout??``};function sp(e){return e.length<=ap?e:`${e.slice(0,ap)}\n[...truncated ${e.length-ap} chars...]`}function cp(e,t,n,r){let i=w(e),a=ct(t)?t:w(i,t);if(a!==i&&!a.startsWith(`${i}/`)||!v(a)||!tt(a).isFile())return null;let o;try{o=b(a,`utf-8`)}catch{return null}if(o.includes(`\0`))return null;let s=o.split(`
478
478
  `),c=Math.max(1,n);if(c>s.length)return null;let l=Math.min(s.length,r>0?r:n);return sp(s.slice(c-1,l).join(`
479
479
  `))}function lp(e,t,n,r=14){let i=n([`grep`,`-nE`,`(function|class|interface|type|enum|const|let|var|def|fn|struct|func)[[:space:]]+${t.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}`],e);if(i===null||!i.trim())return null;let a=/^(.+?):(\d+):/.exec(i.split(`
480
- `)[0]??``);if(!a)return null;let o=parseInt(a[2],10);return cp(e,a[1],o,o+r)}function up(e){let t=e?.gitRunner??op;return[{id:`file-range`,resolve:(e,t)=>{let n=/^([\w./-]+):(\d+)(?:-(\d+))?$/.exec(e);if(!n)return``;let r=cp(t.workspaceDir,n[1],parseInt(n[2],10),n[3]?parseInt(n[3],10):0);if(r===null)return``;let i=n[1],a=i.includes(`.`)?i.split(`.`).pop()??``:``;return`\n\n${i}:${n[3]?`${n[2]}-${n[3]}`:n[2]}:\n\`\`\`${a}\n${r}\n\`\`\`\n`}},{id:`def`,resolve:(e,n)=>{let r=lp(n.workspaceDir,e,t);return r===null?``:`\n\n@def:${e}:\n\`\`\`\n${r}\n\`\`\`\n`}}]}function dp(e){return{sandbox:new oo(e.logger),memoryGovernor:new Ut({logger:e.logger}),residencyGovernor:new Gt,fleetMonitor:new Vt({logger:e.logger}),permissionSync:new ao({logger:e.logger,getToolRegistry:e.getToolRegistry,getPermissionRegistry:e.getPermissionRegistry}),hookRegistry:e.hookRegistry??ta({preset:`default`,onHookTimeout:e.onHookTimeout})}}function fp(e){let t=Zf(e.inspect,e.loggerName),n=t.devtools,r=t.logSubscription,i=new Ei({workspaceDir:e.workspaceDir,projectConfigPath:e.projectConfigPath,projectConfigTrusted:()=>Ni(e.workspaceDir,{interactive:e.interactive})});return i.on(`change`,t=>{e.onSettingsApplied(t),e.permissionSync.sync(t),e.sandbox.applySetting(e.sandbox.resolveConfig(t));let n=t.proxy,r=n?.enabled!==!1&&n?.url?n.url:void 0;bt(r),gt(r),e.getI18nRegistry().setLocale(Yf(t.language))}),{devtools:n,logSubscription:r,settings:i}}function pp(e){let t=new Pf({getModelRegistry:e.getModelRegistry,providerRegistry:e.providerRegistry,getVisionSlotCandidates:()=>Ff(e.getSettings().get(`model_slots`)),isModelUsable:e.isModelUsable,logger:e.logger});return{visionDelegateService:t,sessionConfigResolver:new Jo({settings:e.getSettings(),promptManager:e.promptManager,getModelRegistry:e.getModelRegistry,getTools:e.getTools,getDeclarativeAgentProfiles:e.getDeclarativeAgentProfiles,defaultModel:e.defaultModel,explicitModelSpec:e.explicitModelId,hasCredential:t=>e.providerRegistry.hasCredential(t),isModelUsable:e.isModelUsable,maxToolTurns:e.maxToolTurns,maxToolTurnExtensions:e.maxToolTurnExtensions,promptOutputTokenBudget:e.promptOutputTokenBudget,promptWallClockBudgetMs:e.promptWallClockBudgetMs,sessionCostBudgetUSD:e.sessionCostBudgetUSD,stallDetection:e.stallDetection,workspaceDir:e.workspaceDir,getWorkspaceId:()=>e.getWorkspaceRef()?.id??e.workspaceId,logger:e.logger,describeImages:t.describeImages,getResilienceConfig:e.getResilienceConfig})}}function mp(e){let t=Tf(e.options,{hookRegistry:e.hookRegistry,providerRegistry:e.providerRegistry,modelRegistry:e.getModelRegistry(),logger:e.logger,workspaceDir:e.workspaceDir,getTools:e.getTools,getDeclarativeAgentProfiles:e.getDeclarativeAgentProfiles,getWorkspaceKey:()=>e.getWorkspaceRef()?.key,repoRef:e.repoRef,maxToolTurns:e.maxToolTurns,promptManager:e.promptManager,memory:e.memory,traceStore:e.traceStore,checkpointStore:e.checkpointStore,clock:e.clock,devtools:e.devtools??void 0,residencyGovernor:e.residencyGovernor,getResidencyConfig:e.getResidencyConfig,planeRegistry:e.planeRegistry,semanticReviewer:e.semanticReviewer},e.resolveEffectiveModel),n=t.sessions;return{agentRuntime:t,codingSessionPool:n,swarmAgentRunner:kf({hookRegistry:e.hookRegistry,stream:n.stream,logger:e.logger,defaultModel:e.defaultModel,getTools:e.getTools,getDeclarativeAgentProfiles:e.getDeclarativeAgentProfiles}),defaultModel:e.defaultModel}}function hp(e){let{runSession:t,abortTask:n}=ys({logger:e.logger,getSession:e.getSession,createSession:e.createSession,removeSession:e.removeSession}),r=new Si({hookRegistry:e.hookRegistry,runSession:t,abortTask:n,runAgentTurn:e.swarmAgentRunner,workflowConfig:e.workflowConfig});return{orchestrator:r,runSession:t,runTeam:Mf({logger:e.logger,providerRegistry:e.providerRegistry,hookRegistry:e.hookRegistry,stream:e.stream,defaultModel:e.defaultModel,getDeclarativeTeams:e.getDeclarativeTeams,getDeclarativeAgentProfiles:e.getDeclarativeAgentProfiles,resolveTools:(t,n)=>e.sessionConfigResolver.resolveTools(t,n),runAgentTurn:e=>r.runAgentTurn(e)}),writeTodos:ca()}}function gp(e){Bf(e.callMcpTool);let t=new Yc({mcpController:e.mcpController,getActivePlugins:e.getActivePlugins});return qf({call:(e,n,r,i)=>t.call(e,n,r,i),cancel:(e,n)=>{t.cancel(e,n)},subscribeState:(e,n)=>t.subscribeState(e,n),getStatus:e=>t.getStatus(e),onStatusChange:(e,n)=>t.onStatusChange(e,n)}),{panelBackendController:t}}function _p(e){let t=new Ju((t,n)=>{let r=e.activePlugins().find(e=>e.id===t);return r?(r.manifest.capabilities??[]).includes(n):!1}),n=new nf({hookRegistry:e.hookRegistry,skillRegistry:e.skillRegistry,providerRegistry:e.providerRegistry,wireProtocolRegistry:e.wireProtocolRegistry,modelRegistry:e.modelRegistry,authStore:e.authStore,toolRegistry:e.toolRegistry,feedbackRegistry:e.feedbackRegistry,sigilResolverRegistry:e.sigilResolverRegistry,pluginInput:e.pluginInput,workspaceDir:e.workspaceDir,activePlugins:e.activePlugins,callMcpTool:e.callMcpTool,logger:e.logger,eventDispatcher:t,startPluginJob:e.startPluginJob,getSessionId:e.getPluginJobSessionId,getWorkspaceKey:e.getWorkspaceKey,getSessionMessages:e.getSessionMessages,completeText:e.completeText,capabilityQuota:e.capabilityQuota,askUser:e.askUser,onPluginLoadError:e.onPluginLoadError,...e.getSchedulePort?{getSchedulePort:e.getSchedulePort}:{},...e.getSettingValue?{getSettingValue:e.getSettingValue}:{},...e.notifyUser?{notifyUser:e.notifyUser}:{},...e.planeRegistry?{planeRegistry:e.planeRegistry}:{}}),r=new Xf({providerRegistry:e.providerRegistry,authStore:e.authStore,modelRegistry:e.modelRegistry,wireProtocolRegistry:e.wireProtocolRegistry,activePlugins:e.activePlugins,logger:e.logger,...e.onPluginLoadError?{onProviderRejected:t=>e.onPluginLoadError(t.pluginId,`provider entry "${t.id}" rejected: ${t.reason}`,`provider-rejected`)}:{}});return e.i18nRegistry.register(Fc(e.activePlugins())),{pluginModuleManager:n,pluginProviderManager:r,capabilityReloader:new qc(e.settings,e.mcpController,e.skillRegistryForReloader,n,r,e.toolRegistry,e.modelCatalogManager,e.workspaceDir,e.getActivePluginsForReloader,e.i18nRegistry,e.getCompatTrustGated)}}function vp(e){return{toolsSyncCoordinator:new rc({sessionConfigResolver:e.sessionConfigResolver,getSession:e.getSession,listSessionIds:e.listSessionIds,logger:e.logger}),pluginContributionsFacade:new vc({getWorkspaceDir:()=>e.workspaceDir,settings:e.settings,getActivePlugins:e.getActivePlugins,pluginModuleManager:e.pluginModuleManager,mcpController:e.mcpController,compatProducts:e.compatProducts})}}function yp(e){let t=new Set(e.hookRegistry.getRegistered().map(e=>e.name)),n=new Qf(e.toolRegistry,e.hookRegistry),r=new po(e.settings,e.toolRegistry,e.logger,e.workspaceDir,e.getResilienceConfig,e.compatProducts);return{permissionRegistry:n.registry,auditLog:n.auditLog,mcpController:r,preExistingHooks:t}}function bp(e){return new vo({settings:e.settings,mcp:e.mcpController,skills:e.skillRegistry,getAgentProfiles:()=>e.declarativeAgentProfiles,getPlugins:()=>gr({cwd:e.workspaceDir,homedir:e.pluginHomedir,bundledDirs:e.pluginBundledDirs}),processRuntime:E,onPluginToggle:e.onPluginToggle})}function xp(e){e.pluginInput.register(lr()),e.pluginInput.registerProvider(`@`,dr({cwd:e.workspaceDir})),e.sigilResolvers.register(up(),`builtin`),e.sigilResolvers.register([{id:`shortcut`,resolve:t=>{let n=(e.settings.get(`shortcuts`)??[]).find(e=>e.name===t);return n?n.text:``}}],`builtin`);let t=rd(e.activePlugins());t.length>0&&e.pluginInput.register(t),id(e.activePlugins());for(let t of np(e.activePlugins()))rp(e.agentRuntime.contextSources,[t],e.logger);return e.registerHooks(),{ownedHookNames:e.hookRegistry.getRegistered().map(e=>e.name).filter(t=>!e.preExistingHooks.has(t)),processRegistryUnsubs:ip({hasSession:t=>!!e.codingSessionPoolGet(t),emitHook:(t,n)=>e.hookRegistry.emit(t,n),logger:e.logger,repoRoot:e.workspaceDir})}}async function Sp(e,t,n){t()||(await e.load(),n(!0))}function Cp(e){for(let t of e)try{t.apply()}catch(e){throw Error(`deferred config step "${t.label}" failed: ${e.message}`,{cause:e})}}function wp(e){let t=typeof e==`function`?{getPermissionMode:e}:e;return async(e,n,r,i)=>{if(t.getPermissionMode()===`bypass`)return`allow`;if(t.isSemanticReviewEnabled?.()===!0&&t.createLlmReviewer){let a=t.resolveReviewModel?.();if(a)return await t.createLlmReviewer(a)(e,n,r,i)}return`abstain`}}function Tp(e,t,n,r){return{workspaceDir:t,processOwner:e.processOwnerId,orchestrator:e.orchestrator,writeTodos:e.writeTodos,skillProvider:n,enableLsp:r,sandbox:e.sandbox,autoMemory:e.autoMemory,reloadMemory:e.reloadMemory,archiveRecall:e.archiveRecall,runTeam:e.runTeam,runSession:e.runSession,fileStateManager:e.fileStateManager,learningStore:e.learningStore,localLearningStore:e.localLearningStore,sessions:e.sessions,listModels:e.listModels,startJob:e.startJob,schedule:ha(e.getScheduleService),searchEcosystem:e.searchEcosystem}}function Ep(e){let{orchestrator:t,writeTodos:n,skillProvider:r,autoMemory:i,reloadMemory:a,archiveRecall:o}=e,s=e.processOwner,c=s?{register:e=>{let t=E.registerChild({command:e.command,cwd:e.cwd,logPath:e.logPath,port:e.port,url:e.url,owner:{type:`app`,id:s},sessionId:e.sessionId,category:`shell`,label:e.command,lifecycle:`evictable`},e.child);return{id:t.id,sessionId:e.sessionId,pid:t.pid??-1,command:t.command,status:t.status===`running`?`running`:t.status===`exited`?`exited`:`killed`,logPath:t.logPath,port:t.port,url:t.url,startedAt:t.lastUsed}},get:e=>{let t=E.get(e);return t?{id:t.id,sessionId:t.config.sessionId??``,pid:t.pid??-1,command:t.command,status:t.status===`running`?`running`:t.status===`exited`?`exited`:`killed`,logPath:t.logPath,port:t.port,url:t.url,startedAt:t.lastUsed}:void 0},getForSession:(e,t)=>{let n=E.getForSession(e,t);return n?{id:n.id,sessionId:e,pid:n.pid??-1,command:n.command,status:n.status===`running`?`running`:n.status===`exited`?`exited`:`killed`,logPath:n.logPath,port:n.port,url:n.url,startedAt:n.lastUsed}:void 0},listForSession:e=>E.listForSession(e).map(t=>({id:t.id,sessionId:e,pid:t.pid??-1,command:t.command,status:t.status===`running`?`running`:t.status===`exited`?`exited`:`killed`,logPath:t.logPath,port:t.port,url:t.url,startedAt:t.lastUsed})),kill:e=>E.kill(e),updateDetectedService:(e,t)=>E.updateDetectedService(e,t)}:{register:e=>{let t=E.registerChild({command:e.command,cwd:e.cwd,logPath:e.logPath,port:e.port,url:e.url,owner:{type:`app`,id:`default`},sessionId:e.sessionId,category:`shell`,label:e.command,lifecycle:`evictable`},e.child);return{id:t.id,sessionId:e.sessionId,pid:t.pid??-1,command:t.command,status:t.status===`running`?`running`:t.status===`exited`?`exited`:`killed`,logPath:t.logPath,port:t.port,url:t.url,startedAt:t.lastUsed}},get:e=>{let t=E.get(e);return t?{id:t.id,sessionId:t.config.sessionId??``,pid:t.pid??-1,command:t.command,status:t.status===`running`?`running`:t.status===`exited`?`exited`:`killed`,logPath:t.logPath,port:t.port,url:t.url,startedAt:t.lastUsed}:void 0},getForSession:(e,t)=>{let n=E.getForSession(e,t);return n?{id:n.id,sessionId:e,pid:n.pid??-1,command:n.command,status:n.status===`running`?`running`:n.status===`exited`?`exited`:`killed`,logPath:n.logPath,port:n.port,url:n.url,startedAt:n.lastUsed}:void 0},listForSession:e=>E.listForSession(e).map(t=>({id:t.id,sessionId:e,pid:t.pid??-1,command:t.command,status:t.status===`running`?`running`:t.status===`exited`?`exited`:`killed`,logPath:t.logPath,port:t.port,url:t.url,startedAt:t.lastUsed})),kill:e=>E.kill(e),updateDetectedService:(e,t)=>E.updateDetectedService(e,t)};return{orchestration:{dispatchTask:t.dispatchTask,getTask:t.getTask,listTasks:t.listTasks,updateTask:t.updateTask,getBackgroundOutput:t.getBackgroundOutput,cancelBackground:t.cancelBackground,writeTodos:n,startJob:e.startJob},agents:{callAgent:t.callAgent},fork:{fork:async(t,n,r)=>({ok:!0,value:(await e.runSession({prompt:t,sessionMode:`ephemeral`,depth:n,signal:r})).text})},skills:r?{loadSkill:e=>r.load(e),executeSkill:(e,t)=>r.execute(e,t)}:void 0,memory:i?{recordMemory:async e=>{await i.record(e,e.scope),e.scope===`project-shared`&&a&&await a()},readMemory:e=>i.read(e),archive:o?{read:e=>o.readArchive(e),list:e=>o.listArchives(e)}:void 0}:void 0,team:{runTeam:e.runTeam},session:{manager:{list:async()=>e.sessions.list().map(e=>({id:e.id,title:e.id,messageCount:e.messageCount})),create:async()=>({id:(await e.sessions.create()).id}),remove:async t=>e.sessions.remove(t),compact:async t=>{let n=e.sessions.get(t);return n?(await n.compactNow(),!0):!1}}},features:{listModels:e.listModels,grill:(t,n)=>{let r=e.sessions.get(t);return r?r.requestGrill(n):Promise.resolve({answer:n.recommendation,acceptedRecommendation:!0,resolvedBy:`auto_recommendation`})},enableLsp:e.enableLsp,sandbox:e.sandbox,processRegistry:c,captureFileState:async t=>{let n=await e.fileStateManager.capture({workspaceDir:e.workspaceDir,recentFiles:t.recentFiles,planStatus:t.planStatus});return{success:!0,summary:e.fileStateManager.formatSnapshot(n),timestamp:n.timestamp}},learn:async t=>{let{lesson:n,deduped:r}=await(t.scope===`local`?e.localLearningStore??e.learningStore:e.learningStore).saveDeduped({tags:t.tags,trigger:t.trigger,insight:t.insight,sourceSessionId:t.sessionId});return{success:!0,lessonId:n.id,deduped:r}}},schedule:e.schedule?{create:e.schedule.create,list:e.schedule.list,delete:e.schedule.delete,run:e.schedule.run,cancel:e.schedule.cancel}:void 0,capabilityGap:e.searchEcosystem?{search:e.searchEcosystem,...e.capabilityGapRecorder?{recorder:e.capabilityGapRecorder}:{}}:void 0}}function Dp(e,t){return k({name:A.toolGuidance.name,timing:`system.prompt.transform`,priority:A.toolGuidance.priority,handle:async(n,r)=>{let i=e.buildToolGuidance(t());if(i){let e=_a(A.toolGuidance.name,i);r.systemPrompt=`${r.systemPrompt}\n\n${e}`}}})}function Op(e){let t=C(e,`docs/rfc/RFC-284-core-pack/content.txt`);if(!v(t))return;let n=b(t,`utf8`).trim();return n.length>0?n:void 0}function kp(e){let t=C(e,`docs/rfc/RFC-284-governance-plan.json`);if(!v(t))return new Map;let n=JSON.parse(b(t,`utf8`));return new Map((n.decisions??[]).map(e=>[e.key,e]))}function Ap(e){return new Set(e.toLowerCase().split(/[^\p{L}\p{N}._/-]+/u).filter(e=>e.length>=3))}function jp(e){let t=0;for(let n of e)/[\u3000-\u9fff\uff00-\uffef]/.test(n)&&t++;return Math.ceil(t+(e.length-t)/4)}function Mp(e,t){let n=Ap(t);if(n.size===0)return 0;let r=0,i=e.tags??[];for(let e of i)n.has(e.toLowerCase())&&(r+=3);let a=Ap(`${e.trigger} ${e.insight}`);for(let e of n)a.has(e)&&(r+=1);return r}function Np(e){return e.size>0?{mode:`governance`,decisions:e}:{mode:`safe-default`}}function Pp(e){return!!e.contentHash&&jt({tags:e.tags??[],trigger:e.trigger,insight:e.insight})===e.contentHash}function Fp(e){return!(!Pp(e)||e.supersededBy||(e.relevantHitCount??0)<1)}function Ip(e,t,n){if(!n)return;let r=Np(t),i=e.map(e=>{if(r.mode===`governance`){let t=`workspace:${e.id}`,n=r.decisions.get(t);if(!n||n.class!==`fact`||n.state!==`active`||n.supersededBy)return}else if(!Fp(e))return;let t=Mp(e,n);if(t<=0)return;let i=r.mode===`safe-default`&&e.class===`fact`?2:0,a=`[${e.tags.join(`, `)}] ${e.trigger} → ${e.insight}`;return{lesson:e,score:t,priority:t+i,text:a,tokens:jp(a)}}).filter(e=>!!e).sort((e,t)=>t.priority-e.priority||e.tokens-t.tokens||e.lesson.id.localeCompare(t.lesson.id)),a=[],o=0;for(let e of i)if(!(o+e.tokens>1024)&&(a.push(e),o+=e.tokens,a.length>=3))break;if(a.length!==0)return{text:[`### Relevant Lesson Hints`,`Query-specific volatile hints selected from RFC-284 fact lessons:`,...a.map((e,t)=>`${t+1}. workspace:${e.lesson.id} score=${e.score} ${e.text}`)].join(`
480
+ `)[0]??``);if(!a)return null;let o=parseInt(a[2],10);return cp(e,a[1],o,o+r)}function up(e){let t=e?.gitRunner??op;return[{id:`file-range`,resolve:(e,t)=>{let n=/^([\w./-]+):(\d+)(?:-(\d+))?$/.exec(e);if(!n)return``;let r=cp(t.workspaceDir,n[1],parseInt(n[2],10),n[3]?parseInt(n[3],10):0);if(r===null)return``;let i=n[1],a=i.includes(`.`)?i.split(`.`).pop()??``:``;return`\n\n${i}:${n[3]?`${n[2]}-${n[3]}`:n[2]}:\n\`\`\`${a}\n${r}\n\`\`\`\n`}},{id:`def`,resolve:(e,n)=>{let r=lp(n.workspaceDir,e,t);return r===null?``:`\n\n@def:${e}:\n\`\`\`\n${r}\n\`\`\`\n`}}]}function dp(e){return{sandbox:new oo(e.logger),memoryGovernor:new Ut({logger:e.logger}),residencyGovernor:new Gt,fleetMonitor:new Vt({logger:e.logger}),permissionSync:new ao({logger:e.logger,getToolRegistry:e.getToolRegistry,getPermissionRegistry:e.getPermissionRegistry}),hookRegistry:e.hookRegistry??ta({preset:`default`,onHookTimeout:e.onHookTimeout})}}function fp(e){let t=Zf(e.inspect,e.loggerName),n=t.devtools,r=t.logSubscription,i=new Ei({workspaceDir:e.workspaceDir,projectConfigPath:e.projectConfigPath,projectConfigTrusted:()=>Ni(e.workspaceDir,{interactive:e.interactive})});return i.on(`change`,t=>{e.onSettingsApplied(t),e.permissionSync.sync(t),e.sandbox.applySetting(e.sandbox.resolveConfig(t));let n=t.proxy,r=n?.enabled!==!1&&n?.url?n.url:void 0;bt(r),gt(r),e.getI18nRegistry().setLocale(Yf(t.language))}),{devtools:n,logSubscription:r,settings:i}}function pp(e){let t=new Pf({getModelRegistry:e.getModelRegistry,providerRegistry:e.providerRegistry,getVisionSlotCandidates:()=>Ff(e.getSettings().get(`model_slots`)),isModelUsable:e.isModelUsable,logger:e.logger});return{visionDelegateService:t,sessionConfigResolver:new Jo({settings:e.getSettings(),promptManager:e.promptManager,getModelRegistry:e.getModelRegistry,getTools:e.getTools,getDeclarativeAgentProfiles:e.getDeclarativeAgentProfiles,defaultModel:e.defaultModel,explicitModelSpec:e.explicitModelId,hasCredential:t=>e.providerRegistry.hasCredential(t),isModelUsable:e.isModelUsable,maxToolTurns:e.maxToolTurns,maxToolTurnExtensions:e.maxToolTurnExtensions,promptOutputTokenBudget:e.promptOutputTokenBudget,promptWallClockBudgetMs:e.promptWallClockBudgetMs,sessionCostBudgetUSD:e.sessionCostBudgetUSD,stallDetection:e.stallDetection,workspaceDir:e.workspaceDir,getWorkspaceId:()=>e.getWorkspaceRef()?.id??e.workspaceId,logger:e.logger,describeImages:t.describeImages,getResilienceConfig:e.getResilienceConfig})}}function mp(e){let t=Tf(e.options,{hookRegistry:e.hookRegistry,providerRegistry:e.providerRegistry,modelRegistry:e.getModelRegistry(),logger:e.logger,workspaceDir:e.workspaceDir,getTools:e.getTools,getDeclarativeAgentProfiles:e.getDeclarativeAgentProfiles,getWorkspaceKey:()=>e.getWorkspaceRef()?.key,repoRef:e.repoRef,maxToolTurns:e.maxToolTurns,promptManager:e.promptManager,memory:e.memory,traceStore:e.traceStore,checkpointStore:e.checkpointStore,clock:e.clock,devtools:e.devtools??void 0,residencyGovernor:e.residencyGovernor,getResidencyConfig:e.getResidencyConfig,planeRegistry:e.planeRegistry,semanticReviewer:e.semanticReviewer},e.resolveEffectiveModel),n=t.sessions;return{agentRuntime:t,codingSessionPool:n,swarmAgentRunner:kf({hookRegistry:e.hookRegistry,stream:n.stream,logger:e.logger,defaultModel:e.defaultModel,getTools:e.getTools,getDeclarativeAgentProfiles:e.getDeclarativeAgentProfiles}),defaultModel:e.defaultModel}}function hp(e){let{runSession:t,abortTask:n}=ys({logger:e.logger,getSession:e.getSession,createSession:e.createSession,removeSession:e.removeSession}),r=new Si({hookRegistry:e.hookRegistry,runSession:t,abortTask:n,runAgentTurn:e.swarmAgentRunner,workflowConfig:e.workflowConfig});return{orchestrator:r,runSession:t,runTeam:Mf({logger:e.logger,providerRegistry:e.providerRegistry,hookRegistry:e.hookRegistry,stream:e.stream,defaultModel:e.defaultModel,getDeclarativeTeams:e.getDeclarativeTeams,getDeclarativeAgentProfiles:e.getDeclarativeAgentProfiles,resolveTools:(t,n)=>e.sessionConfigResolver.resolveTools(t,n),runAgentTurn:e=>r.runAgentTurn(e)}),writeTodos:ca()}}function gp(e){Bf(e.callMcpTool);let t=new Yc({mcpController:e.mcpController,getActivePlugins:e.getActivePlugins});return qf({call:(e,n,r,i)=>t.call(e,n,r,i),cancel:(e,n)=>{t.cancel(e,n)},subscribeState:(e,n)=>t.subscribeState(e,n),getStatus:e=>t.getStatus(e),onStatusChange:(e,n)=>t.onStatusChange(e,n)}),{panelBackendController:t}}function _p(e){let t=new Ju((t,n)=>{let r=e.activePlugins().find(e=>e.id===t);return r?(r.manifest.capabilities??[]).includes(n):!1}),n=new nf({hookRegistry:e.hookRegistry,skillRegistry:e.skillRegistry,providerRegistry:e.providerRegistry,wireProtocolRegistry:e.wireProtocolRegistry,modelRegistry:e.modelRegistry,authStore:e.authStore,toolRegistry:e.toolRegistry,feedbackRegistry:e.feedbackRegistry,sigilResolverRegistry:e.sigilResolverRegistry,pluginInput:e.pluginInput,workspaceDir:e.workspaceDir,activePlugins:e.activePlugins,callMcpTool:e.callMcpTool,logger:e.logger,eventDispatcher:t,startPluginJob:e.startPluginJob,getSessionId:e.getPluginJobSessionId,getWorkspaceKey:e.getWorkspaceKey,getSessionMessages:e.getSessionMessages,completeText:e.completeText,capabilityQuota:e.capabilityQuota,askUser:e.askUser,onPluginLoadError:e.onPluginLoadError,...e.getSchedulePort?{getSchedulePort:e.getSchedulePort}:{},...e.getSettingValue?{getSettingValue:e.getSettingValue}:{},...e.notifyUser?{notifyUser:e.notifyUser}:{},...e.planeRegistry?{planeRegistry:e.planeRegistry}:{}}),r=new Xf({providerRegistry:e.providerRegistry,authStore:e.authStore,modelRegistry:e.modelRegistry,wireProtocolRegistry:e.wireProtocolRegistry,activePlugins:e.activePlugins,logger:e.logger,...e.onPluginLoadError?{onProviderRejected:t=>e.onPluginLoadError(t.pluginId,`provider entry "${t.id}" rejected: ${t.reason}`,`provider-rejected`)}:{}});return e.i18nRegistry.register(Fc(e.activePlugins())),{pluginModuleManager:n,pluginProviderManager:r,capabilityReloader:new qc(e.settings,e.mcpController,e.skillRegistryForReloader,n,r,e.toolRegistry,e.modelCatalogManager,e.workspaceDir,e.getActivePluginsForReloader,e.i18nRegistry,e.getCompatTrustGated)}}function vp(e){return{toolsSyncCoordinator:new rc({sessionConfigResolver:e.sessionConfigResolver,getSession:e.getSession,listSessionIds:e.listSessionIds,logger:e.logger}),pluginContributionsFacade:new vc({getWorkspaceDir:()=>e.workspaceDir,settings:e.settings,getActivePlugins:e.getActivePlugins,pluginModuleManager:e.pluginModuleManager,mcpController:e.mcpController,compatProducts:e.compatProducts})}}function yp(e){let t=new Set(e.hookRegistry.getRegistered().map(e=>e.name)),n=new Qf(e.toolRegistry,e.hookRegistry),r=new po(e.settings,e.toolRegistry,e.logger,e.workspaceDir,e.getResilienceConfig,e.compatProducts);return{permissionRegistry:n.registry,auditLog:n.auditLog,mcpController:r,preExistingHooks:t}}function bp(e){return new vo({settings:e.settings,mcp:e.mcpController,skills:e.skillRegistry,getAgentProfiles:()=>e.declarativeAgentProfiles,getPlugins:()=>gr({cwd:e.workspaceDir,homedir:e.pluginHomedir,bundledDirs:e.pluginBundledDirs}),processRuntime:E,onPluginToggle:e.onPluginToggle})}function xp(e){e.pluginInput.register(lr()),e.pluginInput.registerProvider(`@`,dr({cwd:e.workspaceDir})),e.sigilResolvers.register(up(),`builtin`),e.sigilResolvers.register([{id:`shortcut`,resolve:t=>{let n=(e.settings.get(`shortcuts`)??[]).find(e=>e.name===t);return n?n.text:``}}],`builtin`);let t=rd(e.activePlugins());t.length>0&&e.pluginInput.register(t),id(e.activePlugins());for(let t of np(e.activePlugins()))rp(e.agentRuntime.contextSources,[t],e.logger);return e.registerHooks(),{ownedHookNames:e.hookRegistry.getRegistered().map(e=>e.name).filter(t=>!e.preExistingHooks.has(t)),processRegistryUnsubs:ip({hasSession:t=>!!e.codingSessionPoolGet(t),emitHook:(t,n)=>e.hookRegistry.emit(t,n),logger:e.logger,repoRoot:e.workspaceDir})}}async function Sp(e,t,n){t()||(await e.load(),n(!0))}function Cp(e){for(let t of e)try{t.apply()}catch(e){throw Error(`deferred config step "${t.label}" failed: ${e.message}`,{cause:e})}}function wp(e){let t=typeof e==`function`?{getPermissionMode:e}:e;return async(e,n,r,i)=>{if(t.getPermissionMode()===`bypass`)return`allow`;if(t.isSemanticReviewEnabled?.()===!0&&t.createLlmReviewer){let a=t.resolveReviewModel?.();if(a)return await t.createLlmReviewer(a)(e,n,r,i)}return`abstain`}}function Tp(e,t,n,r){return{workspaceDir:t,processOwner:e.processOwnerId,orchestrator:e.orchestrator,writeTodos:e.writeTodos,skillProvider:n,enableLsp:r,sandbox:e.sandbox,autoMemory:e.autoMemory,reloadMemory:e.reloadMemory,archiveRecall:e.archiveRecall,runTeam:e.runTeam,runSession:e.runSession,fileStateManager:e.fileStateManager,learningStore:e.learningStore,localLearningStore:e.localLearningStore,sessions:e.sessions,listModels:e.listModels,validateScheduleModelId:e.validateScheduleModelId,startJob:e.startJob,schedule:ha(e.getScheduleService,{validateModelId:e.validateScheduleModelId}),searchEcosystem:e.searchEcosystem}}function Ep(e){let{orchestrator:t,writeTodos:n,skillProvider:r,autoMemory:i,reloadMemory:a,archiveRecall:o}=e,s=e.processOwner,c=s?{register:e=>{let t=E.registerChild({command:e.command,cwd:e.cwd,logPath:e.logPath,port:e.port,url:e.url,owner:{type:`app`,id:s},sessionId:e.sessionId,category:`shell`,label:e.command,lifecycle:`evictable`},e.child);return{id:t.id,sessionId:e.sessionId,pid:t.pid??-1,command:t.command,status:t.status===`running`?`running`:t.status===`exited`?`exited`:`killed`,logPath:t.logPath,port:t.port,url:t.url,startedAt:t.lastUsed}},get:e=>{let t=E.get(e);return t?{id:t.id,sessionId:t.config.sessionId??``,pid:t.pid??-1,command:t.command,status:t.status===`running`?`running`:t.status===`exited`?`exited`:`killed`,logPath:t.logPath,port:t.port,url:t.url,startedAt:t.lastUsed}:void 0},getForSession:(e,t)=>{let n=E.getForSession(e,t);return n?{id:n.id,sessionId:e,pid:n.pid??-1,command:n.command,status:n.status===`running`?`running`:n.status===`exited`?`exited`:`killed`,logPath:n.logPath,port:n.port,url:n.url,startedAt:n.lastUsed}:void 0},listForSession:e=>E.listForSession(e).map(t=>({id:t.id,sessionId:e,pid:t.pid??-1,command:t.command,status:t.status===`running`?`running`:t.status===`exited`?`exited`:`killed`,logPath:t.logPath,port:t.port,url:t.url,startedAt:t.lastUsed})),kill:e=>E.kill(e),updateDetectedService:(e,t)=>E.updateDetectedService(e,t)}:{register:e=>{let t=E.registerChild({command:e.command,cwd:e.cwd,logPath:e.logPath,port:e.port,url:e.url,owner:{type:`app`,id:`default`},sessionId:e.sessionId,category:`shell`,label:e.command,lifecycle:`evictable`},e.child);return{id:t.id,sessionId:e.sessionId,pid:t.pid??-1,command:t.command,status:t.status===`running`?`running`:t.status===`exited`?`exited`:`killed`,logPath:t.logPath,port:t.port,url:t.url,startedAt:t.lastUsed}},get:e=>{let t=E.get(e);return t?{id:t.id,sessionId:t.config.sessionId??``,pid:t.pid??-1,command:t.command,status:t.status===`running`?`running`:t.status===`exited`?`exited`:`killed`,logPath:t.logPath,port:t.port,url:t.url,startedAt:t.lastUsed}:void 0},getForSession:(e,t)=>{let n=E.getForSession(e,t);return n?{id:n.id,sessionId:e,pid:n.pid??-1,command:n.command,status:n.status===`running`?`running`:n.status===`exited`?`exited`:`killed`,logPath:n.logPath,port:n.port,url:n.url,startedAt:n.lastUsed}:void 0},listForSession:e=>E.listForSession(e).map(t=>({id:t.id,sessionId:e,pid:t.pid??-1,command:t.command,status:t.status===`running`?`running`:t.status===`exited`?`exited`:`killed`,logPath:t.logPath,port:t.port,url:t.url,startedAt:t.lastUsed})),kill:e=>E.kill(e),updateDetectedService:(e,t)=>E.updateDetectedService(e,t)};return{orchestration:{dispatchTask:t.dispatchTask,getTask:t.getTask,listTasks:t.listTasks,updateTask:t.updateTask,getBackgroundOutput:t.getBackgroundOutput,cancelBackground:t.cancelBackground,writeTodos:n,startJob:e.startJob},agents:{callAgent:t.callAgent},fork:{fork:async(t,n,r)=>({ok:!0,value:(await e.runSession({prompt:t,sessionMode:`ephemeral`,depth:n,signal:r})).text})},skills:r?{loadSkill:e=>r.load(e),executeSkill:(e,t)=>r.execute(e,t)}:void 0,memory:i?{recordMemory:async e=>{await i.record(e,e.scope),e.scope===`project-shared`&&a&&await a()},readMemory:e=>i.read(e),archive:o?{read:e=>o.readArchive(e),list:e=>o.listArchives(e)}:void 0}:void 0,team:{runTeam:e.runTeam},session:{manager:{list:async()=>e.sessions.list().map(e=>({id:e.id,title:e.id,messageCount:e.messageCount})),create:async()=>({id:(await e.sessions.create()).id}),remove:async t=>e.sessions.remove(t),compact:async t=>{let n=e.sessions.get(t);return n?(await n.compactNow(),!0):!1}}},features:{listModels:e.listModels,grill:(t,n)=>{let r=e.sessions.get(t);return r?r.requestGrill(n):Promise.resolve({answer:n.recommendation,acceptedRecommendation:!0,resolvedBy:`auto_recommendation`})},enableLsp:e.enableLsp,sandbox:e.sandbox,processRegistry:c,captureFileState:async t=>{let n=await e.fileStateManager.capture({workspaceDir:e.workspaceDir,recentFiles:t.recentFiles,planStatus:t.planStatus});return{success:!0,summary:e.fileStateManager.formatSnapshot(n),timestamp:n.timestamp}},learn:async t=>{let{lesson:n,deduped:r}=await(t.scope===`local`?e.localLearningStore??e.learningStore:e.learningStore).saveDeduped({tags:t.tags,trigger:t.trigger,insight:t.insight,sourceSessionId:t.sessionId});return{success:!0,lessonId:n.id,deduped:r}}},schedule:e.schedule?{create:e.schedule.create,list:e.schedule.list,delete:e.schedule.delete,run:e.schedule.run,cancel:e.schedule.cancel}:void 0,capabilityGap:e.searchEcosystem?{search:e.searchEcosystem,...e.capabilityGapRecorder?{recorder:e.capabilityGapRecorder}:{}}:void 0}}function Dp(e,t){return k({name:A.toolGuidance.name,timing:`system.prompt.transform`,priority:A.toolGuidance.priority,handle:async(n,r)=>{let i=e.buildToolGuidance(t());if(i){let e=_a(A.toolGuidance.name,i);r.systemPrompt=`${r.systemPrompt}\n\n${e}`}}})}function Op(e){let t=C(e,`docs/rfc/RFC-284-core-pack/content.txt`);if(!v(t))return;let n=b(t,`utf8`).trim();return n.length>0?n:void 0}function kp(e){let t=C(e,`docs/rfc/RFC-284-governance-plan.json`);if(!v(t))return new Map;let n=JSON.parse(b(t,`utf8`));return new Map((n.decisions??[]).map(e=>[e.key,e]))}function Ap(e){return new Set(e.toLowerCase().split(/[^\p{L}\p{N}._/-]+/u).filter(e=>e.length>=3))}function jp(e){let t=0;for(let n of e)/[\u3000-\u9fff\uff00-\uffef]/.test(n)&&t++;return Math.ceil(t+(e.length-t)/4)}function Mp(e,t){let n=Ap(t);if(n.size===0)return 0;let r=0,i=e.tags??[];for(let e of i)n.has(e.toLowerCase())&&(r+=3);let a=Ap(`${e.trigger} ${e.insight}`);for(let e of n)a.has(e)&&(r+=1);return r}function Np(e){return e.size>0?{mode:`governance`,decisions:e}:{mode:`safe-default`}}function Pp(e){return!!e.contentHash&&jt({tags:e.tags??[],trigger:e.trigger,insight:e.insight})===e.contentHash}function Fp(e){return!(!Pp(e)||e.supersededBy||(e.relevantHitCount??0)<1)}function Ip(e,t,n){if(!n)return;let r=Np(t),i=e.map(e=>{if(r.mode===`governance`){let t=`workspace:${e.id}`,n=r.decisions.get(t);if(!n||n.class!==`fact`||n.state!==`active`||n.supersededBy)return}else if(!Fp(e))return;let t=Mp(e,n);if(t<=0)return;let i=r.mode===`safe-default`&&e.class===`fact`?2:0,a=`[${e.tags.join(`, `)}] ${e.trigger} → ${e.insight}`;return{lesson:e,score:t,priority:t+i,text:a,tokens:jp(a)}}).filter(e=>!!e).sort((e,t)=>t.priority-e.priority||e.tokens-t.tokens||e.lesson.id.localeCompare(t.lesson.id)),a=[],o=0;for(let e of i)if(!(o+e.tokens>1024)&&(a.push(e),o+=e.tokens,a.length>=3))break;if(a.length!==0)return{text:[`### Relevant Lesson Hints`,`Query-specific volatile hints selected from RFC-284 fact lessons:`,...a.map((e,t)=>`${t+1}. workspace:${e.lesson.id} score=${e.score} ${e.text}`)].join(`
481
481
  `),hitIds:a.map(e=>e.lesson.id),lessons:a.map(e=>e.lesson)}}function Lp(e){return[...e].sort((e,t)=>(t.relevantHitCount??0)-(e.relevantHitCount??0)||(t.createdAt??0)-(e.createdAt??0))}function Rp(e,t,n,r={},i){let a=r.workspaceDir??process.cwd(),o=dn({name:A.agentKnowledge.name,compute:async()=>{let r=Op(a),o=r?_a(A.agentKnowledge.name,r):void 0,s=n?await n.list():[],c;if(o){let e=s.length>0?await t.loadRuntimeLessonsTemplate()??void 0:void 0;c=[o,s.length>0?Kn(Lp(s),e):``].filter(e=>e.length>0).join(`
482
482
 
483
483
  `)||void 0}else{let n=Lp([...await e.list(),...s]);n.length>0&&(c=Kn(n,await t.loadRuntimeLessonsTemplate()??void 0)||void 0)}let l;if(i){let e=i.getMemoryPrompt().trim();e&&(l=e.replace(/^<agent_memory>\s*/,``).replace(/\s*<\/agent_memory>\s*$/,``).trim()||void 0)}if(!l&&!c)return;let u=[`<agent_knowledge>`];return l&&(u.push(`<memory>`),u.push(l),u.push(`</memory>`)),c&&(u.push(`<lessons>`),u.push(c),u.push(`</lessons>`)),u.push(`</agent_knowledge>`),u.join(`
@@ -586,7 +586,7 @@ If the recorded paths turn out to be too varied, too thin, or not actually the s
586
586
  library permanently; skipping costs nothing — otto will offer again if the pattern recurs.
587
587
 
588
588
  The draft you produce is a proposal: it will be reviewed as a diff and only takes effect if the
589
- user explicitly applies it.`}function Gb(e){return`Draft skill: ${e.taskSignature.length>60?`${e.taskSignature.slice(0,60)}…`:e.taskSignature}`}function Kb(e){try{let t=Hb({pluginId:e.pluginId,workspaceKey:e.workspaceKey,sessionIds:e.brief.sessionIds});return{jobId:e.startJob({title:Gb(e.brief),prompt:Wb(e.brief,t),sessionId:e.sessionId}).id}}catch(t){e.logger?.warn(`skill-loop: failed to start skill draft job: ${t instanceof Error?t.message:String(t)}`);return}}function qb(e){e.hookRegistry.register(Dp(e.toolRegistry,e.getDefaultToolPreset)),e.hookRegistry.register(Oe(e.failureSignals)),e.hookRegistry.register(ke(e.failureSignals)),e.hookRegistry.registerAll(e.contextSourcesBuildHooks(e.workspaceDir,e.memory)),e.memory&&e.hookRegistry.registerAll(nn(e.memory)),e.hookRegistry.registerAll(an({getTodoList:t=>e.getSession(t)?.session.getTodoList()}));let t=/-milestone\.md$/,n=/^Status:\s*Done\b/m;e.hookRegistry.registerAll(en({isDocSyncTrigger:e=>{let r=typeof e.args.path==`string`?e.args.path:``;if(!t.test(r))return!1;let i=typeof e.args.newContent==`string`?e.args.newContent:typeof e.args.content==`string`?e.args.content:``;return n.test(i)}})),e.hookRegistry.registerAll(Rp(e.learningStore,e.promptManager,e.localLearningStore,{evolutionSignals:e.evolutionSignals,workspaceDir:e.workspaceDir},e.memory)),e.skillRegistry&&(e.hookRegistry.registerAll(zp(e.skillRegistry)),e.hookRegistry.registerAll(qp({registry:e.skillRegistry,evolutionSignals:e.evolutionSignals,getConfig:()=>{let t=e.settings.get(`skill_internalization`);return{enabled:t?.enabled===!0,minExecutions:t?.min_executions??Bp.minExecutions,minSuccessRate:t?.min_success_rate??Bp.minSuccessRate,maxInternalized:t?.max_internalized??Bp.maxInternalized}}})),e.hookRegistry.register(kb({registry:e.skillRegistry,resolveCwd:t=>t?w(e.workspaceDir,t):e.workspaceDir,logger:e.logger}))),e.hookRegistry.registerAll(e.claudeHooks),e.hookRegistry.registerAll(Xp()),e.hookRegistry.on(`session.deleted`,`rfc047-notification-detach`,t=>e.notificationDispatcher.detach(t.sessionId));let r=Pb();e.hookRegistry.registerAll(r.hooks),e.hookRegistry.register(Zp(e=>{E.killAllForSession(e)})),e.hookRegistry.registerAll(Qp({registry:e.permissionRegistry,getPersistedAllow:t=>e.codingSessionPool.getSessionPermissionAllow(t)})),e.hookRegistry.register(Ob({getContext:()=>{let t=Pe(e.workspaceDir,at());if(!e.sandbox.enabled)return{mode:`bypass`,projectRoot:e.workspaceDir,writableRoots:[],deniedRoots:t,networkAllowed:!0};let n=e.settings.get(`permission_mode`)??`auto`;return{mode:n,projectRoot:e.workspaceDir,writableRoots:Te(n,e.workspaceDir,ot(),e.sandbox.writablePaths),deniedRoots:t,networkAllowed:e.sandbox.isNetworkAllowed,autoAllowBashIfSandboxed:e.sandbox.autoAllowBashIfSandboxed}}})),e.hookRegistry.registerAll(em(t=>e.getSession(t),e.memoryAutoExtractor,{isEnabled:()=>e.settings.get(`memory_auto_extract`)?.enabled===!0||process.env.OTTO_MEMORY_AUTO_EXTRACT===`1`}));let i=()=>e.settings.get(`skill_loop`)?.enabled===!0||process.env.OTTO_SKILL_LOOP===`1`;return e.hookRegistry.registerAll(tm({isEnabled:i},e.promptManager)),e.hookRegistry.registerAll(Eb({isEnabled:i,getMinMessages:()=>e.settings.get(`skill_loop`)?.min_messages,getCooldownDays:()=>e.settings.get(`skill_loop`)?.dismiss_cooldown_days,notifyServices:e.notifyPluginServices,getWorkspaceKey:e.getWorkspaceKey,getRequestGrill:t=>{let n=e.getSession(t);return n?e=>n.requestGrill({...e,askedBy:`skill-loop`}):void 0},onAccepted:({sessionId:t,brief:n})=>{Kb({startJob:t=>e.startSkillDraftJob({...t,origin:`user`}),brief:n,sessionId:t,pluginId:Cb,workspaceKey:e.getWorkspaceKey()??wb,logger:{warn:t=>e.logger.warn(t)}})},logger:e.logger})),e.hookRegistry.register(Mb({getOnFileEdited:e.getEditFileCallback,dedupCache:e.editFilesDedup})),{agentJobNotify:r.notify}}function Jb(e,t,n,r){return Tp({processOwnerId:e.processOwnerId,orchestrator:e.orchestrator,writeTodos:e.writeTodos,sandbox:t=>e.sandbox.isBypassed(t?.command)?void 0:e.sandbox.current??void 0,autoMemory:e.storage.autoMemory,reloadMemory:e.storage.memory?()=>e.storage.memory.loadMemory():void 0,archiveRecall:e.storage.memory,runTeam:e.runTeam,runSession:e.runSession,fileStateManager:e.fileStateManager,learningStore:e.learningStore,localLearningStore:e.localLearningStore,sessions:{list:()=>e.listSessions(),create:()=>e.createSession(),remove:t=>e.removeSession(t),get:t=>e.getSession(t)},listModels:t=>e.buildModelCatalog(t),startJob:t=>({jobId:e.agentJobs.start({...t,origin:`main`}).id}),getScheduleService:()=>e.scheduleServiceInstance,searchEcosystem:e.searchEcosystem,capabilityGapRecorder:e.capabilityGapRecorder},t,n,r)}function Yb(e,t){return Be(t,Ep(Jb(e,t,e.skillRegistry?Bn(e.skillRegistry,t):void 0,!1))).getAvailable(e.defaultToolPreset)}function Xb(e){return e.toolRegistry.getAvailable(e.defaultToolPreset).filter(e=>e.name.startsWith(`mcp__`))}function Zb(e,t){let n=t.skillProvider??(e.skillRegistry?Bn(e.skillRegistry,e.workspaceDir):void 0);t.sandbox&&e.sandbox.pin(t.sandbox);let r={registerChild(e,t){return{pid:E.registerChild(e,t).pid??0}}};return Be(e.workspaceDir,{...Ep(Jb(e,e.workspaceDir,n,t.lsp===!0)),processTracker:r})}function Qb(e){e.agentJobNotify=qb({hookRegistry:e.hookRegistry,toolRegistry:e.toolRegistry,getDefaultToolPreset:()=>e.defaultToolPreset,failureSignals:e.failureSignals,contextSourcesBuildHooks:(t,n)=>e.agentRuntime.contextSources.sealAndBuildHooks(t,n),workspaceDir:e.workspaceDir,memory:e.storage.memory,learningStore:e.learningStore,localLearningStore:e.localLearningStore,evolutionSignals:e.evolutionSignals,promptManager:e.promptManager,skillRegistry:e.skillRegistry,notificationDispatcher:e.notificationDispatcher,permissionRegistry:e.permissionRegistry,codingSessionPool:e.codingSessionPool,sandbox:e.sandbox,settings:e.settings,getEditFileCallback:()=>e.editFileCallback,editFilesDedup:e._editFilesDedup,memoryAutoExtractor:e.memoryAutoExtractor,getSession:t=>e.getSession(t),notifyPluginServices:t=>e.notifyPluginServices(t),getWorkspaceKey:()=>e.workspaceRef?.key,startSkillDraftJob:t=>e.agentJobs.start(t),claudeHooks:e.compatProducts?.hooks??[],logger:e.logger}).agentJobNotify}function $b(e){return{async readFile(e){try{return await Zi(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return null;throw e}},async writeFile(e,t){await Yi(S(e),{recursive:!0}),await Mn(e,t)},async writeFileExclusive(e,t){await Yi(S(e),{recursive:!0});try{let n=await Xi(e,`wx`);try{await n.writeFile(t,`utf8`)}finally{await n.close()}return!0}catch(e){if(e.code===`EEXIST`)return!1;throw e}},genId:e?.genId??Gi,now:e?.now??(()=>new Date().toISOString())}}function ex(e){return t=>{e?.({type:`plugin.load-failed`,...t})}}function tx(e){return new Tt({persist:Ft(`${r}/signals`),logWarn:(t,n)=>e.warn({err:n},t)})}function nx(e,t){return{record:n=>{e.record(n),t?.({type:`capability_gap.reported`,...n})}}}async function rx(e,t){let n=await e.restoreFromLog();return n>0&&t?.(n),n}async function ix(e){if(e.ensureNotDisposed(),await e.ensureSettingsLoaded(),await rx(e.evolutionSignals,t=>e.logger.info({count:t},`signal log restored %d records`)),!e.workspaceRef&&!e.pendingWorkspaceInit&&!e.parentWorkspaceExisted)try{let t=Wi($b()),n=e._workspaceId?{id:e._workspaceId}:void 0,r=await t.resolveLocal(e.workspaceDir,{...n,autoCreate:!(e._interactive&&!n)});`kind`in r&&r.kind===`uninitialized`?e.pendingWorkspaceInit={root:r.root}:`kind`in r&&r.kind===`parentWorkspaceExisted`?e.parentWorkspaceExisted={parentRoot:r.parentRoot,currentRoot:r.currentRoot,marker:r.marker}:e.workspaceRef=r}catch(t){e.logger.warn({err:t,workspaceDir:e.workspaceDir},`Workspace resolution failed; continuing without workspace identity. Sessions previously saved under a workspace key will not be restored.`)}e.storage.autoMemory&&await e.storage.autoMemory.load(),await St(`skills/agents/teams discovery + plugin module load`,async()=>{if(e.skillRegistry){await e.skillRegistry.discover();for(let t of e.settings.get(`disabled_skills`)??[])e.skillRegistry.disable(t);let t=new Set(e.settings.get(`disabled_plugins`)??[]);if(t.size>0)for(let[n,r]of e.skillRegistry.getAll())r.source?.type===`plugin`&&r.source.id&&t.has(r.source.id)&&e.skillRegistry.disable(n)}e.declarativeAgentProfiles=await zc(e.workspaceDir,{plugins:e.activePlugins(),claudeProjectAgentsAllowed:e.compatProducts?!e.compatProducts.trustVerdict.gated:void 0}),e.declarativeTeams=await Gc(e.workspaceDir);let t=await e.pluginModuleManager.reload(new Set(e.declarativeAgentProfiles.map(e=>e.name)));e.declarativeAgentProfiles.push(...t),e._pendingProviderCapabilities=(await e.pluginProviderManager.reload()).pendingCapabilityPluginIds,await e.diagnoseTopoSortIssues()});let t=()=>St(`mcpController.start()`,()=>e.mcpController.start()).then(t=>(e.syncSessionTools(),e.onMcpStartupSettled?e.onMcpStartupSettled(t):e.pendingMcpStartupResult=t,t)).catch(t=>(e.logger.warn({err:t instanceof Error?t.message:String(t)},`mcpController.start() failed unexpectedly (non-blocking path)`),{connected:0,failed:0}));e._interactive?t():await t(),e.pendingWorkspaceInit?e.logger.info({workspaceDir:e.workspaceDir},`Workspace identity pending trust confirmation; session restore deferred`):e.parentWorkspaceExisted?e.logger.info({workspaceDir:e.workspaceDir,parentRoot:e.parentWorkspaceExisted.parentRoot},`Parent workspace detected; waiting for user choice (adopt parent or create new)`):e._interactive?await St(`completeWorkspaceDependentStartup (session restoreAll)`,()=>ax(e)):St(`sweepOrphanTraceFiles (headless)`,()=>fx(e)),e._memoryGovernor.setCallbacks({onWarning:()=>{let t=e.getActiveSession();t&&t.compactNow().catch(t=>{e.logger.warn({err:t instanceof Error?t.message:String(t)},`[memory-governor] headless compactNow (soft degrade) failed`)})},onCritical:t=>{let n=process.env.OTTO_HEADLESS_OOM_POLICY??`log-only`;e.logger.error({policy:n,level:t.level,usedPct:t.usedPct,heapUsed:t.heapUsed},`[memory-governor] critical memory threshold reached (headless/service)`),n===`graceful-exit`&&px(e).finally(()=>process.exit(1))},onSample:t=>{e._residencyGovernor.setLevel(t.level);let n=performance.getEntriesByType(`measure`).length;n>5e4&&(performance.clearMeasures(),performance.clearMarks(),e.logger.warn({measureCount:n},`[memory-governor] user-timing buffer exceeded guard threshold — cleared (likely a dev-mode library leaking performance.measure; see a7eaa826)`));let r=e.getActiveSession()?.id;r&&e.storage.traceStore.append(r,{ts:t.ts,sessionId:r,kind:`lifecycle`,node:`process.memory.sample`,payload:{pid:process.pid,level:t.level,heapUsed:t.heapUsed,heapSizeLimit:t.heapSizeLimit,usedPct:Number(t.usedPct.toFixed(2)),rss:t.rss,external:t.external}}).catch(t=>{e.logger.warn({err:t instanceof Error?t.message:String(t)},`[memory-governor] trace sample append failed`)})}}),e._memoryGovernor.start(),e._fleetMonitor.setCallbacks({onSample:t=>{let n=e.getActiveSession()?.id;n&&e.storage.traceStore.append(n,{ts:t.ts,sessionId:n,kind:`lifecycle`,node:`process.fleet.sample`,payload:{pid:process.pid,processCount:t.processCount,totalRssMb:t.totalRssMb,suspectedOrphanCount:t.suspectedOrphanCount,maxGeneration:t.maxGeneration}}).catch(t=>{e.logger.warn({err:t instanceof Error?t.message:String(t)},`[fleet-monitor] trace sample append failed`)})}}),e._fleetMonitor.start(),vt(`app.start() internal phases complete`),e.logger.info(`App started`)}async function ax(e){if(e.workspaceRef&&e.planeRegistry.migrateWorkspaceGrid(`default`,e.workspaceRef.key),e.codingSessionPool.autoPersist){let t=await e.codingSessionPool.restoreAll();if(t>0){e.logger.info({count:t},`Sessions restored from storage`);for(let t of e.listSessions()){let n=e.getSession(t.id);n&&e.notificationDispatcher.attach(n)}}}fx(e)}function ox(e){return!!e.pendingWorkspaceInit}function sx(e){return!!e.parentWorkspaceExisted}async function cx(e){let t=e.parentWorkspaceExisted;if(!t)return e.workspaceRef;e.parentWorkspaceExisted=void 0;try{return e.workspaceRef=await Wi($b()).resolveLocal(t.parentRoot),await ax(e),e.workspaceRef}catch(n){e.parentWorkspaceExisted=t,e.logger.warn({err:n,parentRoot:t.parentRoot},`Failed to adopt parent workspace; continuing without workspace identity. Will retry on next startup.`);return}}async function lx(e){let t=e.parentWorkspaceExisted;if(!t)return e.workspaceRef;e.parentWorkspaceExisted=void 0;try{return e.workspaceRef=await Wi($b()).createLocal(t.currentRoot),await ax(e),e.workspaceRef}catch(n){e.parentWorkspaceExisted=t,e.logger.warn({err:n,currentRoot:t.currentRoot},`Failed to create new workspace; continuing without workspace identity. Will retry on next startup.`);return}}async function ux(e){let t=e.pendingWorkspaceInit;if(!t)return e.workspaceRef;e.pendingWorkspaceInit=void 0;try{return e.workspaceRef=await Wi($b()).createLocal(t.root),await ax(e),e.workspaceRef}catch(n){e.pendingWorkspaceInit=t,e.logger.warn({err:n,root:t.root},`Workspace identity creation failed; continuing without workspace identity. Will retry on next startup.`);return}}async function dx(e,t){let n=e.workspaceRef?.root;if(!n)return!1;let r=$b(),i=await Ki(n,r);if(!i)return!1;if(!t&&i.memorySyncEnabled){try{await e.storage.autoMemory?.load()}catch{}try{await e.learningStore.refresh()}catch{}}let a=t?{...i,memorySyncEnabled:!0}:{id:i.id,name:i.name,createdAt:i.createdAt};return await Ji(n,a,r),e.workspaceRef={key:qi(a.id),id:a.id,root:n,...a.memorySyncEnabled?{memorySyncEnabled:!0}:{}},!0}async function fx(e){let t=e.sessionStorageDir,n=e.sessionRepoRef?.current;if(!t||!n)return;let r=process.env.OTTO_TRACE_SWEEP;if(r!==`off`)try{let{sweepOrphanTraces:i}=await import(`./trace-orphan-sweeper-BdEIlLfB.js`),a=new Set(await n.listAllSessionIds());for(let t of e.codingSessionPool.listSessions())a.add(t.id);await i({dirs:[C(t,`trace`),C(t,`checkpoint`)],liveSessionIds:a,logger:e.logger,mode:r===`dry-run`?`dry-run`:`delete`})}catch(t){e.logger.warn({err:t instanceof Error?t.message:String(t)},`Orphan trace sweep failed`)}}async function px(e){if(e.disposed)return;e.disposed=!0;let t=[],n=async(e,n)=>{try{await n()}catch(n){t.push(Error(`stop:${e}: ${n.message}`))}};e.codingSessionPool.autoPersist&&await n(`saveSessions`,()=>e.codingSessionPool.saveAll()),await n(`processRegistryUnsubs`,()=>{for(let t of e.processRegistryUnsubs)t();e.processRegistryUnsubs.length=0}),await n(`bgProcesses`,()=>E.killAllForOwner(`app`,e.processOwnerId)),await n(`mcpController`,()=>e.mcpController.stop()),await n(`processRuntime`,()=>E.killAll()),await n(`scheduleService`,()=>e.scheduleServiceInstance?.stop()),await n(`memoryGovernor`,()=>e._memoryGovernor.dispose()),await n(`fleetMonitor`,()=>e._fleetMonitor.dispose()),await n(`agentJobs`,()=>e.agentJobServiceInstance?.dispose()),await n(`settings`,()=>e.settings.dispose()),await n(`toolRegistry`,()=>e.toolRegistry.dispose()),await n(`orchestrator`,()=>e.orchestrator.dispose()),await n(`notification`,()=>e.notificationDispatcher.dispose()),await n(`agentRuntime`,()=>e.agentRuntime.dispose()),await n(`hooks`,()=>{for(let t of e.ownedHookNames)e.hookRegistry.unregister(t);e.ownedHookNames.length=0}),await n(`pluginModules`,()=>e.pluginModuleManager.cleanup()),await n(`pluginProviders`,()=>e.pluginProviderManager.cleanup()),await n(`pluginWorkers`,()=>Hu()),await n(`pluginServices`,()=>vu()),await n(`sandbox`,()=>e.sandbox.dispose()),e.devtools&&await n(`devtools`,()=>e.devtools.stop()),await n(`logSub`,()=>{e.globalLogSubscription&&=(e.globalLogSubscription(),null)}),await n(`traceStore`,()=>e.storage.traceStore.close?.()),await n(`checkpointStore`,()=>e.storage.checkpointStore.close?.()),await n(`signalLog`,()=>e.evolutionSignals.close()),await n(`authStore`,()=>e._authStore.dispose()),await n(`planeRegistry`,()=>e.planeRegistry.dispose()),t.length>0&&e.logger.warn({count:t.length,errors:t.map(e=>e.message)},`stop: %d subsystems reported errors`),e.logger.info(`App stopped`)}function mx(e){return e.filter(e=>e.type===`text`).map(e=>e.text).join(`
589
+ user explicitly applies it.`}function Gb(e){return`Draft skill: ${e.taskSignature.length>60?`${e.taskSignature.slice(0,60)}…`:e.taskSignature}`}function Kb(e){try{let t=Hb({pluginId:e.pluginId,workspaceKey:e.workspaceKey,sessionIds:e.brief.sessionIds});return{jobId:e.startJob({title:Gb(e.brief),prompt:Wb(e.brief,t),sessionId:e.sessionId}).id}}catch(t){e.logger?.warn(`skill-loop: failed to start skill draft job: ${t instanceof Error?t.message:String(t)}`);return}}function qb(e){e.hookRegistry.register(Dp(e.toolRegistry,e.getDefaultToolPreset)),e.hookRegistry.register(Oe(e.failureSignals)),e.hookRegistry.register(ke(e.failureSignals)),e.hookRegistry.registerAll(e.contextSourcesBuildHooks(e.workspaceDir,e.memory)),e.memory&&e.hookRegistry.registerAll(nn(e.memory)),e.hookRegistry.registerAll(an({getTodoList:t=>e.getSession(t)?.session.getTodoList()}));let t=/-milestone\.md$/,n=/^Status:\s*Done\b/m;e.hookRegistry.registerAll(en({isDocSyncTrigger:e=>{let r=typeof e.args.path==`string`?e.args.path:``;if(!t.test(r))return!1;let i=typeof e.args.newContent==`string`?e.args.newContent:typeof e.args.content==`string`?e.args.content:``;return n.test(i)}})),e.hookRegistry.registerAll(Rp(e.learningStore,e.promptManager,e.localLearningStore,{evolutionSignals:e.evolutionSignals,workspaceDir:e.workspaceDir},e.memory)),e.skillRegistry&&(e.hookRegistry.registerAll(zp(e.skillRegistry)),e.hookRegistry.registerAll(qp({registry:e.skillRegistry,evolutionSignals:e.evolutionSignals,getConfig:()=>{let t=e.settings.get(`skill_internalization`);return{enabled:t?.enabled===!0,minExecutions:t?.min_executions??Bp.minExecutions,minSuccessRate:t?.min_success_rate??Bp.minSuccessRate,maxInternalized:t?.max_internalized??Bp.maxInternalized}}})),e.hookRegistry.register(kb({registry:e.skillRegistry,resolveCwd:t=>t?w(e.workspaceDir,t):e.workspaceDir,logger:e.logger}))),e.hookRegistry.registerAll(e.claudeHooks),e.hookRegistry.registerAll(Xp()),e.hookRegistry.on(`session.deleted`,`rfc047-notification-detach`,t=>e.notificationDispatcher.detach(t.sessionId));let r=Pb();e.hookRegistry.registerAll(r.hooks),e.hookRegistry.register(Zp(e=>{E.killAllForSession(e)})),e.hookRegistry.registerAll(Qp({registry:e.permissionRegistry,getPersistedAllow:t=>e.codingSessionPool.getSessionPermissionAllow(t)})),e.hookRegistry.register(Ob({getContext:()=>{let t=Pe(e.workspaceDir,at());if(!e.sandbox.enabled)return{mode:`bypass`,projectRoot:e.workspaceDir,writableRoots:[],deniedRoots:t,networkAllowed:!0};let n=e.settings.get(`permission_mode`)??`auto`;return{mode:n,projectRoot:e.workspaceDir,writableRoots:Te(n,e.workspaceDir,ot(),e.sandbox.writablePaths),deniedRoots:t,networkAllowed:e.sandbox.isNetworkAllowed,autoAllowBashIfSandboxed:e.sandbox.autoAllowBashIfSandboxed}}})),e.hookRegistry.registerAll(em(t=>e.getSession(t),e.memoryAutoExtractor,{isEnabled:()=>e.settings.get(`memory_auto_extract`)?.enabled===!0||process.env.OTTO_MEMORY_AUTO_EXTRACT===`1`}));let i=()=>e.settings.get(`skill_loop`)?.enabled===!0||process.env.OTTO_SKILL_LOOP===`1`;return e.hookRegistry.registerAll(tm({isEnabled:i},e.promptManager)),e.hookRegistry.registerAll(Eb({isEnabled:i,getMinMessages:()=>e.settings.get(`skill_loop`)?.min_messages,getCooldownDays:()=>e.settings.get(`skill_loop`)?.dismiss_cooldown_days,notifyServices:e.notifyPluginServices,getWorkspaceKey:e.getWorkspaceKey,getRequestGrill:t=>{let n=e.getSession(t);return n?e=>n.requestGrill({...e,askedBy:`skill-loop`}):void 0},onAccepted:({sessionId:t,brief:n})=>{Kb({startJob:t=>e.startSkillDraftJob({...t,origin:`user`}),brief:n,sessionId:t,pluginId:Cb,workspaceKey:e.getWorkspaceKey()??wb,logger:{warn:t=>e.logger.warn(t)}})},logger:e.logger})),e.hookRegistry.register(Mb({getOnFileEdited:e.getEditFileCallback,dedupCache:e.editFilesDedup})),{agentJobNotify:r.notify}}function Jb(e,t,n,r){return Tp({processOwnerId:e.processOwnerId,orchestrator:e.orchestrator,writeTodos:e.writeTodos,sandbox:t=>e.sandbox.isBypassed(t?.command)?void 0:e.sandbox.current??void 0,autoMemory:e.storage.autoMemory,reloadMemory:e.storage.memory?()=>e.storage.memory.loadMemory():void 0,archiveRecall:e.storage.memory,runTeam:e.runTeam,runSession:e.runSession,fileStateManager:e.fileStateManager,learningStore:e.learningStore,localLearningStore:e.localLearningStore,sessions:{list:()=>e.listSessions(),create:()=>e.createSession(),remove:t=>e.removeSession(t),get:t=>e.getSession(t)},listModels:t=>e.buildModelCatalog(t),startJob:t=>({jobId:e.agentJobs.start({...t,origin:`main`}).id}),getScheduleService:()=>e.scheduleServiceInstance,validateScheduleModelId:t=>e.modelRegistry.find(t)?void 0:`Model "${t}" not found (check /model list)`,searchEcosystem:e.searchEcosystem,capabilityGapRecorder:e.capabilityGapRecorder},t,n,r)}function Yb(e,t){return Be(t,Ep(Jb(e,t,e.skillRegistry?Bn(e.skillRegistry,t):void 0,!1))).getAvailable(e.defaultToolPreset)}function Xb(e){return e.toolRegistry.getAvailable(e.defaultToolPreset).filter(e=>e.name.startsWith(`mcp__`))}function Zb(e,t){let n=t.skillProvider??(e.skillRegistry?Bn(e.skillRegistry,e.workspaceDir):void 0);t.sandbox&&e.sandbox.pin(t.sandbox);let r={registerChild(e,t){return{pid:E.registerChild(e,t).pid??0}}};return Be(e.workspaceDir,{...Ep(Jb(e,e.workspaceDir,n,t.lsp===!0)),processTracker:r})}function Qb(e){e.agentJobNotify=qb({hookRegistry:e.hookRegistry,toolRegistry:e.toolRegistry,getDefaultToolPreset:()=>e.defaultToolPreset,failureSignals:e.failureSignals,contextSourcesBuildHooks:(t,n)=>e.agentRuntime.contextSources.sealAndBuildHooks(t,n),workspaceDir:e.workspaceDir,memory:e.storage.memory,learningStore:e.learningStore,localLearningStore:e.localLearningStore,evolutionSignals:e.evolutionSignals,promptManager:e.promptManager,skillRegistry:e.skillRegistry,notificationDispatcher:e.notificationDispatcher,permissionRegistry:e.permissionRegistry,codingSessionPool:e.codingSessionPool,sandbox:e.sandbox,settings:e.settings,getEditFileCallback:()=>e.editFileCallback,editFilesDedup:e._editFilesDedup,memoryAutoExtractor:e.memoryAutoExtractor,getSession:t=>e.getSession(t),notifyPluginServices:t=>e.notifyPluginServices(t),getWorkspaceKey:()=>e.workspaceRef?.key,startSkillDraftJob:t=>e.agentJobs.start(t),claudeHooks:e.compatProducts?.hooks??[],logger:e.logger}).agentJobNotify}function $b(e){return{async readFile(e){try{return await Zi(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return null;throw e}},async writeFile(e,t){await Yi(S(e),{recursive:!0}),await Mn(e,t)},async writeFileExclusive(e,t){await Yi(S(e),{recursive:!0});try{let n=await Xi(e,`wx`);try{await n.writeFile(t,`utf8`)}finally{await n.close()}return!0}catch(e){if(e.code===`EEXIST`)return!1;throw e}},genId:e?.genId??Gi,now:e?.now??(()=>new Date().toISOString())}}function ex(e){return t=>{e?.({type:`plugin.load-failed`,...t})}}function tx(e){return new Tt({persist:Ft(`${r}/signals`),logWarn:(t,n)=>e.warn({err:n},t)})}function nx(e,t){return{record:n=>{e.record(n),t?.({type:`capability_gap.reported`,...n})}}}async function rx(e,t){let n=await e.restoreFromLog();return n>0&&t?.(n),n}async function ix(e){if(e.ensureNotDisposed(),await e.ensureSettingsLoaded(),await rx(e.evolutionSignals,t=>e.logger.info({count:t},`signal log restored %d records`)),!e.workspaceRef&&!e.pendingWorkspaceInit&&!e.parentWorkspaceExisted)try{let t=Wi($b()),n=e._workspaceId?{id:e._workspaceId}:void 0,r=await t.resolveLocal(e.workspaceDir,{...n,autoCreate:!(e._interactive&&!n)});`kind`in r&&r.kind===`uninitialized`?e.pendingWorkspaceInit={root:r.root}:`kind`in r&&r.kind===`parentWorkspaceExisted`?e.parentWorkspaceExisted={parentRoot:r.parentRoot,currentRoot:r.currentRoot,marker:r.marker}:e.workspaceRef=r}catch(t){e.logger.warn({err:t,workspaceDir:e.workspaceDir},`Workspace resolution failed; continuing without workspace identity. Sessions previously saved under a workspace key will not be restored.`)}e.storage.autoMemory&&await e.storage.autoMemory.load(),await St(`skills/agents/teams discovery + plugin module load`,async()=>{if(e.skillRegistry){await e.skillRegistry.discover();for(let t of e.settings.get(`disabled_skills`)??[])e.skillRegistry.disable(t);let t=new Set(e.settings.get(`disabled_plugins`)??[]);if(t.size>0)for(let[n,r]of e.skillRegistry.getAll())r.source?.type===`plugin`&&r.source.id&&t.has(r.source.id)&&e.skillRegistry.disable(n)}e.declarativeAgentProfiles=await zc(e.workspaceDir,{plugins:e.activePlugins(),claudeProjectAgentsAllowed:e.compatProducts?!e.compatProducts.trustVerdict.gated:void 0}),e.declarativeTeams=await Gc(e.workspaceDir);let t=await e.pluginModuleManager.reload(new Set(e.declarativeAgentProfiles.map(e=>e.name)));e.declarativeAgentProfiles.push(...t),e._pendingProviderCapabilities=(await e.pluginProviderManager.reload()).pendingCapabilityPluginIds,await e.diagnoseTopoSortIssues()});let t=()=>St(`mcpController.start()`,()=>e.mcpController.start()).then(t=>(e.syncSessionTools(),e.onMcpStartupSettled?e.onMcpStartupSettled(t):e.pendingMcpStartupResult=t,t)).catch(t=>(e.logger.warn({err:t instanceof Error?t.message:String(t)},`mcpController.start() failed unexpectedly (non-blocking path)`),{connected:0,failed:0}));e._interactive?t():await t(),e.pendingWorkspaceInit?e.logger.info({workspaceDir:e.workspaceDir},`Workspace identity pending trust confirmation; session restore deferred`):e.parentWorkspaceExisted?e.logger.info({workspaceDir:e.workspaceDir,parentRoot:e.parentWorkspaceExisted.parentRoot},`Parent workspace detected; waiting for user choice (adopt parent or create new)`):e._interactive?await St(`completeWorkspaceDependentStartup (session restoreAll)`,()=>ax(e)):St(`sweepOrphanTraceFiles (headless)`,()=>fx(e)),e._memoryGovernor.setCallbacks({onWarning:()=>{let t=e.getActiveSession();t&&t.compactNow().catch(t=>{e.logger.warn({err:t instanceof Error?t.message:String(t)},`[memory-governor] headless compactNow (soft degrade) failed`)})},onCritical:t=>{let n=process.env.OTTO_HEADLESS_OOM_POLICY??`log-only`;e.logger.error({policy:n,level:t.level,usedPct:t.usedPct,heapUsed:t.heapUsed},`[memory-governor] critical memory threshold reached (headless/service)`),n===`graceful-exit`&&px(e).finally(()=>process.exit(1))},onSample:t=>{e._residencyGovernor.setLevel(t.level);let n=performance.getEntriesByType(`measure`).length;n>5e4&&(performance.clearMeasures(),performance.clearMarks(),e.logger.warn({measureCount:n},`[memory-governor] user-timing buffer exceeded guard threshold — cleared (likely a dev-mode library leaking performance.measure; see a7eaa826)`));let r=e.getActiveSession()?.id;r&&e.storage.traceStore.append(r,{ts:t.ts,sessionId:r,kind:`lifecycle`,node:`process.memory.sample`,payload:{pid:process.pid,level:t.level,heapUsed:t.heapUsed,heapSizeLimit:t.heapSizeLimit,usedPct:Number(t.usedPct.toFixed(2)),rss:t.rss,external:t.external}}).catch(t=>{e.logger.warn({err:t instanceof Error?t.message:String(t)},`[memory-governor] trace sample append failed`)})}}),e._memoryGovernor.start(),e._fleetMonitor.setCallbacks({onSample:t=>{let n=e.getActiveSession()?.id;n&&e.storage.traceStore.append(n,{ts:t.ts,sessionId:n,kind:`lifecycle`,node:`process.fleet.sample`,payload:{pid:process.pid,processCount:t.processCount,totalRssMb:t.totalRssMb,suspectedOrphanCount:t.suspectedOrphanCount,maxGeneration:t.maxGeneration}}).catch(t=>{e.logger.warn({err:t instanceof Error?t.message:String(t)},`[fleet-monitor] trace sample append failed`)})}}),e._fleetMonitor.start(),vt(`app.start() internal phases complete`),e.logger.info(`App started`)}async function ax(e){if(e.workspaceRef&&e.planeRegistry.migrateWorkspaceGrid(`default`,e.workspaceRef.key),e.codingSessionPool.autoPersist){let t=await e.codingSessionPool.restoreAll();if(t>0){e.logger.info({count:t},`Sessions restored from storage`);for(let t of e.listSessions()){let n=e.getSession(t.id);n&&e.notificationDispatcher.attach(n)}}}fx(e)}function ox(e){return!!e.pendingWorkspaceInit}function sx(e){return!!e.parentWorkspaceExisted}async function cx(e){let t=e.parentWorkspaceExisted;if(!t)return e.workspaceRef;e.parentWorkspaceExisted=void 0;try{return e.workspaceRef=await Wi($b()).resolveLocal(t.parentRoot),await ax(e),e.workspaceRef}catch(n){e.parentWorkspaceExisted=t,e.logger.warn({err:n,parentRoot:t.parentRoot},`Failed to adopt parent workspace; continuing without workspace identity. Will retry on next startup.`);return}}async function lx(e){let t=e.parentWorkspaceExisted;if(!t)return e.workspaceRef;e.parentWorkspaceExisted=void 0;try{return e.workspaceRef=await Wi($b()).createLocal(t.currentRoot),await ax(e),e.workspaceRef}catch(n){e.parentWorkspaceExisted=t,e.logger.warn({err:n,currentRoot:t.currentRoot},`Failed to create new workspace; continuing without workspace identity. Will retry on next startup.`);return}}async function ux(e){let t=e.pendingWorkspaceInit;if(!t)return e.workspaceRef;e.pendingWorkspaceInit=void 0;try{return e.workspaceRef=await Wi($b()).createLocal(t.root),await ax(e),e.workspaceRef}catch(n){e.pendingWorkspaceInit=t,e.logger.warn({err:n,root:t.root},`Workspace identity creation failed; continuing without workspace identity. Will retry on next startup.`);return}}async function dx(e,t){let n=e.workspaceRef?.root;if(!n)return!1;let r=$b(),i=await Ki(n,r);if(!i)return!1;if(!t&&i.memorySyncEnabled){try{await e.storage.autoMemory?.load()}catch{}try{await e.learningStore.refresh()}catch{}}let a=t?{...i,memorySyncEnabled:!0}:{id:i.id,name:i.name,createdAt:i.createdAt};return await Ji(n,a,r),e.workspaceRef={key:qi(a.id),id:a.id,root:n,...a.memorySyncEnabled?{memorySyncEnabled:!0}:{}},!0}async function fx(e){let t=e.sessionStorageDir,n=e.sessionRepoRef?.current;if(!t||!n)return;let r=process.env.OTTO_TRACE_SWEEP;if(r!==`off`)try{let{sweepOrphanTraces:i}=await import(`./trace-orphan-sweeper-BdEIlLfB.js`),a=new Set(await n.listAllSessionIds());for(let t of e.codingSessionPool.listSessions())a.add(t.id);await i({dirs:[C(t,`trace`),C(t,`checkpoint`)],liveSessionIds:a,logger:e.logger,mode:r===`dry-run`?`dry-run`:`delete`})}catch(t){e.logger.warn({err:t instanceof Error?t.message:String(t)},`Orphan trace sweep failed`)}}async function px(e){if(e.disposed)return;e.disposed=!0;let t=[],n=async(e,n)=>{try{await n()}catch(n){t.push(Error(`stop:${e}: ${n.message}`))}};e.codingSessionPool.autoPersist&&await n(`saveSessions`,()=>e.codingSessionPool.saveAll()),await n(`processRegistryUnsubs`,()=>{for(let t of e.processRegistryUnsubs)t();e.processRegistryUnsubs.length=0}),await n(`bgProcesses`,()=>E.killAllForOwner(`app`,e.processOwnerId)),await n(`mcpController`,()=>e.mcpController.stop()),await n(`processRuntime`,()=>E.killAll()),await n(`scheduleService`,()=>e.scheduleServiceInstance?.stop()),await n(`memoryGovernor`,()=>e._memoryGovernor.dispose()),await n(`fleetMonitor`,()=>e._fleetMonitor.dispose()),await n(`agentJobs`,()=>e.agentJobServiceInstance?.dispose()),await n(`settings`,()=>e.settings.dispose()),await n(`toolRegistry`,()=>e.toolRegistry.dispose()),await n(`orchestrator`,()=>e.orchestrator.dispose()),await n(`notification`,()=>e.notificationDispatcher.dispose()),await n(`agentRuntime`,()=>e.agentRuntime.dispose()),await n(`hooks`,()=>{for(let t of e.ownedHookNames)e.hookRegistry.unregister(t);e.ownedHookNames.length=0}),await n(`pluginModules`,()=>e.pluginModuleManager.cleanup()),await n(`pluginProviders`,()=>e.pluginProviderManager.cleanup()),await n(`pluginWorkers`,()=>Hu()),await n(`pluginServices`,()=>vu()),await n(`sandbox`,()=>e.sandbox.dispose()),e.devtools&&await n(`devtools`,()=>e.devtools.stop()),await n(`logSub`,()=>{e.globalLogSubscription&&=(e.globalLogSubscription(),null)}),await n(`traceStore`,()=>e.storage.traceStore.close?.()),await n(`checkpointStore`,()=>e.storage.checkpointStore.close?.()),await n(`signalLog`,()=>e.evolutionSignals.close()),await n(`authStore`,()=>e._authStore.dispose()),await n(`planeRegistry`,()=>e.planeRegistry.dispose()),t.length>0&&e.logger.warn({count:t.length,errors:t.map(e=>e.message)},`stop: %d subsystems reported errors`),e.logger.info(`App stopped`)}function mx(e){return e.filter(e=>e.type===`text`).map(e=>e.text).join(`
590
590
  `)}function hx(e){return typeof e==`string`?e:mx(e)}function gx(e){return mx(e)}function _x(e){return mx(e)}function vx(e){let{sessionId:t,entries:n,signals:r=[]}=e,i=[],a=0,o=-1,s=e=>{i.push({sessionId:t,seq:a++,...e})};for(let e of n){if(e.type===`message`){let t=e.message;if(t.role===`system`||t.role===`system_notification`)continue;if(t.role===`user`){o+=1,s({kind:`turn.start`,at:e.timestamp,turnIndex:o}),s({kind:`user.message`,at:e.timestamp,turnIndex:o,text:hx(t.content)});continue}if(t.role===`assistant`){s({kind:`assistant.message`,at:e.timestamp,turnIndex:o,text:gx(t.content),model:t.model,usage:{input:t.usage.inputTokens,output:t.usage.outputTokens},stopReason:t.stopReason});for(let n of ba(t))s(yx(n,e.timestamp,o));continue}if(t.role===`tool_result`){s({kind:`tool.result`,at:e.timestamp,turnIndex:o,toolCallId:t.toolCallId,toolName:t.toolName,isError:t.isError,summary:_x(t.content)});continue}continue}if(e.type===`compaction`){if(e.replacementStripped)continue;s({kind:`compaction`,at:e.timestamp,boundaryId:e.id,summary:e.summary,compactedCount:e.compactedCount});continue}}for(let e of r)e.sessionId===t&&s({kind:`signal`,at:e.at,signalKind:e.kind,key:e.key,value:e.value,...e.detail===void 0?{}:{detail:e.detail}});return i}function yx(e,t,n){return{kind:`tool.call`,at:t,turnIndex:n,toolCallId:e.id,toolName:e.name,arguments:e.arguments}}function bx(e){let t=[...e.records].sort((e,t)=>e.seq-t.seq),n=0,r=0;for(let i of t){let t=i;if(e.redact){try{t=e.redact(i)}catch{r+=1;continue}if(t===void 0){r+=1;continue}}e.output.write(`${JSON.stringify(t)}\n`),n+=1}return{written:n,suppressed:r}}function xx(e,t,n){return e.filter(e=>(t==null||e.seq>t)&&e.seq<n)}async function Sx(e){let t=await e.repo.getEntryCount(e.sessionId),n=xx(await e.repo.loadEntries(e.sessionId,e.sinceSeq),e.sinceSeq,t);for(let t of n){if(t.type!==`compaction`)continue;let n=t.data?.summary;if(typeof n!=`string`||n.length===0)throw Error(`轨迹导出失败:会话 ${e.sessionId.slice(0,8)} 的 compaction 条目 ${t.entryId.slice(0,8)} 缺 summary(blob 完整性 fail-fast)。`)}let r=n.map(e=>xi(e));return{...bx({records:vx({sessionId:e.sessionId,entries:r,signals:e.signals??[]}),redact:e.redact,output:e.output}),upperSeq:t,entryCount:n.length}}function Cx(){let e=[];return{lines:e,write(t){return e.push(t),!0}}}async function wx(e,t,n={}){let r=t.sessionRepoRef.current;if(!r)throw Error(`轨迹导出仅支持关系化 SQLite 后端(sessions.db)。当前后端不支持。`);let i=t.evolutionSignals.list();if(n.output)return Sx({sessionId:e,repo:r,redact:n.redact,output:n.output,signals:i});let a=Cx();return{...await Sx({sessionId:e,repo:r,redact:n.redact,output:a,signals:i}),lines:a.lines}}async function Tx(e){let t=await e.capabilityReloader.reload();return e.applyResults({agentProfiles:t.agentProfiles,teamDeclarations:t.teamDeclarations,pendingProviderCapabilities:t.pendingProviderCapabilities}),await e.diagnoseTopoSortIssues(),e.syncSessionTools(),e.panelBackendController.notifyReload(),{mcpTools:t.mcpTools,models:t.models,agents:t.agents,teams:t.teamCount,pendingProviderCapabilities:t.pendingProviderCapabilities,i18nEntries:t.i18nEntries,agentProfiles:t.agentProfiles,teamDeclarations:t.teamDeclarations,...t.reloadFailures?{reloadFailures:t.reloadFailures}:{}}}let Ex=0;function Dx(e){let t=`__ottoResidencyDiagnostics`,n=globalThis;n[t]||Object.defineProperty(n,t,{configurable:!1,enumerable:!1,writable:!1,value:Object.freeze({getResidency:()=>e.getResidencyDiagnostics()})})}var Ox=class{processOwnerId=`app-${++Ex}`;get processOwner(){return this.processOwnerId}settings;toolRegistry;hookRegistry;planeRegistry=new Ht;providerRegistry;wireProtocolRegistry;agentRuntime;codingSessionPool;permissionRegistry;auditLog;logger;sessionRepoRef;sessionStorageDir;get workspaceDir(){return this.workspaceRef?.root??this._workspaceDir}_workspaceDir;_workspaceId;_interactive;_shadow;_pluginHomedir;_pluginBundledDirs;workspaceRef;pendingWorkspaceInit;parentWorkspaceExisted;maxSessions;maxToolTurns;maxToolTurnExtensions;promptOutputTokenBudget;promptWallClockBudgetMs;sessionCostBudgetUSD;stallDetection;devtools=null;editFileCallback=void 0;_editFilesDedup=new Set;storage;userMemory=new Ct({store:(()=>{let e=new Dt(at());return c()?Pt(e):e})()});completeText;clock;fileStateManager;learningStore;localLearningStore;memoryAutoExtractor;promptManager;orchestrator;runSession;writeTodos;sessionConfigResolver;session;model;notifications;permissions;runTeam;skillRegistry;i18nRegistry;_pendingProviderCapabilities=[];get pendingProviderCapabilities(){return this._pendingProviderCapabilities}declarativeAgentProfiles=[];compatProducts;extensions;pluginInput=pr();sigilResolvers=new bo;expandSigilChips(e,t){return ko(e,this.sigilResolvers,{workspaceDir:this.workspaceDir},{...t,lookupResolverId:e=>{for(let t of this.pluginInput.getAll())if(t.value===e&&t.resolverId)return t.resolverId}})}feedbackRegistry=new yo;getShortcuts(){return this.settings.get(`shortcuts`)??[]}async saveShortcut(e,t,n){let r=e.trim();if(!r||!/^[A-Za-z0-9_-]+$/.test(r))throw Error(`invalid shortcut name: ${JSON.stringify(e)}`);if(!t.trim())throw Error(`shortcut text cannot be empty`);let i=this.getShortcuts();if(i.some(e=>e.name===r&&e.name!==n))throw Error(`shortcut name already exists: ${r}`);let a=[...n?i.filter(e=>e.name!==n):i,{name:r,text:t}];await this.settings.persist({shortcuts:a},`project`)}async deleteShortcut(e){let t=this.getShortcuts(),n=t.filter(t=>t.name!==e);n.length!==t.length&&await this.settings.persist({shortcuts:n},`project`)}declarativeTeams=[];mcpController;panelBackendController;get mcpManager(){return this.mcpController.manager}disposed=!1;ownedHookNames=[];failureSignals=new be;diagnoser=new ye(this.failureSignals);pluginHealthTracker=wl();pluginCapabilityQuota=new Dl;inquiryCenter=new kl;userAskRenderer;userAskSeq=0;processRegistryUnsubs=[];settingsLoaded=!1;lastSettingsConfig=null;_resilienceOverride;_resilienceConfig;defaultToolPreset=`full`;permissionSync;sandbox;_memoryGovernor;_residencyGovernor;_fleetMonitor;get tools(){return this.toolRegistry.getAvailable(this.defaultToolPreset)}agentJobNotify;agentJobServiceInstance;scheduleServiceInstance;searchEcosystem;evolutionSignals;notificationDispatcher;presenceTracker;followUpPendingProbe;toolsSyncCoordinator;onMcpStartupSettled;pendingMcpStartupResult;setMcpStartupCallback(e){this.onMcpStartupSettled=e,this.pendingMcpStartupResult&&=(e(this.pendingMcpStartupResult),void 0)}pluginContributionsFacade;buildToolsForWorkspace(e){return Yb(this,e)}connectorTools(){return Xb(this)}get agentJobs(){return this.agentJobServiceInstance||=hs({workspaceDir:this.workspaceDir,agentJobNotify:this.agentJobNotify,buildToolsForWorkspace:e=>this.buildToolsForWorkspace(e),connectorTools:()=>this.connectorTools(),settings:this.settings,modelRegistry:this.modelRegistry,stream:this.codingSessionPool.stream,logger:this.logger,hookRegistry:this.hookRegistry}),this.agentJobServiceInstance}setScheduleService(e){this.scheduleServiceInstance=e,this.pluginModuleManager?.reconcileServiceSchedules()}setEcosystemSearch(e){this.searchEcosystem!==e&&(this.searchEcosystem=e,this.reloadCapabilities().catch(e=>{this.logger.warn({err:e instanceof Error?e.message:String(e)},`Failed to refresh capability_gap after ecosystem search injection`)}))}get memoryGovernor(){return this._memoryGovernor}get fleetMonitor(){return this._fleetMonitor}get modelRegistry(){return this._modelRegistry}get authStore(){return this._authStore}modelCatalogManager;_modelRegistry;_authStore;getAllModels(){return this.model.getAllModels()}resolveModel(e){return this.model.resolveModel(e)}listProviders(){return this.model.listProviders()}registerHook(e){Es(this,e)}unregisterHook(e){return Ds(this,e)}async hydrateModelCache(){return this.model.hydrateModelCache()}getSessionAvailableModels(e){return this.model.getSessionAvailableModels(e)}async refreshModels(){return this.model.refreshModels()}async reloadCapabilities(){let{agentProfiles:e,teamDeclarations:t,...n}=await Tx({capabilityReloader:this.capabilityReloader,applyResults:e=>{this.declarativeAgentProfiles=e.agentProfiles,this.declarativeTeams=e.teamDeclarations,this._pendingProviderCapabilities=e.pendingProviderCapabilities},diagnoseTopoSortIssues:()=>this.diagnoseTopoSortIssues(),syncSessionTools:()=>this.syncSessionTools(),panelBackendController:this.panelBackendController});return n}syncSessionTools(){return this.toolsSyncCoordinator.resync()}syncSessionToolsFor(e){return this.toolsSyncCoordinator.resyncOne(e)}pluginTopology=new xf;pluginModuleManager;capabilityGapStore=new Le;capabilityGapRecorder;pluginProviderManager;capabilityReloader;computedPluginCommands(){return this.pluginContributionsFacade.computedPluginCommands()}pluginCliCommands(){return this.pluginContributionsFacade.pluginCliCommands()}pluginSlashCommands(){return this.pluginContributionsFacade.pluginSlashCommands()}get sessionManager(){return this.codingSessionPool}getResidencyDiagnostics(){return this.codingSessionPool.getResidencyDiagnostics()}globalLogSubscription=null;constructor(e){let{inspect:t,logger:n,projectConfigPath:r,maxSessions:i,maxToolTurns:a,maxToolTurnExtensions:o,promptOutputTokenBudget:s,promptWallClockBudgetMs:l,sessionCostBudgetUSD:u,stallDetection:d,workspaceDir:f,workspaceId:p,pluginHomedir:m,pluginBundledDirs:h}=e;this.maxSessions=i??gi,this.maxToolTurns=a??Wt.maxToolTurns,this.maxToolTurnExtensions=o,this.promptOutputTokenBudget=s,this.promptWallClockBudgetMs=l,this.sessionCostBudgetUSD=u,this.stallDetection=d,this._workspaceDir=f??process.cwd(),this._workspaceId=p,this._interactive=e.interactive??!1,this._shadow=e.shadow??c(),this._pluginHomedir=m??at(),this._pluginBundledDirs=h??[],this._resilienceOverride=e.resilience,this.logger=T(n.name,{level:n.level,destination:n.destination}),this.evolutionSignals=tx(this.logger);let g={};this.sessionRepoRef=g,this.sessionStorageDir=e.storage?.session&&`dir`in e.storage.session?e.storage.session.dir:void 0;let _=dp({logger:this.logger,hookRegistry:e.hookRegistry,getToolRegistry:()=>this.toolRegistry,getPermissionRegistry:()=>this.permissionRegistry,onHookTimeout:({hookName:e,timeoutMs:t})=>{let n=nl(e);n&&this.pluginHealthTracker.recordHookTimeout(n,e)}});this.sandbox=_.sandbox,this._memoryGovernor=_.memoryGovernor,this._residencyGovernor=_.residencyGovernor,this._fleetMonitor=_.fleetMonitor,this.permissionSync=_.permissionSync,this.hookRegistry=_.hookRegistry;let te=Sf(e,()=>this.settings);this._authStore=te.authStore,this._modelRegistry=te.modelRegistry,this.providerRegistry=te.providerRegistry,this.wireProtocolRegistry=te.wireProtocolRegistry,this.modelCatalogManager=te.modelCatalogManager;let ne=te.defaultModel,re=te.resolveEffectiveModel,ie=e.modelId,ae=$a({options:e,workspaceDir:this.workspaceDir,providerRegistry:this.providerRegistry,defaultModel:ne,resolveEffectiveModel:re,repoRef:g,getWorkspaceRef:()=>this.workspaceRef,onMemoryConflict:e.onMemoryConflict,getActiveSessionBytes:()=>{let e=this.codingSessionPool?.active?.session;return e instanceof mi?e.estimatedContentBytes:void 0},getRealInputTokens:()=>this.codingSessionPool?.active?.getLastTotalInputTokens(),getToolRegistry:()=>this.toolRegistry,getEffectiveMaxBytes:()=>{let e=this.codingSessionPool;if(e)return e.getResidencyDiagnostics().maxBytesPerSession},getCoverageThresholds:Ya(()=>this.settings.get(`residency`)),...Ja(e=>this.codingSessionPool?.getSession?.(e)?.session,()=>this.codingSessionPool?.active?.session)});this.storage={storageHost:ae.storageHost,autoMemory:ae.autoMemory,memory:ae.memory,traceStore:ae.traceStore,traceLive:ae.traceLive,checkpointStore:ae.checkpointStore,remoteMemoryConfigured:!!(e.storage?.remote?.getAuth&&e.storage?.session&&`url`in e.storage.session),remoteSessionConfigured:!!(e.storage?.session&&`url`in e.storage.session)},this.clock=ae.clock;let se=fp({inspect:t,loggerName:n.name,workspaceDir:this.workspaceDir,projectConfigPath:r,interactive:this._interactive,permissionSync:this.permissionSync,sandbox:this.sandbox,onSettingsApplied:e=>{this.settingsLoaded=!0,e.tool_preset&&(this.defaultToolPreset=e.tool_preset)},getI18nRegistry:()=>this.i18nRegistry});this.devtools=se.devtools,this.globalLogSubscription=se.logSubscription,this.settings=se.settings;let ce=bs({getConfig:()=>this.settings.get(`notification`),getCwd:()=>this.workspaceDir,isFollowUpPending:()=>this.followUpPendingProbe?.()??!1,emitHookNotification:e=>void this.hookRegistry.emit(`notification`,e)});this.notificationDispatcher=ce.dispatcher,this.presenceTracker=ce.presenceTracker,this.compatProducts=io(this.workspaceDir,this.activePlugins());let le=this.settings,ue=ro({skillProvider:e.skillProvider,workspaceDir:this.workspaceDir,activePlugins:()=>this.activePlugins(),resolveEffectiveModel:re,providerRegistry:this.providerRegistry,prompt:e.prompt,compatProducts:this.compatProducts,memoryStore:ae.memoryStore,evolutionSignals:this.evolutionSignals,memoryAutoExtractConfig:{enabled:!0,get everyNTurns(){return le.get(`memory_auto_extract`)?.every_n_turns},get maxLessons(){return le.get(`memory_auto_extract`)?.max_lessons},get similarityThreshold(){return le.get(`memory_auto_extract`)?.similarity_threshold},get minRelevantHits(){return le.get(`memory_auto_extract`)?.min_relevant_hits}}});this.skillRegistry=ue.skillRegistry,this.fileStateManager=ue.fileStateManager,this.learningStore=ue.learningStore,this.localLearningStore=ue.localLearningStore,this.memoryAutoExtractor=ue.memoryAutoExtractor,this.completeText=ue.completeText,this.promptManager=ue.promptManager;let de=oe(this._authStore,`delegation`),fe=pp({getModelRegistry:()=>this.modelRegistry,providerRegistry:this.providerRegistry,authStore:this._authStore,getSettings:()=>this.settings,promptManager:this.promptManager,getTools:()=>this.tools,getDeclarativeAgentProfiles:()=>this.getEnabledAgentProfiles(),defaultModel:ne,explicitModelId:ie,isModelUsable:de,maxToolTurns:this.maxToolTurns,maxToolTurnExtensions:this.maxToolTurnExtensions,promptOutputTokenBudget:this.promptOutputTokenBudget,promptWallClockBudgetMs:this.promptWallClockBudgetMs,sessionCostBudgetUSD:this.sessionCostBudgetUSD,stallDetection:this.stallDetection,workspaceDir:this.workspaceDir,getWorkspaceRef:()=>this.workspaceRef,workspaceId:this._workspaceId,logger:this.logger,getResilienceConfig:()=>this.getResilienceConfig()}),pe=fe.visionDelegateService;this.sessionConfigResolver=fe.sessionConfigResolver;let me=mp({options:e,hookRegistry:this.hookRegistry,providerRegistry:this.providerRegistry,getModelRegistry:()=>this._modelRegistry,logger:this.logger,workspaceDir:this.workspaceDir,getTools:()=>this.tools,getDeclarativeAgentProfiles:()=>this.getEnabledAgentProfiles(),getWorkspaceRef:()=>this.workspaceRef,repoRef:g,maxToolTurns:this.maxToolTurns,promptManager:this.promptManager,memory:this.storage.memory,traceStore:this.storage.traceStore,checkpointStore:this.storage.checkpointStore,clock:this.clock,devtools:this.devtools??void 0,residencyGovernor:this._residencyGovernor,getResidencyConfig:()=>this.getResidencyConfig(),visionDelegateService:pe,resolveEffectiveModel:re,defaultModel:ne,planeRegistry:this.planeRegistry,semanticReviewer:wp({getPermissionMode:()=>this.getPermissionMode(),isSemanticReviewEnabled:()=>this.settings.get(`sandbox`)?.semanticReview===!0,resolveReviewModel:()=>{let e=re();if(e)return ee(`compact`,e,this._modelRegistry)[0]??e},createLlmReviewer:e=>tn({stream:this.codingSessionPool.stream,model:e})})});this.agentRuntime=me.agentRuntime,this.codingSessionPool=me.codingSessionPool,Dx(this);let he=me.swarmAgentRunner,ge=hp({hookRegistry:this.hookRegistry,stream:this.codingSessionPool.stream,logger:this.logger,defaultModel:me.defaultModel,providerRegistry:this.providerRegistry,getDeclarativeTeams:()=>this.declarativeTeams,getDeclarativeAgentProfiles:()=>this.getEnabledAgentProfiles(),getSession:e=>this.getSession(e),createSession:e=>this.createSession(e),removeSession:e=>this.removeSession(e),sessionConfigResolver:this.sessionConfigResolver,swarmAgentRunner:he,workflowConfig:{retry:this.settings.get(`workflow`)?.retry,circuitBreaker:this.settings.get(`workflow`)?.circuitBreaker,orchestration:this.settings.get(`workflow`)?.orchestration}});this.orchestrator=ge.orchestrator,this.runSession=ge.runSession,this.runTeam=ge.runTeam,this.writeTodos=ge.writeTodos,this.toolRegistry=this.initToolRegistry(e);let _e=yp({toolRegistry:this.toolRegistry,hookRegistry:this.hookRegistry,settings:this.settings,workspaceDir:this.workspaceDir,logger:this.logger,getResilienceConfig:()=>this.getResilienceConfig(),compatProducts:this.compatProducts});this.permissionRegistry=_e.permissionRegistry,this.auditLog=_e.auditLog,this.mcpController=_e.mcpController;let ve=_e.preExistingHooks;this.extensions=bp({settings:this.settings,mcpController:this.mcpController,skillRegistry:this.skillRegistry,declarativeAgentProfiles:this.declarativeAgentProfiles,workspaceDir:this.workspaceDir,pluginHomedir:this._pluginHomedir,pluginBundledDirs:this._pluginBundledDirs,onPluginToggle:(e,t)=>{this.pluginModuleManager?.emitMonitorEvent({type:t?`plugin.enabled`:`plugin.disabled`,pluginId:e})}}),this.panelBackendController=gp({mcpController:this.mcpController,callMcpTool:(e,t,n)=>this.callMcpTool(e,t,n),getActivePlugins:()=>this.activePlugins()}).panelBackendController;let ye=xp({pluginInput:this.pluginInput,sigilResolvers:this.sigilResolvers,settings:this.settings,workspaceDir:this.workspaceDir,activePlugins:()=>this.activePlugins(),agentRuntime:this.agentRuntime,hookRegistry:this.hookRegistry,preExistingHooks:ve,codingSessionPoolGet:e=>this.codingSessionPool.getSession(e),logger:this.logger,registerHooks:()=>this.registerHooks()});this.ownedHookNames=ye.ownedHookNames,this.processRegistryUnsubs=ye.processRegistryUnsubs,this.i18nRegistry=new or;let be=_p({hookRegistry:this.hookRegistry,skillRegistry:this.skillRegistry,providerRegistry:this.providerRegistry,wireProtocolRegistry:this.wireProtocolRegistry,modelRegistry:this._modelRegistry,authStore:this._authStore,toolRegistry:this.toolRegistry,feedbackRegistry:this.feedbackRegistry,sigilResolverRegistry:this.sigilResolvers,pluginInput:this.pluginInput,workspaceDir:this.workspaceDir,activePlugins:()=>this.activePlugins(),callMcpTool:(e,t,n)=>this.callMcpTool(e,t,n),startPluginJob:({pluginId:e,title:t,prompt:n,sessionId:r})=>this.agentJobs.start({title:`[${e}] ${t}`,prompt:n,sessionId:r,origin:`plugin`}),getPluginJobSessionId:()=>this.getActiveSession()?.id,getSessionMessages:e=>this.getSession(e)?.session.messages().filter(e=>e.role===`user`||e.role===`assistant`||e.role===`tool_result`),completeText:(e,t)=>this.completeText(e,t),capabilityQuota:this.pluginCapabilityQuota,askUser:(e,t)=>this.askPluginUser(e,t),getWorkspaceKey:()=>this.workspaceRef?.key,logger:this.logger,onPluginLoadError:(e,t,n)=>{this.pluginHealthTracker.recordError(e,t),ex(this.pluginModuleManager?.emitMonitorEvent.bind(this.pluginModuleManager))({pluginId:e,reason:n,message:t})},getSchedulePort:()=>this.scheduleServiceInstance,settings:this.settings,mcpController:this.mcpController,skillRegistryForReloader:this.skillRegistry,modelCatalogManager:this.modelCatalogManager,getActivePluginsForReloader:()=>this.activePlugins(),i18nRegistry:this.i18nRegistry,getCompatTrustGated:()=>this.compatProducts?.trustVerdict.gated??!0,getSettingValue:e=>{try{return this.settings.get(e)}catch{return}},planeRegistry:this.planeRegistry});this.pluginModuleManager=be.pluginModuleManager,this.capabilityGapRecorder=nx(this.capabilityGapStore,this.pluginModuleManager.emitMonitorEvent.bind(this.pluginModuleManager)),this.pluginProviderManager=be.pluginProviderManager,this.capabilityReloader=be.capabilityReloader,this.toolRegistry.onMutation=e=>{this.permissionSync.sync(this.settings.config);for(let t of e.added??[])this.pluginModuleManager.emitMonitorEvent({type:`tool.registered`,toolName:t,source:e.source});for(let t of e.removed??[])this.pluginModuleManager.emitMonitorEvent({type:`tool.unregistered`,toolName:t,source:e.source})},this.settings.on(`change`,e=>{let t=e,n=this.lastSettingsConfig;if(this.lastSettingsConfig=t,!n)return;let r=new Set([...Object.keys(n),...Object.keys(t)]),i=[];for(let e of r)n[e]!==t[e]&&i.push(e);i.length>0&&this.pluginModuleManager.emitMonitorEvent({type:`settings.changed`,keys:i})});let xe=vp({sessionConfigResolver:this.sessionConfigResolver,getSession:e=>this.codingSessionPool.getSession(e),listSessionIds:()=>this.codingSessionPool.listSessions().map(e=>e.id),logger:this.logger,workspaceDir:this.workspaceDir,settings:this.settings,pluginModuleManager:this.pluginModuleManager,mcpController:this.mcpController,getActivePlugins:()=>this.activePlugins(),compatProducts:this.compatProducts});this.toolsSyncCoordinator=xe.toolsSyncCoordinator,this.pluginContributionsFacade=xe.pluginContributionsFacade,this.session=new nc(this),this.model=new Ns(this),this.notifications=new Rs(this),this.permissions=new Gs(this)}deferredConfigSteps(){return[{label:`resilience-config`,apply:()=>{this.freezeResilienceConfig()}},{label:`residency-config`,apply:()=>{this.freezeResidencyConfig()}},{label:`memory-governor-thresholds`,apply:()=>{let e=this.settings.get(`residency`);e&&this._memoryGovernor.updateThresholds({warnThresholdPct:e.warn_threshold_pct,hardThresholdPct:e.hard_threshold_pct})}},{label:`auth-store-lock-timeout`,apply:()=>{this._authStore.setRefreshLockTimeoutMs(this.getResilienceConfig().oauth.refreshLockTimeoutMs)}}]}async ensureSettingsLoaded(){await Sp(this.settings,()=>this.settingsLoaded,e=>{this.settingsLoaded=e}),Cp(this.deferredConfigSteps())}freezeResilienceConfig(){if(this._resilienceConfig!==void 0)return;let e=ji(process.env.OTTO_RESILIENCE_CONFIG),t=this._resilienceOverride?Pi(this._resilienceOverride):void 0;this._resilienceConfig=l(e,this.settings.get(`resilience`),t)}_residencyConfig;freezeResidencyConfig(){if(this._residencyConfig!==void 0)return;let e=this.settings.get(`residency`);this._residencyConfig={totalBytes:e?.total_bytes,minPerSessionBytes:e?.min_per_session_bytes,maxPerSessionBytes:e?.max_per_session_bytes,maxContentBytes:e?.max_content_bytes,maxHistoryMessages:e?.max_history_messages,resumeWindowMessages:e?.resume_window_messages,compactionTimeoutMs:e?.compaction_timeout_ms}}getResidencyConfig(){return this._residencyConfig}getResilienceConfig(){if(this._resilienceConfig===void 0)throw Error(`getResilienceConfig() called before settings are loaded — call after ensureSettingsLoaded()/start()`);return this._resilienceConfig}async allowToolAlways(e,t){return this.permissions.allowToolAlways(e,t)}getPermissionMode(){return this.permissions.getPermissionMode()}async setPermissionMode(e){return this.permissions.setPermissionMode(e)}getSessionAlwaysAllow(e){return this.permissions.getSessionAlwaysAllow(e)}bashAlwaysAllowPrefix(e){return this.permissions.bashAlwaysAllowPrefix(e)}isWellFormedAllowEntry(e){return this.permissions.isWellFormedAllowEntry(e)}async disallowToolAlways(e){return this.permissions.disallowToolAlways(e)}clearSessionAlwaysAllow(e){this.permissions.clearSessionAlwaysAllow(e)}activePlugins(){return this.pluginTopology.resolve({workspaceDir:this.workspaceDir,disabledPlugins:this.settings.get(`disabled_plugins`)??[],homedir:this._pluginHomedir,bundledDirs:this._pluginBundledDirs})}async diagnoseTopoSortIssues(){await this.pluginTopology.diagnose(this.logger,this.settings,ex(this.pluginModuleManager?.emitMonitorEvent.bind(this.pluginModuleManager)))}listFileCommands(){return this.pluginContributionsFacade.listFileCommands()}async callMcpTool(e,t,n){return this.pluginContributionsFacade.callMcpTool(e,t,n)}getPluginPanelRegistrations(){return this.pluginContributionsFacade.getPluginPanelRegistrations()}getPluginStatusItems(){return this.pluginContributionsFacade.getPluginStatusItems()}getGlobalMenuItems(){return this.pluginContributionsFacade.getGlobalMenuItems()}getPluginRenderers(){return this.pluginContributionsFacade.getPluginRenderers()}getPluginStatusWidgets(){return this.pluginContributionsFacade.getPluginStatusWidgets()}getPluginFileViewers(){return this.pluginContributionsFacade.getPluginFileViewers()}isFeedbackAvailable(){return this.feedbackRegistry.get()!==void 0}getPulseSurveyConfig(){return this.settings.get(`pulse_survey`)??{}}recordPulseSurvey(e){this.feedbackRegistry.get()?.recordPulseSurvey?.(e)}buildFeedbackIssueUrl(e){return this.feedbackRegistry.get()?.buildIssueUrl?.(e)}listFeedbackIssues(e){return this.feedbackRegistry.get()?.listIssues?.(e)??Promise.resolve({items:[]})}resolveFeedbackPlatform(){return this.feedbackRegistry.get()?.resolveFeedbackPlatform?.()??Promise.resolve(`github`)}markFeedbackResolved(e){return this.feedbackRegistry.get()?.markIssueResolved?.(e)??Promise.resolve(!1)}unmarkFeedbackResolved(e,t){return this.feedbackRegistry.get()?.unmarkIssueResolved?.(e,t)??Promise.resolve(!1)}listFeedbackResolvedMarks(){return this.feedbackRegistry.get()?.listResolvedMarks?.()??Promise.resolve([])}buildFeedbackCodingIssueUrl(e){return this.feedbackRegistry.get()?.buildCodingIssueUrl?.(e)??null}updateSettings(e){return this.settings.update(e)}resolveA2uiRendererPayload(e){return Ro(Fo(this.activePlugins()),e)}getPluginRegistrations(){return this.pluginContributionsFacade.getPluginRegistrations()}async firePluginActivationEvent(e){await this.pluginModuleManager.activateOn(e,new Set(this.declarativeAgentProfiles.map(e=>e.name)))}async start(){return ix(this)}async completeWorkspaceDependentStartup(){return ax(this)}needsWorkspaceInit(){return ox(this)}async confirmWorkspaceInit(){return ux(this)}hasParentWorkspace(){return sx(this)}async adoptParentWorkspace(){return cx(this)}async createLocalWorkspace(){return lx(this)}async setWorkspaceMemorySyncEnabled(e){return dx(this,e)}async sweepOrphanTraceFiles(){return fx(this)}async stop(){return px(this)}async createSession(e={}){return this.session.createSession(e)}registerNotificationChannel(e){this.notifications.registerNotificationChannel(e)}registerInAppNotificationChannel(e){this.notifications.registerInAppNotificationChannel(e)}setUserAskRenderer(e){this.userAskRenderer=e}async askPluginUser(e,t){let n={...Ax(t),id:`plugin_ask_${++this.userAskSeq}`,askedBy:`plugin:${e}`},r=this.userAskRenderer;if(!this._interactive||!r)return kx();let i=this.inquiryCenter.enqueue({id:n.id,origin:{kind:`plugin`,pluginId:e},question:n});if(!i.accepted)return kx();if(!await this.inquiryCenter.waitForTurn(n.id))return await i.answer;try{let e=await r(n);return this.inquiryCenter.settle(n.id,e),e}catch(e){throw this.inquiryCenter.settle(n.id,kx()),e}}notifyUserInteraction(){this.notifications.notifyUserInteraction()}setTerminalFocus(e){this.notifications.setTerminalFocus(e)}setFollowUpPendingProbe(e){this.followUpPendingProbe=e}notifyPluginServices(e){let t=_u(),n=Mx(this.activePlugins(),this.planeRegistry.resolveForEmit({workspaceKey:this.workspaceRef?.key})),r=0;for(let i of this.activePlugins())if(n.has(i.id))for(let n of t.runningServiceIds(i.id))t.notify(i.id,n,e)&&(this.pluginCapabilityQuota.onNotifyDelivered(i.id,e.sessionId),r+=1);return r}notifyPluginServiceSchedule(e,t){return this.activePlugins().some(t=>t.id===e.pluginId)?_u().notify(e.pluginId,e.serviceId,{type:`schedule.tick`,scheduleId:t.scheduleId,occurrenceId:t.occurrenceId,occurredAt:t.occurredAt}):!1}getSession(e){return this.session.getSession(e)}async shareSession(e,t){return this.session.shareSession(e,t)}getActiveSession(){return this.session.getActiveSession()}listSessions(e){return this.session.listSessions(e)}async listAllSessions(e){return this.session.listAllSessions(e)}async removeSession(e){return this.session.removeSession(e)}async exportSessionArchive(e,t){return this.session.exportSessionArchive(e,t)}exportTrajectory(e,t){return wx(e,{sessionRepoRef:this.sessionRepoRef??{},evolutionSignals:this.evolutionSignals},t)}archiveSession(e){return this.session.archiveSession(e)}async forkSession(e,t){return this.session.forkSession(e,t)}getEnabledAgentProfiles(){let e=new Set(this.settings.get(`disabled_agents`)??[]);return e.size===0?this.declarativeAgentProfiles:this.declarativeAgentProfiles.filter(t=>!e.has(t.name))}initToolRegistry(e){return Zb(this,e)}async buildModelCatalog(e){return this.model.buildModelCatalog(e)}setSessionAvailableModels(e,t){this.model.setSessionAvailableModels(e,t)}registerHooks(){Qb(this)}get activeSandbox(){return this.permissions.activeSandbox}approveSandboxBypass(e){this.permissions.approveSandboxBypass(e)}getRecentPermissionDecisions(e,t){return this.permissions.getRecentPermissionDecisions(e,t)}recordAutoPermissionDecision(e){this.permissions.recordAutoPermissionDecision(e)}ensureNotDisposed(){if(this.disposed)throw Error(`App has been stopped and cannot be reused.`)}};function kx(){return{answer:``,acceptedRecommendation:!1,resolvedBy:`human`}}function Ax(e){return{header:jx(e.header,160),question:jx(e.question,2e3),background:jx(e.background,4e3),recommendation:jx(e.recommendation,1e3),...e.options?{options:e.options.slice(0,8).map(e=>({label:jx(e.label,120),rationale:jx(e.rationale,1e3),...e.recommended?{recommended:!0}:{}}))}:{},...e.allowFreeform===void 0?{}:{allowFreeform:e.allowFreeform},...e.multiSelect===void 0?{}:{multiSelect:e.multiSelect},...e.evidence?{evidence:e.evidence.slice(0,8).map(e=>jx(e,1e3))}:{}}}function jx(e,t){return String(e??``).replace(/[--Ÿ‎‏‪-‮⁦-⁩]/g,` `).slice(0,t)}function Mx(e,t){let n=new Set(t.map(e=>e.pluginId).filter(e=>e!==void 0));return new Set(e.map(e=>e.id).filter(e=>n.has(e)))}function Nx(e){return new Ox(e)}function Px(e){return{get id(){return e.id},get title(){return e.title},get agentName(){return e.agentName},get model(){return{id:e.model.id,name:e.model.name,provider:e.model.provider}},get isBusy(){return e.isBusy},messageCount:()=>e.session.messages().length,lastAssistantText:()=>gs(e.session.messages()),prompt:(t,n)=>e.prompt(t,n),subscribe:((t,n)=>e.subscribe(t,n)),resolveApproval:(t,n)=>e.resolveApproval(t,n),resolveAskUser:(t,n)=>e.resolveAskUser(t,n),clearContext:()=>e.clearContext(),compactNow:()=>e.compactNow(),renameSession:t=>e.renameSession(t),abort:()=>e.abort(),dispose:()=>e.dispose()}}function Fx(e){return{createSession:async t=>Px(await e.createSession(t)),jobs:mn,models:{getAll:()=>e.modelRegistry.getAll().map(e=>({id:e.id,name:e.name,provider:e.provider})),switchModel:async(t,n)=>{let r=e.getSession(t);if(!r)return`会话未找到`;if(r.isBusy)return`当前有正在执行的对话,请等待完成后重试。`;let i=e.modelRegistry.find(n);return i?(r.applyModel(i),null):`未知模型 \`${n}\`。`},refresh:async()=>(await e.refreshModels()).map(e=>({provider:e.provider,status:e.status,added:e.added,kept:e.kept,total:e.total,reason:e.reason}))},permission:{getMode:()=>e.getPermissionMode(),setMode:t=>e.setPermissionMode(t)},auth:{getAuthSource:t=>e.authStore.getAuthSource(t)},i18n:{t:(t,n)=>e.i18nRegistry.t(t,n)},reloadCapabilities:()=>e.reloadCapabilities(),workspaceDir:e.workspaceDir}}const Ix=new Set(`assert.async_hooks.buffer.child_process.cluster.console.constants.crypto.dgram.diagnostics_channel.dns.domain.events.fs.http.http2.https.inspector.module.net.os.path.perf_hooks.process.punycode.querystring.readline.repl.sqlite.stream.string_decoder.timers.tls.trace_events.tty.url.util.v8.vm.wasi.worker_threads.zlib`.split(`.`));function Lx(e){return e.absolutePaths.length>0||e.bareSpecifiers.length>0}function Rx(e){let t=[],n=[];for(let r of e.matchAll(/require\("([^"]+)"\)/g)){let e=r[1];if(e.startsWith(`/`)){t.includes(e)||t.push(e);continue}e.startsWith(`.`)||e.startsWith(`node:`)||Ix.has(e)||n.includes(e)||n.push(e)}return{absolutePaths:t,bareSpecifiers:n}}function zx(e,t){let n=Rx(t);if(!Lx(n))return;let r=[`${e}: 产物不可分发(RFC-365 R1/R2)`];throw n.absolutePaths.length>0&&r.push(` 编译机绝对路径 require(R1)——发布机路径在用户机器不存在:`,...n.absolutePaths.map(e=>` ${e}`)),n.bareSpecifiers.length>0&&r.push(` 裸模块名 require(R2)——假设运行机有 node_modules,在 ~/.otto/plugins/<id>/ 必然 MODULE_NOT_FOUND:`,...n.bareSpecifiers.map(e=>` ${e}`)),Error(r.join(`
591
591
  `))}function Bx(e,t){return new Promise((n,r)=>{let i=setTimeout(()=>r(Error(`timeout`)),t);i.unref?.(),e.then(e=>{clearTimeout(i),n(e)},e=>{clearTimeout(i),r(e)})})}function Vx(e,t=O){let n=t(e);return n.gated||!(e.manifest.capabilities?.includes(`tools`)??!1)?!1:!n.pendingCapabilities.includes(`tools`)}async function Hx(e,t,n){let r=[];for(let i of e){if(!Vx(i,t))continue;let e=i.manifest.contributes?.perfMetrics;if(!e?.length)continue;let a=Uu(i.scope);for(let t of e){let e=(async()=>{try{let{result:e,error:n}=await Bx(a.executeTool(i.id,t.toolRef,{}),5e3);return n?{id:t.id,label:t.label,error:n}:{id:t.id,label:t.label,value:e}}catch(e){let r=e instanceof Error?e.message:String(e);return r===`timeout`&&n?.(i.id),{id:t.id,label:t.label,error:r}}})();r.push(e)}}return(await Promise.allSettled(r)).map((e,t)=>e.status===`fulfilled`?e.value:{id:`unknown-${t}`,label:`unknown`,error:String(e.reason)})}const Ux=20;function Wx(e,t=20){let n=Qc(e);if(!n||!v(n))return[];let r;try{r=b(n,`utf8`)}catch{return[]}let i=r.split(`
592
592
  `).filter(e=>e.trim().length>0).slice(-t),a=[];for(let e of i)try{a.push(JSON.parse(e))}catch{}return a}function Gx(e,t,n){let r=e?.manifest.contributes?.contextKeys;return{...t,...vr(r,n)}}function Kx(e,t){let n=e.manifest.scripts?.[t];if(!n)return Promise.reject(Error(`plugin ${e.id} 无脚本「${t}」`));let r=ht(n);return r.safe?new Promise((r,i)=>{let a=$i(n,{shell:!0,cwd:e.dir,stdio:`ignore`,env:mt()});a.on(`error`,i),a.on(`exit`,e=>e===0?r():i(Error(`脚本「${t}」退出码 ${e}`)))}):Promise.reject(Error(`脚本「${t}」被安全检查拦截:${r.reason}`))}function qx(e){let t=e.startsWith(`chrome://`);process.platform===`darwin`?$i(`open`,t?[`-a`,`Google Chrome`,e]:[e],{detached:!0,stdio:`ignore`}).unref():process.platform===`win32`?$i(`cmd`,[`/c`,`start`,``,e],{detached:!0,stdio:`ignore`}).unref():$i(t?`google-chrome`:`xdg-open`,[e],{detached:!0,stdio:`ignore`}).unref()}const Jx=T(`@x-otto/coding:plugin-cli-passthrough`),Yx=6e4;function Xx(e){let t=e.manifest.contributes?.cli?.bin,n=t?C(e.dir,t):Zx(e.dir);if(n)return Qx(n,e.dir)}function Zx(e){let t=C(e,`package.json`);if(v(t))try{let n=JSON.parse(b(t,`utf8`));if(typeof n.bin==`string`)return C(e,n.bin);if(n.bin&&typeof n.bin==`object`){let t=Object.values(n.bin)[0];return typeof t==`string`?C(e,t):void 0}return}catch{return}}function Qx(e,t){if(!v(e))return;let n,r;try{n=Qe(e),r=Qe(t)}catch{return}let i=r.endsWith(`/`)?r:`${r}/`;if(!n.startsWith(i)&&n!==r){Jx.warn({candidate:e,pluginDir:t},`Plugin CLI bin resolves outside plugin directory (symlink escape rejected)`);return}try{if(!tt(n).isFile())return}catch{return}return n}function $x(e,t){let n=new Map;for(let r of e){let e=r.manifest.contributes?.cli?.name;if(!e)continue;if(t.has(e)){Jx.warn({pluginId:r.id,name:e},`Plugin CLI contribution name collides with a built-in command; ignored`);continue}let i=n.get(e);i?i.push(r):n.set(e,[r])}return n}function eS(e,t){let n=$x(e,t),r=new Map;for(let[e,t]of n){if(t.length===1){r.set(e,t[0]);continue}Jx.warn({name:e,conflictingPluginIds:t.map(e=>e.id)},`Plugin CLI contribution name claimed by multiple plugins; command disabled (fail-closed, RFC-124 §10.2.2 — rename one of the conflicting plugins to resolve)`)}return r}function tS(e,t,n){let r=$x(e,t).get(n);return r&&r.length>=2?r.map(e=>e.id):void 0}function nS(e,t,n,r=Yx){return new Promise((i,a)=>{let o=$i(e,t,{stdio:`inherit`,cwd:n,env:mt()}),s=setTimeout(()=>{o.kill(`SIGTERM`),a(Error(`插件 CLI 执行超时(${r}ms),已终止子进程`))},r);s.unref(),o.on(`error`,e=>{clearTimeout(s),a(e)}),o.on(`exit`,(e,t)=>{clearTimeout(s),i(e??(t?1:0))})})}function rS(e,t){let n=new Map,r=(e,r,i)=>{if(t.has(e)){Jx.warn({pluginId:r.id,name:e,kind:i},`Plugin CLI contribution name collides with a built-in command; ignored`);return}let a=n.get(e);a?a.push({plugin:r,kind:i}):n.set(e,[{plugin:r,kind:i}])};for(let t of e){let e=t.manifest.contributes?.cli?.name;e&&r(e,t,`passthrough`);for(let e of t.manifest.contributes?.cliCommands??[])r(e.name,t,`in-process`)}return n}function iS(e,t){let n=rS(e,t),r=new Map;for(let[e,t]of n){if(t.length===1){r.set(e,t[0]);continue}Jx.warn({name:e,conflicts:t.map(e=>({pluginId:e.plugin.id,kind:e.kind}))},`Plugin CLI command name claimed by multiple contributions (cross-plugin or cross-axis); command disabled (fail-closed, RFC-410 D4 / RFC-124 §10.2.2)`)}return r}function aS(e,t){let n=iS(e,t),r=[];for(let[e,t]of n){let n=t.kind===`in-process`?t.plugin.manifest.contributes?.cliCommands?.find(t=>t.name===e)?.summary:void 0;r.push({name:e,pluginId:t.plugin.id,kind:t.kind,...n?{summary:n}:{}})}return r.sort((e,t)=>e.name.localeCompare(t.name))}function oS(e,t,n){let r=rS(e,t).get(n);return r&&r.length>=2?r:void 0}async function sS(e,t=Yx){let n,r=new Promise(e=>{n=setTimeout(()=>{Jx.warn({timeoutMs:t},`in-process plugin CLI command timed out; returning exit code 124 (handler may still be running detached — cannot be force-killed in-process)`),e(124)},t),n.unref()});try{return await Promise.race([Promise.resolve(e()),r])}catch(e){return Jx.warn({err:String(e)},`in-process plugin CLI command threw; returning exit code 1`),1}finally{n&&clearTimeout(n)}}function cS(e,t={}){return gr({cwd:t.workspaceDir??process.cwd(),homedir:t.homedir??at(),bundledDirs:t.bundledDirs}).find(t=>t.id===e)}function lS(e,t,n={}){let r=cS(e,n);if(!r)return{ok:!1,reason:`plugin-not-found`,granted:[],pending:[],message:`Plugin "${e}" not found. Install it first, or check workspaceDir/homedir options.`};let i=(r.manifest?.capabilities??[]).filter(e=>Xn.includes(e)),a=t??[],o=a.filter(e=>!Xn.includes(e));if(o.length>0)return{ok:!1,reason:`unknown-capability`,granted:[],pending:i,message:`Unknown capability: ${o.join(`, `)}. Valid high-risk capabilities: ${Xn.join(`, `)}.`};let s=a.filter(e=>!i.includes(e));if(s.length>0)return{ok:!1,reason:`capability-not-declared`,granted:[],pending:i,message:`Plugin "${e}" does not declare capability: ${s.join(`, `)}. Declared: ${i.length?i.join(`, `):`(none)`}.`};Ur(r.dir),a.length>0&&Cr(r.dir,a);let c=O(r);return{ok:!0,granted:[...a],pending:c.pendingCapabilities}}function uS(e,t={}){let n=cS(e,t);if(!n)return{found:!1,trusted:!1,gated:!1,declared:[],granted:[],pending:[]};let r=O(n),i=(n.manifest?.capabilities??[]).filter(e=>Xn.includes(e));return{found:!0,trusted:r.trusted,gated:r.gated,declared:[...i],granted:[...r.grantedCapabilities],pending:[...r.pendingCapabilities]}}function dS(e,t={}){let n=cS(e,t);return n?(Gr(n.dir),!0):!1}const fS=T(`@x-otto/coding:plugin-theme-preset-loader`),pS=new Set([`dark`,`light`,`system`,`builtin`]);function mS(e){let t=[];for(let n of e){let e=n.manifest.contributes?.themePresets;if(!e?.length)continue;if(O(n).gated){fS.warn({pluginId:n.id},`plugin gated (untrusted), themePresets skipped`);continue}let r=e;r.length>nr&&(fS.warn({pluginId:n.id,declared:r.length,limit:nr},`plugin declares more theme presets than the per-plugin limit, truncated`),r=r.slice(0,nr));for(let e of r){if(pS.has(e.localId)){fS.warn({pluginId:n.id,localId:e.localId},`themePresets localId collides with a reserved name, skipped`);continue}t.push({pluginId:n.id,localId:e.localId,label:e.label,appearance:e.appearance,colors:e.colors,markdown:e.markdown,meta:e.meta})}}return t}export{ns as AgentJobService,Bt as AgentSession,Ox as App,qt as CodingSessionPool,wb as DEFAULT_WORKSPACE_KEY,vo as ExtensionManager,Yn as HIGH_RISK_CAPABILITIES,Cb as INDUCTOR_PLUGIN_ID,Ux as PLUGIN_LOG_TAIL_LINES,ir as PLUGIN_MANIFEST_FILENAME,ar as POINT,Wd as PluginConfigStore,xa as RegistryClient,Db as SANDBOX_ESCALATION_MARKER,la as SCHEDULE_LEASE_MIGRATIONS,Kt as SandboxUnavailableError,ua as ScheduleRegistry,da as SchedulerService,bo as SigilResolverRegistry,g as apiCredentialId,zx as assertPortableArtifact,lS as authorizePlugin,Gx as buildExtensionContext,Ha as buildMemoryStore,eS as buildPluginCliRegistry,iS as buildUnifiedCliCommandRegistry,Sa as builtinOfficialSource,Zt as captureFiles,vx as captureTrajectory,Ca as checkArchiveBomb,wa as checkGitUpgrades,yf as checkPluginConsistency,Ta as checkUpgrades,Kr as claudeTrustStorePath,Ea as cleanTempDir,aS as collectPluginCliCommandsForHelp,Hx as collectPluginPerfMetrics,mS as collectPluginThemePresets,$l as compilePluginModule,af as compilePluginPanels,nu as computeSourceHash,Nx as createApp,Da as createArchive,cr as createBuiltinHashtags,up as createBuiltinResolvers,qr as createClaudeHookBridgeHooks,ur as createFileProvider,Fx as createFrontendPort,Rp as createLessonInjectionHooks,fa as createLocalFireOwnership,fr as createPluginInputRegistry,pa as createRemoteFireOwnership,ma as createRemoteScheduleStore,ga as createScheduleStore,rn as createSessionStableInjectionHooks,zp as createSkillCatalogInjectionHooks,Oa as createTempDir,Dp as createToolGuidanceHook,Yr as defaultHookRunner,ln as defaultMaxToolTurnExtensions,Cc as defaultPostInstallExecutor,fn as deriveSessionTitle,Xr as detectClaudeExecutableSurface,mr as detectPluginExecutableSurface,Di as detectProjectConfigGating,ka as detectUninstallTarget,Zr as discoverFileCommands,hr as discoverPlugins,_r as dispatch,$r as evaluateClaudeTrust,yr as evaluatePluginTrust,Oi as evaluateWorkspaceTrustPrompt,ti as expandCommandBody,ko as expandSigilChips,bx as exportTrajectory,Sx as exportTrajectoryFromSession,Aa as extractArchive,tS as findPluginCliNameConflict,Rx as findPortabilityViolations,oS as findUnifiedCliCommandConflict,a as findWorkspaceRoot,Fl as getEsbuildModule,_s as getIncompleteSubagentReason,gs as getLastAssistantText,pn as globalAgentJobRegistry,hn as globalAgentObservability,_n as globalProcessRuntime,Sr as grantPluginCapabilities,wr as grantPluginCapabilitiesWithVersion,Tr as grantedPluginCapabilities,Er as grantedPluginCapabilitiesForVersion,Lx as hasPortabilityViolations,uS as inspectPluginAuthorization,ja as install,Rl as installEsbuildExitHook,Bl as installEsbuildSignalBridges,mf as installPluginFromDir,pf as installPluginFromPackage,Zl as installPluginHostExternals,Ma as installSkill,ni as interpretPreToolUse,Cf as isInternalDelegatedSession,Dr as isPluginTrusted,ri as isProjectTrusted,kr as isSensitiveField,Ai as isStrictProjectConfigEnabled,Na as listInstalledItems,ii as loadClaudeHooksConfig,cu as loadPluginModule,Il as markEsbuildStarted,ai as matchesHookMatcher,Sn as messagesFromSnapshot,qx as openTarget,oi as parseClaudeHooks,fi as parseDotMcpJson,jr as parsePluginManifest,Pa as parseRegistry,Nr as pluginTrustStorePath,qd as purgePluginState,Pr as readHighRiskCapabilities,Wx as readPluginLogTail,Rb as readSkillLoopStatus,$o as readTaskOutputTail,Cn as reconstructMessages,_f as recordPluginInstalled,vf as recordPluginUninstalled,Fr as redactSensitiveFields,gf as removeInstalledPluginEntry,Ir as resolveActions,si as resolveClaudeMcpServers,Xl as resolveHostExternalPaths,ff as resolvePackageDir,Xx as resolvePluginCliBin,lo as resolvePluginMcpServers,Mi as resolveProjectConfigTrusted,Tn as resolveSessionTitle,Dn as restoreFiles,dS as revokePluginAuthorization,iu as rewriteArtifactSourceHash,sS as runInProcessCliCommand,Kx as runPluginScript,Fa as scanInstalledVersions,xx as selectTrajectoryEntries,Br as sigilOf,nS as spawnPluginCli,Ll as stopEsbuildService,Hr as trustPlugin,li as trustProject,Ia as uninstall,Wr as untrustPlugin,ui as untrustProject,hf as upsertInstalledPluginEntry,La as validateExtractedPaths,Vl as withBuildTimeout};