@x-otto/coding 0.0.1-alpha.7 → 0.0.1-alpha.8

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
@@ -1,16 +1,16 @@
1
1
  import{createRequire as e}from"node:module";import{Devtools as t}from"@x-otto/devtools";import{OTTO_HOME as n,SDK_VERSION as r,findWorkspaceRoot as i,findWorkspaceRoot as a,isClaudeCompatEnabled as o,isShadowModeEnabled as s,normalizeEnv as c,resolveResilienceConfig as l}from"@x-otto/env";import{CATEGORY_POLICY as u,ModelCatalogStore as d,OAUTH_PROVIDER_IDS as f,TIER_TO_SLOT as p,apiCredentialId as m,builtinSlotModels as h,complete as g,createDefaultAuthStore as _,createDefaultModelRegistry as ee,createModelSlot as te,createModelUsabilityGate as ne,createProviderRegistry as re,createWireProtocolRegistry as ie,fetchModels as v,isBuiltinProviderId as ae,mergeFetchedModels as oe,rankModelsBySlotAffinity as se,registerCacheReportingApi as ce,registerProviderDescriptor as le,resolveModelsRequest as ue,stream as de,unregisterCacheReportingApi as fe,unregisterProviderDescriptor as pe}from"@x-otto/ai";import{Diagnoser as me,FailureSignalStore as he,PermissionAuditLog as ge,assessSandboxSafety as _e,bashAlwaysAllowPrefix as ve,compilePolicyFromSetting as ye,computeSandboxRoots as be,createDisabledToolsPolicy as xe,createEditFilesPanelHook as Se,createEgressAllowlistPolicy as Ce,createFailureSignalHook as we,createHookRegistry as Te,createPermissionDenyHook as Ee,createPermissionGuardHook as De,createPermissionModePolicy as Oe,createPermissionRegistry as ke,createPermissionToolSetsFromRegistry as Ae,defaultDeniedRoots as je,defineHook as y,extractWriteTargets as Me,isWellFormedAllowEntry as Ne}from"@x-otto/hooks";import{ORCHESTRATION_TOOL_NAMES as Pe,createPlatformSandbox as Fe,createToolRegistry as Ie,credentialDenyReadPaths as Le,isPlatformSandboxAvailable as Re}from"@x-otto/tools";import{homedir as ze,tmpdir as Be}from"node:os";import{dirname as b,extname as Ve,isAbsolute as He,join as x,relative as Ue,resolve as S,sep as We}from"node:path";import{CodedError as Ge,ProviderError as Ke,attachLogListener as qe,buildAllowedEnv as Je,checkShellCommand as Ye,createLogger as C,installGlobalProxyDispatcher as Xe,markStartupPhase as Ze,parseFrontmatterList as Qe,setDefaultProxy as $e,splitFrontmatter as et,traceStartupPhase as tt}from"@x-otto/shared";import{AutoMemory as nt,DEFAULT_MEMORY_SOURCES as rt,FileStateManager as it,FileSystemMemoryStore as at,HttpMemoryStore as ot,InMemoryArchiveStorage as st,OperationalLearningStore as ct,createMemoryAutoExtractor as lt,createMemoryManager as ut,createOverlayMemoryStore as dt,discoverAgentsSources as ft}from"@x-otto/memory";import{AgentSession as pt,FleetMonitor as mt,MemoryGovernor as ht,RUNTIME_DEFAULTS as gt,ResidencyGovernor as _t,SYSTEM_PROMPT_SECTIONS as vt,SandboxUnavailableError as yt,SessionPool as bt,applyDiff as xt,attachAgentObserver as St,buildEngineStores as Ct,captureFiles as wt,createAgentRuntime as Tt,createDocSyncReminderHooks as Et,createMemoryDeltaHooks as Dt,createSessionStableInjectionHooks as Ot,createSessionStableInjectionHooks as kt,createTodoReminderHooks as At,createToolHookExecutor as jt,createWorktree as Mt,defaultMaxToolTurnExtensions as Nt,defaultMaxToolTurnExtensions as Pt,deriveSessionTitle as Ft,globalAgentJobRegistry as It,globalAgentJobRegistry as Lt,globalAgentObservability as Rt,globalAgentObservability as zt,globalProcessRegistry as Bt,globalProcessRegistry as w,globalProcessRuntime as Vt,hasRepoDrifted as Ht,installAgentJobReaper as Ut,installProcessReaper as Wt,messagesFromSnapshot as Gt,reconstructMessages as Kt,removeWorktree as qt,resolveSessionTitle as Jt,resolveTodoContinuationConfig as Yt,restoreFiles as Xt,revertDiff as Zt,touchesCapabilitySurface as Qt,touchesForbiddenZone as $t,worktreeDiff as en}from"@x-otto/runtime";import{atomicWriteFile as tn,createFileStorageHost as nn,createInMemoryPanelStatePersistence as rn,createInMemoryPasteStatePersistence as an,createLiveTappedAppendLog as on,createPersistence as sn}from"@x-otto/persistence";import{SESSION_MAX_PER_SESSION_BYTES as cn,SESSION_RESUME_WINDOW_MESSAGES as ln}from"@x-otto/session-contract";import{createRegistrySkillProvider as un,createSkillRegistry as dn}from"@x-otto/skill";import{BUILTIN_PROMPTS_DIR as fn,PromptManager as pn,SKILL_LOOP_GUIDANCE as mn,SUBAGENT_GUARDRAILS as hn,assembleGenericSubAgentPrompt as gn,buildLessonInjection as _n,createPromptProvider as vn,resolveAgentProfile as yn}from"@x-otto/prompt";import{HIGH_RISK_CAPABILITIES as bn,HIGH_RISK_CAPABILITIES as xn,ID_RE as Sn,MAX_I18N_ENTRIES_PER_PLUGIN as Cn,MAX_I18N_FILE_BYTES as wn,MAX_I18N_LOCALE_FILES_PER_PLUGIN as Tn,MAX_I18N_TRANSLATION_BYTES as En,MAX_THEME_PRESETS_PER_PLUGIN as Dn,PLUGIN_API_VERSION as On,PLUGIN_MANIFEST_FILENAME as kn,PLUGIN_MANIFEST_FILENAME as T,POINT as An,PluginI18nRegistry as jn,SHELL_POINTS as Mn,createBuiltinHashtags as Nn,createBuiltinHashtags as Pn,createFileProvider as Fn,createFileProvider as In,createPluginInputRegistry as Ln,createPluginInputRegistry as Rn,detectPluginExecutableSurface as zn,discoverPlugins as Bn,discoverPlugins as Vn,dispatch as Hn,evaluateContextKeys as Un,evaluatePluginTrust as Wn,evaluatePluginTrust as E,evaluateWhen as Gn,filterEngineCompatible as Kn,grantPluginCapabilities as qn,grantPluginCapabilities as Jn,grantedPluginCapabilities as Yn,isPluginTrusted as Xn,isPluginTrusted as Zn,parsePluginManifest as Qn,parsePluginManifest as $n,pluginTrustStorePath as er,readHighRiskCapabilities as tr,resolveActions as nr,resolveActions as rr,resolveActivationEvents as ir,sigilOf as ar,topoSortPlugins as or,trustPlugin as sr,trustPlugin as cr,untrustPlugin as lr,untrustPlugin as ur}from"@x-otto/plugin";import{claudeTrustStorePath as dr,createClaudeHookBridgeHooks as fr,createClaudeHookBridgeHooks as pr,defaultHookRunner as mr,detectClaudeExecutableSurface as hr,detectProjectConfigGating as gr,discoverFileCommands as _r,discoverFileCommands as vr,evaluateClaudeTrust as yr,evaluateClaudeTrust as br,evaluateWorkspaceTrustPrompt as xr,expandCommandBody as Sr,interpretPreToolUse as Cr,isProjectTrusted as wr,isProjectTrusted as Tr,isStrictProjectConfigEnabled as Er,loadClaudeHooksConfig as Dr,mapClaudeAgentToolNames as Or,matchesHookMatcher as kr,parseClaudeHooks as Ar,parseDotMcpJson as jr,parseDotMcpJson as Mr,resolveClaudeMcpServers as Nr,resolveClaudeMcpServers as Pr,resolveProjectConfigTrusted as Fr,resolveProjectConfigTrusted as Ir,trustProject as Lr,untrustProject as Rr}from"@x-otto/claude-compat";import{McpManager as zr}from"@x-otto/mcp";import{appendFileSync as Br,closeSync as Vr,constants as Hr,existsSync as D,lstatSync as Ur,mkdirSync as O,mkdtempSync as Wr,openSync as Gr,readFileSync as k,readdirSync as Kr,readlinkSync as qr,realpathSync as Jr,renameSync as Yr,rmSync as Xr,statSync as Zr,symlinkSync as Qr,unlinkSync as $r,writeFileSync as A,writeSync as ei}from"node:fs";import{InMemorySession as ti,RelationalSessionPersistence as ni,SESSION_MAX as ri,SqliteSessionRepository as ii,createNoopSessionWriteLeaseManager as ai,createSessionWriteLeaseManager as oi,reassembleSnapshot as si}from"@x-otto/session";import{Orchestrator as ci,createHandoffTool as li,createSwarm as ui}from"@x-otto/orchestrator";import{BUILTIN_AGENT_PROFILES as di,SettingsManager as fi}from"@x-otto/setting";import{createHash as pi,randomUUID as mi}from"node:crypto";import{Agent as hi}from"@x-otto/agent";import{CallbackChannel as gi,CommandChannel as _i,NotificationDispatcher as vi,PresenceTracker as yi,TerminalChannel as bi,TimestampPresenceGate as xi}from"@x-otto/notification";import{DEFAULT_WORKSPACE_KEY as Si,createWorkspaceResolver as Ci,genWorkspaceId as wi,readMarker as Ti,workspaceKey as Ei,writeMarker as Di}from"@x-otto/workspace";import{spawn as Oi,spawnSync as ki}from"node:child_process";import{mkdir as Ai,open as ji,readFile as Mi,writeFile as Ni}from"node:fs/promises";import{Worker as Pi}from"node:worker_threads";import{fileURLToPath as Fi,pathToFileURL as Ii}from"node:url";import{DeviceFlowOAuthTemplate as Li,PKCEOAuthTemplate as Ri}from"@x-otto/provider";import{createTodoStore as zi}from"@x-otto/orchestration-contracts";import{SCHEDULE_LEASE_MIGRATIONS as Bi,ScheduleRegistry as Vi,SchedulerService as Hi,createLocalFireOwnership as Ui,createRemoteFireOwnership as Wi,createRemoteScheduleStore as Gi,createScheduleCapability as Ki,createScheduleStore as qi}from"@x-otto/schedule";import{InstallManager as Ji,RegistryClient as Yi,builtinOfficialSource as Xi,checkArchiveBomb as Zi,checkGitUpgrades as Qi,checkUpgrades as $i,cleanTempDir as ea,createArchive as ta,createTempDir as na,detectUninstallTarget as ra,extractArchive as ia,listInstalledItems as aa,parseRegistry as oa,scanInstalledVersions as sa,uninstall as ca,validateExtractedPaths as la}from"@x-otto/install";x(ze(),`.otto`);const ua=c(process.env.OTTO_REMOTE_STORAGE_TIMEOUT_MS,3e4),da=C(`@x-otto/coding:rfc344-compaction-cost`);function fa(e,t){if(!e?.remote?.getAuth)throw Error(`storage.${t}.url is configured, so storage.remote.getAuth is required.`);return e.remote}function pa(e,t,n,r,i){let a=ma(e,t,n,r,i);return a&&s()?dt(a):a}function ma(e,t,n,r,i){let a=e?.memory;if(a&&`dir`in a)return new at(a.dir);let o=e?.session&&`url`in e.session?e.session.url:void 0;if(e?.remote?.getAuth&&o){let a=e.remote;return new ot({baseUrl:o,getAuth:a.getAuth,fetch:a.fetch??globalThis.fetch,timeoutMs:a.timeoutMs??ua,userId:n?.userId,workspaceKey:()=>r?.()?.key,isWorkspaceSyncEnabled:()=>r?.()?.memorySyncEnabled===!0,localDir:t,onConflict:i})}if(t)return new at(t)}function ha(e){let{model:t,getModel:n,providerRegistry:r,onUsage:i}=e;return async(e,a)=>{let o=n?.()??t;if(!o)throw Error(`No model available — sign in or pick a model first.`);let s=await de(o,r.get(o.api),{model:o,systemPrompt:``,messages:[{role:`user`,content:e,timestamp:Date.now()}],maxTokens:a?.maxTokens},{signal:a?.signal}).result();return i&&s.usage&&i(s.usage),s.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
2
- `)}}function ga(e){let{model:t,getModel:n,memoryStore:r,providerRegistry:i,autoMemory:a,workspaceDir:s,getLoadSessionEntries:c,getActiveSessionBytes:l,getEffectiveMaxBytes:u,getCoverageThresholds:d}=e,f=ha({model:t,getModel:n,providerRegistry:i,onUsage:e=>da.info({inputTokens:e.inputTokens,outputTokens:e.outputTokens,cacheReadTokens:e.cacheReadTokens,cacheWriteTokens:e.cacheWriteTokens},`[RFC-344] compaction summarize request cost`)}),p=rt.filter(e=>e.writable),m=ft(s??process.cwd()),h=o()?[{path:`~/.claude/CLAUDE.md`,writable:!1},...ft(s??process.cwd(),{fileName:`CLAUDE.md`})]:[],g=[...p,...h,...m],_=r&&a?[...g,a.asSource()]:void 0;return ut({summarize:f,model:t?{contextWindow:t.contextWindow,maxOutput:t.maxOutputTokens}:void 0,getContextWindow:()=>(n?.()??t)?.contextWindow,maxContentBytes:cn,getMaxContentBytes:u,getCoverageThresholds:d,getEstimatedBytes:l,memoryStore:r,sources:_,archiveStorage:new st,messageFromEntry:e=>{let t=e.data;if(!t||typeof t!=`object`)return null;let n=t.message;return n&&typeof n.role==`string`?n:null},loadSessionEntries:async e=>{let t=c?.();if(!t)throw Error(`Session entries not wired`);return t(e)}})}function _a(e){let{options:t,workspaceDir:n,providerRegistry:r,defaultModel:i,resolveEffectiveModel:a,repoRef:o,getWorkspaceRef:c}=e,l=t.storage?.host?{host:nn({baseDir:t.storage.host.dir,namespaces:t.storage.host.namespaces}),token:t.storage.host.token}:null,u=pa(t.storage,n,t.userIdentity,c,e.onMemoryConflict),d=u?new nt({store:u}):null,f=t.memory??ga({model:i,getModel:a,storage:t.storage,memoryStore:u,providerRegistry:r,autoMemory:d,workspaceDir:n,getLoadSessionEntries:()=>o.current?async e=>(await o.current.loadEntries(e)).map(e=>({type:e.type,seq:e.seq,data:e.data})):void 0}),p=t.storage?.session,m=Ct({sessionDir:p&&`dir`in p?p.dir:void 0,remoteLog:p&&`url`in p&&t.storage?.remote?.getAuth?{baseUrl:p.url,getAuth:t.storage.remote.getAuth,fetch:t.storage.remote.fetch,timeoutMs:t.storage.remote.timeoutMs??ua}:void 0,ephemeral:s()},{traceStore:t.traceStore,checkpointStore:t.checkpointStore}),{store:h,live:g}=on(m.traceStore);return{storageHost:l,autoMemory:d,memory:f,traceStore:h,traceLive:g,checkpointStore:m.checkpointStore,clock:t.clock,memoryStore:u}}const va={delegation:`task_delegate`,"task-observability":`task_inspect`,"file-state-refresh":`capture_file_state`},ya=new Set(Object.keys(va));function ba(e){let t=new Set;for(let[n,r]of Object.entries(va))e.has(r)&&t.add(n);return t}function xa(e){let{skillProvider:t,workspaceDir:n,activePlugins:r,resolveEffectiveModel:i,providerRegistry:a,prompt:c,memoryStore:l,memoryAutoExtractConfig:u}=e,d=o()&&br(n).gated,f=t?null:dn({workspaceDir:n,library:{...d?{projectDirs:[`.otto/skills`]}:{},pluginDirs:r().filter(e=>e.manifest.contributes?.skills!==!1).filter(e=>!E(e).gated).map(e=>({id:e.id,dir:x(e.dir,`skills`)}))}}),p=new it,m=s(),h=new ct({path:`${n}/.otto/lessons.json`,...l?{store:l,storePath:`./.otto/lessons.json`}:{},ephemeral:m});return{skillRegistry:f,fileStateManager:p,learningStore:h,localLearningStore:new ct({path:`${n}/.otto/local/lessons.json`,ephemeral:m}),memoryAutoExtractor:lt({llm:ha({getModel:i,providerRegistry:a}),store:h,config:u??{enabled:!0}}),completeText:ha({getModel:i,providerRegistry:a}),promptManager:new pn({provider:vn(c??{type:`local`,baseDir:fn}),knownCapabilities:ya})}}var Sa=class{currentPermissionMode=void 0;constructor(e){this.deps=e}sync(e){let t=Ae(this.deps.getToolRegistry().getAll());this.syncModePolicy(e.permission_mode,t),this.syncDisabledToolsPolicy(e.disabled_tools),this.syncEgressPolicy(e.web_fetch_allowed_hosts),this.syncUserPolicies(e.permissions),this.registry.setAlwaysAllow(e.permission_always_allow??[]),this.deps.logger.debug(`Permission policies synced: %d policies active`,this.registry.getAll().length)}get registry(){return this.deps.getPermissionRegistry()}syncModePolicy(e,t){let n=e??`auto`;this.currentPermissionMode&&this.registry.unregister(`mode::${this.currentPermissionMode}`),this.registry.register(Oe(n,t)),this.currentPermissionMode=n}syncDisabledToolsPolicy(e){e&&e.length>0?this.registry.register(xe(e)):this.registry.unregister(`setting::disabled-tools`)}syncEgressPolicy(e){e&&e.length>0?this.registry.register(Ce(e)):this.registry.unregister(`setting::egress-allowlist`)}syncUserPolicies(e){for(let e of this.registry.getAll())e.name.startsWith(`user::`)&&this.registry.unregister(e.name);if(e)for(let t of e)this.registry.register(ye({...t,name:`user::${t.name}`}))}},Ca=class{strategy=null;pinned=!1;settingSnapshot=`null`;networkAllowed=!0;configuredWritablePaths=[];autoAllowBash=!1;constructor(e){this.logger=e}get current(){return this.strategy}get activeName(){return this.strategy?.name??null}get enabled(){return this.strategy!==null}get isNetworkAllowed(){return this.networkAllowed}get writablePaths(){return this.configuredWritablePaths}get autoAllowBashIfSandboxed(){return this.autoAllowBash}bypassCommands=new Set;approveBypass(e){e&&this.bypassCommands.add(e)}isBypassed(e){return e!==void 0&&this.bypassCommands.has(e)}pin(e){this.pinned=!0,this.networkAllowed=e.network!==`deny`,this.configuredWritablePaths=Array.isArray(e.writablePaths)?e.writablePaths.filter(e=>typeof e==`string`):[],this.autoAllowBash=e.autoAllowBashIfSandboxed===!0,e.enabled&&!Re()?(this.logger.warn(`Sandbox pinned but no platform sandbox available (install bwrap on Linux); running WITHOUT sandbox`),this.strategy=null):this.strategy=e.enabled?Fe({network:e.network,writablePaths:e.writablePaths,denyReadPaths:e.protectCredentials?Le():void 0}):null}applySetting(e){if(this.pinned)return;let t=JSON.stringify(e??null);if(t===this.settingSnapshot)return;this.settingSnapshot=t,this.networkAllowed=e?.network!==`deny`,this.configuredWritablePaths=Array.isArray(e?.writablePaths)?e.writablePaths.filter(e=>typeof e==`string`):[],this.autoAllowBash=e?.autoAllowBashIfSandboxed===!0;let n=this.strategy;e?.enabled===!0&&!Re()?(this.logger.warn(`Sandbox enabled but no platform sandbox available (install bwrap on Linux); running WITHOUT sandbox`),this.strategy=null):this.strategy=e?.enabled===!0?Fe({network:e.network===`deny`?`deny`:`allow`,writablePaths:this.configuredWritablePaths,denyReadPaths:e.protectCredentials?Le():void 0}):null,n?.dispose().catch(()=>void 0),this.logger.info(`Sandbox strategy %s (settings)`,this.strategy?`enabled: ${this.strategy.name}`:`disabled`)}resolveConfig(e){if(e.sandbox)return e.sandbox;if((e.permission_mode??`auto`)!==`bypass`)return{enabled:!0,network:process.env.OTTO_SANDBOX_NETWORK===`deny`?`deny`:`allow`,writablePaths:[]}}async dispose(){this.strategy&&=(await this.strategy.dispose().catch(()=>void 0),null)}};function wa(e){return typeof e==`string`&&(e.startsWith(`./`)||e.startsWith(`../`)||e.startsWith(`.\\`))}function Ta(e,t){let n={...e};return wa(n.command)&&!He(n.command)&&(n.command=S(t,n.command)),Array.isArray(n.args)&&(n.args=n.args.map(e=>wa(e)?S(t,e):e)),n}function Ea(e){let t=e.plugins??Vn({cwd:e.workspaceDir,homedir:e.homedir,disabled:e.disabled}),n={};for(let e of t){if(e.manifest.contributes?.mcp===!1)continue;let t=E(e);if(t.gated||!(e.manifest.capabilities?.includes(`mcp.server`)??!1)||t.pendingCapabilities.includes(`mcp.server`))continue;let r=Mr(e.dir);for(let[t,i]of Object.entries(r))n[t]={...Ta(i,e.dir),_pluginId:e.id}}return n}const Da=(e,t,n)=>{let r=Vt.spawn({command:e,args:t,env:n,owner:{type:`mcp-server`,id:e},category:`mcp`,lifecycle:`pinned`,label:`mcp:${e}`});return{pid:r.pid,stdin:r.stdin,stdout:r.stdout,stderr:r.stderr,kill:()=>r.kill(),onError:e=>{r.onError(e)},onExit:e=>{r.onExit(()=>e())}}};function Oa(e){return e.code===`MCP_UNAUTHORIZED`?`MCP server "${e.name}" requires authentication. Run 'otto mcp login ${e.name}' to authenticate.`:null}var ka=class{_manager=null;get manager(){return this._manager}getMcpClient(e){return this._manager?.getClient(e)}constructor(e,t,n,r,i){this.settings=e,this.toolRegistry=t,this.logger=n,this.workspaceDir=r,this.getResilienceConfig=i}resolveServerLayers(){return{otto:this.settings.get(`mcp_servers`)??{},claude:this.workspaceDir?Pr(this.workspaceDir):{},plugin:this.workspaceDir?Ea({workspaceDir:this.workspaceDir,homedir:ze(),disabled:this.settings.get(`disabled_plugins`)??[]}):{}}}effectiveServers(){let{otto:e,claude:t,plugin:n}=this.resolveServerLayers();return{...n,...t,...e}}listEffectiveServers(){let{otto:e,claude:t,plugin:n}=this.resolveServerLayers(),r={};for(let[e,t]of Object.entries(n)){let n=t;r[e]={...t,source:`plugin`,pluginId:n._pluginId}}for(let[e,n]of Object.entries(t))r[e]={...n,source:`claude`};for(let[t,n]of Object.entries(e))r[t]={...n,source:`otto`};for(let[t,n]of Object.entries(r))n.source===`otto`?n.disabled=(e[t]??{}).disabled??!1:n.source===`plugin`&&n.managed&&(n.disabled=this.settings.get(`disabled_plugins`)?.includes(n.pluginId??``)??!1);return r}syncTools(){let e=this.toolRegistry.getAll().map(e=>e.name).filter(e=>e.startsWith(`mcp__`));e.length>0&&this.toolRegistry.unregister(e);let t=this._manager?.getAllTools()??[];t.length>0&&this.toolRegistry.register(t,{category:`mcp`,preset:`full`})}ensureManager(){if(this._manager)return this._manager;let e=this.getResilienceConfig?.(),t=new zr({skipOnError:!0,processSpawnFactory:Da,maxReconnectAttempts:e?.mcp.maxReconnectAttempts,reconnectDelayMs:e?.mcp.reconnectDelayMs,requestTimeoutMs:e?.mcp.requestTimeoutMs});this._manager=t;let n=()=>this.syncTools();return t.on(`server.connected`,n),t.on(`tools.changed`,n),t.on(`server.disconnected`,n),t.on(`server.error`,e=>{let t=Oa(e);t&&this.logger.warn(t)}),t}async start(){let e=this.effectiveServers();if(Object.keys(e).length===0)return{connected:0,failed:0};let t=Object.fromEntries(Object.entries(e).filter(([,e])=>!e.disabled));if(Object.keys(t).length===0)return{connected:0,failed:0};let n=await this.ensureManager().connectAll(t);return this.syncTools(),n}async setServerEnabled(e,t){let n={...this.settings.get(`mcp_servers`)??{}},r=n[e];if(!r)throw Error(`Unknown MCP server "${e}"`);n[e]={...r,disabled:!t},await this.settings.persist({mcp_servers:n}),t?await this.ensureManager().connect(e,n[e]):await this._manager?.disconnect(e),this.syncTools()}async reload(){this._manager&&=(await this._manager.disconnectAll(),null),await this.start(),this.syncTools()}async stop(){this._manager&&=(await this._manager.disconnectAll(),null)}},Aa=class{category=`mcp`;constructor(e){this.mcp=e}list(){let e=this.mcp.listEffectiveServers(),t=this.mcp.manager?.getServerInfos()??[],n=new Map(t.map(e=>[e.name,e])),r=(e,t)=>{let r=n.get(t),i=[];return e&&r&&(i.push(String(r.status)),r.tools?.length&&i.push(`${r.tools.length} tools`)),i.length?i.join(` · `):void 0},i=[];for(let[t,n]of Object.entries(e)){if(n.source===`claude`)continue;let e=n.source===`plugin`&&n.managed===!0,a=n.source===`otto`;if(!e&&!a)continue;let o=e?`由 ${n.pluginId??`unknown`} 插件管理`:n.url??n.command??`MCP server`,s=[r(!n.disabled,t),e?`managed`:void 0].filter(Boolean).join(` · `);i.push({category:this.category,id:t,name:t,description:o,enabled:!n.disabled,detail:s||void 0,applies:`live`,readonly:e})}return i}async setEnabled(e,t){let n=this.mcp.listEffectiveServers()[e];if(n?.source===`plugin`&&n.managed)throw Error(`MCP server "${e}" 由插件 ${n.pluginId??`unknown`} 管理,无法单独禁用。请卸载插件以移除。`);await this.mcp.setServerEnabled(e,t)}},ja=class{category=`skill`;constructor(e,t){this.settings=e,this.skills=t}list(){let e=[];for(let[t,n]of this.skills.getAll())e.push({category:this.category,id:t,name:t,description:n.definition.metadata.description??``,enabled:n.status!==`disabled`,detail:n.source?.type,applies:`next-turn`});return e}async setEnabled(e,t){t?this.skills.enable(e):this.skills.disable(e);let n=[];for(let[e,t]of this.skills.getAll())t.status===`disabled`&&n.push(e);await this.settings.persist({disabled_skills:n})}},Ma=class{category=`agent`;constructor(e,t){this.settings=e,this.getProfiles=t}list(){let e=new Set(this.settings.get(`disabled_agents`)??[]);return this.getProfiles().map(t=>({category:this.category,id:t.name,name:t.name,description:t.description??``,enabled:!e.has(t.name),applies:`next-turn`}))}async setEnabled(e,t){let n=new Set(this.settings.get(`disabled_agents`)??[]);t?n.delete(e):n.add(e),await this.settings.persist({disabled_agents:[...n]})}},Na=class{category=`plugin`;constructor(e,t,n){this.settings=e,this.getPlugins=t,this.processRuntime=n}list(){let e=new Set(this.settings.get(`disabled_plugins`)??[]);return this.getPlugins().map(t=>{let n=t.scope===`builtin`,r=E(t).gated,i=[t.scope,r?`untrusted`:void 0].filter(Boolean).join(` · `);return{category:this.category,id:t.id,name:t.manifest.name??t.id,description:t.manifest.description??``,enabled:n?!0:!e.has(t.id),detail:i||void 0,applies:`next-turn`,readonly:n||void 0,scope:t.scope}})}async setEnabled(e,t){if(this.getPlugins().find(t=>t.id===e)?.scope===`builtin`)throw Error(`插件 "${e}" 是 otto 内置插件,恒定信任+启用,无法禁用。`);let n=new Set(this.settings.get(`disabled_plugins`)??[]);t?n.delete(e):n.add(e),await this.settings.persist({disabled_plugins:[...n]}),!t&&this.processRuntime&&(await this.processRuntime.killAll({owner:{type:`plugin-hook`,id:e}}),await this.processRuntime.killAll({owner:{type:`plugin-script`,id:e}}))}},Pa=class{providers;deps;constructor(e){this.deps=e,this.providers=[new Aa(e.mcp),...e.skills?[new ja(e.settings,e.skills)]:[],new Ma(e.settings,e.getAgentProfiles),...e.getPlugins?[new Na(e.settings,e.getPlugins,e.processRuntime)]:[]]}list(){return this.providers.flatMap(e=>e.list())}async setEnabled(e,t,n){let r=this.providers.find(t=>t.category===e);if(!r)throw Error(`Unknown extension category "${e}"`);await r.setEnabled(t,n),e===`plugin`&&this.deps.onPluginToggle&&this.deps.onPluginToggle(t,n)}},Fa=class{provider;source;register(e,t){return this.source!==void 0&&this.source!==t?!1:(this.provider=e,this.source=t,!0)}replace(e,t){this.provider=e,this.source=t}unregister(e){this.source===e&&(this.provider=void 0,this.source=void 0)}get(){return this.provider}reset(){this.provider=void 0,this.source=void 0}},Ia=class{resolvers=new Map;register(e,t){for(let n of e)this.resolvers.set(n.id,{resolver:n,source:t})}get(e){return this.resolvers.get(e)?.resolver}unregisterBySource(e){for(let[t,n]of this.resolvers)n.source===e&&this.resolvers.delete(t)}getAll(){let e=new Map;for(let[t,n]of this.resolvers)e.set(t,n.resolver);return e}get size(){return this.resolvers.size}};const La=C(`@x-otto/coding:sigil-expand`),Ra=/\[@([a-z][\w.-]*):((?:\\\]|[^\]])+)\]/g,za=/\[@([a-z][\w.-]*)\]/g,Ba=/@([\w./\-]+):(\d+)(?:-(\d+))?/g,Va=/@def:([A-Za-z_]\w*)/g;function Ha(e,t){let n=new Set,r=[];for(let i of[Ra,za]){i.lastIndex=0;for(let a of e.matchAll(i)){let e=a[0];if(n.has(e))continue;n.add(e);let i=a[1];t?.has(i)||r.push({raw:e,kind:i,param:(a[2]??``).replace(/\\\]/g,`]`)})}}Ba.lastIndex=0;for(let i of e.matchAll(Ba)){let e=i[0];n.has(e)||(n.add(e),!t?.has(`file-range`)&&r.push({raw:e,kind:`file-range`,param:e.slice(1)}))}Va.lastIndex=0;for(let i of e.matchAll(Va)){let e=i[0];n.has(e)||(n.add(e),!t?.has(`def`)&&r.push({raw:e,kind:`def`,param:i[1]}))}return r}function Ua(e,t){return new Promise((n,r)=>{let i=setTimeout(()=>r(Error(`resolver timeout after ${t}ms`)),t);e.then(e=>{clearTimeout(i),n(e)},e=>{clearTimeout(i),r(e)})})}function Wa(e,t){return e.length<=t?e:`${e.slice(0,t)}\n[...truncated ${e.length-t} chars...]`}async function Ga(e,t,n,r){let i=Ha(e,r?.skipPrefixes);if(i.length===0)return e;let a=r?.uiHost??!0,o=r?.maxOutput??2e4,s={workspaceDir:n.workspaceDir,maxOutput:o},c=i.map(async e=>{let n=r?.lookupResolverId?.(e.raw),i=(n?t.get(n):void 0)??t.get(e.kind);if(!i)return null;if(i.uiHostOnly&&!a)return La.debug({chip:e.raw},`uiHostOnly resolver skipped in non-uiHost context`),null;let c=i.timeoutMs??1e4,l=await Ua(Promise.resolve().then(()=>i.resolve(e.param,s)),c);return l===``?null:[e.raw,Wa(l,o)]}),l=await Promise.allSettled(c),u=e;for(let e=0;e<l.length;e++){let t=l[e];if(t.status===`rejected`){La.warn({chip:i[e].raw,err:String(t.reason)},`sigil resolver failed, chip left as-is`);continue}if(t.value===null)continue;let[n,r]=t.value;u=u.split(n).join(r)}return u}const Ka=e(import.meta.url);function qa(e,t){let n=t.entries(e);if(!n?.length)return[];let r=E(e);if(r.gated)return t.logger.warn({pluginId:e.id},`project/repository plugin not trusted, skipping ${t.axis} (fail-closed)`),[];if(!e.manifest.capabilities?.includes(t.capability))return t.logger.warn({pluginId:e.id},`plugin declares contributes.${t.axis} but not capabilities:["${t.capability}"], skipped (fail-closed)`),[];if(r.pendingCapabilities.includes(t.capability))return t.logger.warn({pluginId:e.id},`plugin capability "${t.capability}" declared but not yet granted, skipping ${t.axis} (fail-closed, ${t.pendingNote})`),[];let i=[];for(let r of n){if(t.preCheck&&!t.preCheck(e,r))continue;let n=x(e.dir,t.entryPath(r));if(!D(n)){t.logger.warn({pluginId:e.id,...t.idLogFields(r),modulePath:n},`${t.noun} entry not found, skipped`);continue}try{delete Ka.cache[n];let a=Ka(n),o=t.exportName(r)??`default`,s=a?.[o];if(typeof s!=`function`){t.logger.warn({pluginId:e.id,...t.idLogFields(r),exportName:o,...t.logTypeofOnNotFunction?{type:typeof s}:{}},`${t.noun} export is not a function, skipped`);continue}i.push(t.build(e,r,s)),t.successLogFields&&t.logger.info({pluginId:e.id,...t.successLogFields(r)},`plugin ${t.noun} loaded successfully`)}catch(n){t.logger.warn({pluginId:e.id,...t.idLogFields(r),err:String(n)},`${t.noun} load failed, skipped`)}}return i}function Ja(e,t,n){if(!n)return e.flatMap(e=>qa(e,t));let r=new Map,i=[];for(let a of e)for(let e of qa(a,t)){let t=n.key(e),a=r.get(t);if(a){n.onConflict(e,a);continue}r.set(t,e.pluginId),i.push(e)}return i}const Ya=C(`@x-otto/coding:plugin-a2ui-renderer-loader`),Xa={capability:`a2ui.renderer`,axis:`a2uiRenderers`,noun:`a2ui renderer`,pendingNote:`RFC-210 D5`,logger:Ya,entries:e=>e.manifest.contributes?.a2uiRenderers,entryPath:e=>e.entry,exportName:e=>e.export,idLogFields:e=>({a2uiRendererId:e.id}),logTypeofOnNotFunction:!0,build:(e,t,n)=>({id:`${e.id}:${t.id}`,pluginId:e.id,matcher:t.matcher,toPayload:n}),successLogFields:e=>({a2uiRendererId:e.id,matcher:e.matcher})};function Za(e){return Ja(e,Xa)}function Qa(e,t){let n=t;if(!n||typeof n!=`object`||e.role!=null&&n.role!==e.role||e.toolName!=null&&(n.name??n.toolName)!==e.toolName)return!1;if(e.contentType!=null){let t=n.content;if(!(Array.isArray(t)&&t.some(t=>t&&typeof t==`object`&&t.type===e.contentType)))return!1}return!0}const $a=2e3;async function eo(e,t){for(let n of e)if(Qa(n.matcher,t))try{let e=await Promise.race([Promise.resolve().then(()=>n.toPayload(t)),new Promise((e,t)=>setTimeout(()=>t(Error(`toPayload timeout after ${$a}ms`)),$a))]);if(Array.isArray(e)&&e.length>0)return e}catch(e){Ya.warn({a2uiRendererId:n.id,err:String(e)},`toPayload failed, trying next candidate (fail-soft)`)}return null}const to={file_read:[`read`],file_write:[`write`],file_edit:[`edit`],shell:[`bash`],search:[`find`,`grep`]};function no(e){if(e===void 0)return;if(e.length===0)return[];let t=new Set;for(let n of e){let e=to[n];if(e&&e.length>0){for(let n of e)t.add(n);continue}t.add(n)}return[...t]}function ro(){return process.env.OTTO_SUBAGENT_MODEL_POLICY===`off`}var io=class{constructor(e){this.deps=e}async resolveModel(e,t,n,r){let i=this.deps.getModelRegistry(),a=[],o=new Set,s=(e,t)=>{e&&!o.has(e.id)&&(o.add(e.id),a.push({model:e,layer:t}))};s(e,`explicit`);let c=this.deps.settings.get(`model_slots`),l=this.deps.settings.get(`model`),d=c?.default??l,f=(d===void 0?void 0:i.tryResolve(d))??this.deps.defaultModel??(this.deps.explicitModelSpec?i.tryResolve(this.deps.explicitModelSpec):void 0);if(t&&f)for(let e of this.slotCandidates(t,f,i))s(e,`slot`);if(r&&n)for(let e of this.categoryCandidates(n,f,i))s(e,`category`);s(f,`default`);let p=[];for(let{model:e,layer:t}of a){if(!r)return{model:e,decidedBy:t,rejected:p};let n=await this.checkUsable(e);if(n.usable)return{model:e,decidedBy:t,rejected:p};n.reason&&p.push({spec:e.id,reason:n.reason})}if(a.length===0&&!d&&!this.deps.defaultModel&&!this.deps.explicitModelSpec)throw Error(`No model configured. Set model in .otto/config.json or pass modelId to createApp().`);let m=t??(n?u[n]:void 0);return{model:await this.pickUsableFallback(i,m),decidedBy:`fallback`,rejected:p}}async checkUsable(e){if(this.deps.isModelUsable)try{return await this.deps.isModelUsable(e)}catch{}if(this.deps.hasCredential)try{return await this.deps.hasCredential(e.provider)?{usable:!0}:{usable:!1,reason:`unauthenticated`}}catch{}return{usable:!0}}async pickUsableFallback(e,t){let n=se(e.getAll(),t);for(let e of n)if((await this.checkUsable(e)).usable)return e;let r=this.deps.defaultModel??n[0];if(r)return r;throw Error(`No model available — sign in (/login) or pick a model (/model) first.`)}slotCandidates(e,t,n){return te({slots:this.deps.settings.get(`model_slots`)?.slots??{},default:t},n).candidates(e).filter(e=>e.id!==t.id)}categoryCandidates(e,t,n){let r=[],i=e=>{if(e){let t=n.tryResolve(e);t&&r.push(t)}},a=this.deps.settings.get(`categories`)?.[e];i(a?.default_model);for(let e of a?.preferred_models??[])i(e);if(r.length>0)return r;if(ro())return[];let o=u[e];if(!o||!t)return[];for(let e of this.slotCandidates(o,t,n))r.push(e);return r.length>0?r:h(o,t,n)}};function ao(e,t){let n=new Set(t);return e.filter(e=>n.has(e.name))}function oo(e,t,n,r,i){let a;return a=t||(n?ao(e(),n):e()),r?.length&&(a=a.filter(e=>!r.includes(e.name))),i||(a=a.filter(e=>!Pe.has(e.name))),a}function so(e,t,n,r){let i=n?[...t.disallowedToolNames??[],...r]:t.disallowedToolNames;return oo(e,void 0,t.toolNames,i,t.allowSubagents)}const co=[`edit`,`write`,`lsp_rename`,`bash`];function lo(e,t,n,r){let i=yn([...t,...di],n),a=ba(new Set(r.map(e=>e.name)));return()=>e.assemblePreset({preset:`subagent`,agentName:n,profile:i,promptMode:i?.promptMode},a)}var uo=class{modelResolver;constructor(e){this.deps=e,this.modelResolver=new io(e)}readAgentSources(e,t){let n=e?this.deps.settings.get(`agents`)?.[e]:void 0,r=t===`subagent`&&e?yn([...this.deps.getDeclarativeAgentProfiles(),...di],e):void 0;return{slot:n?.default_workflow_slot,profileTier:r?.preferredModelTier,toolNames:n?.tools??no(r?.defaultTools),disallowedToolNames:r?.disallowedTools,allowSubagents:t===`main`?!0:r?.allowSubagents,systemPrompt:n?.system_prompt,maxToolTurns:n?.max_tool_turns??r?.defaultMaxToolTurns,maxToolTurnExtensions:n?.max_tool_turn_extensions??r?.defaultMaxToolTurnExtensions,promptOutputTokenBudget:n?.prompt_output_token_budget,promptWallClockBudgetMs:n?.prompt_wall_clock_budget_ms,sessionCostBudgetUSD:n?.session_cost_budget_usd,stallDetection:n?.stall_detection===!1?!1:n?.stall_detection?{windowTurns:n.stall_detection.window_turns,repeatThreshold:n.stall_detection.repeat_threshold}:void 0,promptMode:r?.promptMode,promptContext:void 0,profile:r}}resolvePersistedThinkingLevel(){let e=this.deps.settings.get(`thinking_level`),t=e===`minimal`?`low`:e;return typeof t==`string`&&[`low`,`medium`,`high`,`xhigh`,`max`].includes(t)?t:void 0}resolveToolsForResync(e,t,n){let r=t??(e?`subagent`:`main`),i=this.readAgentSources(e,r);return so(this.deps.getTools,i,n,co)}resolveTools(e,t,n,r){return oo(this.deps.getTools,e,t,n,r)}async resolve(e){let t=e.promptPreset??(e.agentName?`subagent`:`main`),n=this.readAgentSources(e.agentName,t),r=t===`subagent`||e.delegated===!0,i=e.slot??n.slot??p[n.profileTier??``];!i&&r&&!e.category&&(i=this.deps.settings.get(`model_slots`)?.subagent_default_slot);let a=e.model??(e.modelId?this.deps.getModelRegistry().tryResolve(e.modelId):void 0)??(this.deps.explicitModelSpec?this.deps.getModelRegistry().tryResolve(this.deps.explicitModelSpec):void 0),o=await this.modelResolver.resolveModel(a,i,e.category,r),s=o.model,c=h(`compact`,s,this.deps.getModelRegistry())[0]??s;r&&this.deps.logger?.debug({model:s.id,decidedBy:o.decidedBy,category:e.category,slot:i,rejected:o.rejected},`subagent model resolved`);let l=e.readOnly?[...n.disallowedToolNames??[],...co]:n.disallowedToolNames,u=this.resolveTools(e.tools,n.toolNames,l,n.allowSubagents);s.supportsTools===!1&&(u=[]);let d=ba(new Set(u.map(e=>e.name))),f=e.promptRefresh??(async()=>{let r=t===`subagent`&&e.agentName?await this.deps.promptManager.assemblePreset({preset:`subagent`,agentName:e.agentName,profile:n.profile,context:e.promptContext,promptMode:n.promptMode},d):await this.deps.promptManager.assemblePreset({preset:`main`},d),i=e.systemPrompt??n.systemPrompt;return i!==void 0&&i.length>0?r?`${r}\n\n${i}`:i:r}),m=await f(),g=e.systemPrompt===void 0&&n.systemPrompt===void 0&&t===`subagent`&&e.agentName?this.deps.promptManager.assembleSubAgentTail({preset:`subagent`,agentName:e.agentName,profile:n.profile,context:e.promptContext,promptMode:n.promptMode}):void 0,_=e.thinkingLevel??(r?void 0:this.resolvePersistedThinkingLevel())??`medium`;return{id:e.id,model:s,titleModel:c,modelResolution:o,agentName:e.agentName,systemPrompt:m??``,systemTail:g?[g]:void 0,tools:u,thinkingLevel:_,maxToolTurns:e.maxToolTurns??n.maxToolTurns??this.deps.maxToolTurns,maxToolTurnExtensions:e.maxToolTurnExtensions??n.maxToolTurnExtensions??this.deps.maxToolTurnExtensions??Pt(e.depth??0,e.transient),promptOutputTokenBudget:(e.depth??0)>0?void 0:e.promptOutputTokenBudget??n.promptOutputTokenBudget??this.deps.settings.get(`prompt_output_token_budget`)??this.deps.promptOutputTokenBudget,promptWallClockBudgetMs:(e.depth??0)>0?void 0:e.promptWallClockBudgetMs??n.promptWallClockBudgetMs??this.deps.settings.get(`prompt_wall_clock_budget_ms`)??this.deps.promptWallClockBudgetMs,sessionCostBudgetUSD:(e.depth??0)>0?void 0:e.sessionCostBudgetUSD??n.sessionCostBudgetUSD??this.deps.settings.get(`session_cost_budget_usd`)??this.deps.sessionCostBudgetUSD,stallDetection:e.stallDetection??n.stallDetection??(()=>{let e=this.deps.settings.get(`stall_detection`);if(e!==void 0)return e===!1?!1:{windowTurns:e.window_turns,repeatThreshold:e.repeat_threshold}})()??this.deps.stallDetection,todoContinuation:e.todoContinuation??(()=>{let e=this.deps.settings.get(`todo_continue_max`);if(e===void 0)return;let t=Yt(process.env),n=Number.isFinite(e)&&e>=0?Math.trunc(e):t.max;return{enabled:t.enabled,max:n}})(),promptRefresh:f,workspaceDir:e.workspaceDir??this.deps.workspaceDir,workspaceId:e.workspaceId??this.deps.getWorkspaceId?.(),transient:e.transient,depth:e.depth,interactive:e.interactive,listable:e.listable,retryAccelerate:e.retryAccelerate,streamRetry:e.streamRetry??this.deps.getResilienceConfig?.().stream,networkDisconnectRetry:e.networkDisconnectRetry??fo(this.deps.getResilienceConfig?.().networkDisconnect),describeImages:this.deps.describeImages}}};function fo(e){if(e)return{maxRetries:e.maxRetries,initialDelayMs:e.intervalMs,backoffFactor:1,maxDelayMs:e.intervalMs}}const po=Hr.O_NOFOLLOW??0;function mo(e,t){let n=Gr(e,Hr.O_WRONLY|Hr.O_APPEND|Hr.O_CREAT|po,384);try{ei(n,t.endsWith(`
2
+ `)}}function ga(e){let{model:t,getModel:n,memoryStore:r,providerRegistry:i,autoMemory:a,workspaceDir:s,getLoadSessionEntries:c,getActiveSessionBytes:l,getEffectiveMaxBytes:u,getCoverageThresholds:d}=e,f=ha({model:t,getModel:n,providerRegistry:i,onUsage:e=>da.info({inputTokens:e.inputTokens,outputTokens:e.outputTokens,cacheReadTokens:e.cacheReadTokens,cacheWriteTokens:e.cacheWriteTokens},`[RFC-344] compaction summarize request cost`)}),p=rt.filter(e=>e.writable),m=ft(s??process.cwd()),h=o()?[{path:`~/.claude/CLAUDE.md`,writable:!1},...ft(s??process.cwd(),{fileName:`CLAUDE.md`})]:[],g=[...p,...h,...m],_=r&&a?[...g,a.asSource()]:void 0;return ut({summarize:f,model:t?{contextWindow:t.contextWindow,maxOutput:t.maxOutputTokens}:void 0,getContextWindow:()=>(n?.()??t)?.contextWindow,maxContentBytes:cn,getMaxContentBytes:u,getCoverageThresholds:d,getEstimatedBytes:l,memoryStore:r,sources:_,archiveStorage:new st,messageFromEntry:e=>{let t=e.data;if(!t||typeof t!=`object`)return null;let n=t.message;return n&&typeof n.role==`string`?n:null},loadSessionEntries:async e=>{let t=c?.();if(!t)throw Error(`Session entries not wired`);return t(e)}})}function _a(e){let{options:t,workspaceDir:n,providerRegistry:r,defaultModel:i,resolveEffectiveModel:a,repoRef:o,getWorkspaceRef:c}=e,l=t.storage?.host?{host:nn({baseDir:t.storage.host.dir,namespaces:t.storage.host.namespaces}),token:t.storage.host.token}:null,u=pa(t.storage,n,t.userIdentity,c,e.onMemoryConflict),d=u?new nt({store:u}):null,f=t.memory??ga({model:i,getModel:a,storage:t.storage,memoryStore:u,providerRegistry:r,autoMemory:d,workspaceDir:n,getLoadSessionEntries:()=>o.current?async e=>(await o.current.loadEntries(e)).map(e=>({type:e.type,seq:e.seq,data:e.data})):void 0}),p=t.storage?.session,m=Ct({sessionDir:p&&`dir`in p?p.dir:void 0,remoteLog:p&&`url`in p&&t.storage?.remote?.getAuth?{baseUrl:p.url,getAuth:t.storage.remote.getAuth,fetch:t.storage.remote.fetch,timeoutMs:t.storage.remote.timeoutMs??ua}:void 0,ephemeral:s()},{traceStore:t.traceStore,checkpointStore:t.checkpointStore}),{store:h,live:g}=on(m.traceStore);return{storageHost:l,autoMemory:d,memory:f,traceStore:h,traceLive:g,checkpointStore:m.checkpointStore,clock:t.clock,memoryStore:u}}const va={delegation:`task_delegate`,"task-observability":`task_inspect`,"file-state-refresh":`capture_file_state`},ya=new Set(Object.keys(va));function ba(e){let t=new Set;for(let[n,r]of Object.entries(va))e.has(r)&&t.add(n);return t}function xa(e){let{skillProvider:t,workspaceDir:n,activePlugins:r,resolveEffectiveModel:i,providerRegistry:a,prompt:c,memoryStore:l,memoryAutoExtractConfig:u}=e,d=o()&&br(n).gated,f=t?null:dn({workspaceDir:n,library:{...d?{projectDirs:[`.otto/skills`]}:{},pluginDirs:r().filter(e=>e.manifest.contributes?.skills!==!1).filter(e=>!E(e).gated).map(e=>({id:e.id,dir:x(e.dir,`skills`)}))}}),p=new it,m=s(),h=new ct({path:`${n}/.otto/lessons.json`,...l?{store:l,storePath:`./.otto/lessons.json`}:{},ephemeral:m});return{skillRegistry:f,fileStateManager:p,learningStore:h,localLearningStore:new ct({path:`${n}/.otto/local/lessons.json`,ephemeral:m}),memoryAutoExtractor:lt({llm:ha({getModel:i,providerRegistry:a}),store:h,config:u??{enabled:!0}}),completeText:ha({getModel:i,providerRegistry:a}),promptManager:new pn({provider:vn(c??{type:`local`,baseDir:fn}),knownCapabilities:ya})}}var Sa=class{currentPermissionMode=void 0;constructor(e){this.deps=e}sync(e){let t=Ae(this.deps.getToolRegistry().getAll());this.syncModePolicy(e.permission_mode,t),this.syncDisabledToolsPolicy(e.disabled_tools),this.syncEgressPolicy(e.web_fetch_allowed_hosts),this.syncUserPolicies(e.permissions),this.registry.setAlwaysAllow(e.permission_always_allow??[]),this.deps.logger.debug(`Permission policies synced: %d policies active`,this.registry.getAll().length)}get registry(){return this.deps.getPermissionRegistry()}syncModePolicy(e,t){let n=e??`auto`;this.currentPermissionMode&&this.registry.unregister(`mode::${this.currentPermissionMode}`),this.registry.register(Oe(n,t)),this.currentPermissionMode=n}syncDisabledToolsPolicy(e){e&&e.length>0?this.registry.register(xe(e)):this.registry.unregister(`setting::disabled-tools`)}syncEgressPolicy(e){e&&e.length>0?this.registry.register(Ce(e)):this.registry.unregister(`setting::egress-allowlist`)}syncUserPolicies(e){for(let e of this.registry.getAll())e.name.startsWith(`user::`)&&this.registry.unregister(e.name);if(e)for(let t of e)this.registry.register(ye({...t,name:`user::${t.name}`}))}},Ca=class{strategy=null;pinned=!1;settingSnapshot=`null`;networkAllowed=!0;configuredWritablePaths=[];autoAllowBash=!1;constructor(e){this.logger=e}get current(){return this.strategy}get activeName(){return this.strategy?.name??null}get enabled(){return this.strategy!==null}get isNetworkAllowed(){return this.networkAllowed}get writablePaths(){return this.configuredWritablePaths}get autoAllowBashIfSandboxed(){return this.autoAllowBash}bypassCommands=new Set;approveBypass(e){e&&this.bypassCommands.add(e)}isBypassed(e){return e!==void 0&&this.bypassCommands.has(e)}pin(e){this.pinned=!0,this.networkAllowed=e.network!==`deny`,this.configuredWritablePaths=Array.isArray(e.writablePaths)?e.writablePaths.filter(e=>typeof e==`string`):[],this.autoAllowBash=e.autoAllowBashIfSandboxed===!0,e.enabled&&!Re()?(this.logger.warn(`Sandbox pinned but no platform sandbox available (install bwrap on Linux); running WITHOUT sandbox`),this.strategy=null):this.strategy=e.enabled?Fe({network:e.network,writablePaths:e.writablePaths,denyReadPaths:e.protectCredentials?Le():void 0}):null}applySetting(e){if(this.pinned)return;let t=JSON.stringify(e??null);if(t===this.settingSnapshot)return;this.settingSnapshot=t,this.networkAllowed=e?.network!==`deny`,this.configuredWritablePaths=Array.isArray(e?.writablePaths)?e.writablePaths.filter(e=>typeof e==`string`):[],this.autoAllowBash=e?.autoAllowBashIfSandboxed===!0;let n=this.strategy;e?.enabled===!0&&!Re()?(this.logger.warn(`Sandbox enabled but no platform sandbox available (install bwrap on Linux); running WITHOUT sandbox`),this.strategy=null):this.strategy=e?.enabled===!0?Fe({network:e.network===`deny`?`deny`:`allow`,writablePaths:this.configuredWritablePaths,denyReadPaths:e.protectCredentials?Le():void 0}):null,n?.dispose().catch(()=>void 0),this.logger.info(`Sandbox strategy %s (settings)`,this.strategy?`enabled: ${this.strategy.name}`:`disabled`)}resolveConfig(e){if(e.sandbox)return e.sandbox;if((e.permission_mode??`auto`)!==`bypass`)return{enabled:!0,network:process.env.OTTO_SANDBOX_NETWORK===`deny`?`deny`:`allow`,writablePaths:[]}}async dispose(){this.strategy&&=(await this.strategy.dispose().catch(()=>void 0),null)}};function wa(e){return typeof e==`string`&&(e.startsWith(`./`)||e.startsWith(`../`)||e.startsWith(`.\\`))}function Ta(e,t){let n={...e};return wa(n.command)&&!He(n.command)&&(n.command=S(t,n.command)),Array.isArray(n.args)&&(n.args=n.args.map(e=>wa(e)?S(t,e):e)),n}function Ea(e){let t=e.plugins??Vn({cwd:e.workspaceDir,homedir:e.homedir,disabled:e.disabled}),n={};for(let e of t){if(e.manifest.contributes?.mcp===!1)continue;let t=E(e);if(t.gated||!(e.manifest.capabilities?.includes(`mcp.server`)??!1)||t.pendingCapabilities.includes(`mcp.server`))continue;let r=Mr(e.dir);for(let[t,i]of Object.entries(r))n[t]={...Ta(i,e.dir),_pluginId:e.id}}return n}const Da=(e,t,n)=>{let r=Vt.spawn({command:e,args:t,env:n,owner:{type:`mcp-server`,id:e},category:`mcp`,lifecycle:`pinned`,label:`mcp:${e}`});return{pid:r.pid,stdin:r.stdin,stdout:r.stdout,stderr:r.stderr,kill:()=>r.kill(),onError:e=>{r.onError(e)},onExit:e=>{r.onExit(()=>e())}}};function Oa(e){return e.code===`MCP_UNAUTHORIZED`?`MCP server "${e.name}" requires authentication. Run 'otto mcp login ${e.name}' to authenticate.`:null}var ka=class{_manager=null;get manager(){return this._manager}getMcpClient(e){return this._manager?.getClient(e)}constructor(e,t,n,r,i){this.settings=e,this.toolRegistry=t,this.logger=n,this.workspaceDir=r,this.getResilienceConfig=i}resolveServerLayers(){return{otto:this.settings.get(`mcp_servers`)??{},claude:this.workspaceDir?Pr(this.workspaceDir):{},plugin:this.workspaceDir?Ea({workspaceDir:this.workspaceDir,homedir:ze(),disabled:this.settings.get(`disabled_plugins`)??[]}):{}}}effectiveServers(){let{otto:e,claude:t,plugin:n}=this.resolveServerLayers();return{...n,...t,...e}}listEffectiveServers(){let{otto:e,claude:t,plugin:n}=this.resolveServerLayers(),r={};for(let[e,t]of Object.entries(n)){let n=t;r[e]={...t,source:`plugin`,pluginId:n._pluginId}}for(let[e,n]of Object.entries(t))r[e]={...n,source:`claude`};for(let[t,n]of Object.entries(e))r[t]={...n,source:`otto`};for(let[t,n]of Object.entries(r))n.source===`otto`?n.disabled=(e[t]??{}).disabled??!1:n.source===`plugin`&&n.managed&&(n.disabled=this.settings.get(`disabled_plugins`)?.includes(n.pluginId??``)??!1);return r}syncTools(){let e=this.toolRegistry.getAll().map(e=>e.name).filter(e=>e.startsWith(`mcp__`));e.length>0&&this.toolRegistry.unregister(e);let t=this._manager?.getAllTools()??[];t.length>0&&this.toolRegistry.register(t,{category:`mcp`,preset:`full`})}ensureManager(){if(this._manager)return this._manager;let e=this.getResilienceConfig?.(),t=new zr({skipOnError:!0,processSpawnFactory:Da,maxReconnectAttempts:e?.mcp.maxReconnectAttempts,reconnectDelayMs:e?.mcp.reconnectDelayMs,requestTimeoutMs:e?.mcp.requestTimeoutMs});this._manager=t;let n=()=>this.syncTools();return t.on(`server.connected`,n),t.on(`tools.changed`,n),t.on(`server.disconnected`,n),t.on(`server.error`,e=>{let t=Oa(e);t&&this.logger.warn(t)}),t}async start(){let e=this.effectiveServers();if(Object.keys(e).length===0)return{connected:0,failed:0};let t=Object.fromEntries(Object.entries(e).filter(([,e])=>!e.disabled));if(Object.keys(t).length===0)return{connected:0,failed:0};let n=await this.ensureManager().connectAll(t);return this.syncTools(),n}async setServerEnabled(e,t){let n={...this.settings.get(`mcp_servers`)??{}},r=n[e];if(!r)throw Error(`Unknown MCP server "${e}"`);n[e]={...r,disabled:!t},await this.settings.persist({mcp_servers:n}),t?await this.ensureManager().connect(e,n[e]):await this._manager?.disconnect(e),this.syncTools()}async reload(){this._manager&&=(await this._manager.disconnectAll(),null),await this.start(),this.syncTools()}async stop(){this._manager&&=(await this._manager.disconnectAll(),null)}},Aa=class{category=`mcp`;constructor(e){this.mcp=e}list(){let e=this.mcp.listEffectiveServers(),t=this.mcp.manager?.getServerInfos()??[],n=new Map(t.map(e=>[e.name,e])),r=(e,t)=>{let r=n.get(t),i=[];return e&&r&&(i.push(String(r.status)),r.tools?.length&&i.push(`${r.tools.length} tools`)),i.length?i.join(` · `):void 0},i=[];for(let[t,n]of Object.entries(e)){if(n.source===`claude`)continue;let e=n.source===`plugin`&&n.managed===!0,a=n.source===`otto`;if(!e&&!a)continue;let o=e?`由 ${n.pluginId??`unknown`} 插件管理`:n.url??n.command??`MCP server`,s=[r(!n.disabled,t),e?`managed`:void 0].filter(Boolean).join(` · `);i.push({category:this.category,id:t,name:t,description:o,enabled:!n.disabled,detail:s||void 0,applies:`live`,readonly:e})}return i}async setEnabled(e,t){let n=this.mcp.listEffectiveServers()[e];if(n?.source===`plugin`&&n.managed)throw Error(`MCP server "${e}" 由插件 ${n.pluginId??`unknown`} 管理,无法单独禁用。请卸载插件以移除。`);await this.mcp.setServerEnabled(e,t)}},ja=class{category=`skill`;constructor(e,t){this.settings=e,this.skills=t}list(){let e=[];for(let[t,n]of this.skills.getAll())e.push({category:this.category,id:t,name:t,description:n.definition.metadata.description??``,enabled:n.status!==`disabled`,detail:n.source?.type,applies:`next-turn`});return e}async setEnabled(e,t){t?this.skills.enable(e):this.skills.disable(e);let n=[];for(let[e,t]of this.skills.getAll())t.status===`disabled`&&n.push(e);await this.settings.persist({disabled_skills:n})}},Ma=class{category=`agent`;constructor(e,t){this.settings=e,this.getProfiles=t}list(){let e=new Set(this.settings.get(`disabled_agents`)??[]);return this.getProfiles().map(t=>({category:this.category,id:t.name,name:t.name,description:t.description??``,enabled:!e.has(t.name),applies:`next-turn`}))}async setEnabled(e,t){let n=new Set(this.settings.get(`disabled_agents`)??[]);t?n.delete(e):n.add(e),await this.settings.persist({disabled_agents:[...n]})}},Na=class{category=`plugin`;constructor(e,t,n){this.settings=e,this.getPlugins=t,this.processRuntime=n}list(){let e=new Set(this.settings.get(`disabled_plugins`)??[]);return this.getPlugins().map(t=>{let n=t.scope===`builtin`,r=E(t).gated,i=[t.scope,r?`untrusted`:void 0].filter(Boolean).join(` · `);return{category:this.category,id:t.id,name:t.manifest.name??t.id,description:t.manifest.description??``,enabled:n?!0:!e.has(t.id),detail:i||void 0,applies:`next-turn`,readonly:n||void 0,scope:t.scope}})}async setEnabled(e,t){if(this.getPlugins().find(t=>t.id===e)?.scope===`builtin`)throw Error(`插件 "${e}" 是 otto 内置插件,恒定信任+启用,无法禁用。`);let n=new Set(this.settings.get(`disabled_plugins`)??[]);t?n.delete(e):n.add(e),await this.settings.persist({disabled_plugins:[...n]}),!t&&this.processRuntime&&(await this.processRuntime.killAll({owner:{type:`plugin-hook`,id:e}}),await this.processRuntime.killAll({owner:{type:`plugin-script`,id:e}}))}},Pa=class{providers;deps;constructor(e){this.deps=e,this.providers=[new Aa(e.mcp),...e.skills?[new ja(e.settings,e.skills)]:[],new Ma(e.settings,e.getAgentProfiles),...e.getPlugins?[new Na(e.settings,e.getPlugins,e.processRuntime)]:[]]}list(){return this.providers.flatMap(e=>e.list())}async setEnabled(e,t,n){let r=this.providers.find(t=>t.category===e);if(!r)throw Error(`Unknown extension category "${e}"`);await r.setEnabled(t,n),e===`plugin`&&this.deps.onPluginToggle&&this.deps.onPluginToggle(t,n)}},Fa=class{provider;source;register(e,t){return this.source!==void 0&&this.source!==t?!1:(this.provider=e,this.source=t,!0)}replace(e,t){this.provider=e,this.source=t}unregister(e){this.source===e&&(this.provider=void 0,this.source=void 0)}get(){return this.provider}reset(){this.provider=void 0,this.source=void 0}},Ia=class{resolvers=new Map;register(e,t){for(let n of e)this.resolvers.set(n.id,{resolver:n,source:t})}get(e){return this.resolvers.get(e)?.resolver}unregisterBySource(e){for(let[t,n]of this.resolvers)n.source===e&&this.resolvers.delete(t)}getAll(){let e=new Map;for(let[t,n]of this.resolvers)e.set(t,n.resolver);return e}get size(){return this.resolvers.size}};const La=C(`@x-otto/coding:sigil-expand`),Ra=/\[@([a-z][\w.-]*):((?:\\\]|[^\]])+)\]/g,za=/\[@([a-z][\w.-]*)\]/g,Ba=/@([\w./\-]+):(\d+)(?:-(\d+))?/g,Va=/@def:([A-Za-z_]\w*)/g;function Ha(e,t){let n=new Set,r=[];for(let i of[Ra,za]){i.lastIndex=0;for(let a of e.matchAll(i)){let e=a[0];if(n.has(e))continue;n.add(e);let i=a[1];t?.has(i)||r.push({raw:e,kind:i,param:(a[2]??``).replace(/\\\]/g,`]`)})}}Ba.lastIndex=0;for(let i of e.matchAll(Ba)){let e=i[0];n.has(e)||(n.add(e),!t?.has(`file-range`)&&r.push({raw:e,kind:`file-range`,param:e.slice(1)}))}Va.lastIndex=0;for(let i of e.matchAll(Va)){let e=i[0];n.has(e)||(n.add(e),!t?.has(`def`)&&r.push({raw:e,kind:`def`,param:i[1]}))}return r}function Ua(e,t){return new Promise((n,r)=>{let i=setTimeout(()=>r(Error(`resolver timeout after ${t}ms`)),t);e.then(e=>{clearTimeout(i),n(e)},e=>{clearTimeout(i),r(e)})})}function Wa(e,t){return e.length<=t?e:`${e.slice(0,t)}\n[...truncated ${e.length-t} chars...]`}async function Ga(e,t,n,r){let i=Ha(e,r?.skipPrefixes);if(i.length===0)return e;let a=r?.uiHost??!0,o=r?.maxOutput??2e4,s={workspaceDir:n.workspaceDir,maxOutput:o},c=i.map(async e=>{let n=r?.lookupResolverId?.(e.raw),i=(n?t.get(n):void 0)??t.get(e.kind);if(!i)return null;if(i.uiHostOnly&&!a)return La.debug({chip:e.raw},`uiHostOnly resolver skipped in non-uiHost context`),null;let c=i.timeoutMs??1e4,l=await Ua(Promise.resolve().then(()=>i.resolve(e.param,s)),c);return l===``?null:[e.raw,Wa(l,o)]}),l=await Promise.allSettled(c),u=e;for(let e=0;e<l.length;e++){let t=l[e];if(t.status===`rejected`){La.warn({chip:i[e].raw,err:String(t.reason)},`sigil resolver failed, chip left as-is`);continue}if(t.value===null)continue;let[n,r]=t.value;u=u.split(n).join(r)}return u}const Ka=e(import.meta.url);function qa(e,t){let n=t.entries(e);if(!n?.length)return[];let r=E(e);if(r.gated)return t.logger.warn({pluginId:e.id},`project/repository plugin not trusted, skipping ${t.axis} (fail-closed)`),[];if(!e.manifest.capabilities?.includes(t.capability))return t.logger.warn({pluginId:e.id},`plugin declares contributes.${t.axis} but not capabilities:["${t.capability}"], skipped (fail-closed)`),[];if(r.pendingCapabilities.includes(t.capability))return t.logger.warn({pluginId:e.id},`plugin capability "${t.capability}" declared but not yet granted, skipping ${t.axis} (fail-closed, ${t.pendingNote})`),[];let i=[];for(let r of n){if(t.preCheck&&!t.preCheck(e,r))continue;let n=x(e.dir,t.entryPath(r));if(!D(n)){t.logger.warn({pluginId:e.id,...t.idLogFields(r),modulePath:n},`${t.noun} entry not found, skipped`);continue}try{delete Ka.cache[n];let a=Ka(n),o=t.exportName(r)??`default`,s=a?.[o];if(typeof s!=`function`){t.logger.warn({pluginId:e.id,...t.idLogFields(r),exportName:o,...t.logTypeofOnNotFunction?{type:typeof s}:{}},`${t.noun} export is not a function, skipped`);continue}i.push(t.build(e,r,s)),t.successLogFields&&t.logger.info({pluginId:e.id,...t.successLogFields(r)},`plugin ${t.noun} loaded successfully`)}catch(n){t.logger.warn({pluginId:e.id,...t.idLogFields(r),err:String(n)},`${t.noun} load failed, skipped`)}}return i}function Ja(e,t,n){if(!n)return e.flatMap(e=>qa(e,t));let r=new Map,i=[];for(let a of e)for(let e of qa(a,t)){let t=n.key(e),a=r.get(t);if(a){n.onConflict(e,a);continue}r.set(t,e.pluginId),i.push(e)}return i}const Ya=C(`@x-otto/coding:plugin-a2ui-renderer-loader`),Xa={capability:`a2ui.renderer`,axis:`a2uiRenderers`,noun:`a2ui renderer`,pendingNote:`RFC-210 D5`,logger:Ya,entries:e=>e.manifest.contributes?.a2uiRenderers,entryPath:e=>e.entry,exportName:e=>e.export,idLogFields:e=>({a2uiRendererId:e.id}),logTypeofOnNotFunction:!0,build:(e,t,n)=>({id:`${e.id}:${t.id}`,pluginId:e.id,matcher:t.matcher,toPayload:n}),successLogFields:e=>({a2uiRendererId:e.id,matcher:e.matcher})};function Za(e){return Ja(e,Xa)}function Qa(e,t){let n=t;if(!n||typeof n!=`object`||e.role!=null&&n.role!==e.role||e.toolName!=null&&(n.name??n.toolName)!==e.toolName)return!1;if(e.contentType!=null){let t=n.content;if(!(Array.isArray(t)&&t.some(t=>t&&typeof t==`object`&&t.type===e.contentType)))return!1}return!0}const $a=2e3;async function eo(e,t){for(let n of e)if(Qa(n.matcher,t))try{let e=await Promise.race([Promise.resolve().then(()=>n.toPayload(t)),new Promise((e,t)=>setTimeout(()=>t(Error(`toPayload timeout after ${$a}ms`)),$a))]);if(Array.isArray(e)&&e.length>0)return e}catch(e){Ya.warn({a2uiRendererId:n.id,err:String(e)},`toPayload failed, trying next candidate (fail-soft)`)}return null}const to={file_read:[`read`],file_write:[`write`],file_edit:[`edit`],shell:[`bash`],search:[`find`,`grep`]};function no(e){if(e===void 0)return;if(e.length===0)return[];let t=new Set;for(let n of e){let e=to[n];if(e&&e.length>0){for(let n of e)t.add(n);continue}t.add(n)}return[...t]}function ro(){return process.env.OTTO_SUBAGENT_MODEL_POLICY===`off`}var io=class{constructor(e){this.deps=e}async resolveModel(e,t,n,r){let i=this.deps.getModelRegistry(),a=[],o=new Set,s=(e,t)=>{e&&!o.has(e.id)&&(o.add(e.id),a.push({model:e,layer:t}))};s(e,`explicit`);let c=this.deps.settings.get(`model_slots`),l=this.deps.settings.get(`model`),d=c?.default??l,f=(d===void 0?void 0:i.tryResolve(d))??this.deps.defaultModel??(this.deps.explicitModelSpec?i.tryResolve(this.deps.explicitModelSpec):void 0);if(t&&f)for(let e of this.slotCandidates(t,f,i))s(e,`slot`);if(r&&n)for(let e of this.categoryCandidates(n,f,i))s(e,`category`);s(f,`default`);let p=[];for(let{model:e,layer:t}of a){if(!r)return{model:e,decidedBy:t,rejected:p};let n=await this.checkUsable(e);if(n.usable)return{model:e,decidedBy:t,rejected:p};n.reason&&p.push({spec:e.id,reason:n.reason})}if(a.length===0&&!d&&!this.deps.defaultModel&&!this.deps.explicitModelSpec)throw Error(`No model configured. Set model in .otto/config.json or pass modelId to createApp().`);let m=t??(n?u[n]:void 0);return{model:await this.pickUsableFallback(i,m),decidedBy:`fallback`,rejected:p}}async checkUsable(e){if(this.deps.isModelUsable)try{return await this.deps.isModelUsable(e)}catch{}if(this.deps.hasCredential)try{return await this.deps.hasCredential(e.provider)?{usable:!0}:{usable:!1,reason:`unauthenticated`}}catch{}return{usable:!0}}async pickUsableFallback(e,t){let n=se(e.getAll(),t);for(let e of n)if((await this.checkUsable(e)).usable)return e;let r=this.deps.defaultModel??n[0];if(r)return r;throw Error(`No model available — sign in (/login) or pick a model (/model) first.`)}slotCandidates(e,t,n){return te({slots:this.deps.settings.get(`model_slots`)?.slots??{},default:t},n).candidates(e).filter(e=>e.id!==t.id)}categoryCandidates(e,t,n){let r=[],i=e=>{if(e){let t=n.tryResolve(e);t&&r.push(t)}},a=this.deps.settings.get(`categories`)?.[e];i(a?.default_model);for(let e of a?.preferred_models??[])i(e);if(r.length>0)return r;if(ro())return[];let o=u[e];if(!o||!t)return[];for(let e of this.slotCandidates(o,t,n))r.push(e);return r.length>0?r:h(o,t,n)}};function ao(e,t){let n=new Set(t);return e.filter(e=>n.has(e.name))}function oo(e,t,n,r,i){let a;return a=t||(n?ao(e(),n):e()),r?.length&&(a=a.filter(e=>!r.includes(e.name))),i||(a=a.filter(e=>!Pe.has(e.name))),a}function so(e,t,n,r){let i=n?[...t.disallowedToolNames??[],...r]:t.disallowedToolNames;return oo(e,void 0,t.toolNames,i,t.allowSubagents)}const co=[`edit`,`write`,`lsp_rename`,`bash`];function lo(e,t,n,r){let i=yn([...t,...di],n),a=ba(new Set(r.map(e=>e.name)));return()=>e.assemblePreset({preset:`subagent`,agentName:n,profile:i,promptMode:i?.promptMode},a)}var uo=class{modelResolver;constructor(e){this.deps=e,this.modelResolver=new io(e)}readAgentSources(e,t){let n=e?this.deps.settings.get(`agents`)?.[e]:void 0,r=t===`subagent`&&e?yn([...this.deps.getDeclarativeAgentProfiles(),...di],e):void 0;return{slot:n?.default_workflow_slot,profileTier:r?.preferredModelTier,toolNames:n?.tools??no(r?.defaultTools),disallowedToolNames:r?.disallowedTools,allowSubagents:t===`main`?!0:r?.allowSubagents,systemPrompt:n?.system_prompt,maxToolTurns:n?.max_tool_turns??r?.defaultMaxToolTurns,maxToolTurnExtensions:n?.max_tool_turn_extensions??r?.defaultMaxToolTurnExtensions,promptOutputTokenBudget:n?.prompt_output_token_budget,promptWallClockBudgetMs:n?.prompt_wall_clock_budget_ms,sessionCostBudgetUSD:n?.session_cost_budget_usd,stallDetection:n?.stall_detection===!1?!1:n?.stall_detection?{windowTurns:n.stall_detection.window_turns,repeatThreshold:n.stall_detection.repeat_threshold}:void 0,promptMode:r?.promptMode,promptContext:void 0,profile:r}}resolvePersistedThinkingLevel(){let e=this.deps.settings.get(`thinking_level`),t=e===`minimal`?`low`:e;return typeof t==`string`&&[`low`,`medium`,`high`,`xhigh`,`max`].includes(t)?t:void 0}resolveToolsForResync(e,t,n){let r=t??(e?`subagent`:`main`),i=this.readAgentSources(e,r);return so(this.deps.getTools,i,n,co)}resolveTools(e,t,n,r){return oo(this.deps.getTools,e,t,n,r)}async resolve(e){let t=e.promptPreset??(e.agentName?`subagent`:`main`),n=this.readAgentSources(e.agentName,t),r=t===`subagent`||e.delegated===!0,i=e.slot??n.slot??p[n.profileTier??``];!i&&r&&!e.category&&(i=this.deps.settings.get(`model_slots`)?.subagent_default_slot);let a=e.model??(e.modelId?this.deps.getModelRegistry().tryResolve(e.modelId):void 0)??(this.deps.explicitModelSpec?this.deps.getModelRegistry().tryResolve(this.deps.explicitModelSpec):void 0),o=await this.modelResolver.resolveModel(a,i,e.category,r),s=o.model,c=h(`compact`,s,this.deps.getModelRegistry())[0]??s;r&&this.deps.logger?.debug({model:s.id,decidedBy:o.decidedBy,category:e.category,slot:i,rejected:o.rejected},`subagent model resolved`);let l=e.readOnly?[...n.disallowedToolNames??[],...co]:n.disallowedToolNames,u=this.resolveTools(e.tools,n.toolNames,l,n.allowSubagents);s.supportsTools===!1&&(u=[]);let d=ba(new Set(u.map(e=>e.name))),f=e.promptRefresh??(async()=>{let r=t===`subagent`&&e.agentName?await this.deps.promptManager.assemblePreset({preset:`subagent`,agentName:e.agentName,profile:n.profile,context:e.promptContext,promptMode:n.promptMode},d):await this.deps.promptManager.assemblePreset({preset:`main`},d),i=e.systemPrompt??n.systemPrompt;return i!==void 0&&i.length>0?r?`${r}\n\n${i}`:i:r}),m=await f(),g=e.systemPrompt===void 0&&n.systemPrompt===void 0&&t===`subagent`&&e.agentName?this.deps.promptManager.assembleSubAgentTail({preset:`subagent`,agentName:e.agentName,profile:n.profile,context:e.promptContext,promptMode:n.promptMode}):void 0,_=e.thinkingLevel??(r?void 0:this.resolvePersistedThinkingLevel())??`medium`;return{id:e.id,model:s,titleModel:c,modelResolution:o,agentName:e.agentName,systemPrompt:m??``,systemTail:g?[g]:void 0,tools:u,thinkingLevel:_,maxToolTurns:e.maxToolTurns??n.maxToolTurns??this.deps.maxToolTurns,maxToolTurnExtensions:e.maxToolTurnExtensions??n.maxToolTurnExtensions??this.deps.maxToolTurnExtensions??Pt(e.depth??0,e.transient),promptOutputTokenBudget:(e.depth??0)>0?void 0:e.promptOutputTokenBudget??n.promptOutputTokenBudget??this.deps.settings.get(`prompt_output_token_budget`)??this.deps.promptOutputTokenBudget,promptWallClockBudgetMs:(e.depth??0)>0?void 0:e.promptWallClockBudgetMs??n.promptWallClockBudgetMs??this.deps.settings.get(`prompt_wall_clock_budget_ms`)??this.deps.promptWallClockBudgetMs,sessionCostBudgetUSD:(e.depth??0)>0?void 0:e.sessionCostBudgetUSD??n.sessionCostBudgetUSD??this.deps.settings.get(`session_cost_budget_usd`)??this.deps.sessionCostBudgetUSD,stallDetection:e.stallDetection??n.stallDetection??(()=>{let e=this.deps.settings.get(`stall_detection`);if(e!==void 0)return e===!1?!1:{windowTurns:e.window_turns,repeatThreshold:e.repeat_threshold}})()??this.deps.stallDetection,todoContinuation:e.todoContinuation??(()=>{let e=this.deps.settings.get(`todo_continue_max`);if(e===void 0)return;let t=Yt(process.env),n=Number.isFinite(e)&&e>=0?Math.trunc(e):t.max;return{enabled:t.enabled,max:n}})(),promptRefresh:f,workspaceDir:e.workspaceDir??this.deps.workspaceDir,workspaceId:e.workspaceId??this.deps.getWorkspaceId?.(),transient:e.transient,depth:e.depth,interactive:e.interactive,listable:e.listable,retryAccelerate:e.retryAccelerate,streamRetry:e.streamRetry??this.deps.getResilienceConfig?.().stream,networkDisconnectRetry:e.networkDisconnectRetry??fo(this.deps.getResilienceConfig?.().networkDisconnect),lifecycleAsyncTimeoutMs:po(process.env.OTTO_LIFECYCLE_ASYNC_TIMEOUT_MS),describeImages:this.deps.describeImages}}};function fo(e){if(e)return{maxRetries:e.maxRetries,initialDelayMs:e.intervalMs,backoffFactor:1,maxDelayMs:e.intervalMs}}function po(e){if(!e)return;let t=Number(e);return Number.isFinite(t)&&t>0?t:void 0}const mo=Hr.O_NOFOLLOW??0;function ho(e,t){let n=Gr(e,Hr.O_WRONLY|Hr.O_APPEND|Hr.O_CREAT|mo,384);try{ei(n,t.endsWith(`
3
3
  `)?t:t+`
4
- `)}finally{Vr(n)}}function ho(e,t=20){let n;try{return n=Gr(e,Hr.O_RDONLY|po),k(n,`utf-8`).replace(/\n+$/,``).split(`
4
+ `)}finally{Vr(n)}}function go(e,t=20){let n;try{return n=Gr(e,Hr.O_RDONLY|mo),k(n,`utf-8`).replace(/\n+$/,``).split(`
5
5
  `).slice(-t).join(`
6
- `)}catch{return``}finally{n!==void 0&&Vr(n)}}function go(e){return e.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
7
- `)}function _o(e){let t=Date.now(),n={model:e.model,systemPrompt:e.systemPrompt??``,messages:[{role:`user`,content:[{type:`text`,text:e.prompt}],timestamp:Date.now()}],tools:e.tools,thinkingLevel:e.thinkingLevel??`medium`,maxTokens:e.maxTokens},r,i=new hi({stream:e.stream,logger:e.logger,agentName:e.runId,maxToolTurns:e.maxToolTurns,toolHookExecutor:jt({hookRegistry:e.hookRegistry,agentName:e.runId,sessionId:e.runId}),depth:e.depth??0,approval:(t,n,i)=>{let a=e.onAwaitingInput;return a?new Promise(n=>{zt.setAwaitingApproval(e.runId,`${t}: ${i}`),r=t=>{zt.clearAwaitingApproval(e.runId),n(t)};try{mo(e.outputPath,`⏳ 需要你确认「${t}」:${i}\n 进 Delegates 面板按 o,回复 yes 允许 / no 拒绝。`)}catch{}a(i)}):Promise.resolve(!1)}});i.on(`turn.end`,({message:t})=>{let n=go(t);if(n)try{mo(e.outputPath,n)}catch{}});let a=()=>{if(r){let e=r;r=void 0,e(!1)}i.abort()},o=St(i,{id:e.runId,agentName:e.runId,title:e.runId,prompt:e.prompt,model:e.model.id,origin:`user`,depth:e.depth??0,abort:a,messages:n.messages});return{promise:i.run(n).then(e=>({text:go(e),messages:n.messages,tokenUsage:{input:e.usage.inputTokens,output:e.usage.outputTokens,cacheRead:e.usage.cacheReadTokens},durationMs:Date.now()-t})).finally(()=>{o(),zt.markEnded(e.runId)}),abort:a,steer:e=>{if(r){let t=r;r=void 0,t(/^\s*(y|yes|是|好|ok|approve|允许|同意|确认|可以|行)/i.test(e));return}i.steer({role:`user`,content:[{type:`text`,text:e}],timestamp:Date.now()})},outputPath:e.outputPath}}var vo=class{ownedJobIds=new Set;handles=new Map;appliedDiffs=new Map;constructor(e){if(this.deps=e,e.appliedDiffStore)for(let{jobId:t,diff:n}of e.appliedDiffStore.loadAll())this.appliedDiffs.set(t,n)}start(e){let{repoRoot:t,registry:n,spawnRun:r,buildOutputPath:i,newJobId:a}=this.deps,o=a(),s=Mt(t,o),c=i(o),l;try{l=r({runId:o,prompt:e.prompt,outputPath:c,workspaceDir:s.path,onAwaitingInput:()=>this.deps.registry.update(o,{status:`needs_input`})})}catch(e){throw qt(s,this.deps.onWorktreeCleanupError),e}let u=n.register({id:o,sessionId:e.sessionId,title:e.title,origin:e.origin,worktree:s,outputPath:c,abort:l.abort});return this.ownedJobIds.add(o),this.handles.set(o,l),l.promise.then(t=>this.onRunComplete(o,e.title,e.sessionId,s,c,t)).catch(t=>this.onRunFailed(o,e.title,e.sessionId,t)).finally(()=>this.handles.delete(o)),u}supply(e,t){let n=this.handles.get(e);if(!n?.steer)return!1;let r=this.deps.registry.get(e);return!r||r.status!==`running`&&r.status!==`needs_input`?!1:(n.steer(t),r.status===`needs_input`&&this.deps.registry.update(e,{status:`running`}),!0)}dispose(){for(let e of this.ownedJobIds)this.deps.registry.cancel(e);this.ownedJobIds.clear(),this.handles.clear(),this.appliedDiffs.clear()}onRunComplete(e,t,n,r,i,a){let o=this.deps.registry.get(e);if(!o||o.status===`canceled`)return;let s=``;try{s=en(r)}catch(r){this.onRunFailed(e,t,n,r);return}if(this.deps.registry.update(e,{status:`ready`,diff:s}),s.trim()){this.deps.notify(n,{jobId:e,title:t,status:`ready`,summary:`produced a diff (${bo(s)})`,outputPath:i,worktree:{path:r.path,branch:r.branch}});return}let c=yo(a).trim(),l=c?`完成 — /jobs 按 o 看结果(约 ${c.length} 字)`:`完成(无文件改动、无文本输出)`;this.deps.notify(n,{jobId:e,title:t,status:`ready`,summary:l,outputPath:i})}onRunFailed(e,t,n,r){let i=this.deps.registry.get(e);if(!i||i.status===`canceled`)return;let a=r instanceof Error?r.message:String(r);this.deps.registry.update(e,{status:`failed`,error:a}),this.deps.notify(n,{jobId:e,title:t,status:`failed`,summary:a})}apply(e){let t=this.deps.registry.get(e);if(!t)return{applied:!1,status:`error`,message:`job ${e} not found`,conflictPaths:[]};if(t.status!==`ready`)return{applied:!1,status:`error`,message:`job ${e} is ${t.status}, not ready`,conflictPaths:[]};let n=$t(t.diff??``),r=Qt(t.diff??``).length>0,i=xt(this.deps.repoRoot,t.diff??``);if(i.applied)return t.diff?.trim()&&(this.appliedDiffs.set(e,t.diff),this.deps.appliedDiffStore?.save(e,t.diff)),this.deps.registry.update(e,{status:`applied`}),{applied:!0,status:`success`,message:`applied cleanly`,conflictPaths:[],forbiddenZone:n,capabilityTouched:r};let a=Ht(this.deps.repoRoot,t.worktree.base);return{applied:!1,status:i.conflictPaths.length?`partial`:`error`,message:i.conflictPaths.length?`conflicts in ${i.conflictPaths.length} file(s); resolve or cancel${a?` (main repo has moved since this job started)`:``}`:`apply failed`,conflictPaths:i.conflictPaths,repoDrifted:a}}revert(e){let t=this.appliedDiffs.get(e);if(!t)return{applied:!1,status:`error`,message:`job ${e} has no applied change to revert`,conflictPaths:[]};let n=Zt(this.deps.repoRoot,t);return n.applied?(this.appliedDiffs.delete(e),this.deps.appliedDiffStore?.delete(e),{applied:!0,status:`success`,message:`reverted cleanly`,conflictPaths:[]}):{applied:!1,status:n.conflictPaths.length?`partial`:`error`,message:n.conflictPaths.length?`cannot revert: ${n.conflictPaths.length} file(s) diverged since apply`:`revert failed`,conflictPaths:n.conflictPaths}}cancel(e){this.deps.registry.cancel(e)}};function yo(e){let t=e?.text;return typeof t==`string`?t:``}function bo(e){let t=0,n=0,r=0,i=e.split(/^diff --git /m).filter(Boolean);for(let e of i){if(e.includes(`
6
+ `)}catch{return``}finally{n!==void 0&&Vr(n)}}function _o(e){return e.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
7
+ `)}function vo(e){let t=Date.now(),n={model:e.model,systemPrompt:e.systemPrompt??``,messages:[{role:`user`,content:[{type:`text`,text:e.prompt}],timestamp:Date.now()}],tools:e.tools,thinkingLevel:e.thinkingLevel??`medium`,maxTokens:e.maxTokens},r,i=new hi({stream:e.stream,logger:e.logger,agentName:e.runId,maxToolTurns:e.maxToolTurns,toolHookExecutor:jt({hookRegistry:e.hookRegistry,agentName:e.runId,sessionId:e.runId}),depth:e.depth??0,approval:(t,n,i)=>{let a=e.onAwaitingInput;return a?new Promise(n=>{zt.setAwaitingApproval(e.runId,`${t}: ${i}`),r=t=>{zt.clearAwaitingApproval(e.runId),n(t)};try{ho(e.outputPath,`⏳ 需要你确认「${t}」:${i}\n 进 Delegates 面板按 o,回复 yes 允许 / no 拒绝。`)}catch{}a(i)}):Promise.resolve(!1)}});i.on(`turn.end`,({message:t})=>{let n=_o(t);if(n)try{ho(e.outputPath,n)}catch{}});let a=()=>{if(r){let e=r;r=void 0,e(!1)}i.abort()},o=St(i,{id:e.runId,agentName:e.runId,title:e.runId,prompt:e.prompt,model:e.model.id,origin:`user`,depth:e.depth??0,abort:a,messages:n.messages});return{promise:i.run(n).then(e=>({text:_o(e),messages:n.messages,tokenUsage:{input:e.usage.inputTokens,output:e.usage.outputTokens,cacheRead:e.usage.cacheReadTokens},durationMs:Date.now()-t})).finally(()=>{o(),zt.markEnded(e.runId)}),abort:a,steer:e=>{if(r){let t=r;r=void 0,t(/^\s*(y|yes|是|好|ok|approve|允许|同意|确认|可以|行)/i.test(e));return}i.steer({role:`user`,content:[{type:`text`,text:e}],timestamp:Date.now()})},outputPath:e.outputPath}}var yo=class{ownedJobIds=new Set;handles=new Map;appliedDiffs=new Map;constructor(e){if(this.deps=e,e.appliedDiffStore)for(let{jobId:t,diff:n}of e.appliedDiffStore.loadAll())this.appliedDiffs.set(t,n)}start(e){let{repoRoot:t,registry:n,spawnRun:r,buildOutputPath:i,newJobId:a}=this.deps,o=a(),s=Mt(t,o),c=i(o),l;try{l=r({runId:o,prompt:e.prompt,outputPath:c,workspaceDir:s.path,onAwaitingInput:()=>this.deps.registry.update(o,{status:`needs_input`})})}catch(e){throw qt(s,this.deps.onWorktreeCleanupError),e}let u=n.register({id:o,sessionId:e.sessionId,title:e.title,origin:e.origin,worktree:s,outputPath:c,abort:l.abort});return this.ownedJobIds.add(o),this.handles.set(o,l),l.promise.then(t=>this.onRunComplete(o,e.title,e.sessionId,s,c,t)).catch(t=>this.onRunFailed(o,e.title,e.sessionId,t)).finally(()=>this.handles.delete(o)),u}supply(e,t){let n=this.handles.get(e);if(!n?.steer)return!1;let r=this.deps.registry.get(e);return!r||r.status!==`running`&&r.status!==`needs_input`?!1:(n.steer(t),r.status===`needs_input`&&this.deps.registry.update(e,{status:`running`}),!0)}dispose(){for(let e of this.ownedJobIds)this.deps.registry.cancel(e);this.ownedJobIds.clear(),this.handles.clear(),this.appliedDiffs.clear()}onRunComplete(e,t,n,r,i,a){let o=this.deps.registry.get(e);if(!o||o.status===`canceled`)return;let s=``;try{s=en(r)}catch(r){this.onRunFailed(e,t,n,r);return}if(this.deps.registry.update(e,{status:`ready`,diff:s}),s.trim()){this.deps.notify(n,{jobId:e,title:t,status:`ready`,summary:`produced a diff (${xo(s)})`,outputPath:i,worktree:{path:r.path,branch:r.branch}});return}let c=bo(a).trim(),l=c?`完成 — /jobs 按 o 看结果(约 ${c.length} 字)`:`完成(无文件改动、无文本输出)`;this.deps.notify(n,{jobId:e,title:t,status:`ready`,summary:l,outputPath:i})}onRunFailed(e,t,n,r){let i=this.deps.registry.get(e);if(!i||i.status===`canceled`)return;let a=r instanceof Error?r.message:String(r);this.deps.registry.update(e,{status:`failed`,error:a}),this.deps.notify(n,{jobId:e,title:t,status:`failed`,summary:a})}apply(e){let t=this.deps.registry.get(e);if(!t)return{applied:!1,status:`error`,message:`job ${e} not found`,conflictPaths:[]};if(t.status!==`ready`)return{applied:!1,status:`error`,message:`job ${e} is ${t.status}, not ready`,conflictPaths:[]};let n=$t(t.diff??``),r=Qt(t.diff??``).length>0,i=xt(this.deps.repoRoot,t.diff??``);if(i.applied)return t.diff?.trim()&&(this.appliedDiffs.set(e,t.diff),this.deps.appliedDiffStore?.save(e,t.diff)),this.deps.registry.update(e,{status:`applied`}),{applied:!0,status:`success`,message:`applied cleanly`,conflictPaths:[],forbiddenZone:n,capabilityTouched:r};let a=Ht(this.deps.repoRoot,t.worktree.base);return{applied:!1,status:i.conflictPaths.length?`partial`:`error`,message:i.conflictPaths.length?`conflicts in ${i.conflictPaths.length} file(s); resolve or cancel${a?` (main repo has moved since this job started)`:``}`:`apply failed`,conflictPaths:i.conflictPaths,repoDrifted:a}}revert(e){let t=this.appliedDiffs.get(e);if(!t)return{applied:!1,status:`error`,message:`job ${e} has no applied change to revert`,conflictPaths:[]};let n=Zt(this.deps.repoRoot,t);return n.applied?(this.appliedDiffs.delete(e),this.deps.appliedDiffStore?.delete(e),{applied:!0,status:`success`,message:`reverted cleanly`,conflictPaths:[]}):{applied:!1,status:n.conflictPaths.length?`partial`:`error`,message:n.conflictPaths.length?`cannot revert: ${n.conflictPaths.length} file(s) diverged since apply`:`revert failed`,conflictPaths:n.conflictPaths}}cancel(e){this.deps.registry.cancel(e)}};function bo(e){let t=e?.text;return typeof t==`string`?t:``}function xo(e){let t=0,n=0,r=0,i=e.split(/^diff --git /m).filter(Boolean);for(let e of i){if(e.includes(`
8
8
  GIT binary patch`)){r++;continue}for(let r of e.split(`
9
- `))r.startsWith(`+`)&&!r.startsWith(`+++`)?t++:r.startsWith(`-`)&&!r.startsWith(`---`)&&n++}let a=r>0?`, ${r} binary file${r===1?``:`s`}`:``;return`+${t}/-${n}${a}`}const xo=/^[a-zA-Z0-9_-]+$/;function So(e){return{save(t,n){if(!xo.test(t))throw Error(`Invalid jobId for applied diff store: ${t}`);O(e,{recursive:!0}),A(x(e,`${t}.patch`),n,`utf-8`)},load(t){let n=x(e,`${t}.patch`);if(D(n))return k(n,`utf-8`)},delete(t){let n=x(e,`${t}.patch`);D(n)&&$r(n)},loadAll(){return D(e)?Kr(e).filter(e=>Ve(e)===`.patch`).map(t=>({jobId:t.slice(0,-6),diff:k(x(e,t),`utf-8`)})):[]}}}const Co=[`delegate_job`];function wo(e){return e.filter(e=>!Co.includes(e.name))}function To(){return`job_${mi().replace(/-/g,``).slice(0,8)}`}function Eo(e){let t=e.outputDir??x(Be(),`otto-jobs`);return e.registry.setWorktreeCleanupErrorHandler((t,n,r)=>e.logger.warn({jobId:t,op:n,err:r instanceof Error?r.message:String(r)},`Failed to clean up agent job worktree`)),new vo({repoRoot:e.repoRoot,registry:e.registry,notify:e.notify,onWorktreeCleanupError:(t,n)=>{e.logger.warn({op:t,err:n instanceof Error?n.message:String(n)},`Failed to clean up agent job worktree`)},appliedDiffStore:e.appliedDiffDir?So(e.appliedDiffDir):void 0,spawnRun:({runId:t,prompt:n,outputPath:r,workspaceDir:i,onAwaitingInput:a})=>_o({runId:t,prompt:n,outputPath:r,model:e.getModel(),systemPrompt:e.systemPrompt,tools:[...wo(e.buildTools(i)),...e.mcpTools?.()??[]],maxToolTurns:e.maxToolTurns,stream:e.stream,logger:e.logger,hookRegistry:e.hookRegistry,onAwaitingInput:a}),buildOutputPath:e=>(O(t,{recursive:!0}),x(t,`agent-job-${e}.log`)),newJobId:e.newJobId??To})}function Do(e){return Eo({repoRoot:e.workspaceDir,registry:Lt,notify:(t,n)=>e.agentJobNotify?.(t,n),buildTools:t=>e.buildToolsForWorkspace(t),mcpTools:()=>e.connectorTools(),getModel:()=>{let t=e.settings.get(`model`),n=(t?e.modelRegistry.find(t):void 0)??e.modelRegistry.getAll().find(e=>e.id!==`__otto_setup__`);if(!n)throw Error(`No model available — configure a model or run /model first.`);return n},stream:e.stream,logger:e.logger,hookRegistry:e.hookRegistry,appliedDiffDir:s()?void 0:x(n,`jobs`,`applied`)})}function Oo(e){for(let t=e.length-1;t>=0;t--){let n=e[t];if(n?.role!==`assistant`)continue;let r=(n.content??[]).filter(e=>e.type===`text`&&typeof e.text==`string`).map(e=>e.text).join(`
10
- `).trim();if(r.length>0)return r}return``}function ko(e){for(let t=e.length-1;t>=0;t--){let n=e[t];if(n?.role!==`assistant`)continue;let r=n.stopReason;return r===`refusal`||r===`max_tokens`?r:null}return null}function Ao(e){let t=Error(e);return t.name=`AbortError`,t}function jo(e){let t=new Map;return{runSession:async n=>{let r=Date.now(),i=new AbortController;n.taskId&&t.set(n.taskId,i);let a=n.signal,o=()=>i.abort();a&&(a.aborted?i.abort():a.addEventListener(`abort`,o,{once:!0}));let s;s=n.sessionMode===`sticky`&&n.sessionId?e.getSession(n.sessionId)||await e.createSession({id:n.sessionId,agentName:n.agentName,slot:n.slot,modelId:n.model,category:n.category,delegated:!0,promptContext:n.promptContext??(n.agentName?{taskDescription:n.prompt}:void 0),depth:n.depth,readOnly:n.readOnly}):await e.createSession({agentName:n.agentName,slot:n.slot,modelId:n.model,category:n.category,delegated:!0,promptContext:n.promptContext??(n.agentName?{taskDescription:n.prompt}:void 0),depth:n.depth,transient:!0,readOnly:n.readOnly});let c=s.id,l=St(s.coreAgent,{id:c,agentName:n.agentName??`agent`,title:n.agentName??n.prompt.replace(/\s+/g,` `).slice(0,48),prompt:n.prompt,model:n.model??s.model.id,modelDecidedBy:s.modelResolution?.decidedBy,origin:`main`,depth:n.depth??0,abort:()=>s.abort(),messages:()=>s.session.messages()});try{if(i.signal.aborted)throw Ao(`Task cancelled before the session started`);let e=n.agentName?`<agent-guardrails>\n${hn}\n</agent-guardrails>\n\n<task>\n${n.prompt}\n</task>`:n.prompt,t=s.prompt(e);t.catch(()=>{}),await Promise.race([t,new Promise((e,t)=>{i.signal.addEventListener(`abort`,()=>{s.abort(),t(Ao(`Task cancelled`))})})]);let a=s.session.messages(),o=Oo(a),c=ko(a);return c&&(o=`${o}\n\n[⚠ subagent did not complete cleanly (stop reason: ${c}) — the output above may be partial or unreliable; verify before relying on it]`),{text:o,sessionId:s.id,durationMs:Date.now()-r}}finally{zt.setMessages(c,s.session.messages()),l(),zt.markEnded(c),a?.removeEventListener(`abort`,o),n.taskId&&t.delete(n.taskId),n.sessionMode===`ephemeral`&&await e.removeSession(s.id).catch(t=>{e.logger.warn(`Failed to remove ephemeral session %s: %s`,s.id,t)})}},abortTask:e=>{t.get(e)?.abort()}}}function Mo(e){let t=new yi({focusTracking:process.env.OTTO_TUI_FOCUS===`1`}),n=new vi({getConfig:e.getConfig,getCwd:e.getCwd,onInteraction:()=>t.recordInteraction(),isFollowUpPending:e.isFollowUpPending,gate:new xi({getCondition:()=>e.getConfig()?.condition,getIdleThresholdMs:()=>e.getConfig()?.idle_threshold_ms,state:t})});return n.registerChannel(new bi({getConfig:e.getConfig})),n.registerChannel(new gi(`hook`,()=>!0,t=>e.emitHookNotification({sessionId:t.sessionId,message:t.message,title:t.title,notification_type:t.type}))),n.registerChannel(new _i({getConfig:e.getConfig,isTrusted:()=>Tr(e.getCwd())})),{dispatcher:n,presenceTracker:t}}function No(e,t){if(!t||t.length===0)return e;let n=t.map(e=>RegExp(`^`+e.replace(/[.+^${}()|[\]\\]/g,`\\$&`).replace(/\*/g,`.*`)+`$`,`i`));return e.filter(e=>!n.some(t=>t.test(e)))}var Po=class{catalog;derivedModelIds=new Map;constructor(e,t,n){this.modelRegistry=e,this.authStore=t,this.catalog=n??new d}async hydrate(){let e=new Set,t=await this.catalog.load();if(!t)return e;for(let n of Object.values(t.providers)){let t=oe(this.modelRegistry,n.mergeProvider,n.modelIds,{templateApi:n.modelApi});for(let n of t.availableIds)e.add(n);let r=this.derivedModelIds.get(n.mergeProvider)??new Set;for(let e of t.derivedIds)r.add(e);this.derivedModelIds.set(n.mergeProvider,r)}return e}refreshInFlight=null;async refresh(){return this.refreshInFlight||=this.doRefresh().finally(()=>{this.refreshInFlight=null}),this.refreshInFlight}async doRefresh(){let e=this.modelRegistry,t=this.authStore,n=t.listProviders(),r=await Promise.all(n.map(e=>t.getAuthSource(e).catch(()=>null))),i=[];for(let a=0;a<n.length;a++){let o=n[a];if(!r[a]){i.push({provider:o,status:`skipped`,reason:`not authenticated`});continue}let s=await t.resolveAuth(o).catch(()=>null);if(!s?.token){let e=r[a]===`oauth`&&!t.oauth.has(o)?`provider capability not granted — trust the plugin in /extension`:`credential expired or refresh failed — re-login`;i.push({provider:o,status:`skipped`,reason:e});continue}let c=ue(o,s.token,{mode:s.mode,beta:s.beta});if(!c){let t=e.getByProvider(o);if(t.length>0){let e=t.map(e=>e.id);await this.catalog.put(o,{fetchedAt:Date.now(),mergeProvider:o,modelIds:e}).catch(()=>{}),i.push({provider:o,status:`ok`,added:0,kept:e.length,total:e.length,availableIds:e})}else i.push({provider:o,status:`skipped`,reason:`no live models endpoint`});continue}try{let t=No(await v(c),c.modelIdExclude),n=oe(e,c.mergeProvider,t,{templateApi:c.modelApi}),r=new Set(n.availableIds),a=this.derivedModelIds.get(c.mergeProvider)??new Set;for(let t of a)r.has(t)||e.unregister(t);this.derivedModelIds.set(c.mergeProvider,new Set([...[...a].filter(e=>r.has(e)),...n.derivedIds])),await this.catalog.put(o,{fetchedAt:Date.now(),mergeProvider:c.mergeProvider,modelApi:c.modelApi,modelIds:t}).catch(()=>{}),i.push({provider:o,status:`ok`,added:n.added,kept:n.kept,total:n.total,availableIds:n.availableIds})}catch(e){i.push({provider:o,status:`failed`,reason:e instanceof Error?e.message:String(e)})}}return i}};function Fo(e){return e.modelRegistry.getAll()}function Io(e,t){return e.modelRegistry.resolve(t)}function Lo(e){return e.providerRegistry.list()}function Ro(e,t){e.hookRegistry.register(t)}function zo(e,t){return e.hookRegistry.unregister(t)}async function Bo(e){return e.modelCatalogManager.hydrate()}function Vo(e,t){return e.codingSessionPool.getSessionAvailableModels(t)}function Ho(e,t,n){e.codingSessionPool.setSessionAvailableModels(t,n)}async function Uo(e){return e.modelCatalogManager.refresh()}async function Wo(e,t){let n=new Set(t?e.codingSessionPool.getSessionAvailableModels(t):[]),r=ne(e.authStore,`delegation`);return Promise.all(e.modelRegistry.getAll().filter(e=>e.id!==`__otto_setup__`).map(async e=>{let t=await r(e);return{id:e.id,provider:e.provider,strengths:e.strengths??[],available:n.has(e.id),usable:t.usable,...t.reason?{unusableReason:t.reason}:{}}}))}function Go(e,t){e.notificationDispatcher.registerChannel(t)}function Ko(e,t){e.notificationDispatcher.registerChannel(new gi(`inapp`,()=>!0,e=>t(e.title??`otto`,e.message,e.type)))}function qo(e){e.presenceTracker.recordInteraction()}function Jo(e,t){e.presenceTracker.setFocus(t)}async function Yo(e,t,n){if(!t)return;if(n){e.permissionRegistry.addSessionAlwaysAllow(n,t),e.codingSessionPool.setSessionPermissionAllow(n,e.permissionRegistry.getSessionAlwaysAllow(n)),e.logger.info({tool:t,sessionId:n},`Tool added to session always-allow list`);return}let r=e.settings.get(`permission_always_allow`)??[];r.includes(t)||(e.permissionRegistry.addAlwaysAllow(t),await e.settings.persist({permission_always_allow:[...r,t]}),e.logger.info({tool:t},`Tool added to project always-allow list`))}function Xo(e){return e.settings.get(`permission_mode`)??`auto`}async function Zo(e,t){let n=Xo(e);await e.settings.update({permission_mode:t}),e.settings.persist({permission_mode:t}).catch(n=>e.logger.warn({err:n instanceof Error?n.message:String(n),mode:t},`Failed to persist permission mode`)),e.logger.info({from:n,to:t},`Permission mode set`)}function Qo(e,t){return e.permissionRegistry.getSessionAlwaysAllow(t)}async function $o(e,t){if(!t)return!1;let n=e.settings.get(`permission_always_allow`)??[];if(!n.includes(t))return!1;let r=n.filter(e=>e!==t);return e.permissionRegistry.setAlwaysAllow(r),await e.settings.persist({permission_always_allow:r}),e.logger.info({tool:t},`Tool removed from project always-allow list`),!0}function es(e,t){t&&(e.permissionRegistry.clearSessionAlwaysAllow(t),e.codingSessionPool.setSessionPermissionAllow(t,[]),e.logger.info({sessionId:t},`Session always-allow list cleared`))}async function ts(e,t={}){e.ensureNotDisposed(),await e.ensureSettingsLoaded();let n=await e.sessionConfigResolver.resolve(t),r=await e.agentRuntime.createSession(n);return e.notificationDispatcher.attach(r),e.toolsSyncCoordinator?.record(r.id,{agentName:t.agentName,promptPreset:t.promptPreset??(t.agentName?`subagent`:`main`),readOnly:t.readOnly,hasExplicitTools:t.tools!==void 0}),e.logger.info({sessionId:r.id},`Session created`),r}function ns(e,t){return e.codingSessionPool.getSession(t)}async function rs(e,t,n){if(!e.storage.storageHost)throw Error(`shareSession requires a configured storage.host`);await e.storage.storageHost.host.updateMetadata(`sessions`,e.workspaceRef?.key,t,{visibility:n.visibility},void 0),e.logger.info({sessionId:t,visibility:n.visibility},`Session visibility changed`)}function is(e){return e.codingSessionPool.active}function as(e,t){return e.codingSessionPool.listSessions(t)}async function os(e,t){let n=as(e,t).filter(t=>{let n=e.codingSessionPool.getSession(t.id);return n?!(n.transient===!0||n.depth>0||n.listable===!1):!0}),r;try{r=t?.workspaceId===void 0?e.workspaceRef?.key:Ei(t.workspaceId)}catch{r=void 0}if(!r)return n;let i=await e.codingSessionPool.listAllPersistedSessions({workspaceKey:r}).catch(()=>[]),a=t?.workspaceId??e.workspaceRef?.id,o=new Set(n.map(e=>e.id)),s=i.filter(e=>!o.has(e.id)).map(e=>({...e,workspaceId:a})),c=[...n,...s];return c.sort((e,t)=>{let n=e.updatedAt?.getTime()??e.createdAt.getTime();return(t.updatedAt?.getTime()??t.createdAt.getTime())-n}),c}async function ss(e,t){e.notificationDispatcher.detach(t);let n=await e.codingSessionPool.removeSession(t);return n&&(e.toolsSyncCoordinator?.forget(t),e.logger.info({sessionId:t},`Session removed`)),n}async function cs(e,t){let n=await e.codingSessionPool.archiveSession(t);return n&&e.logger.info({sessionId:t},`Session archived`),n}async function ls(e,t,n){let r=await e.codingSessionPool.forkSession(t,n);return r&&e.notificationDispatcher.attach(r),r}var us=class{contexts=new Map;constructor(e){this.deps=e}record(e,t){t.hasExplicitTools||this.contexts.set(e,{agentName:t.agentName,promptPreset:t.promptPreset,readOnly:t.readOnly})}forget(e){this.contexts.delete(e)}resyncOne(e){let t=this.contexts.get(e);return t?this.resyncSession(e,t):!1}resync(){let e=new Set(this.deps.listSessionIds());for(let t of this.contexts.keys())e.has(t)||this.contexts.delete(t);let t=0;for(let[e,n]of this.contexts)this.resyncSession(e,n)&&t++;return t}resyncSession(e,t){let n=this.deps.getSession(e);if(!n)return!1;try{let e=this.deps.sessionConfigResolver.resolveToolsForResync(t.agentName,t.promptPreset,t.readOnly);return n.model.supportsTools===!1&&(e=[]),n.tools=e,!0}catch(t){return this.deps.logger.warn({sessionId:e,err:t instanceof Error?t.message:String(t)},`[session-tools-sync] resync failed for session, skipping (fail-soft)`),!1}}};const ds=C(`@x-otto/coding:plugin-panel-manager`);function fs(e){let t=e.plugins??Vn({cwd:e.workspaceDir,homedir:e.homedir,disabled:e.disabledPlugins}),n=[];for(let e of t){let t=e.manifest.contributes?.panels;if(!t||t.length===0)continue;let r=E(e);if(!r.gated){if(!e.manifest.capabilities?.includes(`tui.renderer`)){ds.warn({pluginId:e.id},`plugin declares contributes.panels but not capabilities:["tui.renderer"], skipped (fail-closed)`);continue}if(r.pendingCapabilities.includes(`tui.renderer`)){ds.warn({pluginId:e.id},`plugin capability "tui.renderer" declared but not yet granted, skipping panels (fail-closed)`);continue}for(let r of t){let t=x(e.dir,r.entry);if(!D(t)){ds.warn({pluginId:e.id,panelId:r.id,modulePath:t},`panel entry not found — postinstall build may not have run`);continue}n.push({id:`${e.id}:${r.id}`,pluginId:e.id,title:r.title,modulePath:t,exportName:r.export??`default`})}}}return n}function ps(e){let t=[];for(let n of e){if(E(n).gated)continue;let e=n.manifest.contributes?.statusItems;if(!e?.length)continue;let r=Un(n.manifest.contributes?.contextKeys);for(let i of e){if((i.point??Mn.statuslineItem)!==Mn.statuslineItem||!Gn(i.when,r))continue;let e=r[i.dataSource.contextKey];e!=null&&t.push({item:{id:`${n.id}:${i.id}`,text:e},order:i.order??0})}}return t.sort((e,t)=>e.order-t.order).map(e=>e.item)}function ms(e){let t=[];for(let n of e){if(E(n).gated)continue;let e=n.manifest.contributes;if(!e?.menus?.length)continue;let r=Un(e.contextKeys);t.push(...rr(Mn.menuItem,e.menus,e.actions,r))}return t}const hs={capability:`tui.renderer`,axis:`renderers`,noun:`renderer`,pendingNote:`RFC-140 D3`,logger:C(`@x-otto/coding:plugin-renderer-loader`),entries:e=>e.manifest.contributes?.renderers,entryPath:e=>e.entry,exportName:e=>e.export,idLogFields:e=>({rendererId:e.id}),logTypeofOnNotFunction:!0,build:(e,t,n)=>({id:`${e.id}:${t.id}`,pluginId:e.id,matcher:t.matcher,render:n}),successLogFields:e=>({rendererId:e.id,matcher:e.matcher})};function gs(e){return Ja(e,hs)}const _s=C(`@x-otto/coding:plugin-a2ui-component-loader`),vs=new Set([`Text`,`Card`,`List`,`Progress`,`Chip`,`Button`]),ys={capability:`a2ui.component`,axis:`a2uiComponents`,noun:`a2ui component`,pendingNote:`RFC-140 D3 pattern`,logger:_s,entries:e=>e.manifest.contributes?.a2uiComponents,entryPath:e=>e.entry,exportName:e=>e.export,idLogFields:e=>({type:e.type}),logTypeofOnNotFunction:!1,preCheck:(e,t)=>vs.has(t.type)?(_s.warn({pluginId:e.id,type:t.type},`plugin a2ui component type collides with builtin reserved type, rejected (R4)`),!1):!0,build:(e,t,n)=>({type:t.type,pluginId:e.id,render:n})};function bs(e){return Ja(e,ys,{key:e=>e.type,onConflict:(e,t)=>{_s.warn({pluginId:e.pluginId,type:e.type,existingOwner:t},`a2ui component type already registered by another plugin, rejected (first-registered wins)`)}})}const xs={capability:`tui.renderer`,axis:`statusWidgets`,noun:`status widget`,pendingNote:`RFC-140 D3 pattern`,logger:C(`@x-otto/coding:plugin-status-widget-loader`),entries:e=>e.manifest.contributes?.statusWidgets,entryPath:e=>e.entry,exportName:e=>e.export,idLogFields:e=>({widgetId:e.id}),logTypeofOnNotFunction:!0,build:(e,t,n)=>({id:`${e.id}:${t.id}`,pluginId:e.id,render:n,tickMs:t.tickMs,order:t.order}),successLogFields:e=>({widgetId:e.id})};function Ss(e){return Ja(e,xs)}const Cs={capability:`tui.renderer`,axis:`fileViewers`,noun:`file viewer`,pendingNote:`RFC-140 D3 pattern`,logger:C(`@x-otto/coding:plugin-file-viewer-loader`),entries:e=>e.manifest.contributes?.fileViewers,entryPath:e=>e.entry,exportName:e=>e.export,idLogFields:e=>({viewerId:e.id}),logTypeofOnNotFunction:!0,build:(e,t,n)=>({id:`${e.id}:${t.id}`,pluginId:e.id,label:t.label,matcher:t.matcher,render:n,order:t.order}),successLogFields:e=>({viewerId:e.id,matcher:e.matcher})};function ws(e){return Ja(e,Cs)}var Ts=class{constructor(e){this.deps=e}listFileCommands(){return[...vr(this.deps.getWorkspaceDir(),this.deps.getActivePlugins()),...this.deps.pluginModuleManager.commands]}computedPluginCommands(){return this.deps.pluginModuleManager.commands}async callMcpTool(e,t,n){let r=this.deps.mcpController.getMcpClient(e);if(!r)throw Error(`MCP server "${e}" not connected or not found`);let i=await r.callTool({name:t,arguments:n});return{content:i.content,isError:i.isError}}getPluginPanelRegistrations(){return fs({workspaceDir:this.deps.getWorkspaceDir(),homedir:ze(),disabledPlugins:this.deps.settings.get(`disabled_plugins`),plugins:this.deps.getActivePlugins()})}getPluginStatusItems(){return ps(this.deps.getActivePlugins())}getGlobalMenuItems(){return ms(this.deps.getActivePlugins())}getPluginRenderers(){return gs(this.deps.getActivePlugins())}getPluginA2uiComponents(){return bs(this.deps.getActivePlugins())}getPluginStatusWidgets(){return Ss(this.deps.getActivePlugins())}getPluginFileViewers(){return ws(this.deps.getActivePlugins())}getPluginRegistrations(){let e=new Map,t=t=>{let n=e.get(t);return n||(n={pluginId:t},e.set(t,n)),n};for(let e of this.getPluginRenderers()){let n=t(e.pluginId);(n.renderers??=[]).push(e)}for(let e of this.getPluginStatusItems()){let n=t(e.id.split(`:`)[0]??e.id);(n.statusItems??=[]).push(e)}for(let e of this.getPluginPanelRegistrations()){let n=t(e.pluginId);(n.panels??=[]).push(e)}for(let e of this.getPluginA2uiComponents()){let n=t(e.pluginId);(n.a2uiComponents??=[]).push(e)}for(let e of this.getPluginStatusWidgets()){let n=t(e.pluginId);(n.statusWidgets??=[]).push(e)}for(let e of this.getPluginFileViewers()){let n=t(e.pluginId);(n.fileViewers??=[]).push(e)}return[...e.values()]}};const j=C(`@x-otto/coding:plugin-hooks`),Es=4096;function Ds(e,t){let n=Je();return n.OTTO_PLUGIN_DIR=e.pluginDir,n.OTTO_PLUGIN_ID=e.pluginId,e.workspaceDir&&(n.OTTO_WORKSPACE_DIR=e.workspaceDir),t&&Object.assign(n,t),n}function Os(e){let t=Ye(e);return t.safe?null:{success:!1,hook:`pre-check`,command:e,error:`Dangerous command blocked: ${t.reason}`}}function ks(e,t){let n=!1,r,i;if(e?.length){let t=typeof e==`string`?e:e.toString(`utf-8`);r=t.slice(0,Es),n=t.length>Es}if(t?.length){let e=typeof t==`string`?t:t.toString(`utf-8`);i=e.slice(0,Es),n||=e.length>Es}return{stdout:r,stderr:i,truncated:n}}async function As(e,t){return Os(t)||(j.info({pluginId:e.pluginId,command:t},`Executing postinstall hook`),new Promise(n=>{let r=Oi(t,{cwd:e.pluginDir,env:Ds(e),shell:!0,stdio:`pipe`}),i=[],a=[];r.stdout?.on(`data`,e=>{i.push(e)}),r.stderr?.on(`data`,e=>{a.push(e)});let o=!1,s=setTimeout(()=>{o=!0,r.kill()},3e4);r.on(`close`,(r,c)=>{clearTimeout(s);let{stdout:l,stderr:u,truncated:d}=ks(Buffer.concat(i),Buffer.concat(a)),f={success:!o&&r===0&&c===null,hook:`postinstall`,command:t,exitCode:r,signal:c??void 0,stdout:l,stderr:u,truncated:d||void 0};o&&(f.timeout=!0,f.error=`postinstall hook timed out (30s)`),f.success||j.warn({pluginId:e.pluginId,result:f},`Postinstall hook failed`),n(f)}),r.on(`error`,e=>{clearTimeout(s),n({success:!1,hook:`postinstall`,command:t,error:e.message})})}))}function js(e,t,n,r,i){let a=Os(t);if(a){j.warn({pluginId:e.pluginId,command:t},`Setup hook blocked by safety check`),n?.(a);return}if(j.info({pluginId:e.pluginId,command:t},`Executing setup hook (async)`),r){let a=r.spawn({command:t,args:[],options:{shell:!0},owner:{type:`plugin-hook`,id:e.pluginId},category:`plugin`,label:`${e.pluginId}:setup`,lifecycle:`evictable`,killGraceMs:5e3,cwd:e.pluginDir,env:Ds(e),signal:i}),o=setTimeout(()=>{j.warn({pluginId:e.pluginId},`Setup hook exceeded 60s — killing`),a.kill({reason:`setup timeout (60s)`})},6e4);o.unref?.();let s=``,c=``;a.onStdoutLine(e=>{s+=e+`
9
+ `))r.startsWith(`+`)&&!r.startsWith(`+++`)?t++:r.startsWith(`-`)&&!r.startsWith(`---`)&&n++}let a=r>0?`, ${r} binary file${r===1?``:`s`}`:``;return`+${t}/-${n}${a}`}const So=/^[a-zA-Z0-9_-]+$/;function Co(e){return{save(t,n){if(!So.test(t))throw Error(`Invalid jobId for applied diff store: ${t}`);O(e,{recursive:!0}),A(x(e,`${t}.patch`),n,`utf-8`)},load(t){let n=x(e,`${t}.patch`);if(D(n))return k(n,`utf-8`)},delete(t){let n=x(e,`${t}.patch`);D(n)&&$r(n)},loadAll(){return D(e)?Kr(e).filter(e=>Ve(e)===`.patch`).map(t=>({jobId:t.slice(0,-6),diff:k(x(e,t),`utf-8`)})):[]}}}const wo=[`delegate_job`];function To(e){return e.filter(e=>!wo.includes(e.name))}function Eo(){return`job_${mi().replace(/-/g,``).slice(0,8)}`}function Do(e){let t=e.outputDir??x(Be(),`otto-jobs`);return e.registry.setWorktreeCleanupErrorHandler((t,n,r)=>e.logger.warn({jobId:t,op:n,err:r instanceof Error?r.message:String(r)},`Failed to clean up agent job worktree`)),new yo({repoRoot:e.repoRoot,registry:e.registry,notify:e.notify,onWorktreeCleanupError:(t,n)=>{e.logger.warn({op:t,err:n instanceof Error?n.message:String(n)},`Failed to clean up agent job worktree`)},appliedDiffStore:e.appliedDiffDir?Co(e.appliedDiffDir):void 0,spawnRun:({runId:t,prompt:n,outputPath:r,workspaceDir:i,onAwaitingInput:a})=>vo({runId:t,prompt:n,outputPath:r,model:e.getModel(),systemPrompt:e.systemPrompt,tools:[...To(e.buildTools(i)),...e.mcpTools?.()??[]],maxToolTurns:e.maxToolTurns,stream:e.stream,logger:e.logger,hookRegistry:e.hookRegistry,onAwaitingInput:a}),buildOutputPath:e=>(O(t,{recursive:!0}),x(t,`agent-job-${e}.log`)),newJobId:e.newJobId??Eo})}function Oo(e){return Do({repoRoot:e.workspaceDir,registry:Lt,notify:(t,n)=>e.agentJobNotify?.(t,n),buildTools:t=>e.buildToolsForWorkspace(t),mcpTools:()=>e.connectorTools(),getModel:()=>{let t=e.settings.get(`model`),n=(t?e.modelRegistry.find(t):void 0)??e.modelRegistry.getAll().find(e=>e.id!==`__otto_setup__`);if(!n)throw Error(`No model available — configure a model or run /model first.`);return n},stream:e.stream,logger:e.logger,hookRegistry:e.hookRegistry,appliedDiffDir:s()?void 0:x(n,`jobs`,`applied`)})}function ko(e){for(let t=e.length-1;t>=0;t--){let n=e[t];if(n?.role!==`assistant`)continue;let r=(n.content??[]).filter(e=>e.type===`text`&&typeof e.text==`string`).map(e=>e.text).join(`
10
+ `).trim();if(r.length>0)return r}return``}function Ao(e){for(let t=e.length-1;t>=0;t--){let n=e[t];if(n?.role!==`assistant`)continue;let r=n.stopReason;return r===`refusal`||r===`max_tokens`?r:null}return null}function jo(e){let t=Error(e);return t.name=`AbortError`,t}function Mo(e){let t=new Map;return{runSession:async n=>{let r=Date.now(),i=new AbortController;n.taskId&&t.set(n.taskId,i);let a=n.signal,o=()=>i.abort();a&&(a.aborted?i.abort():a.addEventListener(`abort`,o,{once:!0}));let s;s=n.sessionMode===`sticky`&&n.sessionId?e.getSession(n.sessionId)||await e.createSession({id:n.sessionId,agentName:n.agentName,slot:n.slot,modelId:n.model,category:n.category,delegated:!0,promptContext:n.promptContext??(n.agentName?{taskDescription:n.prompt}:void 0),depth:n.depth,readOnly:n.readOnly}):await e.createSession({agentName:n.agentName,slot:n.slot,modelId:n.model,category:n.category,delegated:!0,promptContext:n.promptContext??(n.agentName?{taskDescription:n.prompt}:void 0),depth:n.depth,transient:!0,readOnly:n.readOnly});let c=s.id,l=St(s.coreAgent,{id:c,agentName:n.agentName??`agent`,title:n.agentName??n.prompt.replace(/\s+/g,` `).slice(0,48),prompt:n.prompt,model:n.model??s.model.id,modelDecidedBy:s.modelResolution?.decidedBy,origin:`main`,depth:n.depth??0,abort:()=>s.abort(),messages:()=>s.session.messages()});try{if(i.signal.aborted)throw jo(`Task cancelled before the session started`);let e=n.agentName?`<agent-guardrails>\n${hn}\n</agent-guardrails>\n\n<task>\n${n.prompt}\n</task>`:n.prompt,t=s.prompt(e);t.catch(()=>{}),await Promise.race([t,new Promise((e,t)=>{i.signal.addEventListener(`abort`,()=>{s.abort(),t(jo(`Task cancelled`))})})]);let a=s.session.messages(),o=ko(a),c=Ao(a);return c&&(o=`${o}\n\n[⚠ subagent did not complete cleanly (stop reason: ${c}) — the output above may be partial or unreliable; verify before relying on it]`),{text:o,sessionId:s.id,durationMs:Date.now()-r}}finally{zt.setMessages(c,s.session.messages()),l(),zt.markEnded(c),a?.removeEventListener(`abort`,o),n.taskId&&t.delete(n.taskId),n.sessionMode===`ephemeral`&&await e.removeSession(s.id).catch(t=>{e.logger.warn(`Failed to remove ephemeral session %s: %s`,s.id,t)})}},abortTask:e=>{t.get(e)?.abort()}}}function No(e){let t=new yi({focusTracking:process.env.OTTO_TUI_FOCUS===`1`}),n=new vi({getConfig:e.getConfig,getCwd:e.getCwd,onInteraction:()=>t.recordInteraction(),isFollowUpPending:e.isFollowUpPending,gate:new xi({getCondition:()=>e.getConfig()?.condition,getIdleThresholdMs:()=>e.getConfig()?.idle_threshold_ms,state:t})});return n.registerChannel(new bi({getConfig:e.getConfig})),n.registerChannel(new gi(`hook`,()=>!0,t=>e.emitHookNotification({sessionId:t.sessionId,message:t.message,title:t.title,notification_type:t.type}))),n.registerChannel(new _i({getConfig:e.getConfig,isTrusted:()=>Tr(e.getCwd())})),{dispatcher:n,presenceTracker:t}}function Po(e,t){if(!t||t.length===0)return e;let n=t.map(e=>RegExp(`^`+e.replace(/[.+^${}()|[\]\\]/g,`\\$&`).replace(/\*/g,`.*`)+`$`,`i`));return e.filter(e=>!n.some(t=>t.test(e)))}var Fo=class{catalog;derivedModelIds=new Map;constructor(e,t,n){this.modelRegistry=e,this.authStore=t,this.catalog=n??new d}async hydrate(){let e=new Set,t=await this.catalog.load();if(!t)return e;for(let n of Object.values(t.providers)){let t=oe(this.modelRegistry,n.mergeProvider,n.modelIds,{templateApi:n.modelApi});for(let n of t.availableIds)e.add(n);let r=this.derivedModelIds.get(n.mergeProvider)??new Set;for(let e of t.derivedIds)r.add(e);this.derivedModelIds.set(n.mergeProvider,r)}return e}refreshInFlight=null;async refresh(){return this.refreshInFlight||=this.doRefresh().finally(()=>{this.refreshInFlight=null}),this.refreshInFlight}async doRefresh(){let e=this.modelRegistry,t=this.authStore,n=t.listProviders(),r=await Promise.all(n.map(e=>t.getAuthSource(e).catch(()=>null))),i=[];for(let a=0;a<n.length;a++){let o=n[a];if(!r[a]){i.push({provider:o,status:`skipped`,reason:`not authenticated`});continue}let s=await t.resolveAuth(o).catch(()=>null);if(!s?.token){let e=r[a]===`oauth`&&!t.oauth.has(o)?`provider capability not granted — trust the plugin in /extension`:`credential expired or refresh failed — re-login`;i.push({provider:o,status:`skipped`,reason:e});continue}let c=ue(o,s.token,{mode:s.mode,beta:s.beta});if(!c){let t=e.getByProvider(o);if(t.length>0){let e=t.map(e=>e.id);await this.catalog.put(o,{fetchedAt:Date.now(),mergeProvider:o,modelIds:e}).catch(()=>{}),i.push({provider:o,status:`ok`,added:0,kept:e.length,total:e.length,availableIds:e})}else i.push({provider:o,status:`skipped`,reason:`no live models endpoint`});continue}try{let t=Po(await v(c),c.modelIdExclude),n=oe(e,c.mergeProvider,t,{templateApi:c.modelApi}),r=new Set(n.availableIds),a=this.derivedModelIds.get(c.mergeProvider)??new Set;for(let t of a)r.has(t)||e.unregister(t);this.derivedModelIds.set(c.mergeProvider,new Set([...[...a].filter(e=>r.has(e)),...n.derivedIds])),await this.catalog.put(o,{fetchedAt:Date.now(),mergeProvider:c.mergeProvider,modelApi:c.modelApi,modelIds:t}).catch(()=>{}),i.push({provider:o,status:`ok`,added:n.added,kept:n.kept,total:n.total,availableIds:n.availableIds})}catch(e){i.push({provider:o,status:`failed`,reason:e instanceof Error?e.message:String(e)})}}return i}};function Io(e){return e.modelRegistry.getAll()}function Lo(e,t){return e.modelRegistry.resolve(t)}function Ro(e){return e.providerRegistry.list()}function zo(e,t){e.hookRegistry.register(t)}function Bo(e,t){return e.hookRegistry.unregister(t)}async function Vo(e){return e.modelCatalogManager.hydrate()}function Ho(e,t){return e.codingSessionPool.getSessionAvailableModels(t)}function Uo(e,t,n){e.codingSessionPool.setSessionAvailableModels(t,n)}async function Wo(e){return e.modelCatalogManager.refresh()}async function Go(e,t){let n=new Set(t?e.codingSessionPool.getSessionAvailableModels(t):[]),r=ne(e.authStore,`delegation`);return Promise.all(e.modelRegistry.getAll().filter(e=>e.id!==`__otto_setup__`).map(async e=>{let t=await r(e);return{id:e.id,provider:e.provider,strengths:e.strengths??[],available:n.has(e.id),usable:t.usable,...t.reason?{unusableReason:t.reason}:{}}}))}function Ko(e,t){e.notificationDispatcher.registerChannel(t)}function qo(e,t){e.notificationDispatcher.registerChannel(new gi(`inapp`,()=>!0,e=>t(e.title??`otto`,e.message,e.type)))}function Jo(e){e.presenceTracker.recordInteraction()}function Yo(e,t){e.presenceTracker.setFocus(t)}async function Xo(e,t,n){if(!t)return;if(n){e.permissionRegistry.addSessionAlwaysAllow(n,t),e.codingSessionPool.setSessionPermissionAllow(n,e.permissionRegistry.getSessionAlwaysAllow(n)),e.logger.info({tool:t,sessionId:n},`Tool added to session always-allow list`);return}let r=e.settings.get(`permission_always_allow`)??[];r.includes(t)||(e.permissionRegistry.addAlwaysAllow(t),await e.settings.persist({permission_always_allow:[...r,t]}),e.logger.info({tool:t},`Tool added to project always-allow list`))}function Zo(e){return e.settings.get(`permission_mode`)??`auto`}async function Qo(e,t){let n=Zo(e);await e.settings.update({permission_mode:t}),e.settings.persist({permission_mode:t}).catch(n=>e.logger.warn({err:n instanceof Error?n.message:String(n),mode:t},`Failed to persist permission mode`)),e.logger.info({from:n,to:t},`Permission mode set`)}function $o(e,t){return e.permissionRegistry.getSessionAlwaysAllow(t)}async function es(e,t){if(!t)return!1;let n=e.settings.get(`permission_always_allow`)??[];if(!n.includes(t))return!1;let r=n.filter(e=>e!==t);return e.permissionRegistry.setAlwaysAllow(r),await e.settings.persist({permission_always_allow:r}),e.logger.info({tool:t},`Tool removed from project always-allow list`),!0}function ts(e,t){t&&(e.permissionRegistry.clearSessionAlwaysAllow(t),e.codingSessionPool.setSessionPermissionAllow(t,[]),e.logger.info({sessionId:t},`Session always-allow list cleared`))}async function ns(e,t={}){e.ensureNotDisposed(),await e.ensureSettingsLoaded();let n=await e.sessionConfigResolver.resolve(t),r=await e.agentRuntime.createSession(n);return e.notificationDispatcher.attach(r),e.toolsSyncCoordinator?.record(r.id,{agentName:t.agentName,promptPreset:t.promptPreset??(t.agentName?`subagent`:`main`),readOnly:t.readOnly,hasExplicitTools:t.tools!==void 0}),e.logger.info({sessionId:r.id},`Session created`),r}function rs(e,t){return e.codingSessionPool.getSession(t)}async function is(e,t,n){if(!e.storage.storageHost)throw Error(`shareSession requires a configured storage.host`);await e.storage.storageHost.host.updateMetadata(`sessions`,e.workspaceRef?.key,t,{visibility:n.visibility},void 0),e.logger.info({sessionId:t,visibility:n.visibility},`Session visibility changed`)}function as(e){return e.codingSessionPool.active}function os(e,t){return e.codingSessionPool.listSessions(t)}async function ss(e,t){let n=os(e,t).filter(t=>{let n=e.codingSessionPool.getSession(t.id);return n?!(n.transient===!0||n.depth>0||n.listable===!1):!0}),r;try{r=t?.workspaceId===void 0?e.workspaceRef?.key:Ei(t.workspaceId)}catch{r=void 0}if(!r)return n;let i=await e.codingSessionPool.listAllPersistedSessions({workspaceKey:r}).catch(()=>[]),a=t?.workspaceId??e.workspaceRef?.id,o=new Set(n.map(e=>e.id)),s=i.filter(e=>!o.has(e.id)).map(e=>({...e,workspaceId:a})),c=[...n,...s];return c.sort((e,t)=>{let n=e.updatedAt?.getTime()??e.createdAt.getTime();return(t.updatedAt?.getTime()??t.createdAt.getTime())-n}),c}async function cs(e,t){e.notificationDispatcher.detach(t);let n=await e.codingSessionPool.removeSession(t);return n&&(e.toolsSyncCoordinator?.forget(t),e.logger.info({sessionId:t},`Session removed`)),n}async function ls(e,t){let n=await e.codingSessionPool.archiveSession(t);return n&&e.logger.info({sessionId:t},`Session archived`),n}async function us(e,t,n){let r=await e.codingSessionPool.forkSession(t,n);return r&&e.notificationDispatcher.attach(r),r}var ds=class{contexts=new Map;constructor(e){this.deps=e}record(e,t){t.hasExplicitTools||this.contexts.set(e,{agentName:t.agentName,promptPreset:t.promptPreset,readOnly:t.readOnly})}forget(e){this.contexts.delete(e)}resyncOne(e){let t=this.contexts.get(e);return t?this.resyncSession(e,t):!1}resync(){let e=new Set(this.deps.listSessionIds());for(let t of this.contexts.keys())e.has(t)||this.contexts.delete(t);let t=0;for(let[e,n]of this.contexts)this.resyncSession(e,n)&&t++;return t}resyncSession(e,t){let n=this.deps.getSession(e);if(!n)return!1;try{let e=this.deps.sessionConfigResolver.resolveToolsForResync(t.agentName,t.promptPreset,t.readOnly);return n.model.supportsTools===!1&&(e=[]),n.tools=e,!0}catch(t){return this.deps.logger.warn({sessionId:e,err:t instanceof Error?t.message:String(t)},`[session-tools-sync] resync failed for session, skipping (fail-soft)`),!1}}};const fs=C(`@x-otto/coding:plugin-panel-manager`);function ps(e){let t=e.plugins??Vn({cwd:e.workspaceDir,homedir:e.homedir,disabled:e.disabledPlugins}),n=[];for(let e of t){let t=e.manifest.contributes?.panels;if(!t||t.length===0)continue;let r=E(e);if(!r.gated){if(!e.manifest.capabilities?.includes(`tui.renderer`)){fs.warn({pluginId:e.id},`plugin declares contributes.panels but not capabilities:["tui.renderer"], skipped (fail-closed)`);continue}if(r.pendingCapabilities.includes(`tui.renderer`)){fs.warn({pluginId:e.id},`plugin capability "tui.renderer" declared but not yet granted, skipping panels (fail-closed)`);continue}for(let r of t){let t=x(e.dir,r.entry);if(!D(t)){fs.warn({pluginId:e.id,panelId:r.id,modulePath:t},`panel entry not found — postinstall build may not have run`);continue}n.push({id:`${e.id}:${r.id}`,pluginId:e.id,title:r.title,modulePath:t,exportName:r.export??`default`})}}}return n}function ms(e){let t=[];for(let n of e){if(E(n).gated)continue;let e=n.manifest.contributes?.statusItems;if(!e?.length)continue;let r=Un(n.manifest.contributes?.contextKeys);for(let i of e){if((i.point??Mn.statuslineItem)!==Mn.statuslineItem||!Gn(i.when,r))continue;let e=r[i.dataSource.contextKey];e!=null&&t.push({item:{id:`${n.id}:${i.id}`,text:e},order:i.order??0})}}return t.sort((e,t)=>e.order-t.order).map(e=>e.item)}function hs(e){let t=[];for(let n of e){if(E(n).gated)continue;let e=n.manifest.contributes;if(!e?.menus?.length)continue;let r=Un(e.contextKeys);t.push(...rr(Mn.menuItem,e.menus,e.actions,r))}return t}const gs={capability:`tui.renderer`,axis:`renderers`,noun:`renderer`,pendingNote:`RFC-140 D3`,logger:C(`@x-otto/coding:plugin-renderer-loader`),entries:e=>e.manifest.contributes?.renderers,entryPath:e=>e.entry,exportName:e=>e.export,idLogFields:e=>({rendererId:e.id}),logTypeofOnNotFunction:!0,build:(e,t,n)=>({id:`${e.id}:${t.id}`,pluginId:e.id,matcher:t.matcher,render:n}),successLogFields:e=>({rendererId:e.id,matcher:e.matcher})};function _s(e){return Ja(e,gs)}const vs=C(`@x-otto/coding:plugin-a2ui-component-loader`),ys=new Set([`Text`,`Card`,`List`,`Progress`,`Chip`,`Button`]),bs={capability:`a2ui.component`,axis:`a2uiComponents`,noun:`a2ui component`,pendingNote:`RFC-140 D3 pattern`,logger:vs,entries:e=>e.manifest.contributes?.a2uiComponents,entryPath:e=>e.entry,exportName:e=>e.export,idLogFields:e=>({type:e.type}),logTypeofOnNotFunction:!1,preCheck:(e,t)=>ys.has(t.type)?(vs.warn({pluginId:e.id,type:t.type},`plugin a2ui component type collides with builtin reserved type, rejected (R4)`),!1):!0,build:(e,t,n)=>({type:t.type,pluginId:e.id,render:n})};function xs(e){return Ja(e,bs,{key:e=>e.type,onConflict:(e,t)=>{vs.warn({pluginId:e.pluginId,type:e.type,existingOwner:t},`a2ui component type already registered by another plugin, rejected (first-registered wins)`)}})}const Ss={capability:`tui.renderer`,axis:`statusWidgets`,noun:`status widget`,pendingNote:`RFC-140 D3 pattern`,logger:C(`@x-otto/coding:plugin-status-widget-loader`),entries:e=>e.manifest.contributes?.statusWidgets,entryPath:e=>e.entry,exportName:e=>e.export,idLogFields:e=>({widgetId:e.id}),logTypeofOnNotFunction:!0,build:(e,t,n)=>({id:`${e.id}:${t.id}`,pluginId:e.id,render:n,tickMs:t.tickMs,order:t.order}),successLogFields:e=>({widgetId:e.id})};function Cs(e){return Ja(e,Ss)}const ws={capability:`tui.renderer`,axis:`fileViewers`,noun:`file viewer`,pendingNote:`RFC-140 D3 pattern`,logger:C(`@x-otto/coding:plugin-file-viewer-loader`),entries:e=>e.manifest.contributes?.fileViewers,entryPath:e=>e.entry,exportName:e=>e.export,idLogFields:e=>({viewerId:e.id}),logTypeofOnNotFunction:!0,build:(e,t,n)=>({id:`${e.id}:${t.id}`,pluginId:e.id,label:t.label,matcher:t.matcher,render:n,order:t.order}),successLogFields:e=>({viewerId:e.id,matcher:e.matcher})};function Ts(e){return Ja(e,ws)}var Es=class{constructor(e){this.deps=e}listFileCommands(){return[...vr(this.deps.getWorkspaceDir(),this.deps.getActivePlugins()),...this.deps.pluginModuleManager.commands]}computedPluginCommands(){return this.deps.pluginModuleManager.commands}async callMcpTool(e,t,n){let r=this.deps.mcpController.getMcpClient(e);if(!r)throw Error(`MCP server "${e}" not connected or not found`);let i=await r.callTool({name:t,arguments:n});return{content:i.content,isError:i.isError}}getPluginPanelRegistrations(){return ps({workspaceDir:this.deps.getWorkspaceDir(),homedir:ze(),disabledPlugins:this.deps.settings.get(`disabled_plugins`),plugins:this.deps.getActivePlugins()})}getPluginStatusItems(){return ms(this.deps.getActivePlugins())}getGlobalMenuItems(){return hs(this.deps.getActivePlugins())}getPluginRenderers(){return _s(this.deps.getActivePlugins())}getPluginA2uiComponents(){return xs(this.deps.getActivePlugins())}getPluginStatusWidgets(){return Cs(this.deps.getActivePlugins())}getPluginFileViewers(){return Ts(this.deps.getActivePlugins())}getPluginRegistrations(){let e=new Map,t=t=>{let n=e.get(t);return n||(n={pluginId:t},e.set(t,n)),n};for(let e of this.getPluginRenderers()){let n=t(e.pluginId);(n.renderers??=[]).push(e)}for(let e of this.getPluginStatusItems()){let n=t(e.id.split(`:`)[0]??e.id);(n.statusItems??=[]).push(e)}for(let e of this.getPluginPanelRegistrations()){let n=t(e.pluginId);(n.panels??=[]).push(e)}for(let e of this.getPluginA2uiComponents()){let n=t(e.pluginId);(n.a2uiComponents??=[]).push(e)}for(let e of this.getPluginStatusWidgets()){let n=t(e.pluginId);(n.statusWidgets??=[]).push(e)}for(let e of this.getPluginFileViewers()){let n=t(e.pluginId);(n.fileViewers??=[]).push(e)}return[...e.values()]}};const j=C(`@x-otto/coding:plugin-hooks`),Ds=4096;function Os(e,t){let n=Je();return n.OTTO_PLUGIN_DIR=e.pluginDir,n.OTTO_PLUGIN_ID=e.pluginId,e.workspaceDir&&(n.OTTO_WORKSPACE_DIR=e.workspaceDir),t&&Object.assign(n,t),n}function ks(e){let t=Ye(e);return t.safe?null:{success:!1,hook:`pre-check`,command:e,error:`Dangerous command blocked: ${t.reason}`}}function As(e,t){let n=!1,r,i;if(e?.length){let t=typeof e==`string`?e:e.toString(`utf-8`);r=t.slice(0,Ds),n=t.length>Ds}if(t?.length){let e=typeof t==`string`?t:t.toString(`utf-8`);i=e.slice(0,Ds),n||=e.length>Ds}return{stdout:r,stderr:i,truncated:n}}async function js(e,t){return ks(t)||(j.info({pluginId:e.pluginId,command:t},`Executing postinstall hook`),new Promise(n=>{let r=Oi(t,{cwd:e.pluginDir,env:Os(e),shell:!0,stdio:`pipe`}),i=[],a=[];r.stdout?.on(`data`,e=>{i.push(e)}),r.stderr?.on(`data`,e=>{a.push(e)});let o=!1,s=setTimeout(()=>{o=!0,r.kill()},3e4);r.on(`close`,(r,c)=>{clearTimeout(s);let{stdout:l,stderr:u,truncated:d}=As(Buffer.concat(i),Buffer.concat(a)),f={success:!o&&r===0&&c===null,hook:`postinstall`,command:t,exitCode:r,signal:c??void 0,stdout:l,stderr:u,truncated:d||void 0};o&&(f.timeout=!0,f.error=`postinstall hook timed out (30s)`),f.success||j.warn({pluginId:e.pluginId,result:f},`Postinstall hook failed`),n(f)}),r.on(`error`,e=>{clearTimeout(s),n({success:!1,hook:`postinstall`,command:t,error:e.message})})}))}function Ms(e,t,n,r,i){let a=ks(t);if(a){j.warn({pluginId:e.pluginId,command:t},`Setup hook blocked by safety check`),n?.(a);return}if(j.info({pluginId:e.pluginId,command:t},`Executing setup hook (async)`),r){let a=r.spawn({command:t,args:[],options:{shell:!0},owner:{type:`plugin-hook`,id:e.pluginId},category:`plugin`,label:`${e.pluginId}:setup`,lifecycle:`evictable`,killGraceMs:5e3,cwd:e.pluginDir,env:Os(e),signal:i}),o=setTimeout(()=>{j.warn({pluginId:e.pluginId},`Setup hook exceeded 60s — killing`),a.kill({reason:`setup timeout (60s)`})},6e4);o.unref?.();let s=``,c=``;a.onStdoutLine(e=>{s+=e+`
11
11
  `}),a.onStderrLine(e=>{c+=e+`
12
- `}),a.onExit(r=>{clearTimeout(o);let{stdout:i,stderr:a,truncated:l}=ks(s,c),u={success:r.code===0&&r.signal===null,hook:`setup`,command:t,exitCode:r.code,signal:r.signal??void 0,stdout:i,stderr:a,truncated:l||void 0};u.success?j.info({pluginId:e.pluginId},`Setup hook succeeded`):j.error({pluginId:e.pluginId,exitCode:r.code,signal:r.signal,stderr:a?.slice(0,512)},`Setup hook failed`),n?.(u)}),a.onError(r=>{j.error({pluginId:e.pluginId,err:r},`Setup hook spawn error`),n?.({success:!1,hook:`setup`,command:t,error:r.message})});return}let o=Oi(t,{cwd:e.pluginDir,env:Ds(e),shell:!0,timeout:6e4,stdio:`pipe`}),s=``,c=``;o.stdout?.on(`data`,e=>{s+=e.toString(`utf-8`)}),o.stderr?.on(`data`,e=>{c+=e.toString(`utf-8`)}),o.on(`close`,(r,i)=>{let{stdout:a,stderr:o,truncated:l}=ks(s,c),u={success:r===0&&i===null,hook:`setup`,command:t,exitCode:r,signal:i,stdout:a,stderr:o,truncated:l||void 0};u.success?j.info({pluginId:e.pluginId},`Setup hook succeeded`):j.error({pluginId:e.pluginId,exitCode:r,signal:i,stderr:o?.slice(0,512)},`Setup hook failed`),n?.(u)}),o.on(`error`,r=>{j.error({pluginId:e.pluginId,err:r},`Setup hook spawn error`),n?.({success:!1,hook:`setup`,command:t,error:r.message})})}const Ms=C(`@x-otto/coding:plugin-lifecycle`),Ns=`plugin_lifecycle`,Ps=new Set;async function Fs(e,t,n){let r=t.get(Ns)?.setupDone??[],i=new Map(r.map(e=>[e.id,e.version])),a=new Set(e.map(e=>e.id));for(let e of i.keys())a.has(e)||i.delete(e);let o=!1;for(let r of e){let e=i.get(r.id),a=r.manifest.version,s=r.manifest.scripts?.setup;if(!s){(e===void 0||e!==a)&&(i.set(r.id,a),o=!0);continue}if(!(e!==void 0&&e===a)){if(E(r).gated){Ms.info({pluginId:r.id},`Setup hook deferred: plugin not yet trusted`);continue}Ps.has(r.id)||(Ps.add(r.id),js({pluginDir:r.dir,pluginId:r.id,workspaceDir:n},s,e=>{Ps.delete(r.id),i.set(r.id,a),Is(t,i)},Vt))}}o&&await Is(t,i)}async function Is(e,t){let n=[...t].map(([e,t])=>({id:e,version:t}));await e.persist({[Ns]:{setupDone:n}})}function Ls(e,t){let n;try{n=Jr(t)}catch{return!1}let r;try{r=Jr(e)}catch{r=e}return r===n||r.startsWith(n+We)}const M=C(`@x-otto/coding:plugin-i18n-loader`),Rs=/^([a-zA-Z0-9_-]+)\.json$/;function zs(e){return Buffer.byteLength(e,`utf8`)<=En?e:`${Buffer.from(e,`utf8`).subarray(0,En).toString(`utf8`)}…`}function Bs(e,t,n){let r=new Map,i=S(t,n);if(!Ls(i,t))return M.warn({pluginId:e,i18nDir:n},`i18nDir resolves outside plugin dir, skipped`),r;let a;try{a=Kr(i)}catch{return r}let o=a.filter(e=>Rs.test(e)).sort();o.length>Tn&&(M.warn({pluginId:e,i18nDir:n,declared:o.length,limit:Tn},`plugin i18nDir declares more locale files than the per-plugin limit, truncated`),o=o.slice(0,Tn));for(let n of o){let a=Rs.exec(n)?.[1];if(!a)continue;let o=S(i,n);if(!Ls(o,t)){M.warn({pluginId:e,filename:n},`i18nDir locale file resolves outside plugin dir, skipped`);continue}let s;try{s=k(o,`utf8`)}catch(t){M.warn({pluginId:e,filename:n,err:String(t)},`i18nDir locale file read failed, skipped`);continue}if(Buffer.byteLength(s,`utf8`)>wn){M.warn({pluginId:e,filename:n,limit:wn},`i18nDir locale file exceeds byte limit, skipped`);continue}let c;try{c=JSON.parse(s)}catch(t){M.warn({pluginId:e,filename:n,err:String(t)},`i18nDir locale file is not valid JSON, skipped`);continue}if(typeof c!=`object`||!c||Array.isArray(c)){M.warn({pluginId:e,filename:n},`i18nDir locale file is not a flat object, skipped`);continue}for(let[e,t]of Object.entries(c)){if(typeof t!=`string`)continue;let n=r.get(e)??{};n[a]=t,r.set(e,n)}}return r}function Vs(e){let t=[];for(let n of e){if(E(n).gated)continue;let e=n.manifest.contributes?.i18nDir,r=n.manifest.contributes?.i18n;if(!e&&!r?.length)continue;let i=e?Bs(n.id,n.dir,e):new Map;if(r?.length)for(let e of r){let t=i.get(e.id)??{};for(let[r,i]of Object.entries(e.translations))r in t&&M.debug({pluginId:n.id,id:e.id,locale:r},`i18n inline entry overrides locale dir value`),t[r]=i;i.set(e.id,t)}let a=[...i.keys()];a.length>Cn&&(M.warn({pluginId:n.id,declared:a.length,limit:Cn},`plugin declares more i18n entries than the per-plugin limit, truncated`),a=a.slice(0,Cn));for(let e of a){let r=i.get(e);if(!r)continue;let a={};for(let[e,t]of Object.entries(r))a[e]=zs(t);t.push({pluginId:n.id,id:e,translations:a})}}return t}const Hs=C(`@x-otto/coding:declarative-agents`);function Us(e){return{...e,defaultTools:e.defaultTools?.length?Or(e.defaultTools):e.defaultTools,disallowedTools:e.disallowedTools?.length?Or(e.disallowedTools):e.disallowedTools}}function Ws(e,t){let n=et(e);if(!n)return Hs.warn({sourcePath:t},`Agent definition missing frontmatter, skipped`),null;let{fields:r,body:i}=n,a=r.get(`name`),o=r.get(`description`);if(!a||!o||!i)return Hs.warn({sourcePath:t},`Agent definition requires name/description/body, skipped`),null;let s=Qe(r.get(`tools`)),c=Number.parseInt(r.get(`maxtoolturns`)??``,10),l=Number.parseInt(r.get(`maxtoolturnextensions`)??``,10),u=r.get(`prompt-mode`),d=Qe(r.get(`disallowed-tools`)),f=r.get(`allow-subagents`)===`true`?!0:r.get(`allow-subagents`)===`false`?!1:void 0;return{name:a,description:o,taskTypes:Qe(r.get(`tasktypes`))??[o],capabilities:Qe(r.get(`capabilities`))??[],systemPromptTemplate:i,promptMode:u===`append`||u===`replace`?u:void 0,defaultTools:s,disallowedTools:d?.length?d:void 0,preferredModelTier:r.get(`slot`)??r.get(`tier`),defaultMaxToolTurns:Number.isInteger(c)?c:void 0,defaultMaxToolTurnExtensions:Number.isInteger(l)?l:void 0,allowSubagents:f}}async function Gs(e,t){let{homedir:n}=await import(`node:os`),{join:r}=await import(`node:path`),i=t?.globalDir??r(n(),`.otto`,`agents`),a=r(e,`.otto`,`agents`),s=(t?.plugins??Vn({cwd:e,homedir:n()})).filter(e=>e.manifest.contributes?.agents!==!1).filter(e=>!E(e).gated).map(e=>({dir:r(e.dir,`agents`),claude:!1})),c=o(),l=c&&!br(e).gated,u=[...s,...c?[{dir:r(n(),`.claude`,`agents`),claude:!0}]:[],{dir:i,claude:!1},...l?[{dir:r(e,`.claude`,`agents`),claude:!0}]:[],{dir:a,claude:!1}],d=new Map;for(let{dir:e,claude:t}of u)for(let n of await Ks(e))d.set(n.name,t?Us(n):n);let f=[...d.values()];return f.length>0&&Hs.info(`Loaded %d declarative agent(s): %s`,f.length,f.map(e=>e.name).join(`, `)),f}async function Ks(e){let{readFile:t,readdir:n}=await import(`node:fs/promises`),{join:r}=await import(`node:path`),i;try{i=await n(e)}catch{return[]}let a=[];for(let n of i.filter(e=>e.endsWith(`.md`)).sort()){let i=r(e,n);try{let e=Ws(await t(i,`utf-8`),i);e&&a.push(e)}catch(e){Hs.warn({sourcePath:i,err:e},`Failed to read agent definition, skipped`)}}return a}const qs=C(`@x-otto/coding:declarative-teams`),Js=new Set([`handoff`,`sequential`,`parallel`,`hierarchical`,`router`]);function Ys(e){if(!e)return;let t=[];for(let n of e.split(`|`)){let[e,r]=n.split(/→|->/);if(e===void 0||r===void 0)continue;let i=e.split(`,`).map(e=>e.trim().toLowerCase()).filter(e=>e!==``),a=r.trim();i.length>0&&a!==``&&t.push({keywords:i,agentId:a})}return t.length>0?t:void 0}function Xs(e,t){let n=et(e);if(!n)return qs.warn({sourcePath:t},`Team definition missing frontmatter, skipped`),null;let{fields:r}=n,i=r.get(`name`),a=r.get(`pattern`),o=Qe(r.get(`agents`));if(!i||!a||!Js.has(a)||!o||o.length===0)return qs.warn({sourcePath:t},`Team definition requires name, valid pattern and non-empty agents, skipped`),null;let s=Number.parseInt(r.get(`maxhandoffdepth`)??``,10);return{name:i,pattern:a,agentNames:o,pipeline:Qe(r.get(`pipeline`)),supervisorId:r.get(`supervisor`),entryAgentId:r.get(`entry`),routerStrategy:r.get(`router`),rules:Ys(r.get(`rules`)),maxHandoffDepth:Number.isInteger(s)?s:void 0}}async function Zs(e,t){let{homedir:n}=await import(`node:os`),{join:r}=await import(`node:path`),i=t?.globalDir??r(n(),`.otto`,`teams`),a=r(e,`.otto`,`teams`),o=new Map;for(let e of[i,a])for(let t of await Qs(e))o.set(t.name,t);let s=[...o.values()];return s.length>0&&qs.info(`Loaded %d declarative team(s): %s`,s.length,s.map(e=>e.name).join(`, `)),s}async function Qs(e){let{readFile:t,readdir:n}=await import(`node:fs/promises`),{join:r}=await import(`node:path`),i;try{i=await n(e)}catch{return[]}let a=[];for(let n of i.filter(e=>e.endsWith(`.md`)).sort()){let i=r(e,n);try{let e=Xs(await t(i,`utf-8`),i);e&&a.push(e)}catch(e){qs.warn({sourcePath:i,err:e},`Failed to read team definition, skipped`)}}return a}var $s=class{reloadQueue=Promise.resolve();constructor(e,t,n,r,i,a,o,s,c,l){this.settings=e,this.mcp=t,this.skills=n,this.pluginModules=r,this.pluginProviders=i,this.tools=a,this.modelCatalog=o,this.workspaceDir=s,this.activePlugins=c,this.i18n=l}async reload(){let e=this.reloadQueue.then(()=>this.reloadSerial());return this.reloadQueue=e.catch(()=>void 0),e}async reloadSerial(){await this.settings.load(),Fs(this.activePlugins(),this.settings,this.workspaceDir),await this.mcp.reload(),this.skills&&(this.skills.updatePluginDirs(this.activePlugins().filter(e=>e.manifest.contributes?.skills!==!1).filter(e=>!E(e).gated).map(e=>({id:e.id,dir:x(e.dir,`skills`)}))),await this.skills.discover());let e=Vs(this.activePlugins());this.i18n.register(e);let t=(await this.modelCatalog.refresh().catch(()=>[])).reduce((e,t)=>e+(t.added??0),0),n=await Gs(this.workspaceDir,{plugins:this.activePlugins()}),r=await Zs(this.workspaceDir),i=await this.pluginModules.reload(new Set(n.map(e=>e.name)));n.push(...i);let a=await this.pluginProviders.reload();return{mcpTools:this.tools.getAvailable(`full`).filter(e=>e.name.startsWith(`mcp__`)).length,models:t,agents:n.length,teamCount:r.length,agentProfiles:n,teamDeclarations:r,pendingProviderCapabilities:a.pendingCapabilityPluginIds,i18nEntries:e.length}}};const ec=C(`@x-otto/coding:panel-backend-controller`);var tc=class{stateListeners=new Map;statusListeners=new Map;inProcessHandlers=new Map;subscribedManager=null;constructor(e){this.deps=e}registerInProcessBackend(e,t){this.inProcessHandlers.set(e,t);let n=this.statusListeners.get(e);if(n)for(let e of n)e(`ready`)}unregisterInProcessBackend(e){this.inProcessHandlers.delete(e)}resolveServerForPlugin(e){if(this.inProcessHandlers.has(e))return{ok:!0};let t=this.deps.getActivePlugins().find(t=>t.id===e);if(!t)return{ok:!1,reason:`plugin "${e}" not found or not active`};if(!t.manifest.capabilities?.includes(`panel.backend`))return{ok:!1,reason:`plugin "${e}" does not declare capabilities:["panel.backend"]`};let n=E(t);if(n.pendingCapabilities.includes(`panel.backend`))return{ok:!1,reason:`plugin "${e}" capability "panel.backend" declared but not yet granted`};if(n.gated)return{ok:!1,reason:`plugin "${e}" is untrusted`};let r=this.deps.mcpController.listEffectiveServers(),i=Object.entries(r).filter(([,t])=>t.pluginId===e);return i.length===0?{ok:!1,reason:`plugin "${e}" has no associated MCP server`}:(i.length>1&&ec.warn({pluginId:e,serverNames:i.map(([e])=>e)},`plugin contributes multiple MCP servers; panel backend uses the first match (multi-server routing not yet supported)`),{ok:!0,serverName:i[0][0]})}async call(e,t,n,r){let i=this.inProcessHandlers.get(e);if(i)return i(t,n);let a=this.resolveServerForPlugin(e);if(!a.ok||!a.serverName)throw Error(a.reason??`cannot resolve backend server for plugin "${e}"`);let o=this.deps.mcpController.getMcpClient(a.serverName);if(!o)throw Error(`MCP server "${a.serverName}" for plugin "${e}" is not connected`);let s=r?.operationId?{...n,__operationId:r.operationId}:n;return o.callRaw(t,s,r?.signal)}async cancel(e,t){if(this.inProcessHandlers.has(e))return;let n=this.resolveServerForPlugin(e);if(!n.ok||!n.serverName)return;let r=this.deps.mcpController.getMcpClient(n.serverName);r&&await r.callRaw(`backend/cancel`,{id:t}).catch(()=>void 0)}subscribeState(e,t){return this.ensureNotificationSubscription(),this.stateListeners.has(e)||this.stateListeners.set(e,new Set),this.stateListeners.get(e).add(t),()=>{this.stateListeners.get(e)?.delete(t)}}onStatusChange(e,t){return this.ensureNotificationSubscription(),this.statusListeners.has(e)||this.statusListeners.set(e,new Set),this.statusListeners.get(e).add(t),()=>{this.statusListeners.get(e)?.delete(t)}}getStatus(e){if(this.inProcessHandlers.has(e))return`ready`;let t=this.resolveServerForPlugin(e);if(!t.ok||!t.serverName||this.deps.mcpController.listEffectiveServers()[t.serverName]?.disabled)return`disabled`;let n=this.deps.mcpController.getMcpClient(t.serverName);if(!n)return`crashed`;let r=n.getStatus();return r===`ready`?`ready`:r===`connecting`||r===`reconnecting`?`connecting`:`crashed`}notifyReload(){this.ensureNotificationSubscription();for(let[e,t]of this.statusListeners){if(t.size===0)continue;let n=this.getStatus(e);for(let e of t)e(n)}}ensureNotificationSubscription(){let e=this.deps.mcpController.manager;if(this.subscribedManager===e||(this.subscribedManager=e,!e))return;e.on(`server.notification`,({name:e,method:t,params:n})=>{if(t!==`backend/state`)return;let r=this.pluginIdForServer(e);if(!r)return;let i=this.stateListeners.get(r);if(!(!i||i.size===0))for(let e of i)e(n??{})});let t=e=>{let t=this.pluginIdForServer(e);if(!t)return;let n=this.statusListeners.get(t);if(!n||n.size===0)return;let r=this.getStatus(t);for(let e of n)e(r)};e.on(`server.connected`,({name:e})=>t(e)),e.on(`server.disconnected`,({name:e})=>t(e))}pluginIdForServer(e){return this.deps.mcpController.listEffectiveServers()[e]?.pluginId}};const nc=C(`@x-otto/coding:plugin-log-writer`);function rc(){return S(n,`plugin-logs`)}function ic(e){return Sn.test(e)?x(rc(),`${e}.jsonl`):(nc.warn({pluginId:e},`plugin id failed kebab-case validation, skipping log path resolution`),null)}function ac(e){let t;try{t=Zr(e).size}catch{return}if(!(t<=5242880))try{let t=k(e,`utf8`),n=Math.floor(t.length/2),r=t.indexOf(`
13
- `,n);A(e,r>=0?t.slice(r+1):t.slice(n))}catch(t){nc.warn({path:e,err:String(t)},`plugin log truncation failed (fail-soft)`)}}function oc(e,t,n){if(!s())try{let r=ic(e);if(!r)return;let i=rc();D(i)||O(i,{recursive:!0}),ac(r),Br(r,`${JSON.stringify({ts:Date.now(),level:t,pluginId:e,msg:n})}\n`)}catch(t){nc.warn({pluginId:e,err:String(t)},`plugin log append failed (fail-soft)`)}}const sc=C(`@x-otto/coding:plugin-tool-wiring`);function N(e,t){return`plugin:${e}:${t}`}function cc(e){let t=e.split(`:`);return t.length<3||t[0]!==`plugin`?null:t[1]||null}function lc(e){let t=e?.content;return typeof t==`string`?t:Array.isArray(t)?t.map(e=>e&&typeof e==`object`&&`text`in e?String(e.text):``).join(``):``}const P={preToolUse:`tool.execute.before`,postToolUse:`tool.execute.after`,userPromptSubmit:`chat.message.before`,sessionStart:`session.created`,stop:`stream.end`,sessionRestored:`session.restored`,sessionDeleted:`session.deleted`,sessionIdle:`session.idle`,sessionError:`session.error`,streamStart:`stream.start`,compactionPending:`compaction.before`,compactionOccurred:`compaction.after`,taskCreated:`task.created`,taskStarted:`task.started`,taskCompleted:`task.completed`,taskFailed:`task.failed`};function uc(e,t){let n=[];if(t.preToolUse){let r=t.preToolUse;n.push(y({name:N(e,`preToolUse`),timing:P.preToolUse,handle:async(t,n)=>{let i=await r({toolName:t.toolName,input:t.args});i&&(i.decision===`deny`?(n.decision=`deny`,n.cancelled=!0,n.cancelReason=i.reason??`denied by plugin ${e}`):i.decision===`ask`&&(n.decision=`ask`,n.decisionReason=i.reason??`requires approval (plugin ${e})`))}}))}if(t.postToolUse){let r=t.postToolUse;n.push(y({name:N(e,`postToolUse`),timing:P.postToolUse,handle:async e=>{await r({toolName:e.toolName,input:e.args,result:e.result})}}))}if(t.userPromptSubmit){let r=t.userPromptSubmit;n.push(y({name:N(e,`userPromptSubmit`),timing:P.userPromptSubmit,handle:async e=>{await r({prompt:lc(e.message)})}}))}if(t.sessionStart){let r=t.sessionStart;n.push(y({name:N(e,`sessionStart`),timing:P.sessionStart,handle:async()=>{await r()}}))}if(t.stop){let r=t.stop;n.push(y({name:N(e,`stop`),timing:P.stop,handle:async()=>{await r()}}))}if(t.sessionRestored){let r=t.sessionRestored;n.push(y({name:N(e,`sessionRestored`),timing:P.sessionRestored,handle:async e=>{await r({sessionId:e.sessionId})}}))}if(t.sessionDeleted){let r=t.sessionDeleted;n.push(y({name:N(e,`sessionDeleted`),timing:P.sessionDeleted,handle:async e=>{await r({sessionId:e.sessionId})}}))}if(t.sessionIdle){let r=t.sessionIdle;n.push(y({name:N(e,`sessionIdle`),timing:P.sessionIdle,handle:async e=>{await r({sessionId:e.sessionId})}}))}if(t.sessionError){let r=t.sessionError;n.push(y({name:N(e,`sessionError`),timing:P.sessionError,handle:async e=>{await r({sessionId:e.sessionId,error:e.error})}}))}if(t.streamStart){let r=t.streamStart;n.push(y({name:N(e,`streamStart`),timing:P.streamStart,handle:async e=>{await r({sessionId:e.sessionId,model:e.model})}}))}if(t.compactionPending){let r=t.compactionPending;n.push(y({name:N(e,`compactionPending`),timing:P.compactionPending,handle:async e=>{await r({sessionId:e.sessionId,messageCount:e.messageCount})}}))}if(t.compactionOccurred){let r=t.compactionOccurred;n.push(y({name:N(e,`compactionOccurred`),timing:P.compactionOccurred,handle:async e=>{await r({sessionId:e.sessionId,retainedCount:e.retainedCount})}}))}if(t.taskCreated){let r=t.taskCreated;n.push(y({name:N(e,`taskCreated`),timing:P.taskCreated,handle:async e=>{await r({taskId:e.task.id})}}))}if(t.taskStarted){let r=t.taskStarted;n.push(y({name:N(e,`taskStarted`),timing:P.taskStarted,handle:async e=>{await r({taskId:e.task.id,agent:e.agent})}}))}if(t.taskCompleted){let r=t.taskCompleted;n.push(y({name:N(e,`taskCompleted`),timing:P.taskCompleted,handle:async e=>{await r({taskId:e.task.id,status:e.task.status,durationMs:e.result.durationMs,tokenUsage:e.result.tokenUsage})}}))}if(t.taskFailed){let r=t.taskFailed;n.push(y({name:N(e,`taskFailed`),timing:P.taskFailed,handle:async e=>{await r({taskId:e.task.id,error:e.error.message})}}))}return n}function dc(e,t,n,r){return r.map(r=>({name:r.name,description:r.description,argumentHint:r.argumentHint,allowedTools:r.allowedTools,model:r.model,body:r.body,source:`plugin`,scope:t===`bundled`?`project`:t,pluginId:e,filePath:`${n}#computed:${r.name}`}))}function fc(e){return e.map(e=>({name:e.name,description:e.description,taskTypes:e.taskTypes??[],capabilities:e.capabilities??[],systemPromptTemplate:e.systemPromptTemplate,...e.promptMode?{promptMode:e.promptMode}:{},...e.defaultTools?{defaultTools:e.defaultTools}:{},...e.disallowedTools?{disallowedTools:e.disallowedTools}:{},...e.preferredModelTier?{preferredModelTier:e.preferredModelTier}:{},...e.allowSubagents===void 0?{}:{allowSubagents:e.allowSubagents}}))}function pc(e,t,n){return n.map(n=>({definition:{metadata:{name:n.name,description:n.description??``},body:n.body,directory:t,filePath:`${t}#computed:${n.name}`,supportingFiles:[]},source:{type:`plugin`,root:t,id:e}}))}function mc(e,t){return t instanceof Ge?t.pluginSource===void 0?new t.constructor(t.message,{code:t.code,cause:t.cause,status:t.status,headers:t.headers,errorType:t.errorType,pluginSource:e}):t:new Ke(t instanceof Error?t.message:String(t),{code:`PROVIDER_PLUGIN_ERROR`,cause:t instanceof Error?t:void 0,pluginSource:e})}function hc(e,t){return()=>{let n=t();return{...n,async*converse(t,r,i,a){try{for await(let o of n.converse(t,r,i,a))o.type===`error`?yield{type:`error`,error:mc(e,o.error)}:yield o}catch(t){throw mc(e,t)}}}}}function gc(e,t){try{return t()}catch(t){let n=String(t);return sc.warn({pluginId:e,err:n},`plugin oauthProviderFactory threw, skipped`),oc(e,`warn`,`oauthProviderFactory threw, skipped: ${n}`),null}}function _c(e){return e&&typeof e==`object`&&Array.isArray(e.content)?e:{content:[{type:`text`,text:typeof e==`string`?e:JSON.stringify(e??null)}]}}function vc(e,t,n){let r=t;if(!r||typeof r!=`object`)return sc.warn({pluginId:e},`plugin tool entry is not an object, skipped`),null;if(typeof r.name!=`string`||!r.name)return sc.warn({pluginId:e},`plugin tool missing valid name, skipped`),null;if(typeof r.execute!=`function`)return sc.warn({pluginId:e,tool:r.name},`plugin tool missing execute function, skipped`),null;if(!r.parameters||typeof r.parameters.safeParse!=`function`)return sc.warn({pluginId:e,tool:r.name},`plugin tool missing valid parameters.safeParse, skipped`),null;let i=r.name,a=r.description??``,o=r.parameters,s=r.execute;return{name:i,description:a,parameters:o,async execute(t){try{let r={pluginId:e,workspaceDir:n?.workspaceDir??``,logger:n?.logger??{info:()=>{},warn:()=>{},error:()=>{}},host:n?.host,signal:t.signal,storage:n?.storage},i=_c(await s(t.params,r));return i.isError?{...i,pluginSource:e}:i}catch(t){throw t instanceof Error&&Object.assign(t,{pluginSource:e}),t}}}}function yc(e,t){let n=[],r=async(t,n)=>{try{await t.onEvent(n)}catch(n){sc.warn({pluginId:e,monitorId:t.id,err:String(n)},`plugin monitor onEvent threw, isolated`)}};for(let i of t)n.push(y({name:N(e,`monitor:${i.id}:stream.end`),timing:`stream.end`,handle:async e=>{e.tokenUsage&&await r(i,{type:`turn.completed`,sessionId:e.sessionId,tokens:{input:e.tokenUsage.input,output:e.tokenUsage.output}})}})),n.push(y({name:N(e,`monitor:${i.id}:compaction.after`),timing:`compaction.after`,handle:async e=>{await r(i,{type:`compaction.occurred`,sessionId:e.sessionId})}})),n.push(y({name:N(e,`monitor:${i.id}:session.error`),timing:`session.error`,handle:async e=>{await r(i,{type:`error`,sessionId:e.sessionId,message:e.error})}}));return n}function bc(e){return{...e}}var xc=class{stats=new Map;clock;constructor(e=()=>Date.now()){this.clock=e}ensure(e){let t=this.stats.get(e);return t||(t={pluginId:e,hookTimeouts:0,toolTimeouts:0},this.stats.set(e,t)),t}recordHookTimeout(e,t){let n=this.ensure(e);n.hookTimeouts++,n.lastTimeoutHook=t}recordToolTimeout(e){let t=this.ensure(e);t.toolTimeouts++}recordError(e,t){let n=this.ensure(e);n.lastError={message:t,timestamp:this.clock()}}query(e){let t=this.stats.get(e);return t?bc(t):{pluginId:e,hookTimeouts:0,toolTimeouts:0}}all(){return[...this.stats.values()].map(bc)}clear(){this.stats.clear()}};function Sc(e){return new xc(e)}const Cc=3600*1e3;function wc(){return{authorizedSessionIds:new Set,readCountThisEpoch:0,llmCountThisEpoch:0,llmCallTimes:[],notifyTimes:[]}}var Tc=class{states=new Map;constructor(e=()=>Date.now()){this.now=e}stateOf(e){let t=this.states.get(e);return t||(t=wc(),this.states.set(e,t)),t}onNotifyDelivered(e,t){let n=this.stateOf(e);n.authorizedSessionIds.add(t),n.readCountThisEpoch=0,n.llmCountThisEpoch=0}isSessionAuthorized(e,t){return this.stateOf(e).authorizedSessionIds.has(t)}tryConsumeRead(e){let t=this.stateOf(e);return t.readCountThisEpoch>=1?!1:(t.readCountThisEpoch+=1,!0)}tryConsumeLlm(e){let t=this.stateOf(e);if(t.llmCountThisEpoch>=2)return{ok:!1,reason:`epoch`};let n=this.now()-Cc;return t.llmCallTimes=t.llmCallTimes.filter(e=>e>n),t.llmCallTimes.length>=30?{ok:!1,reason:`hourly`}:(t.llmCountThisEpoch+=1,t.llmCallTimes.push(this.now()),{ok:!0})}tryConsumeNotify(e){let t=this.stateOf(e),n=this.now()-Cc;return t.notifyTimes=t.notifyTimes.filter(e=>e>n),t.notifyTimes.length>=20?!1:(t.notifyTimes.push(this.now()),!0)}reset(e){this.states.delete(e)}};function Ec(e){return e.kind===`session`?0:1}var Dc=class{queue=[];inFlightId=null;maxPending;maxPerPlugin;ttlMs;now;constructor(e={}){this.maxPending=e.maxPending??8,this.maxPerPlugin=e.maxPerPlugin??1,this.ttlMs=e.ttlMs??3e5,this.now=e.now??Date.now}enqueue(e){if(this.sweepExpired(),this.queue.length>=this.maxPending)return{accepted:!1,reason:`queue-full`};if(e.origin.kind===`plugin`){let t=e.origin.pluginId;if(this.queue.filter(e=>e.request.origin.kind===`plugin`&&e.request.origin.pluginId===t).length>=this.maxPerPlugin)return{accepted:!1,reason:`plugin-concurrency`}}let t,n=new Promise(e=>{t=e}),r={...e,enqueuedAt:this.now()};return this.queue.push({request:r,resolve:t,dispatched:!1}),this.queue.sort((e,t)=>Ec(e.request.origin)-Ec(t.request.origin)||e.request.enqueuedAt-t.request.enqueuedAt),{accepted:!0,answer:n}}async waitForTurn(e,t=25){for(;;){if(this.takeNext()?.id===e)return!0;if(!this.queue.some(t=>t.request.id===e))return!1;await new Promise(e=>setTimeout(e,t))}}takeNext(){if(this.sweepExpired(),this.inFlightId!==null)return;let e=this.queue.find(e=>!e.dispatched);if(e)return e.dispatched=!0,this.inFlightId=e.request.id,e.request}settle(e,t){let n=this.queue.findIndex(t=>t.request.id===e);if(n===-1)return!1;let[r]=this.queue.splice(n,1);return this.inFlightId===e&&(this.inFlightId=null),r.resolve(t),!0}release(e){let t=this.queue.findIndex(t=>t.request.id===e);return t===-1?!1:(this.queue.splice(t,1),this.inFlightId===e&&(this.inFlightId=null),!0)}get hasInFlight(){return this.inFlightId!==null}get size(){return this.queue.length}sweepExpired(){let e=this.now()-this.ttlMs;for(let t=this.queue.length-1;t>=0;t--){let n=this.queue[t];n.dispatched||n.request.enqueuedAt>e||(this.queue.splice(t,1),n.resolve(Oc(n.request.question)))}}shutdown(){let e=this.queue.splice(0,this.queue.length);this.inFlightId=null;for(let t of e)t.resolve(Oc(t.request.question))}};function Oc(e){return{answer:``,acceptedRecommendation:!1,resolvedBy:`human`}}const F={start:`service.start`,started:`service.started`,stop:`service.stop`,stopped:`service.stopped`,hostCall:`service.hostCall`,hostResult:`service.hostResult`,crashed:`service.crashed`,notify:`service.notify`};function kc(){return`const { parentPort, workerData } = require('worker_threads')
12
+ `}),a.onExit(r=>{clearTimeout(o);let{stdout:i,stderr:a,truncated:l}=As(s,c),u={success:r.code===0&&r.signal===null,hook:`setup`,command:t,exitCode:r.code,signal:r.signal??void 0,stdout:i,stderr:a,truncated:l||void 0};u.success?j.info({pluginId:e.pluginId},`Setup hook succeeded`):j.error({pluginId:e.pluginId,exitCode:r.code,signal:r.signal,stderr:a?.slice(0,512)},`Setup hook failed`),n?.(u)}),a.onError(r=>{j.error({pluginId:e.pluginId,err:r},`Setup hook spawn error`),n?.({success:!1,hook:`setup`,command:t,error:r.message})});return}let o=Oi(t,{cwd:e.pluginDir,env:Os(e),shell:!0,timeout:6e4,stdio:`pipe`}),s=``,c=``;o.stdout?.on(`data`,e=>{s+=e.toString(`utf-8`)}),o.stderr?.on(`data`,e=>{c+=e.toString(`utf-8`)}),o.on(`close`,(r,i)=>{let{stdout:a,stderr:o,truncated:l}=As(s,c),u={success:r===0&&i===null,hook:`setup`,command:t,exitCode:r,signal:i,stdout:a,stderr:o,truncated:l||void 0};u.success?j.info({pluginId:e.pluginId},`Setup hook succeeded`):j.error({pluginId:e.pluginId,exitCode:r,signal:i,stderr:o?.slice(0,512)},`Setup hook failed`),n?.(u)}),o.on(`error`,r=>{j.error({pluginId:e.pluginId,err:r},`Setup hook spawn error`),n?.({success:!1,hook:`setup`,command:t,error:r.message})})}const Ns=C(`@x-otto/coding:plugin-lifecycle`),Ps=`plugin_lifecycle`,Fs=new Set;async function Is(e,t,n){let r=t.get(Ps)?.setupDone??[],i=new Map(r.map(e=>[e.id,e.version])),a=new Set(e.map(e=>e.id));for(let e of i.keys())a.has(e)||i.delete(e);let o=!1;for(let r of e){let e=i.get(r.id),a=r.manifest.version,s=r.manifest.scripts?.setup;if(!s){(e===void 0||e!==a)&&(i.set(r.id,a),o=!0);continue}if(!(e!==void 0&&e===a)){if(E(r).gated){Ns.info({pluginId:r.id},`Setup hook deferred: plugin not yet trusted`);continue}Fs.has(r.id)||(Fs.add(r.id),Ms({pluginDir:r.dir,pluginId:r.id,workspaceDir:n},s,e=>{Fs.delete(r.id),i.set(r.id,a),Ls(t,i)},Vt))}}o&&await Ls(t,i)}async function Ls(e,t){let n=[...t].map(([e,t])=>({id:e,version:t}));await e.persist({[Ps]:{setupDone:n}})}function Rs(e,t){let n;try{n=Jr(t)}catch{return!1}let r;try{r=Jr(e)}catch{r=e}return r===n||r.startsWith(n+We)}const M=C(`@x-otto/coding:plugin-i18n-loader`),zs=/^([a-zA-Z0-9_-]+)\.json$/;function Bs(e){return Buffer.byteLength(e,`utf8`)<=En?e:`${Buffer.from(e,`utf8`).subarray(0,En).toString(`utf8`)}…`}function Vs(e,t,n){let r=new Map,i=S(t,n);if(!Rs(i,t))return M.warn({pluginId:e,i18nDir:n},`i18nDir resolves outside plugin dir, skipped`),r;let a;try{a=Kr(i)}catch{return r}let o=a.filter(e=>zs.test(e)).sort();o.length>Tn&&(M.warn({pluginId:e,i18nDir:n,declared:o.length,limit:Tn},`plugin i18nDir declares more locale files than the per-plugin limit, truncated`),o=o.slice(0,Tn));for(let n of o){let a=zs.exec(n)?.[1];if(!a)continue;let o=S(i,n);if(!Rs(o,t)){M.warn({pluginId:e,filename:n},`i18nDir locale file resolves outside plugin dir, skipped`);continue}let s;try{s=k(o,`utf8`)}catch(t){M.warn({pluginId:e,filename:n,err:String(t)},`i18nDir locale file read failed, skipped`);continue}if(Buffer.byteLength(s,`utf8`)>wn){M.warn({pluginId:e,filename:n,limit:wn},`i18nDir locale file exceeds byte limit, skipped`);continue}let c;try{c=JSON.parse(s)}catch(t){M.warn({pluginId:e,filename:n,err:String(t)},`i18nDir locale file is not valid JSON, skipped`);continue}if(typeof c!=`object`||!c||Array.isArray(c)){M.warn({pluginId:e,filename:n},`i18nDir locale file is not a flat object, skipped`);continue}for(let[e,t]of Object.entries(c)){if(typeof t!=`string`)continue;let n=r.get(e)??{};n[a]=t,r.set(e,n)}}return r}function Hs(e){let t=[];for(let n of e){if(E(n).gated)continue;let e=n.manifest.contributes?.i18nDir,r=n.manifest.contributes?.i18n;if(!e&&!r?.length)continue;let i=e?Vs(n.id,n.dir,e):new Map;if(r?.length)for(let e of r){let t=i.get(e.id)??{};for(let[r,i]of Object.entries(e.translations))r in t&&M.debug({pluginId:n.id,id:e.id,locale:r},`i18n inline entry overrides locale dir value`),t[r]=i;i.set(e.id,t)}let a=[...i.keys()];a.length>Cn&&(M.warn({pluginId:n.id,declared:a.length,limit:Cn},`plugin declares more i18n entries than the per-plugin limit, truncated`),a=a.slice(0,Cn));for(let e of a){let r=i.get(e);if(!r)continue;let a={};for(let[e,t]of Object.entries(r))a[e]=Bs(t);t.push({pluginId:n.id,id:e,translations:a})}}return t}const Us=C(`@x-otto/coding:declarative-agents`);function Ws(e){return{...e,defaultTools:e.defaultTools?.length?Or(e.defaultTools):e.defaultTools,disallowedTools:e.disallowedTools?.length?Or(e.disallowedTools):e.disallowedTools}}function Gs(e,t){let n=et(e);if(!n)return Us.warn({sourcePath:t},`Agent definition missing frontmatter, skipped`),null;let{fields:r,body:i}=n,a=r.get(`name`),o=r.get(`description`);if(!a||!o||!i)return Us.warn({sourcePath:t},`Agent definition requires name/description/body, skipped`),null;let s=Qe(r.get(`tools`)),c=Number.parseInt(r.get(`maxtoolturns`)??``,10),l=Number.parseInt(r.get(`maxtoolturnextensions`)??``,10),u=r.get(`prompt-mode`),d=Qe(r.get(`disallowed-tools`)),f=r.get(`allow-subagents`)===`true`?!0:r.get(`allow-subagents`)===`false`?!1:void 0;return{name:a,description:o,taskTypes:Qe(r.get(`tasktypes`))??[o],capabilities:Qe(r.get(`capabilities`))??[],systemPromptTemplate:i,promptMode:u===`append`||u===`replace`?u:void 0,defaultTools:s,disallowedTools:d?.length?d:void 0,preferredModelTier:r.get(`slot`)??r.get(`tier`),defaultMaxToolTurns:Number.isInteger(c)?c:void 0,defaultMaxToolTurnExtensions:Number.isInteger(l)?l:void 0,allowSubagents:f}}async function Ks(e,t){let{homedir:n}=await import(`node:os`),{join:r}=await import(`node:path`),i=t?.globalDir??r(n(),`.otto`,`agents`),a=r(e,`.otto`,`agents`),s=(t?.plugins??Vn({cwd:e,homedir:n()})).filter(e=>e.manifest.contributes?.agents!==!1).filter(e=>!E(e).gated).map(e=>({dir:r(e.dir,`agents`),claude:!1})),c=o(),l=c&&!br(e).gated,u=[...s,...c?[{dir:r(n(),`.claude`,`agents`),claude:!0}]:[],{dir:i,claude:!1},...l?[{dir:r(e,`.claude`,`agents`),claude:!0}]:[],{dir:a,claude:!1}],d=new Map;for(let{dir:e,claude:t}of u)for(let n of await qs(e))d.set(n.name,t?Ws(n):n);let f=[...d.values()];return f.length>0&&Us.info(`Loaded %d declarative agent(s): %s`,f.length,f.map(e=>e.name).join(`, `)),f}async function qs(e){let{readFile:t,readdir:n}=await import(`node:fs/promises`),{join:r}=await import(`node:path`),i;try{i=await n(e)}catch{return[]}let a=[];for(let n of i.filter(e=>e.endsWith(`.md`)).sort()){let i=r(e,n);try{let e=Gs(await t(i,`utf-8`),i);e&&a.push(e)}catch(e){Us.warn({sourcePath:i,err:e},`Failed to read agent definition, skipped`)}}return a}const Js=C(`@x-otto/coding:declarative-teams`),Ys=new Set([`handoff`,`sequential`,`parallel`,`hierarchical`,`router`]);function Xs(e){if(!e)return;let t=[];for(let n of e.split(`|`)){let[e,r]=n.split(/→|->/);if(e===void 0||r===void 0)continue;let i=e.split(`,`).map(e=>e.trim().toLowerCase()).filter(e=>e!==``),a=r.trim();i.length>0&&a!==``&&t.push({keywords:i,agentId:a})}return t.length>0?t:void 0}function Zs(e,t){let n=et(e);if(!n)return Js.warn({sourcePath:t},`Team definition missing frontmatter, skipped`),null;let{fields:r}=n,i=r.get(`name`),a=r.get(`pattern`),o=Qe(r.get(`agents`));if(!i||!a||!Ys.has(a)||!o||o.length===0)return Js.warn({sourcePath:t},`Team definition requires name, valid pattern and non-empty agents, skipped`),null;let s=Number.parseInt(r.get(`maxhandoffdepth`)??``,10);return{name:i,pattern:a,agentNames:o,pipeline:Qe(r.get(`pipeline`)),supervisorId:r.get(`supervisor`),entryAgentId:r.get(`entry`),routerStrategy:r.get(`router`),rules:Xs(r.get(`rules`)),maxHandoffDepth:Number.isInteger(s)?s:void 0}}async function Qs(e,t){let{homedir:n}=await import(`node:os`),{join:r}=await import(`node:path`),i=t?.globalDir??r(n(),`.otto`,`teams`),a=r(e,`.otto`,`teams`),o=new Map;for(let e of[i,a])for(let t of await $s(e))o.set(t.name,t);let s=[...o.values()];return s.length>0&&Js.info(`Loaded %d declarative team(s): %s`,s.length,s.map(e=>e.name).join(`, `)),s}async function $s(e){let{readFile:t,readdir:n}=await import(`node:fs/promises`),{join:r}=await import(`node:path`),i;try{i=await n(e)}catch{return[]}let a=[];for(let n of i.filter(e=>e.endsWith(`.md`)).sort()){let i=r(e,n);try{let e=Zs(await t(i,`utf-8`),i);e&&a.push(e)}catch(e){Js.warn({sourcePath:i,err:e},`Failed to read team definition, skipped`)}}return a}var ec=class{reloadQueue=Promise.resolve();constructor(e,t,n,r,i,a,o,s,c,l){this.settings=e,this.mcp=t,this.skills=n,this.pluginModules=r,this.pluginProviders=i,this.tools=a,this.modelCatalog=o,this.workspaceDir=s,this.activePlugins=c,this.i18n=l}async reload(){let e=this.reloadQueue.then(()=>this.reloadSerial());return this.reloadQueue=e.catch(()=>void 0),e}async reloadSerial(){await this.settings.load(),Is(this.activePlugins(),this.settings,this.workspaceDir),await this.mcp.reload(),this.skills&&(this.skills.updatePluginDirs(this.activePlugins().filter(e=>e.manifest.contributes?.skills!==!1).filter(e=>!E(e).gated).map(e=>({id:e.id,dir:x(e.dir,`skills`)}))),await this.skills.discover());let e=Hs(this.activePlugins());this.i18n.register(e);let t=(await this.modelCatalog.refresh().catch(()=>[])).reduce((e,t)=>e+(t.added??0),0),n=await Ks(this.workspaceDir,{plugins:this.activePlugins()}),r=await Qs(this.workspaceDir),i=await this.pluginModules.reload(new Set(n.map(e=>e.name)));n.push(...i);let a=await this.pluginProviders.reload();return{mcpTools:this.tools.getAvailable(`full`).filter(e=>e.name.startsWith(`mcp__`)).length,models:t,agents:n.length,teamCount:r.length,agentProfiles:n,teamDeclarations:r,pendingProviderCapabilities:a.pendingCapabilityPluginIds,i18nEntries:e.length}}};const tc=C(`@x-otto/coding:panel-backend-controller`);var nc=class{stateListeners=new Map;statusListeners=new Map;inProcessHandlers=new Map;subscribedManager=null;constructor(e){this.deps=e}registerInProcessBackend(e,t){this.inProcessHandlers.set(e,t);let n=this.statusListeners.get(e);if(n)for(let e of n)e(`ready`)}unregisterInProcessBackend(e){this.inProcessHandlers.delete(e)}resolveServerForPlugin(e){if(this.inProcessHandlers.has(e))return{ok:!0};let t=this.deps.getActivePlugins().find(t=>t.id===e);if(!t)return{ok:!1,reason:`plugin "${e}" not found or not active`};if(!t.manifest.capabilities?.includes(`panel.backend`))return{ok:!1,reason:`plugin "${e}" does not declare capabilities:["panel.backend"]`};let n=E(t);if(n.pendingCapabilities.includes(`panel.backend`))return{ok:!1,reason:`plugin "${e}" capability "panel.backend" declared but not yet granted`};if(n.gated)return{ok:!1,reason:`plugin "${e}" is untrusted`};let r=this.deps.mcpController.listEffectiveServers(),i=Object.entries(r).filter(([,t])=>t.pluginId===e);return i.length===0?{ok:!1,reason:`plugin "${e}" has no associated MCP server`}:(i.length>1&&tc.warn({pluginId:e,serverNames:i.map(([e])=>e)},`plugin contributes multiple MCP servers; panel backend uses the first match (multi-server routing not yet supported)`),{ok:!0,serverName:i[0][0]})}async call(e,t,n,r){let i=this.inProcessHandlers.get(e);if(i)return i(t,n);let a=this.resolveServerForPlugin(e);if(!a.ok||!a.serverName)throw Error(a.reason??`cannot resolve backend server for plugin "${e}"`);let o=this.deps.mcpController.getMcpClient(a.serverName);if(!o)throw Error(`MCP server "${a.serverName}" for plugin "${e}" is not connected`);let s=r?.operationId?{...n,__operationId:r.operationId}:n;return o.callRaw(t,s,r?.signal)}async cancel(e,t){if(this.inProcessHandlers.has(e))return;let n=this.resolveServerForPlugin(e);if(!n.ok||!n.serverName)return;let r=this.deps.mcpController.getMcpClient(n.serverName);r&&await r.callRaw(`backend/cancel`,{id:t}).catch(()=>void 0)}subscribeState(e,t){return this.ensureNotificationSubscription(),this.stateListeners.has(e)||this.stateListeners.set(e,new Set),this.stateListeners.get(e).add(t),()=>{this.stateListeners.get(e)?.delete(t)}}onStatusChange(e,t){return this.ensureNotificationSubscription(),this.statusListeners.has(e)||this.statusListeners.set(e,new Set),this.statusListeners.get(e).add(t),()=>{this.statusListeners.get(e)?.delete(t)}}getStatus(e){if(this.inProcessHandlers.has(e))return`ready`;let t=this.resolveServerForPlugin(e);if(!t.ok||!t.serverName||this.deps.mcpController.listEffectiveServers()[t.serverName]?.disabled)return`disabled`;let n=this.deps.mcpController.getMcpClient(t.serverName);if(!n)return`crashed`;let r=n.getStatus();return r===`ready`?`ready`:r===`connecting`||r===`reconnecting`?`connecting`:`crashed`}notifyReload(){this.ensureNotificationSubscription();for(let[e,t]of this.statusListeners){if(t.size===0)continue;let n=this.getStatus(e);for(let e of t)e(n)}}ensureNotificationSubscription(){let e=this.deps.mcpController.manager;if(this.subscribedManager===e||(this.subscribedManager=e,!e))return;e.on(`server.notification`,({name:e,method:t,params:n})=>{if(t!==`backend/state`)return;let r=this.pluginIdForServer(e);if(!r)return;let i=this.stateListeners.get(r);if(!(!i||i.size===0))for(let e of i)e(n??{})});let t=e=>{let t=this.pluginIdForServer(e);if(!t)return;let n=this.statusListeners.get(t);if(!n||n.size===0)return;let r=this.getStatus(t);for(let e of n)e(r)};e.on(`server.connected`,({name:e})=>t(e)),e.on(`server.disconnected`,({name:e})=>t(e))}pluginIdForServer(e){return this.deps.mcpController.listEffectiveServers()[e]?.pluginId}};const rc=C(`@x-otto/coding:plugin-log-writer`);function ic(){return S(n,`plugin-logs`)}function ac(e){return Sn.test(e)?x(ic(),`${e}.jsonl`):(rc.warn({pluginId:e},`plugin id failed kebab-case validation, skipping log path resolution`),null)}function oc(e){let t;try{t=Zr(e).size}catch{return}if(!(t<=5242880))try{let t=k(e,`utf8`),n=Math.floor(t.length/2),r=t.indexOf(`
13
+ `,n);A(e,r>=0?t.slice(r+1):t.slice(n))}catch(t){rc.warn({path:e,err:String(t)},`plugin log truncation failed (fail-soft)`)}}function sc(e,t,n){if(!s())try{let r=ac(e);if(!r)return;let i=ic();D(i)||O(i,{recursive:!0}),oc(r),Br(r,`${JSON.stringify({ts:Date.now(),level:t,pluginId:e,msg:n})}\n`)}catch(t){rc.warn({pluginId:e,err:String(t)},`plugin log append failed (fail-soft)`)}}const cc=C(`@x-otto/coding:plugin-tool-wiring`);function N(e,t){return`plugin:${e}:${t}`}function lc(e){let t=e.split(`:`);return t.length<3||t[0]!==`plugin`?null:t[1]||null}function uc(e){let t=e?.content;return typeof t==`string`?t:Array.isArray(t)?t.map(e=>e&&typeof e==`object`&&`text`in e?String(e.text):``).join(``):``}const P={preToolUse:`tool.execute.before`,postToolUse:`tool.execute.after`,userPromptSubmit:`chat.message.before`,sessionStart:`session.created`,stop:`stream.end`,sessionRestored:`session.restored`,sessionDeleted:`session.deleted`,sessionIdle:`session.idle`,sessionError:`session.error`,streamStart:`stream.start`,compactionPending:`compaction.before`,compactionOccurred:`compaction.after`,taskCreated:`task.created`,taskStarted:`task.started`,taskCompleted:`task.completed`,taskFailed:`task.failed`};function dc(e,t){let n=[];if(t.preToolUse){let r=t.preToolUse;n.push(y({name:N(e,`preToolUse`),timing:P.preToolUse,handle:async(t,n)=>{let i=await r({toolName:t.toolName,input:t.args});i&&(i.decision===`deny`?(n.decision=`deny`,n.cancelled=!0,n.cancelReason=i.reason??`denied by plugin ${e}`):i.decision===`ask`&&(n.decision=`ask`,n.decisionReason=i.reason??`requires approval (plugin ${e})`))}}))}if(t.postToolUse){let r=t.postToolUse;n.push(y({name:N(e,`postToolUse`),timing:P.postToolUse,handle:async e=>{await r({toolName:e.toolName,input:e.args,result:e.result})}}))}if(t.userPromptSubmit){let r=t.userPromptSubmit;n.push(y({name:N(e,`userPromptSubmit`),timing:P.userPromptSubmit,handle:async e=>{await r({prompt:uc(e.message)})}}))}if(t.sessionStart){let r=t.sessionStart;n.push(y({name:N(e,`sessionStart`),timing:P.sessionStart,handle:async()=>{await r()}}))}if(t.stop){let r=t.stop;n.push(y({name:N(e,`stop`),timing:P.stop,handle:async()=>{await r()}}))}if(t.sessionRestored){let r=t.sessionRestored;n.push(y({name:N(e,`sessionRestored`),timing:P.sessionRestored,handle:async e=>{await r({sessionId:e.sessionId})}}))}if(t.sessionDeleted){let r=t.sessionDeleted;n.push(y({name:N(e,`sessionDeleted`),timing:P.sessionDeleted,handle:async e=>{await r({sessionId:e.sessionId})}}))}if(t.sessionIdle){let r=t.sessionIdle;n.push(y({name:N(e,`sessionIdle`),timing:P.sessionIdle,handle:async e=>{await r({sessionId:e.sessionId})}}))}if(t.sessionError){let r=t.sessionError;n.push(y({name:N(e,`sessionError`),timing:P.sessionError,handle:async e=>{await r({sessionId:e.sessionId,error:e.error})}}))}if(t.streamStart){let r=t.streamStart;n.push(y({name:N(e,`streamStart`),timing:P.streamStart,handle:async e=>{await r({sessionId:e.sessionId,model:e.model})}}))}if(t.compactionPending){let r=t.compactionPending;n.push(y({name:N(e,`compactionPending`),timing:P.compactionPending,handle:async e=>{await r({sessionId:e.sessionId,messageCount:e.messageCount})}}))}if(t.compactionOccurred){let r=t.compactionOccurred;n.push(y({name:N(e,`compactionOccurred`),timing:P.compactionOccurred,handle:async e=>{await r({sessionId:e.sessionId,retainedCount:e.retainedCount})}}))}if(t.taskCreated){let r=t.taskCreated;n.push(y({name:N(e,`taskCreated`),timing:P.taskCreated,handle:async e=>{await r({taskId:e.task.id})}}))}if(t.taskStarted){let r=t.taskStarted;n.push(y({name:N(e,`taskStarted`),timing:P.taskStarted,handle:async e=>{await r({taskId:e.task.id,agent:e.agent})}}))}if(t.taskCompleted){let r=t.taskCompleted;n.push(y({name:N(e,`taskCompleted`),timing:P.taskCompleted,handle:async e=>{await r({taskId:e.task.id,status:e.task.status,durationMs:e.result.durationMs,tokenUsage:e.result.tokenUsage})}}))}if(t.taskFailed){let r=t.taskFailed;n.push(y({name:N(e,`taskFailed`),timing:P.taskFailed,handle:async e=>{await r({taskId:e.task.id,error:e.error.message})}}))}return n}function fc(e,t,n,r){return r.map(r=>({name:r.name,description:r.description,argumentHint:r.argumentHint,allowedTools:r.allowedTools,model:r.model,body:r.body,source:`plugin`,scope:t===`bundled`?`project`:t,pluginId:e,filePath:`${n}#computed:${r.name}`}))}function pc(e){return e.map(e=>({name:e.name,description:e.description,taskTypes:e.taskTypes??[],capabilities:e.capabilities??[],systemPromptTemplate:e.systemPromptTemplate,...e.promptMode?{promptMode:e.promptMode}:{},...e.defaultTools?{defaultTools:e.defaultTools}:{},...e.disallowedTools?{disallowedTools:e.disallowedTools}:{},...e.preferredModelTier?{preferredModelTier:e.preferredModelTier}:{},...e.allowSubagents===void 0?{}:{allowSubagents:e.allowSubagents}}))}function mc(e,t,n){return n.map(n=>({definition:{metadata:{name:n.name,description:n.description??``},body:n.body,directory:t,filePath:`${t}#computed:${n.name}`,supportingFiles:[]},source:{type:`plugin`,root:t,id:e}}))}function hc(e,t){return t instanceof Ge?t.pluginSource===void 0?new t.constructor(t.message,{code:t.code,cause:t.cause,status:t.status,headers:t.headers,errorType:t.errorType,pluginSource:e}):t:new Ke(t instanceof Error?t.message:String(t),{code:`PROVIDER_PLUGIN_ERROR`,cause:t instanceof Error?t:void 0,pluginSource:e})}function gc(e,t){return()=>{let n=t();return{...n,async*converse(t,r,i,a){try{for await(let o of n.converse(t,r,i,a))o.type===`error`?yield{type:`error`,error:hc(e,o.error)}:yield o}catch(t){throw hc(e,t)}}}}}function _c(e,t){try{return t()}catch(t){let n=String(t);return cc.warn({pluginId:e,err:n},`plugin oauthProviderFactory threw, skipped`),sc(e,`warn`,`oauthProviderFactory threw, skipped: ${n}`),null}}function vc(e){return e&&typeof e==`object`&&Array.isArray(e.content)?e:{content:[{type:`text`,text:typeof e==`string`?e:JSON.stringify(e??null)}]}}function yc(e,t,n){let r=t;if(!r||typeof r!=`object`)return cc.warn({pluginId:e},`plugin tool entry is not an object, skipped`),null;if(typeof r.name!=`string`||!r.name)return cc.warn({pluginId:e},`plugin tool missing valid name, skipped`),null;if(typeof r.execute!=`function`)return cc.warn({pluginId:e,tool:r.name},`plugin tool missing execute function, skipped`),null;if(!r.parameters||typeof r.parameters.safeParse!=`function`)return cc.warn({pluginId:e,tool:r.name},`plugin tool missing valid parameters.safeParse, skipped`),null;let i=r.name,a=r.description??``,o=r.parameters,s=r.execute;return{name:i,description:a,parameters:o,async execute(t){try{let r={pluginId:e,workspaceDir:n?.workspaceDir??``,logger:n?.logger??{info:()=>{},warn:()=>{},error:()=>{}},host:n?.host,signal:t.signal,storage:n?.storage},i=vc(await s(t.params,r));return i.isError?{...i,pluginSource:e}:i}catch(t){throw t instanceof Error&&Object.assign(t,{pluginSource:e}),t}}}}function bc(e,t){let n=[],r=async(t,n)=>{try{await t.onEvent(n)}catch(n){cc.warn({pluginId:e,monitorId:t.id,err:String(n)},`plugin monitor onEvent threw, isolated`)}};for(let i of t)n.push(y({name:N(e,`monitor:${i.id}:stream.end`),timing:`stream.end`,handle:async e=>{e.tokenUsage&&await r(i,{type:`turn.completed`,sessionId:e.sessionId,tokens:{input:e.tokenUsage.input,output:e.tokenUsage.output}})}})),n.push(y({name:N(e,`monitor:${i.id}:compaction.after`),timing:`compaction.after`,handle:async e=>{await r(i,{type:`compaction.occurred`,sessionId:e.sessionId})}})),n.push(y({name:N(e,`monitor:${i.id}:session.error`),timing:`session.error`,handle:async e=>{await r(i,{type:`error`,sessionId:e.sessionId,message:e.error})}}));return n}function xc(e){return{...e}}var Sc=class{stats=new Map;clock;constructor(e=()=>Date.now()){this.clock=e}ensure(e){let t=this.stats.get(e);return t||(t={pluginId:e,hookTimeouts:0,toolTimeouts:0},this.stats.set(e,t)),t}recordHookTimeout(e,t){let n=this.ensure(e);n.hookTimeouts++,n.lastTimeoutHook=t}recordToolTimeout(e){let t=this.ensure(e);t.toolTimeouts++}recordError(e,t){let n=this.ensure(e);n.lastError={message:t,timestamp:this.clock()}}query(e){let t=this.stats.get(e);return t?xc(t):{pluginId:e,hookTimeouts:0,toolTimeouts:0}}all(){return[...this.stats.values()].map(xc)}clear(){this.stats.clear()}};function Cc(e){return new Sc(e)}const wc=3600*1e3;function Tc(){return{authorizedSessionIds:new Set,readCountThisEpoch:0,llmCountThisEpoch:0,llmCallTimes:[],notifyTimes:[]}}var Ec=class{states=new Map;constructor(e=()=>Date.now()){this.now=e}stateOf(e){let t=this.states.get(e);return t||(t=Tc(),this.states.set(e,t)),t}onNotifyDelivered(e,t){let n=this.stateOf(e);n.authorizedSessionIds.add(t),n.readCountThisEpoch=0,n.llmCountThisEpoch=0}isSessionAuthorized(e,t){return this.stateOf(e).authorizedSessionIds.has(t)}tryConsumeRead(e){let t=this.stateOf(e);return t.readCountThisEpoch>=1?!1:(t.readCountThisEpoch+=1,!0)}tryConsumeLlm(e){let t=this.stateOf(e);if(t.llmCountThisEpoch>=2)return{ok:!1,reason:`epoch`};let n=this.now()-wc;return t.llmCallTimes=t.llmCallTimes.filter(e=>e>n),t.llmCallTimes.length>=30?{ok:!1,reason:`hourly`}:(t.llmCountThisEpoch+=1,t.llmCallTimes.push(this.now()),{ok:!0})}tryConsumeNotify(e){let t=this.stateOf(e),n=this.now()-wc;return t.notifyTimes=t.notifyTimes.filter(e=>e>n),t.notifyTimes.length>=20?!1:(t.notifyTimes.push(this.now()),!0)}reset(e){this.states.delete(e)}};function Dc(e){return e.kind===`session`?0:1}var Oc=class{queue=[];inFlightId=null;maxPending;maxPerPlugin;ttlMs;now;constructor(e={}){this.maxPending=e.maxPending??8,this.maxPerPlugin=e.maxPerPlugin??1,this.ttlMs=e.ttlMs??3e5,this.now=e.now??Date.now}enqueue(e){if(this.sweepExpired(),this.queue.length>=this.maxPending)return{accepted:!1,reason:`queue-full`};if(e.origin.kind===`plugin`){let t=e.origin.pluginId;if(this.queue.filter(e=>e.request.origin.kind===`plugin`&&e.request.origin.pluginId===t).length>=this.maxPerPlugin)return{accepted:!1,reason:`plugin-concurrency`}}let t,n=new Promise(e=>{t=e}),r={...e,enqueuedAt:this.now()};return this.queue.push({request:r,resolve:t,dispatched:!1}),this.queue.sort((e,t)=>Dc(e.request.origin)-Dc(t.request.origin)||e.request.enqueuedAt-t.request.enqueuedAt),{accepted:!0,answer:n}}async waitForTurn(e,t=25){for(;;){if(this.takeNext()?.id===e)return!0;if(!this.queue.some(t=>t.request.id===e))return!1;await new Promise(e=>setTimeout(e,t))}}takeNext(){if(this.sweepExpired(),this.inFlightId!==null)return;let e=this.queue.find(e=>!e.dispatched);if(e)return e.dispatched=!0,this.inFlightId=e.request.id,e.request}settle(e,t){let n=this.queue.findIndex(t=>t.request.id===e);if(n===-1)return!1;let[r]=this.queue.splice(n,1);return this.inFlightId===e&&(this.inFlightId=null),r.resolve(t),!0}release(e){let t=this.queue.findIndex(t=>t.request.id===e);return t===-1?!1:(this.queue.splice(t,1),this.inFlightId===e&&(this.inFlightId=null),!0)}get hasInFlight(){return this.inFlightId!==null}get size(){return this.queue.length}sweepExpired(){let e=this.now()-this.ttlMs;for(let t=this.queue.length-1;t>=0;t--){let n=this.queue[t];n.dispatched||n.request.enqueuedAt>e||(this.queue.splice(t,1),n.resolve(kc(n.request.question)))}}shutdown(){let e=this.queue.splice(0,this.queue.length);this.inFlightId=null;for(let t of e)t.resolve(kc(t.request.question))}};function kc(e){return{answer:``,acceptedRecommendation:!1,resolvedBy:`human`}}const F={start:`service.start`,started:`service.started`,stop:`service.stop`,stopped:`service.stopped`,hostCall:`service.hostCall`,hostResult:`service.hostResult`,crashed:`service.crashed`,notify:`service.notify`};function Ac(){return`const { parentPort, workerData } = require('worker_threads')
14
14
  const __send = (m) => parentPort.postMessage(m)
15
15
 
16
16
  // RFC-303 M5:worker 侧 scoped storage 实现(无第三方依赖,直接文件读写)。
@@ -193,8 +193,8 @@ parentPort.on('message', async (msg) => {
193
193
  return
194
194
  }
195
195
  })
196
- `}const I=C(`@x-otto/coding:plugin-module-loader`),L=e(import.meta.url),Ac=[`plugin.ts`,`plugin.tsx`];function jc(e){for(let t of Ac){let n=x(e,t);if(D(n))return n}return null}const Mc={name:`otto-plugin-sdk-shim`,setup(e){e.onResolve({filter:/^@(?:x-)?otto\/(plugin|extension)$/},()=>({path:`otto-plugin-sdk`,namespace:`otto-sdk-shim`})),e.onLoad({filter:/.*/,namespace:`otto-sdk-shim`},()=>({contents:`export const definePlugin = (f) => f;`,loader:`js`}))}};function Nc(){let e={};try{let t=import.meta.resolve(`@x-otto/shared`),n=b(Fi(t)),r=L.resolve(`pino`,{paths:[n]});e.pino=r,e[`thread-stream`]=L.resolve(`thread-stream`,{paths:[b(r)]}),e[`jsonc-parser`]=L.resolve(`jsonc-parser`,{paths:[n]}),e[`@x-otto/shared`]=t.startsWith(`file://`)?Fi(t):t;let i=import.meta.resolve(`@x-otto/provider`);e[`@x-otto/provider`]=i.startsWith(`file://`)?Fi(i):i;let a=import.meta.resolve(`@x-otto/interchange`);e[`@x-otto/interchange`]=a.startsWith(`file://`)?Fi(a):a;let o=import.meta.resolve(`@x-otto/env`);e[`@x-otto/env`]=o.startsWith(`file://`)?Fi(o):o}catch(e){I.warn({err:String(e)},`failed to pre-resolve pino/thread-stream/jsonc-parser/@x-otto absolute paths, falling back to bare-specifier external (pre-fix behavior)`)}return e}const Pc=[`pino`,`thread-stream`,`jsonc-parser`],Fc=`otto-host-external`,Ic=`__ottoPluginHostExternals`;function Lc(){let e=RegExp(`^(${Pc.join(`|`)})$`);return{name:`otto-plugin-host-slot`,setup(t){t.onResolve({filter:e},e=>({path:e.path,namespace:Fc})),t.onLoad({filter:/.*/,namespace:Fc},e=>({contents:`const __slot = globalThis[${JSON.stringify(Ic)}]\nif (!__slot || !__slot[${JSON.stringify(e.path)}]) {\n throw new Error('otto plugin: host external ${e.path} 未注入' +\n '(宿主须在加载插件产物前调用 installPluginHostExternals;隔离端见 RFC-365 R3)')\n}\nmodule.exports = __slot[${JSON.stringify(e.path)}]\n`,loader:`js`}))}}}function Rc(){let e={};try{let t=b(Fi(import.meta.resolve(`@x-otto/shared`))),n=L.resolve(`pino`,{paths:[t]});e.pino=n,e[`thread-stream`]=L.resolve(`thread-stream`,{paths:[b(n)]}),e[`jsonc-parser`]=L.resolve(`jsonc-parser`,{paths:[t]})}catch(e){I.warn({err:String(e)},`failed to resolve host external paths (pino/thread-stream/jsonc-parser) — plugins compiled in portable mode will fail to load`)}return e}function zc(){let e=globalThis,t=e[Ic]??={};for(let[e,n]of Object.entries(Rc()))if(t[e]===void 0)try{t[e]=L(n)}catch(t){I.warn({module:e,path:n,err:String(t)},`failed to load host external into injection slot`)}}function Bc(e){let t=Object.keys(e);return{name:`otto-plugin-absolute-external`,setup(n){if(t.length===0)return;let r=RegExp(`^(${t.map(e=>e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)).join(`|`)})$`);n.onResolve({filter:r},t=>({path:e[t.path],external:!0}))}}}async function Vc(e,t){let n=jc(e);if(!n)return null;let r=x(e,`plugin-dist`);O(r,{recursive:!0});let i=x(r,`plugin.cjs`),a=t?.portable?{}:Nc(),o=(t?.portable?[`react`,`ink`]:[`react`,`ink`,`jsonc-parser`,`pino`,`thread-stream`,`@x-otto/shared`,`@x-otto/provider`,`@x-otto/interchange`,`@x-otto/env`]).filter(e=>!(e in a)),{build:s}=L(`esbuild`);return await s({entryPoints:[n],outfile:i,bundle:!0,format:`cjs`,platform:`node`,external:o,jsx:`transform`,logLevel:`silent`,define:{"import.meta.url":`__otto_plugin_import_meta_url`},banner:{js:`const __otto_plugin_import_meta_url = require("url").pathToFileURL(__filename).href;`},plugins:[Mc,...t?.portable?[Lc()]:[Bc(a)]]}),qc(r,e),i}const Hc=[`.ts`,`.tsx`,`.js`,`.jsx`,`.mjs`,`.cjs`,`.json`];function Uc(e){let t=[],n=r=>{let i;try{i=Kr(r,{withFileTypes:!0})}catch{return}for(let a of i){let i=a.name;if(i===`plugin-dist`||i===`panels-dist`||i===`node_modules`||i.startsWith(`.`))continue;let o=x(r,i);if(a.isDirectory())n(o);else if(a.isFile()){let n=i.lastIndexOf(`.`),r=n>=0?i.slice(n):``;Hc.includes(r)&&t.push(Ue(e,o))}}};return n(e),t.sort()}function Wc(e){let t=Uc(e),n=pi(`sha256`);for(let r of t){let t=r.split(We).join(`/`);n.update(t),n.update(`\0`);try{n.update(k(x(e,r)))}catch(e){n.update(`<unreadable:${e instanceof Error?e.message:String(e)}>`)}n.update(`\0`)}return n.digest(`hex`)}function Gc(e){return{apiVersion:On,compilerVersion:r,sourceHash:Wc(e)}}function Kc(e,t=e){let n=x(e,`plugin-dist`,`meta.json`);if(D(n))try{let e=JSON.parse(k(n,`utf8`));e.sourceHash=Wc(t),A(n,JSON.stringify(e))}catch(t){I.warn({pluginDir:e,err:String(t)},`failed to rewrite artifact sourceHash`)}}function qc(e,t){try{let n=x(e,`meta.json`),r=x(e,`.meta.json.tmp-${process.pid}`);A(r,JSON.stringify(Gc(t))),Yr(r,n)}catch(e){I.warn(`Failed to write plugin artifact meta: %s`,e instanceof Error?e.message:String(e))}}function Jc(e){try{let t=k(x(e,`plugin-dist`,`meta.json`),`utf8`),n=JSON.parse(t),r=Gc(e);return n.apiVersion===r.apiVersion&&n.compilerVersion===r.compilerVersion&&n.sourceHash===r.sourceHash}catch{return!1}}function Yc(e){let t=x(e,`plugin-dist`,`plugin.cjs`);return D(t)?Jc(e)?t:(I.info(`Plugin artifact at %s is stale (meta mismatch/missing) — recompiling`,t),null):null}async function Xc(e,t,n){if(!jc(e.dir))return null;if((e.scope===`project`||e.scope===`repository`)&&!Zn(e.dir))return I.warn({pluginId:e.id},`project/repository plugin not trusted, skipping code module (fail-closed)`),null;let r=E(e);if(r.pendingCapabilities.length>0)return I.warn({pluginId:e.id,pendingCapabilities:r.pendingCapabilities},`plugin declares high-risk capabilities not yet granted, skipping code module entirely before factory execution (fail-closed, RFC-140 D3)`),null;let i=!1,a=Yc(e.dir);if(a)i=!0,I.info({pluginId:e.id,outfile:a},`using prebuilt plugin module (RFC-150 D5, skip compile)`);else try{a=await Vc(e.dir)}catch(t){let r=String(t);return I.warn({pluginId:e.id,err:r},`plugin.ts compile failed`),n?.(e.id,`compile failed: ${r}`),null}if(!a)return null;zc();let o;try{delete L.cache[a];let e=L(a);o=e?.default??e}catch(t){if(i){I.warn({pluginId:e.id,outfile:a,err:String(t)},`prebuilt plugin module failed to load — recompiling for this machine`);try{a=await Vc(e.dir),delete L.cache[a];let t=L(a);o=t?.default??t}catch(t){let r=String(t);return I.warn({pluginId:e.id,err:r},`plugin.ts load failed (after recompile retry)`),n?.(e.id,`load failed: ${r}`),null}}else{let r=String(t);return I.warn({pluginId:e.id,err:r},`plugin.ts load failed`),n?.(e.id,`load failed: ${r}`),null}}if(typeof o!=`function`)return I.warn({pluginId:e.id},`plugin.ts default export is not a factory function`),n?.(e.id,`default export is not a factory function`),null;try{let n=await o(t);return{pluginId:e.id,module:n,compiledPath:a??void 0}}catch(t){let r=String(t);return I.warn({pluginId:e.id,err:r},`plugin factory threw`),n?.(e.id,`factory threw: ${r}`),null}}const R=C(`@x-otto/coding:plugin-service-pool`),Zc=5e3;function Qc(e){return[`--experimental-permission`,`--allow-fs-read=*`,...e?[`--allow-fs-write=${e}`]:[]]}`${Be()}`;let $c=null,el=null;function tl(){return el||($c||=Wr(x(Be(),`otto-plugin-service-`)),el=x($c,`service-entry.cjs`),A(el,kc()),el)}function nl(e,t){return`${e}:${t}`}var rl=class{services=new Map;get runningKeys(){return[...this.services.entries()].filter(([,e])=>e.status===`running`).map(([e])=>e)}statusOf(e,t){return this.services.get(nl(e,t))?.status}restartsOf(e,t){return this.services.get(nl(e,t))?.restarts??0}notify(e,t,n){let r=this.services.get(nl(e,t));if(!r||r.status!==`running`)return!1;try{return r.worker.postMessage({type:F.notify,notification:n}),!0}catch{return!1}}runningServiceIds(e){let t=`${e}:`;return[...this.services.entries()].filter(([e,n])=>e.startsWith(t)&&n.status===`running`).map(([e])=>e.slice(t.length))}async start(e){let t=nl(e.pluginId,e.serviceId);return await this.stop(e.pluginId,e.serviceId),this.spawnAndStart(t,e,0)}spawnAndStart(e,t,n){return new Promise(r=>{let i;try{i=new Pi(tl(),{execArgv:[...Qc(t.storageDir)]})}catch(t){R.error({key:e,err:String(t)},`failed to create service worker`),r({error:String(t)});return}i.unref();let a={worker:i,input:t,status:`starting`,restarts:n,stopping:!1};this.services.set(e,a);let o=!1,s=e=>{o||(o=!0,r(e))};i.on(`message`,t=>{this.onWorkerMessage(e,a,t,s)}),i.on(`error`,t=>{R.warn({key:e,err:String(t)},`service worker error`),a.status=`failed`,s({error:String(t)}),this.scheduleRestart(e,a)}),i.on(`exit`,()=>{a.stopping||(a.status!==`failed`&&(a.status=`failed`),s({error:`service worker exited unexpectedly`}),this.scheduleRestart(e,a))}),i.postMessage({type:F.start,compiledPath:t.compiledPath,hostExternals:Rc(),serviceId:t.serviceId,factoryCtx:t.factoryCtx,serviceCtx:{pluginId:t.pluginId,workspaceDir:t.workspaceDir,workspaceKey:t.workspaceKey,hostCapabilities:t.hostCapabilities,storageDir:t.storageDir,hasStorageCapability:t.hasStorageCapability}})})}async onWorkerMessage(e,t,n,r){if(n.type===F.started){n.error?(t.status=`failed`,R.warn({key:e,err:n.error},`plugin service failed to start`),r({error:n.error}),this.scheduleRestart(e,t)):(t.status=`running`,R.info({key:e},`plugin service started`),r({}));return}if(n.type===F.crashed){R.warn({key:e,err:n.error},`plugin service crashed at runtime`),t.status=`failed`,this.scheduleRestart(e,t);return}if(n.type===F.hostCall){await this.dispatchHostCall(e,t,n);return}}async dispatchHostCall(e,t,n){let{callId:r,method:i,params:a}=n;if(i===`log.info`||i===`log.warn`||i===`log.error`){let e=a?.msg??``;R[i.slice(4)]({pluginId:t.input.pluginId,serviceId:t.input.serviceId},e);return}if(!r)return;let o=(e,n)=>{try{t.worker.postMessage({type:F.hostResult,callId:r,result:e,error:n})}catch{}};if(i===`startJob`){let e=t.input.bridge.startJob;if(!e){o(void 0,`capability not granted: agent.dispatch`);return}let n=a;try{o(await e({title:String(n?.title??``),prompt:String(n?.prompt??``)}))}catch(e){o(void 0,e instanceof Error?e.message:String(e))}return}if(i===`readTranscript`){let e=t.input.bridge.readTranscript;if(!e){o(void 0,`capability not granted: session.read`);return}let n=a;try{let t=typeof n?.sinceIndex==`number`?n.sinceIndex:void 0;o(await e({sessionId:String(n?.sessionId??``),sinceIndex:t}))}catch(e){o(void 0,e instanceof Error?e.message:String(e))}return}if(i===`notify`){let e=t.input.bridge.notify;if(!e){o(void 0,`capability not granted: user.notify`);return}let n=a,r=String(n?.level??`info`),i=r===`warning`||r===`error`?r:`info`;try{await e({level:i,code:String(n?.code??``),message:String(n?.message??``)}),o(void 0)}catch(e){o(void 0,e instanceof Error?e.message:String(e))}return}if(i===`ask`){o(void 0,`capability not granted: user.ask`);return}if(i===`complete`){let e=t.input.bridge.complete;if(!e){o(void 0,`capability not granted: llm.complete`);return}let n=a;try{let t=typeof n?.maxTokens==`number`?n.maxTokens:void 0;o(await e({prompt:String(n?.prompt??``),maxTokens:t}))}catch(e){o(void 0,e instanceof Error?e.message:String(e))}return}R.warn({key:e,method:i},`plugin service requested unknown host method (rejected)`),o(void 0,`unknown host method: ${String(i)}`)}scheduleRestart(e,t){if(t.stopping||t.restartTimer)return;if(t.restarts>=5){R.error({key:e,restarts:t.restarts},`plugin service exceeded restart limit, giving up (no further restarts)`),t.status=`failed`;return}let n=t.restarts+1,r=Math.min(1e3*2**(n-1),3e4);R.warn({key:e,attempt:n,delayMs:r},`restarting plugin service after crash`);let i=setTimeout(()=>{t.restartTimer=void 0;let r=this.services.get(e);!r||r.stopping||this.spawnAndStart(e,t.input,n)},r);i.unref?.(),t.restartTimer=i}async stop(e,t){let n=nl(e,t),r=this.services.get(n);if(!r)return;r.stopping=!0,r.restartTimer&&=(clearTimeout(r.restartTimer),void 0),this.services.delete(n);let i=new Promise(e=>{let t=n=>{n?.type===F.stopped&&(r.worker.off(`message`,t),e(!0))};r.worker.on(`message`,t);try{r.worker.postMessage({type:F.stop})}catch{e(!1)}}),a=new Promise(e=>{setTimeout(()=>e(!1),Zc).unref?.()});await Promise.race([i,a])||R.warn({key:n,timeoutMs:Zc},`plugin service did not stop gracefully, terminating (state may be lost)`),r.status=`stopped`;try{await r.worker.terminate()}catch{}}async stopPlugin(e){let t=`${e}:`,n=[...this.services.keys()].filter(e=>e.startsWith(t));for(let r of n){let n=r.slice(t.length);await this.stop(e,n)}}async dispose(){let e=[...this.services.keys()];for(let t of e){let e=t.indexOf(`:`);await this.stop(t.slice(0,e),t.slice(e+1))}if($c){try{Xr($c,{recursive:!0,force:!0})}catch{}$c=null,el=null}}};let il=null;function al(){return il||=new rl,il}async function ol(){await il?.dispose(),il=null}const sl=[/\bsk-[A-Za-z0-9_-]{16,}/g,/\bgh[pousr]_[A-Za-z0-9]{20,}/g,/\bAKIA[0-9A-Z]{16}\b/g,/\bxox[abposr]-[A-Za-z0-9-]{10,}/g,/\bBearer\s+[A-Za-z0-9._~+/-]{20,}=*/g,/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}/g];function cl(e){let t=e;for(let e of sl)t=t.replace(e,`***`);return t}function ll(e){if(typeof e==`string`)return e;if(!Array.isArray(e))return``;let t=[];for(let n of e){let e=n;e?.type===`text`&&typeof e.text==`string`&&t.push(e.text)}return t.join(`
197
- `)}function ul(e){if(e.role===`user`)return e.internal?null:{role:`user`,text:cl(ll(e.content))};if(e.role===`assistant`){let t=e.content.filter(e=>e.type===`tool_call`)[0]?.name,n={role:`assistant`,text:cl(ll(e.content))};return t&&(n.toolName=t),n}return e.role===`tool_result`?e.internal?null:{role:`tool_result`,text:cl(ll(e.content)),toolName:e.toolName}:null}function dl(e,t,n){let r=Math.max(0,Math.min(t,e.length)),i=e.slice(r),a=i.length>n?i.slice(i.length-n):i,o=[];for(let e of a){let t=ul(e);t&&o.push(t)}return{messages:o,nextIndex:e.length}}const z={load:`worker.load`,loaded:`worker.loaded`,error:`worker.error`,toolExecute:`tool.execute`,toolResult:`tool.result`,toolCancel:`tool.cancel`,sigilResolve:`sigil.resolve`,sigilResult:`sigil.result`,onActivate:`worker.onActivate`,activated:`worker.activated`,onDeactivate:`worker.onDeactivate`,deactivated:`worker.deactivated`,stop:`worker.stop`,hostCall:`host.call`,hostResult:`host.result`};function fl(e){return`${e===`worker`?`const { parentPort } = require('worker_threads')
196
+ `}const I=C(`@x-otto/coding:plugin-module-loader`),L=e(import.meta.url),jc=[`plugin.ts`,`plugin.tsx`];function Mc(e){for(let t of jc){let n=x(e,t);if(D(n))return n}return null}const Nc={name:`otto-plugin-sdk-shim`,setup(e){e.onResolve({filter:/^@(?:x-)?otto\/(plugin|extension)$/},()=>({path:`otto-plugin-sdk`,namespace:`otto-sdk-shim`})),e.onLoad({filter:/.*/,namespace:`otto-sdk-shim`},()=>({contents:`export const definePlugin = (f) => f;`,loader:`js`}))}};function Pc(){let e={};try{let t=import.meta.resolve(`@x-otto/shared`),n=b(Fi(t)),r=L.resolve(`pino`,{paths:[n]});e.pino=r,e[`thread-stream`]=L.resolve(`thread-stream`,{paths:[b(r)]}),e[`jsonc-parser`]=L.resolve(`jsonc-parser`,{paths:[n]}),e[`@x-otto/shared`]=t.startsWith(`file://`)?Fi(t):t;let i=import.meta.resolve(`@x-otto/provider`);e[`@x-otto/provider`]=i.startsWith(`file://`)?Fi(i):i;let a=import.meta.resolve(`@x-otto/interchange`);e[`@x-otto/interchange`]=a.startsWith(`file://`)?Fi(a):a;let o=import.meta.resolve(`@x-otto/env`);e[`@x-otto/env`]=o.startsWith(`file://`)?Fi(o):o}catch(e){I.warn({err:String(e)},`failed to pre-resolve pino/thread-stream/jsonc-parser/@x-otto absolute paths, falling back to bare-specifier external (pre-fix behavior)`)}return e}const Fc=[`pino`,`thread-stream`,`jsonc-parser`],Ic=`otto-host-external`,Lc=`__ottoPluginHostExternals`;function Rc(){let e=RegExp(`^(${Fc.join(`|`)})$`);return{name:`otto-plugin-host-slot`,setup(t){t.onResolve({filter:e},e=>({path:e.path,namespace:Ic})),t.onLoad({filter:/.*/,namespace:Ic},e=>({contents:`const __slot = globalThis[${JSON.stringify(Lc)}]\nif (!__slot || !__slot[${JSON.stringify(e.path)}]) {\n throw new Error('otto plugin: host external ${e.path} 未注入' +\n '(宿主须在加载插件产物前调用 installPluginHostExternals;隔离端见 RFC-365 R3)')\n}\nmodule.exports = __slot[${JSON.stringify(e.path)}]\n`,loader:`js`}))}}}function zc(){let e={};try{let t=b(Fi(import.meta.resolve(`@x-otto/shared`))),n=L.resolve(`pino`,{paths:[t]});e.pino=n,e[`thread-stream`]=L.resolve(`thread-stream`,{paths:[b(n)]}),e[`jsonc-parser`]=L.resolve(`jsonc-parser`,{paths:[t]})}catch(e){I.warn({err:String(e)},`failed to resolve host external paths (pino/thread-stream/jsonc-parser) — plugins compiled in portable mode will fail to load`)}return e}function Bc(){let e=globalThis,t=e[Lc]??={};for(let[e,n]of Object.entries(zc()))if(t[e]===void 0)try{t[e]=L(n)}catch(t){I.warn({module:e,path:n,err:String(t)},`failed to load host external into injection slot`)}}function Vc(e){let t=Object.keys(e);return{name:`otto-plugin-absolute-external`,setup(n){if(t.length===0)return;let r=RegExp(`^(${t.map(e=>e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)).join(`|`)})$`);n.onResolve({filter:r},t=>({path:e[t.path],external:!0}))}}}async function Hc(e,t){let n=Mc(e);if(!n)return null;let r=x(e,`plugin-dist`);O(r,{recursive:!0});let i=x(r,`plugin.cjs`),a=t?.portable?{}:Pc(),o=(t?.portable?[`react`,`ink`]:[`react`,`ink`,`jsonc-parser`,`pino`,`thread-stream`,`@x-otto/shared`,`@x-otto/provider`,`@x-otto/interchange`,`@x-otto/env`]).filter(e=>!(e in a)),{build:s}=L(`esbuild`);return await s({entryPoints:[n],outfile:i,bundle:!0,format:`cjs`,platform:`node`,external:o,jsx:`transform`,logLevel:`silent`,define:{"import.meta.url":`__otto_plugin_import_meta_url`},banner:{js:`const __otto_plugin_import_meta_url = require("url").pathToFileURL(__filename).href;`},plugins:[Nc,...t?.portable?[Rc()]:[Vc(a)]]}),Jc(r,e),i}const Uc=[`.ts`,`.tsx`,`.js`,`.jsx`,`.mjs`,`.cjs`,`.json`];function Wc(e){let t=[],n=r=>{let i;try{i=Kr(r,{withFileTypes:!0})}catch{return}for(let a of i){let i=a.name;if(i===`plugin-dist`||i===`panels-dist`||i===`node_modules`||i.startsWith(`.`))continue;let o=x(r,i);if(a.isDirectory())n(o);else if(a.isFile()){let n=i.lastIndexOf(`.`),r=n>=0?i.slice(n):``;Uc.includes(r)&&t.push(Ue(e,o))}}};return n(e),t.sort()}function Gc(e){let t=Wc(e),n=pi(`sha256`);for(let r of t){let t=r.split(We).join(`/`);n.update(t),n.update(`\0`);try{n.update(k(x(e,r)))}catch(e){n.update(`<unreadable:${e instanceof Error?e.message:String(e)}>`)}n.update(`\0`)}return n.digest(`hex`)}function Kc(e){return{apiVersion:On,compilerVersion:r,sourceHash:Gc(e)}}function qc(e,t=e){let n=x(e,`plugin-dist`,`meta.json`);if(D(n))try{let e=JSON.parse(k(n,`utf8`));e.sourceHash=Gc(t),A(n,JSON.stringify(e))}catch(t){I.warn({pluginDir:e,err:String(t)},`failed to rewrite artifact sourceHash`)}}function Jc(e,t){try{let n=x(e,`meta.json`),r=x(e,`.meta.json.tmp-${process.pid}`);A(r,JSON.stringify(Kc(t))),Yr(r,n)}catch(e){I.warn(`Failed to write plugin artifact meta: %s`,e instanceof Error?e.message:String(e))}}function Yc(e){try{let t=k(x(e,`plugin-dist`,`meta.json`),`utf8`),n=JSON.parse(t),r=Kc(e);return n.apiVersion===r.apiVersion&&n.compilerVersion===r.compilerVersion&&n.sourceHash===r.sourceHash}catch{return!1}}function Xc(e){let t=x(e,`plugin-dist`,`plugin.cjs`);return D(t)?Yc(e)?t:(I.info(`Plugin artifact at %s is stale (meta mismatch/missing) — recompiling`,t),null):null}async function Zc(e,t,n){if(!Mc(e.dir))return null;if((e.scope===`project`||e.scope===`repository`)&&!Zn(e.dir))return I.warn({pluginId:e.id},`project/repository plugin not trusted, skipping code module (fail-closed)`),null;let r=E(e);if(r.pendingCapabilities.length>0)return I.warn({pluginId:e.id,pendingCapabilities:r.pendingCapabilities},`plugin declares high-risk capabilities not yet granted, skipping code module entirely before factory execution (fail-closed, RFC-140 D3)`),null;let i=!1,a=Xc(e.dir);if(a)i=!0,I.info({pluginId:e.id,outfile:a},`using prebuilt plugin module (RFC-150 D5, skip compile)`);else try{a=await Hc(e.dir)}catch(t){let r=String(t);return I.warn({pluginId:e.id,err:r},`plugin.ts compile failed`),n?.(e.id,`compile failed: ${r}`),null}if(!a)return null;Bc();let o;try{delete L.cache[a];let e=L(a);o=e?.default??e}catch(t){if(i){I.warn({pluginId:e.id,outfile:a,err:String(t)},`prebuilt plugin module failed to load — recompiling for this machine`);try{a=await Hc(e.dir),delete L.cache[a];let t=L(a);o=t?.default??t}catch(t){let r=String(t);return I.warn({pluginId:e.id,err:r},`plugin.ts load failed (after recompile retry)`),n?.(e.id,`load failed: ${r}`),null}}else{let r=String(t);return I.warn({pluginId:e.id,err:r},`plugin.ts load failed`),n?.(e.id,`load failed: ${r}`),null}}if(typeof o!=`function`)return I.warn({pluginId:e.id},`plugin.ts default export is not a factory function`),n?.(e.id,`default export is not a factory function`),null;try{let n=await o(t);return{pluginId:e.id,module:n,compiledPath:a??void 0}}catch(t){let r=String(t);return I.warn({pluginId:e.id,err:r},`plugin factory threw`),n?.(e.id,`factory threw: ${r}`),null}}const R=C(`@x-otto/coding:plugin-service-pool`),Qc=5e3;function $c(e){return[`--experimental-permission`,`--allow-fs-read=*`,...e?[`--allow-fs-write=${e}`]:[]]}`${Be()}`;let el=null,tl=null;function nl(){return tl||(el||=Wr(x(Be(),`otto-plugin-service-`)),tl=x(el,`service-entry.cjs`),A(tl,Ac()),tl)}function rl(e,t){return`${e}:${t}`}var il=class{services=new Map;get runningKeys(){return[...this.services.entries()].filter(([,e])=>e.status===`running`).map(([e])=>e)}statusOf(e,t){return this.services.get(rl(e,t))?.status}restartsOf(e,t){return this.services.get(rl(e,t))?.restarts??0}notify(e,t,n){let r=this.services.get(rl(e,t));if(!r||r.status!==`running`)return!1;try{return r.worker.postMessage({type:F.notify,notification:n}),!0}catch{return!1}}runningServiceIds(e){let t=`${e}:`;return[...this.services.entries()].filter(([e,n])=>e.startsWith(t)&&n.status===`running`).map(([e])=>e.slice(t.length))}async start(e){let t=rl(e.pluginId,e.serviceId);return await this.stop(e.pluginId,e.serviceId),this.spawnAndStart(t,e,0)}spawnAndStart(e,t,n){return new Promise(r=>{let i;try{i=new Pi(nl(),{execArgv:[...$c(t.storageDir)]})}catch(t){R.error({key:e,err:String(t)},`failed to create service worker`),r({error:String(t)});return}i.unref();let a={worker:i,input:t,status:`starting`,restarts:n,stopping:!1};this.services.set(e,a);let o=!1,s=e=>{o||(o=!0,r(e))};i.on(`message`,t=>{this.onWorkerMessage(e,a,t,s)}),i.on(`error`,t=>{R.warn({key:e,err:String(t)},`service worker error`),a.status=`failed`,s({error:String(t)}),this.scheduleRestart(e,a)}),i.on(`exit`,()=>{a.stopping||(a.status!==`failed`&&(a.status=`failed`),s({error:`service worker exited unexpectedly`}),this.scheduleRestart(e,a))}),i.postMessage({type:F.start,compiledPath:t.compiledPath,hostExternals:zc(),serviceId:t.serviceId,factoryCtx:t.factoryCtx,serviceCtx:{pluginId:t.pluginId,workspaceDir:t.workspaceDir,workspaceKey:t.workspaceKey,hostCapabilities:t.hostCapabilities,storageDir:t.storageDir,hasStorageCapability:t.hasStorageCapability}})})}async onWorkerMessage(e,t,n,r){if(n.type===F.started){n.error?(t.status=`failed`,R.warn({key:e,err:n.error},`plugin service failed to start`),r({error:n.error}),this.scheduleRestart(e,t)):(t.status=`running`,R.info({key:e},`plugin service started`),r({}));return}if(n.type===F.crashed){R.warn({key:e,err:n.error},`plugin service crashed at runtime`),t.status=`failed`,this.scheduleRestart(e,t);return}if(n.type===F.hostCall){await this.dispatchHostCall(e,t,n);return}}async dispatchHostCall(e,t,n){let{callId:r,method:i,params:a}=n;if(i===`log.info`||i===`log.warn`||i===`log.error`){let e=a?.msg??``;R[i.slice(4)]({pluginId:t.input.pluginId,serviceId:t.input.serviceId},e);return}if(!r)return;let o=(e,n)=>{try{t.worker.postMessage({type:F.hostResult,callId:r,result:e,error:n})}catch{}};if(i===`startJob`){let e=t.input.bridge.startJob;if(!e){o(void 0,`capability not granted: agent.dispatch`);return}let n=a;try{o(await e({title:String(n?.title??``),prompt:String(n?.prompt??``)}))}catch(e){o(void 0,e instanceof Error?e.message:String(e))}return}if(i===`readTranscript`){let e=t.input.bridge.readTranscript;if(!e){o(void 0,`capability not granted: session.read`);return}let n=a;try{let t=typeof n?.sinceIndex==`number`?n.sinceIndex:void 0;o(await e({sessionId:String(n?.sessionId??``),sinceIndex:t}))}catch(e){o(void 0,e instanceof Error?e.message:String(e))}return}if(i===`notify`){let e=t.input.bridge.notify;if(!e){o(void 0,`capability not granted: user.notify`);return}let n=a,r=String(n?.level??`info`),i=r===`warning`||r===`error`?r:`info`;try{await e({level:i,code:String(n?.code??``),message:String(n?.message??``)}),o(void 0)}catch(e){o(void 0,e instanceof Error?e.message:String(e))}return}if(i===`ask`){o(void 0,`capability not granted: user.ask`);return}if(i===`complete`){let e=t.input.bridge.complete;if(!e){o(void 0,`capability not granted: llm.complete`);return}let n=a;try{let t=typeof n?.maxTokens==`number`?n.maxTokens:void 0;o(await e({prompt:String(n?.prompt??``),maxTokens:t}))}catch(e){o(void 0,e instanceof Error?e.message:String(e))}return}R.warn({key:e,method:i},`plugin service requested unknown host method (rejected)`),o(void 0,`unknown host method: ${String(i)}`)}scheduleRestart(e,t){if(t.stopping||t.restartTimer)return;if(t.restarts>=5){R.error({key:e,restarts:t.restarts},`plugin service exceeded restart limit, giving up (no further restarts)`),t.status=`failed`;return}let n=t.restarts+1,r=Math.min(1e3*2**(n-1),3e4);R.warn({key:e,attempt:n,delayMs:r},`restarting plugin service after crash`);let i=setTimeout(()=>{t.restartTimer=void 0;let r=this.services.get(e);!r||r.stopping||this.spawnAndStart(e,t.input,n)},r);i.unref?.(),t.restartTimer=i}async stop(e,t){let n=rl(e,t),r=this.services.get(n);if(!r)return;r.stopping=!0,r.restartTimer&&=(clearTimeout(r.restartTimer),void 0),this.services.delete(n);let i=new Promise(e=>{let t=n=>{n?.type===F.stopped&&(r.worker.off(`message`,t),e(!0))};r.worker.on(`message`,t);try{r.worker.postMessage({type:F.stop})}catch{e(!1)}}),a=new Promise(e=>{setTimeout(()=>e(!1),Qc).unref?.()});await Promise.race([i,a])||R.warn({key:n,timeoutMs:Qc},`plugin service did not stop gracefully, terminating (state may be lost)`),r.status=`stopped`;try{await r.worker.terminate()}catch{}}async stopPlugin(e){let t=`${e}:`,n=[...this.services.keys()].filter(e=>e.startsWith(t));for(let r of n){let n=r.slice(t.length);await this.stop(e,n)}}async dispose(){let e=[...this.services.keys()];for(let t of e){let e=t.indexOf(`:`);await this.stop(t.slice(0,e),t.slice(e+1))}if(el){try{Xr(el,{recursive:!0,force:!0})}catch{}el=null,tl=null}}};let al=null;function ol(){return al||=new il,al}async function sl(){await al?.dispose(),al=null}const cl=[/\bsk-[A-Za-z0-9_-]{16,}/g,/\bgh[pousr]_[A-Za-z0-9]{20,}/g,/\bAKIA[0-9A-Z]{16}\b/g,/\bxox[abposr]-[A-Za-z0-9-]{10,}/g,/\bBearer\s+[A-Za-z0-9._~+/-]{20,}=*/g,/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}/g];function ll(e){let t=e;for(let e of cl)t=t.replace(e,`***`);return t}function ul(e){if(typeof e==`string`)return e;if(!Array.isArray(e))return``;let t=[];for(let n of e){let e=n;e?.type===`text`&&typeof e.text==`string`&&t.push(e.text)}return t.join(`
197
+ `)}function dl(e){if(e.role===`user`)return e.internal?null:{role:`user`,text:ll(ul(e.content))};if(e.role===`assistant`){let t=e.content.filter(e=>e.type===`tool_call`)[0]?.name,n={role:`assistant`,text:ll(ul(e.content))};return t&&(n.toolName=t),n}return e.role===`tool_result`?e.internal?null:{role:`tool_result`,text:ll(ul(e.content)),toolName:e.toolName}:null}function fl(e,t,n){let r=Math.max(0,Math.min(t,e.length)),i=e.slice(r),a=i.length>n?i.slice(i.length-n):i,o=[];for(let e of a){let t=dl(e);t&&o.push(t)}return{messages:o,nextIndex:e.length}}const z={load:`worker.load`,loaded:`worker.loaded`,error:`worker.error`,toolExecute:`tool.execute`,toolResult:`tool.result`,toolCancel:`tool.cancel`,sigilResolve:`sigil.resolve`,sigilResult:`sigil.result`,onActivate:`worker.onActivate`,activated:`worker.activated`,onDeactivate:`worker.onDeactivate`,deactivated:`worker.deactivated`,stop:`worker.stop`,hostCall:`host.call`,hostResult:`host.result`};function pl(e){return`${e===`worker`?`const { parentPort } = require('worker_threads')
198
198
  const __send = (m) => parentPort.postMessage(m)
199
199
  const __onMessage = (fn) => parentPort.on('message', fn)`:`const __send = (m) => process.send(m)
200
200
  const __onMessage = (fn) => process.on('message', fn)`}\n${`// RFC-303 M4:工具执行上下文——host/logger 经反向 RPC 代理回宿主
@@ -364,7 +364,7 @@ __onMessage(async (msg) => {
364
364
  return
365
365
  }
366
366
  if (msg.type === '${z.stop}') { toolExecutors.clear(); pluginInstance = null; process.exit(0) }
367
- })`}`}var pl=class{pending=new Map;idCounter=0;boundPluginId=``;hostCallDispatcher=null;setHostCallDispatcher(e){this.hostCallDispatcher=e}constructor(e){this.adapter=e,this.adapter.onMessage(e=>{if(e.type===z.loaded){let t=this.settlePending(`__load__`);t&&t.resolve(e.module);return}if(e.type===z.error){let t=this.settlePending(`__load__`);t&&t.reject(Error(e.error??this.adapter.loadFailedMessage?.()??`plugin isolated transport load failed`));return}if(e.type===z.toolResult){let t=this.settlePending(e.id);t&&t.resolve({result:e.result,error:e.error});return}if(e.type===z.sigilResult){let t=this.settlePending(e.id);t&&t.resolve({result:e.result,error:e.error});return}if(e.type===z.activated||e.type===z.deactivated){let t=this.settlePending(e.id);t&&t.resolve({error:e.error});return}if(e.type===z.hostCall){let t=this.boundPluginId,n=this.hostCallDispatcher,r=t=>{try{this.adapter.send({type:z.hostResult,id:e.id,...t})}catch{}};if(!n){r({error:`host call dispatcher not installed (plugin host capabilities unavailable)`});return}n(t,e.method??``,e.args??[]).then(e=>r({result:e})).catch(e=>r({error:e instanceof Error?e.message:String(e)}));return}}),this.adapter.onError(e=>{this.adapter.onErrorLog?.(e),this.rejectAllPending(e)}),this.adapter.onExit(e=>{if(this.pending.size===0)return;this.adapter.onExitLog?.(e);let t=this.adapter.exitErrorMessage?.(e)??`plugin isolated transport exited unexpectedly (code ${e})`;this.rejectAllPending(Error(t))})}rejectAllPending(e){for(let[,t]of this.pending)t.type===`load`?t.reject(e):t.resolve({error:e.message});this.pending.clear(),this.adapter.unref()}syncRefState(){this.pending.size>0?this.adapter.ref():this.adapter.unref()}trackPending(e,t){this.pending.set(e,t),this.syncRefState()}settlePending(e){let t=this.pending.get(e);return t&&(this.pending.delete(e),this.syncRefState()),t}async load(e,t,n){if(this.pending.has(`__load__`))throw Error(this.adapter.alreadyLoadingMessage?.(e)??`plugin isolated transport already loading ${e}`);return this.boundPluginId=e,new Promise((r,i)=>{this.trackPending(`__load__`,{type:`load`,resolve:r,reject:i}),this.adapter.send({type:z.load,pluginId:e,compiledPath:t,ctx:n,...n.hostMethods?{hostMethods:n.hostMethods}:{},...n.hostExternals?{hostExternals:n.hostExternals}:{}})})}async executeTool(e,t,n){let r=`tool-${++this.idCounter}`,i=n?.timeoutMs??6e4,a=n?.signal;return a?.aborted?{error:`plugin tool execution aborted`}:new Promise(n=>{let o,s,c=()=>{o!==void 0&&clearTimeout(o),s&&a&&a.removeEventListener(`abort`,s)};this.trackPending(r,{type:`tool`,resolve:e=>{c(),n(e)}});let l=e=>{let t=this.settlePending(r);if(t){try{this.adapter.send({type:z.toolCancel,id:r})}catch{}t.resolve({error:e})}};i>0&&(o=setTimeout(()=>{this.adapter.onToolTimeout?.(e,i),l(`plugin tool "${e}" timed out after ${i}ms`)},i),o.unref?.()),a&&(s=()=>l(`plugin tool execution aborted`),a.addEventListener(`abort`,s,{once:!0})),this.adapter.send({type:z.toolExecute,id:r,name:e,params:t})})}async resolveSigil(e,t,n,r){let i=`sigil-${++this.idCounter}`,a=r?.timeoutMs??6e4;return new Promise(r=>{let o;this.trackPending(i,{type:`sigil`,resolve:e=>{o!==void 0&&clearTimeout(o),r(e)}}),a>0&&(o=setTimeout(()=>{let t=this.settlePending(i);t&&t.resolve({error:`sigil resolver "${e}" timed out after ${a}ms`})},a),o.unref?.()),this.adapter.send({type:z.sigilResolve,id:i,name:e,param:t,ctx:n})})}async activate(){let e=`lifecycle-${++this.idCounter}`;return new Promise(t=>{this.trackPending(e,{type:`lifecycle`,resolve:t}),this.adapter.send({type:z.onActivate,id:e})})}async deactivate(){let e=`lifecycle-${++this.idCounter}`;return new Promise(t=>{this.trackPending(e,{type:`lifecycle`,resolve:t}),this.adapter.send({type:z.onDeactivate,id:e})})}clearPending(){this.pending.clear()}};const ml=C(`@x-otto/coding:plugin-worker-pool`);let hl=null,gl=null;function _l(){return gl||(hl||=Wr(x(Be(),`otto-plugin-worker-`)),gl=x(hl,`worker-entry.cjs`),A(gl,fl(`worker`)),gl)}var vl=class extends pl{worker;constructor(){let e=new Pi(_l());e.unref(),super({send:t=>e.postMessage(t),onMessage:t=>e.on(`message`,e=>t(e)),onError:t=>e.on(`error`,e=>t(e)),onExit:t=>e.on(`exit`,t),ref:()=>e.ref(),unref:()=>e.unref(),onToolTimeout:(e,t)=>{ml.warn({tool:e,timeoutMs:t},`plugin tool execution timed out`)},onErrorLog:e=>{ml.warn({err:String(e)},`plugin worker error`)},onExitLog:e=>{ml.warn({code:e},`plugin worker exited unexpectedly with pending requests`)},exitErrorMessage:e=>`plugin worker exited unexpectedly (code ${e})`,loadFailedMessage:()=>`plugin worker load failed`,alreadyLoadingMessage:e=>`plugin worker already loading ${e}`}),this.worker=e}async stop(){try{this.worker.postMessage({type:z.stop}),await this.worker.terminate()}catch{}this.clearPending(),this.worker.unref()}},yl=class{workers=new Map;maxConcurrent;hostCallDispatcher=null;constructor(e=8){this.maxConcurrent=e}setHostCallDispatcher(e){this.hostCallDispatcher=e}async load(e,t,n){if(this.workers.size>=this.maxConcurrent)return null;await this.unload(e);let r=new vl;this.hostCallDispatcher&&r.setHostCallDispatcher(this.hostCallDispatcher),this.workers.set(e,r);try{return await r.load(e,t,n)}catch(t){throw this.workers.delete(e),r.stop().catch(()=>{}),t}}async executeTool(e,t,n,r){let i=this.workers.get(e);if(!i)throw Error(`no worker for plugin ${e}`);return i.executeTool(t,n,r)}async resolveSigil(e,t,n,r,i){let a=this.workers.get(e);if(!a)throw Error(`no worker for plugin ${e}`);return a.resolveSigil(t,n,r,i)}async activate(e){let t=this.workers.get(e);if(!t)throw Error(`no worker for plugin ${e}`);return t.activate()}async deactivate(e){let t=this.workers.get(e);if(!t)throw Error(`no worker for plugin ${e}`);return t.deactivate()}async unload(e){let t=this.workers.get(e);t&&(this.workers.delete(e),await t.stop())}async dispose(){let e=[...this.workers.values()];if(this.workers.clear(),hl){try{Xr(hl,{recursive:!0,force:!0})}catch{}hl=null,gl=null}await Promise.all(e.map(e=>e.stop().catch(()=>{})))}get size(){return this.workers.size}};const bl=C(`@x-otto/coding:plugin-process-pool`);let xl=null,Sl=null;function Cl(){return Sl||(xl||=Wr(x(Be(),`otto-plugin-process-`)),Sl=x(xl,`process-entry.cjs`),A(Sl,fl(`process`)),Sl)}var wl=class extends pl{child;sandboxToDispose;constructor(e){let t=Cl(),n=process.execPath,r=[t],i=n,a=r,o;if(Re()){let t=Fe({network:`deny`}),s=t.wrap({command:n,args:r,options:{timeout:0,cwd:e},projectRoot:e});i=s.command,a=s.args,o=t}else bl.warn(`No platform sandbox available for project/repository scope plugin isolation — falling back to plain child_process (still process-isolated, but without OS-level file/network constraints)`);let s=Oi(i,a,{cwd:e,stdio:[`ignore`,`ignore`,`pipe`,`ipc`]});s.unref(),super({send:e=>s.send(e),onMessage:e=>s.on(`message`,t=>e(t)),onError:e=>s.on(`error`,t=>e(t)),onExit:e=>s.on(`exit`,e),ref:()=>{s.channel?.ref(),s.stderr?.ref?.()},unref:()=>{s.channel?.unref(),s.stderr?.unref?.()},onToolTimeout:(e,t)=>{bl.warn({tool:e,timeoutMs:t},`plugin tool execution timed out (isolated process)`)},onErrorLog:e=>{bl.warn({err:String(e)},`plugin process error`)},onExitLog:e=>{bl.warn({code:e},`plugin process exited unexpectedly with pending requests`)},exitErrorMessage:e=>`plugin process exited unexpectedly (code ${e})`,loadFailedMessage:()=>`plugin process load failed`,alreadyLoadingMessage:e=>`plugin process already loading ${e}`}),this.child=s,this.sandboxToDispose=o,this.child.stderr?.on(`data`,e=>{bl.warn({stderr:e.toString().slice(0,500)},`plugin process stderr output`)}),this.child.on(`exit`,()=>{this.sandboxToDispose?.dispose().catch(()=>void 0),this.sandboxToDispose=void 0})}async stop(){try{this.child.send({type:z.stop})}catch{}try{this.child.kill()}catch{}this.clearPending()}},Tl=class{processes=new Map;maxConcurrent;hostCallDispatcher=null;constructor(e=4){this.maxConcurrent=e}setHostCallDispatcher(e){this.hostCallDispatcher=e}async load(e,t,n){if(this.processes.size>=this.maxConcurrent)return null;await this.unload(e);let r=new wl(n.workspaceDir);this.hostCallDispatcher&&r.setHostCallDispatcher(this.hostCallDispatcher),this.processes.set(e,r);try{return await r.load(e,t,n)}catch(t){throw this.processes.delete(e),r.stop().catch(()=>{}),t}}async executeTool(e,t,n,r){let i=this.processes.get(e);if(!i)throw Error(`no process for plugin ${e}`);return i.executeTool(t,n,r)}async resolveSigil(e,t,n,r,i){let a=this.processes.get(e);if(!a)throw Error(`no process for plugin ${e}`);return a.resolveSigil(t,n,r,i)}async activate(e){let t=this.processes.get(e);if(!t)throw Error(`no process for plugin ${e}`);return t.activate()}async deactivate(e){let t=this.processes.get(e);if(!t)throw Error(`no process for plugin ${e}`);return t.deactivate()}async unload(e){let t=this.processes.get(e);t&&(this.processes.delete(e),await t.stop())}async dispose(){let e=[...this.processes.values()];if(this.processes.clear(),xl){try{Xr(xl,{recursive:!0,force:!0})}catch{}xl=null,Sl=null}await Promise.all(e.map(e=>e.stop().catch(()=>{})))}get size(){return this.processes.size}};const El=C(`@x-otto/coding:plugin-module-loader-isolated`);let Dl=null;function Ol(){return Dl||=new yl,Dl}let kl=null;function Al(){return kl||=new Tl,kl}async function jl(){await Promise.all([Dl?.dispose()??Promise.resolve(),kl?.dispose()??Promise.resolve()])}function Ml(e){return e===`project`||e===`repository`?Al():Ol()}function Nl(e){return!!e.manifest.capabilities?.includes(`tools`)}function Pl(e,t,n){let r={};if(t.contributions&&(r.contributions=t.contributions),t.tools.length>0&&(r.tools=t.tools.map(t=>({name:t.name,description:t.description||t.name,parameters:{safeParse(e){return t.hasParameters?{success:!0,data:e}:{success:!0,data:{}}},...t.parametersSchema===void 0?{}:{toJSONSchema:()=>t.parametersSchema}},async execute(r,i){let{result:a,error:o}=await n.executeTool(e,t.name,r,{signal:i?.signal});if(o)throw Error(o);return a&&typeof a==`object`&&Array.isArray(a.content)?a:{content:[{type:`text`,text:typeof a==`string`?a:JSON.stringify(a??null)}]}}}))),t.hasSigilProviders&&El.warn({pluginId:e},`plugin declares sigilProviders but is loaded via the isolated path (tools capability) — dynamic @ search providers are not proxied over RPC and will be inactive; declare input.resolver without tools to use the in-process path, or use static sigilEntries`),t.sigilResolvers?.length>0){r.sigilResolvers={};for(let i of t.sigilResolvers)r.sigilResolvers[i.name]={resolve:(t,r)=>n.resolveSigil(e,i.name,t,r,{timeoutMs:i.timeoutMs}).then(e=>{if(e.error)throw Error(e.error);return e.result??``}),timeoutMs:i.timeoutMs,uiHostOnly:i.uiHostOnly}}return t.hasOnActivate&&(r.onActivate=async()=>{let{error:t}=await n.activate(e);if(t)throw Error(t)}),t.hasOnDeactivate&&(r.onDeactivate=async()=>{let{error:t}=await n.deactivate(e);if(t)throw Error(t)}),r}async function Fl(e,t,n,r){if((e.scope===`project`||e.scope===`repository`)&&!Zn(e.dir))return El.warn({pluginId:e.id},`project/repository plugin not trusted, skipping isolated code module (fail-closed)`),null;let i=E(e);if(i.pendingCapabilities.length>0)return El.warn({pluginId:e.id,pendingCapabilities:i.pendingCapabilities},`plugin declares high-risk capabilities not yet granted, skipping isolated code module before worker execution (fail-closed, RFC-140 D3)`),null;let a=n??Ml(e.scope),o=Yc(e.dir);try{o?El.info({pluginId:e.id,compiledPath:o},`using prebuilt plugin module (isolated path, RFC-150 D5)`):o=await Vc(e.dir)}catch(t){let n=String(t);return El.warn({pluginId:e.id,err:n},`plugin.ts compile failed (isolated path)`),r?.(e.id,`compile failed: ${n}`),null}if(!o)return null;let s=[...Object.keys(t.host??{}),`listActivePlugins`];if(t.host&&Object.keys(t.host).length>0||t.listActivePlugins){let e=t.host;a.setHostCallDispatcher?.(async(n,r,i)=>{if(r===`listActivePlugins`)return t.listActivePlugins?t.listActivePlugins():[];if(!e||typeof e[r]!=`function`)throw Error(`host method '${r}' not available (not declared or not granted)`);if(!(r in e))throw Error(`host method '${r}' not in whitelist`);let a=e[r];return a(...i)})}try{let n=await a.load(e.id,o,{pluginId:t.pluginId,pluginDir:t.pluginDir,workspaceDir:t.workspaceDir,hostMethods:s,listActivePlugins:!0,hostExternals:Rc()});if(n===null){if(e.scope===`project`||e.scope===`repository`){let t=`plugin process pool exhausted (project/repository scope requires isolated execution, refusing to downgrade to in-process)`;return El.warn({pluginId:e.id},t),r?.(e.id,t),null}return El.info({pluginId:e.id},`plugin worker pool exhausted, falling back to in-process load`),Xc(e,t,r)}return{pluginId:e.id,module:Pl(e.id,n,a),compiledPath:o}}catch(t){let n=String(t);return El.warn({pluginId:e.id,err:n},`plugin.ts worker load failed`),r?.(e.id,`worker load failed: ${n}`),null}}function Il(e,t){return e.includes(`onStartup`)?!0:e.some(e=>t.has(e))}var Ll=class{axisName=`hooks`;hookNamesByPlugin=new Map;constructor(e){this.hookRegistry=e}register(e){let t=e.loaded.module.hooks;if(t){let n=uc(e.plugin.id,t);this.hookRegistry.registerAll(n);let r=this.hookNamesByPlugin.get(e.plugin.id)??[];r.push(...n.map(e=>e.name)),this.hookNamesByPlugin.set(e.plugin.id,r)}}unregister(e){let t=this.hookNamesByPlugin.get(e);if(t){for(let e of t)this.hookRegistry.unregister(e);this.hookNamesByPlugin.delete(e)}}unregisterAll(){for(let e of[...this.hookNamesByPlugin.keys()])this.unregister(e)}},Rl=class{axisName=`monitors`;hookNamesByPlugin=new Map;monitorsByPlugin=new Map;constructor(e,t){this.hookRegistry=e,this.logger=t}register(e){let t=e.loaded.module.monitors;if(!t?.length)return;if(!e.plugin.manifest.capabilities?.includes(`monitor`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares monitors but not capabilities:["monitor"], skipped (fail-closed)`);return}let n=yc(e.plugin.id,t);this.hookRegistry.registerAll(n);let r=this.hookNamesByPlugin.get(e.plugin.id)??[];r.push(...n.map(e=>e.name)),this.hookNamesByPlugin.set(e.plugin.id,r),this.monitorsByPlugin.set(e.plugin.id,t)}unregister(e){let t=this.hookNamesByPlugin.get(e);if(t){for(let e of t)this.hookRegistry.unregister(e);this.hookNamesByPlugin.delete(e)}this.monitorsByPlugin.delete(e)}unregisterAll(){for(let e of[...this.hookNamesByPlugin.keys()])this.unregister(e)}async dispatch(e){for(let[t,n]of this.monitorsByPlugin)for(let r of n)try{await r.onEvent(e)}catch(n){this.logger.warn({pluginId:t,monitorId:r.id,eventType:e.type,err:String(n)},`plugin monitor onEvent threw (host event), isolated`)}}get monitorPluginIds(){return[...this.monitorsByPlugin.keys()]}},zl=class{axisName=`feedback`;feedbackRegisteredSources=new Set;constructor(e,t){this.feedbackRegistry=e,this.logger=t}register(e){let t=e.loaded.module.feedbackProviders;if(!(!t||!this.feedbackRegistry)){if(!e.plugin.manifest.capabilities?.includes(`feedback`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares feedbackProviders but not capabilities:["feedback"], skipped (fail-closed)`);return}this.feedbackRegistry.register(t,e.plugin.id)?this.feedbackRegisteredSources.add(e.plugin.id):this.logger.warn({pluginId:e.plugin.id},`plugin feedbackProviders rejected (already registered by a different plugin)`)}}unregister(e){!this.feedbackRegistry||!this.feedbackRegisteredSources.has(e)||(this.feedbackRegistry.unregister(e),this.feedbackRegisteredSources.delete(e))}unregisterAll(){for(let e of[...this.feedbackRegisteredSources])this.unregister(e)}};const Bl=C(`@x-otto/coding:plugin-sigil-loader`);function Vl(e){return e.startsWith(`!`)||e.startsWith(`#`)}function Hl(e){let t=[];for(let n of e){let e=n.manifest.contributes?.sigilEntries;if(e?.length){if(E(n).gated){Bl.warn({pluginId:n.id},`plugin gated (untrusted), sigilEntries skipped`);continue}for(let r of e){if(Vl(r.value)){Bl.warn({pluginId:n.id,label:r.label},`sigilEntries value starts with '!' or '#' (mode-prefix collision), skipped`);continue}t.push({label:r.label,value:r.value,kind:r.kind,description:r.description,source:n.id,resolverId:r.resolverId?`${n.id}:${r.resolverId}`:void 0})}}}return t}function Ul(e){for(let t of e)t.manifest.contributes?.inputEntries&&Bl.warn({pluginId:t.id},`contributes.inputEntries is deprecated (RFC-210); migrate to contributes.sigilEntries (inline array) — the file-path form is no longer loaded`)}function Wl(e,t){let n=[];for(let[r,i]of Object.entries(t)){let t=`${e}:${r}`;typeof i==`function`?n.push({id:t,resolve:i}):i&&typeof i.resolve==`function`?n.push({id:t,resolve:i.resolve,timeoutMs:i.timeoutMs,uiHostOnly:i.uiHostOnly}):Bl.warn({pluginId:e,name:r},`sigilResolvers entry is neither function nor {resolve}, skipped`)}return n}function Gl(e,t){return t.map(t=>async(n,r)=>(await t(n,r)).filter(e=>!Vl(e.value)).map(t=>({...t,source:e})))}function Kl(e,t){for(let n of e)n.resolverId&&!t(n.resolverId)&&Bl.warn({label:n.label,resolverId:n.resolverId,source:n.source},`sigilEntries.resolverId has no matching resolver (declared sigilResolvers missing or capability not granted) — entry will pass through unexpanded at submit`)}var ql=class{axisName=`sigil`;sigilResolverSourcePluginIds=new Set;sigilProviderUnsubsByPlugin=new Map;constructor(e,t,n){this.sigilResolverRegistry=e,this.pluginInput=t,this.logger=n}register(e){let t=e.loaded.module.sigilResolvers,n=e.loaded.module.sigilProviders;if(t&&Object.keys(t).length>0||n?.length){if(!e.plugin.manifest.capabilities?.includes(`input.resolver`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares sigilResolvers/sigilProviders but not capabilities:["input.resolver"], skipped (fail-closed)`);return}if(e.verdict.pendingCapabilities.includes(`input.resolver`)){this.logger.warn({pluginId:e.plugin.id},`plugin capability "input.resolver" declared but not yet granted, skipping sigil axes (fail-closed)`);return}if(t&&this.sigilResolverRegistry){let n=Wl(e.plugin.id,t);n.length>0&&(this.sigilResolverRegistry.register(n,e.plugin.id),this.sigilResolverSourcePluginIds.add(e.plugin.id))}if(n?.length&&this.pluginInput){let t=this.sigilProviderUnsubsByPlugin.get(e.plugin.id)??[];for(let r of Gl(e.plugin.id,n))t.push(this.pluginInput.registerProvider(`@`,r));this.sigilProviderUnsubsByPlugin.set(e.plugin.id,t)}if(this.sigilResolverRegistry){let t=this.sigilResolverRegistry;Kl(Hl([e.plugin]),e=>t.get(e)!==void 0)}}}unregister(e){this.sigilResolverRegistry&&this.sigilResolverSourcePluginIds.has(e)&&(this.sigilResolverRegistry.unregisterBySource(e),this.sigilResolverSourcePluginIds.delete(e));let t=this.sigilProviderUnsubsByPlugin.get(e);if(t){for(let e of t)try{e()}catch{}this.sigilProviderUnsubsByPlugin.delete(e)}}unregisterAll(){let e=new Set([...this.sigilResolverSourcePluginIds,...this.sigilProviderUnsubsByPlugin.keys()]);for(let t of e)this.unregister(t)}},Jl=class{axisName=`computedCommands`;commandsByPlugin=new Map;register(e){let t=e.loaded.module.contributions?.commands;if(t?.length&&e.plugin.scope!==`builtin`){let n=this.commandsByPlugin.get(e.plugin.id)??[];n.push(...dc(e.plugin.id,e.plugin.scope,e.plugin.dir,t)),this.commandsByPlugin.set(e.plugin.id,n)}}unregister(e){this.commandsByPlugin.delete(e)}unregisterAll(){}resetForReload(){this.commandsByPlugin.clear()}getComputedCommands(){return[...this.commandsByPlugin.values()].flat()}},Yl=class{axisName=`computedAgents`;profilesByPlugin=new Map;existingAgentNames=new Set;register(e){let t=e.loaded.module.contributions?.agents;if(!t?.length)return;let n=this.profilesByPlugin.get(e.plugin.id)??[];n.push(...fc(t)),this.profilesByPlugin.set(e.plugin.id,n)}unregister(e){this.profilesByPlugin.delete(e)}unregisterAll(){}setExistingAgentNames(e){this.existingAgentNames=e}resetForReload(e){this.profilesByPlugin.clear(),this.existingAgentNames=e}getAppendedAgents(){let e=new Set(this.existingAgentNames),t=[];for(let n of this.profilesByPlugin.values())for(let r of n)e.has(r.name)||(e.add(r.name),t.push(r));return t}},Xl=class{axisName=`computedSkills`;skillNamesByPlugin=new Map;constructor(e){this.skillRegistry=e}register(e){let t=e.loaded.module.contributions?.skills;if(!t?.length||!this.skillRegistry)return;let n=this.skillNamesByPlugin.get(e.plugin.id)??[];for(let{definition:r,source:i}of pc(e.plugin.id,e.plugin.dir,t))this.skillRegistry.get(r.metadata.name)||(this.skillRegistry.register(r,i),n.push(r.metadata.name));n.length>0&&this.skillNamesByPlugin.set(e.plugin.id,n)}unregister(e){let t=this.skillNamesByPlugin.get(e);if(t){for(let e of t)this.skillRegistry?.unregister(e);this.skillNamesByPlugin.delete(e)}}unregisterAll(){for(let e of[...this.skillNamesByPlugin.keys()])this.unregister(e)}};const B=C(`@x-otto/coding:plugin-provider-loader`);function Zl(e){let t=C(`wire-protocol:${e}`),n=e=>(t,...n)=>e(t,...n);return{debug:n(t.debug.bind(t)),info:n(t.info.bind(t)),warn:n(t.warn.bind(t)),error:n(t.error.bind(t))}}function V(e,t){return`${e}:${t}`}function Ql(e){return new Set([...(e.contributes?.providers??[]).filter(e=>e.preserveProviderId===!0&&e.oauthRef).map(e=>e.oauthRef),...e.codeProviderIds??[]])}function $l(e,t){let n=Ql(t);return new Set((t.contributes?.oauth??[]).map(t=>n.has(t.id)?t.id:V(e,t.id)))}function eu(e,t){return new Set((t.contributes?.providers??[]).filter(e=>e.catalogOnly!==!0&&e.baseUrl&&e.wireApi).map(t=>t.preserveProviderId===!0?t.id:V(e,t.id)))}function tu(e,t,n){return new Set([...n.codeProviderIds??[],...(n.contributes?.providers??[]).filter(e=>e.preserveProviderId===!0).map(e=>e.id)]).has(t)?t:V(e,t)}function nu(e){return`code:${e}`}function ru(e,t,n,r,i,a,o){let s=e.id.indexOf(`/`),c=s>=0?e.id.slice(s+1):e.id;return{id:e.id,name:c,api:n,provider:t,baseUrl:r,reasoning:e.reasoning??!1,input:e.input??[`text`],cost:e.cost,contextWindow:e.contextWindow,maxOutputTokens:e.maxOutput,imageConstraints:i,supportsTools:a,strengths:e.strengths,thinkingLevels:e.thinkingLevels,thinkingMode:e.thinkingMode,responseBodyPolicy:o}}function iu(e,t,n,r,i){return(a,o)=>{let s=e.url.replace(`{baseUrl}`,r??``).replace(`{clientVersion}`,process.env.OTTO_CODEX_CLIENT_VERSION||`1.0.0`),c=e.authScheme??`bearer`,l=c===`x-api-key`||c===`auto`&&o.mode!==`oauth`?{"x-api-key":a}:{authorization:`Bearer ${a}`};return c===`auto`&&o.mode===`oauth`&&o.beta&&e.betaHeaderName&&(l[e.betaHeaderName]=o.beta),{url:s,headers:{...i,...e.headers,...l},mergeProvider:t,modelApi:n,modelIdExclude:e.modelIdExclude}}}function au(e,t,n,r,i,a){return()=>{let o=r.get(a);if(!o)throw new Ke(`wire protocol '${a}' is not registered — is its provider plugin installed and trusted? (RFC-148)`,{code:`WIRE_PROTOCOL_NOT_REGISTERED`});return o.create({resolveAuth:()=>t.resolveAuth(n).then(e=>e??void 0),resolveBaseUrl:async()=>i,headers:e.headers,tokenDerivedHeaders:e.tokenDerivedHeaders,allowAuthHeaderOverride:e.allowAuthHeaderOverride,logger:Zl(a)})}}function ou(e,t,n,r,i,a,o){let s=t.contributes?.oauth;if(s?.length&&n)if(t.capabilities?.includes(`provider`))for(let t of s){let s=r.has(t.id)?t.id:V(e,t.id);if(f.includes(t.id)||n.isReservedId(t.id)){a.rejected.push({id:t.id,reason:`oauth id collides with builtin reserved OAuth provider`}),B.warn({pluginId:e,oauthId:t.id},`plugin oauth id collides with builtin reserved, rejected (R3)`);continue}let c=t.name??i.get(t.id)??t.id,l=t.kind===`pkce`?Ri({...t,id:s,name:c,tokenExchangeEncoding:t.tokenExchangeEncoding??`form`,assumesLoopbackAlways:t.assumesLoopbackAlways??!1,subscriptionScoped:t.subscriptionScoped??!1}):Li({...t,id:s,name:c,allowCustomDomain:t.allowCustomDomain??!1});if(o?.has(s))n.replace(l,e);else if(!n.register(l,e)){a.rejected.push({id:t.id,reason:`oauth registration rejected (id already claimed by another plugin or reserved)`});continue}}else{B.warn({pluginId:e},`plugin declares contributes.oauth but not capabilities:["provider"], skipped (fail-closed)`);for(let e of s)a.rejected.push({id:e.id,reason:`capability "provider" not declared`})}}function su(e,t,n,r,i,a){let o=t.contributes?.providers;if(!o?.length)return;if(!t.capabilities?.includes(`provider`)){B.warn({pluginId:e},`plugin declares contributes.providers but not capabilities:["provider"], skipped (fail-closed)`);for(let e of o)i.rejected.push({id:e.id,reason:`capability "provider" not declared`});return}let s=new Set;for(let t of o){if(i.registered.includes(t.id)){i.rejected.push({id:t.id,reason:`duplicate provider id in manifest`}),B.warn({pluginId:e,providerId:t.id},`duplicate provider id in manifest, second entry rejected (review F5)`);continue}if(ae(t.id)){i.rejected.push({id:t.id,reason:`reserved builtin provider id`}),B.warn({pluginId:e,providerId:t.id},`plugin provider id collides with builtin, rejected (R3)`);continue}let o=t.preserveProviderId===!0,c=o?t.id:V(e,t.id),l=o?t.id:V(e,t.id);if(t.catalogOnly===!0){let a=l;if(t.oauthRef){let n=o?t.oauthRef:V(e,t.oauthRef);if(!r?.get(n)){i.rejected.push({id:t.id,reason:`oauthRef '${t.oauthRef}' not found in current plugin's oauth table (R7)`}),B.warn({pluginId:e,providerId:t.id,oauthRef:t.oauthRef},`catalog provider oauthRef not found, rejected (R7)`);continue}a=n}if(t.envKey&&!n.authStore.registerEnvKey(l,t.envKey,e)){i.rejected.push({id:t.id,reason:`envKey registration rejected (reserved or claimed)`});continue}if(!le({id:l,name:t.name,env:t.oauthRef?void 0:t.envKey,requiresIntranet:t.requiresIntranet===!0},e)){i.rejected.push({id:t.id,reason:`provider descriptor id already claimed`}),t.envKey&&n.authStore.unregisterEnvKey(l);continue}if(t.models?.length){let r=t.models.map(e=>ru(e,a,c,t.baseUrl??``,void 0,t.supportsTools,t.responseBodyPolicy)),i=n.modelRegistry.registerWithSource(r,e);for(let t of i)B.warn({pluginId:e,modelId:t},`plugin model id collides, rejected`)}i.registered.push(t.id);continue}let u=l;if(t.oauthRef){let n=o?t.oauthRef:V(e,t.oauthRef);if(!r?.get(n)){i.rejected.push({id:t.id,reason:`oauthRef '${t.oauthRef}' not found in current plugin's oauth table (R7: cross-plugin/invalid ref rejected)`}),B.warn({pluginId:e,providerId:t.id,oauthRef:t.oauthRef},`provider oauthRef not found in current plugin oauth table, rejected (R7)`);continue}u=n,t.envKey&&B.warn({pluginId:e,providerId:t.id},`provider declares both oauthRef and envKey; ignoring envKey (R2, oauth takes priority)`)}if(t.envKey&&!t.oauthRef&&!n.authStore.registerEnvKey(l,t.envKey,e)){i.rejected.push({id:t.id,reason:`envKey registration rejected (reserved or claimed by another plugin)`});continue}let d=t.baseUrl,f=t.wireApi;if(!d||!f){i.rejected.push({id:t.id,reason:`baseUrl and wireApi required for non-catalog providers`});continue}let p=t.modelsEndpoint?iu(t.modelsEndpoint,l,c,t.baseUrl,t.headers):void 0,m=()=>{t.oauthRef&&r&&!s.has(u)&&r.unregister(u)};if(!le({id:l,name:t.name,env:t.oauthRef?void 0:t.envKey,buildModelsRequest:p,requiresIntranet:t.requiresIntranet===!0},e)){i.rejected.push({id:t.id,reason:`provider descriptor id already claimed by another plugin`}),t.envKey&&!t.oauthRef&&n.authStore.unregisterEnvKey(l),m();continue}t.allowAuthHeaderOverride&&B.warn({pluginId:e,providerId:t.id},`provider declares allowAuthHeaderOverride: custom headers may replace auth headers (RFC-270 D3)`);let h=au(t,n.authStore,u,n.wireProtocolRegistry,d,f);if(!(a?.has(c)?n.providerRegistry.replacePluginProvider(c,h,e):n.providerRegistry.registerPluginProvider(c,h,e))){i.rejected.push({id:t.id,reason:`api already registered by another plugin or reserved`}),pe(l),t.envKey&&!t.oauthRef&&n.authStore.unregisterEnvKey(l),m();continue}if(t.models?.length){let r=t.models.map(e=>ru(e,u,c,d,t.imageConstraints,t.supportsTools,t.responseBodyPolicy)),i=n.modelRegistry.registerWithSource(r,e);for(let t of i)B.warn({pluginId:e,modelId:t},`plugin model id collides with an existing model, rejected (no silent override)`)}i.registered.push(t.id),t.oauthRef&&s.add(u)}}function cu(e,t,n,r,i){let a={registered:[],rejected:[]},o=n.authStore.oauth;return ou(e,t,o,Ql(t),new Map((t.contributes?.providers??[]).filter(e=>e.oauthRef&&e.name).map(e=>[e.oauthRef,e.name])),a,r),su(e,t,n,o,a,i),a}async function lu(e,t,n,r,i){let a=n.authStore.oauth,o=Ql(t),s=t.contributes?.oauth;if(s?.length&&a)for(let t of s){let n=o.has(t.id)?t.id:V(e,t.id);r?.has(n)||a.unregister(n)}let c=t.contributes?.providers;if(c?.length){for(let t of c){let r=t.preserveProviderId===!0?t.id:V(e,t.id);pe(r),t.envKey&&!t.oauthRef&&n.authStore.unregisterEnvKey(r)}await n.providerRegistry.unregisterBySource(e,i),n.modelRegistry.unregisterBySource(e)}}var uu=class{axisName=`oauthProviderFactories`;oauthIdsByPlugin=new Map;constructor(e,t){this.authStore=e,this.logger=t}register(e){let t=e.loaded.module.oauthProviderFactories;if(!t||!this.authStore)return;if(!e.plugin.manifest.capabilities?.includes(`provider`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares oauthProviderFactories but not capabilities:["provider"], skipped (fail-closed)`);return}if(e.verdict.pendingCapabilities.includes(`provider`)){this.logger.warn({pluginId:e.plugin.id},`plugin capability "provider" not yet granted, skipping oauthProviderFactories (fail-closed)`);return}let n=new Set((e.plugin.manifest.contributes?.providers??[]).filter(e=>e.preserveProviderId===!0&&e.oauthRef).map(e=>e.oauthRef));for(let[r,i]of Object.entries(t)){let t=gc(e.plugin.id,i);if(!t)continue;let a=n.has(r)?r:V(e.plugin.id,r);if(t.id!==a){this.logger.warn({pluginId:e.plugin.id,name:r,expectedId:a,actualId:t.id},`plugin oauth provider id mismatch with manifest oauthRef/preserveProviderId, skipped`);continue}if(this.authStore.oauth.register(t,e.plugin.id)){let n=this.oauthIdsByPlugin.get(e.plugin.id)??new Set;n.add(t.id),this.oauthIdsByPlugin.set(e.plugin.id,n)}else this.logger.warn({pluginId:e.plugin.id,oauthId:t.id},`plugin oauthProviderFactory rejected (reserved or claimed)`)}}unregister(e){if(!this.authStore)return;let t=this.oauthIdsByPlugin.get(e);if(t){for(let e of t)this.authStore.oauth.unregister(e);this.oauthIdsByPlugin.delete(e)}}unregisterAll(){for(let e of[...this.oauthIdsByPlugin.keys()])this.unregister(e)}},du=class{axisName=`providerFactories`;providerSourcePluginIds=new Set;modelSourcePluginIds=new Set;descriptorIdsByPlugin=new Map;constructor(e,t,n){this.providerRegistry=e,this.modelRegistry=t,this.logger=n}register(e){let t=e.loaded.module.providerFactories;if(!t||!this.providerRegistry)return;if(!e.plugin.manifest.capabilities?.includes(`provider`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares providerFactories but not capabilities:["provider"], skipped (fail-closed)`);return}if(e.verdict.pendingCapabilities.includes(`provider`)){this.logger.warn({pluginId:e.plugin.id},`plugin capability "provider" declared but not yet granted, skipping providerFactories (fail-closed, RFC-124 C2)`);return}let n=e.plugin.manifest.codeProviderModelsEndpoints??{},r=e.plugin.manifest.codeProviderModels??{};for(let[i,a]of Object.entries(t)){let t=tu(e.plugin.id,i,e.plugin.manifest);if(!this.providerRegistry.registerPluginProvider(t,hc(e.plugin.id,a),nu(e.plugin.id))){this.logger.warn({pluginId:e.plugin.id,api:t},`plugin providerFactory rejected (reserved builtin or claimed by another plugin)`);continue}this.providerSourcePluginIds.add(e.plugin.id);let o=n[i];if(o)if(le({id:t,buildModelsRequest:iu(o,t,t)},nu(e.plugin.id))){let n=this.descriptorIdsByPlugin.get(e.plugin.id)??new Set;n.add(t),this.descriptorIdsByPlugin.set(e.plugin.id,n)}else this.logger.warn({pluginId:e.plugin.id,api:t},`plugin codeProviderModelsEndpoints descriptor rejected (reserved builtin or claimed by another plugin)`);let s=r[i];if(s?.models?.length&&this.modelRegistry){let n=s.models.map(e=>ru(e,t,t,s.baseUrl,s.imageConstraints,s.supportsTools,s.responseBodyPolicy)),r=this.modelRegistry.registerWithSource(n,e.plugin.id);this.modelSourcePluginIds.add(e.plugin.id),r.length>0&&this.logger.warn({pluginId:e.plugin.id,rejectedModelIds:r},`plugin codeProviderModels contains model ids already claimed by another source, rejected`)}}}async unregister(e){this.providerRegistry&&this.providerSourcePluginIds.has(e)&&(await this.providerRegistry.unregisterBySource(nu(e)),this.providerSourcePluginIds.delete(e)),this.modelRegistry&&this.modelSourcePluginIds.has(e)&&(this.modelRegistry.unregisterBySource(e),this.modelSourcePluginIds.delete(e));let t=this.descriptorIdsByPlugin.get(e);if(t){for(let e of t)pe(e);this.descriptorIdsByPlugin.delete(e)}}async unregisterAll(){let e=new Set([...this.providerSourcePluginIds,...this.modelSourcePluginIds,...this.descriptorIdsByPlugin.keys()]);for(let t of e)await this.unregister(t)}},fu=class{axisName=`wireProtocols`;wireProtocolSourcePluginIds=new Set;cacheReportingApisByPlugin=new Map;constructor(e,t){this.wireProtocolRegistry=e,this.logger=t}register(e){let t=e.loaded.module.wireProtocols;if(!(!t||!this.wireProtocolRegistry)){if(!e.plugin.manifest.capabilities?.includes(`wire-protocol`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares wireProtocols but not capabilities:["wire-protocol"], skipped (fail-closed)`);return}if(e.verdict.pendingCapabilities.includes(`wire-protocol`)){this.logger.warn({pluginId:e.plugin.id},`plugin capability "wire-protocol" declared but not yet granted, skipping wireProtocols (fail-closed, RFC-124 C2 pattern)`);return}for(let[n,r]of Object.entries(t))if(this.wireProtocolRegistry.register(n,r,e.plugin.id)){if(this.wireProtocolSourcePluginIds.add(e.plugin.id),r.meta?.reportsCacheTokens){ce(n);let t=this.cacheReportingApisByPlugin.get(e.plugin.id)??new Set;t.add(n),this.cacheReportingApisByPlugin.set(e.plugin.id,t)}}else this.logger.warn({pluginId:e.plugin.id,wireApi:n},`plugin wireProtocol rejected (already registered by another plugin, first-win)`)}}unregister(e){this.wireProtocolRegistry&&this.wireProtocolSourcePluginIds.has(e)&&(this.wireProtocolRegistry.unregisterBySource(e),this.wireProtocolSourcePluginIds.delete(e));let t=this.cacheReportingApisByPlugin.get(e);if(t){for(let e of t)fe(e);this.cacheReportingApisByPlugin.delete(e)}}unregisterAll(){let e=new Set([...this.wireProtocolSourcePluginIds,...this.cacheReportingApisByPlugin.keys()]);for(let t of e)this.unregister(t)}},pu=class{axisName=`tools`;toolSourcePluginIds=new Set;constructor(e,t){this.toolRegistry=e,this.logger=t}register(e){let t=e.loaded.module.tools;if(!t?.length||!this.toolRegistry)return;if(!e.plugin.manifest.capabilities?.includes(`tools`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares tools but not capabilities:["tools"], skipped (fail-closed)`);return}if(e.verdict.pendingCapabilities.includes(`tools`)){this.logger.warn({pluginId:e.plugin.id},`plugin capability "tools" declared but not yet granted, skipping tools (fail-closed, RFC-124 C2)`);return}let n=this.toolRegistry,r={workspaceDir:e.workspaceDir,logger:{info:t=>this.logger.info({pluginId:e.plugin.id},t),warn:t=>this.logger.warn({pluginId:e.plugin.id},t),error:t=>this.logger.error({pluginId:e.plugin.id},t)},host:e.host,storage:e.storage},i=t.map(t=>vc(e.plugin.id,t,r)).filter(e=>e!==null).filter(t=>n.has(t.name)?(this.logger.warn({pluginId:e.plugin.id,tool:t.name},`plugin tool name collides with an existing tool, rejected (R3, no silent override)`),!1):!0);i.length>0&&(n.register(i,{preset:`full`,source:e.plugin.id}),this.toolSourcePluginIds.add(e.plugin.id))}unregister(e){!this.toolRegistry||!this.toolSourcePluginIds.has(e)||(this.toolRegistry.unregisterBySource(e),this.toolSourcePluginIds.delete(e))}unregisterAll(){for(let e of[...this.toolSourcePluginIds])this.unregister(e)}};const mu=`[plugin]`;function hu(e,t,n){let r=n.name?.trim()||n.key;return`${mu} ${e}:${t}:${n.key} — ${r}`}function gu(e,t,n){let r=e.subscriber;return!r||r.kind!==`plugin-service`||r.pluginId!==t||r.serviceId!==n?!1:e.name.startsWith(mu)}function _u(e,t,n){let r=`${mu} ${t}:${n}:`;if(!e.name.startsWith(r))return;let i=e.name.slice(r.length),a=i.indexOf(` — `);if(!(a<=0))return i.slice(0,a)}function vu(e){let{port:t,logger:n,pluginId:r,serviceId:i}=e,a={added:0,updated:0,removed:0},o=new Map;for(let t of e.declared){let e=t?.key?.trim(),a=t?.cron?.trim();if(!e||!a){n.warn({pluginId:r,serviceId:i,key:t?.key},`plugin schedule subscription missing key or cron, skipped (RFC-327 D2)`);continue}if(o.has(e)){n.warn({pluginId:r,serviceId:i,key:e},`duplicate plugin schedule subscription key, later declaration ignored`);continue}o.set(e,{...t,key:e,cron:a})}let s=new Map;for(let e of t.list()){if(!gu(e,r,i))continue;let t=_u(e,r,i);t!==void 0&&s.set(t,e)}for(let[e,c]of o){let o=hu(r,i,c),l=s.get(e);if(!l){try{t.add({name:o,prompt:`plugin service subscription (${r}:${i}:${e})`,cronExpression:c.cron,recurring:!0,origin:`user`,subscriber:{kind:`plugin-service`,pluginId:r,serviceId:i}}),a.added+=1}catch(t){n.warn({pluginId:r,serviceId:i,key:e,err:t instanceof Error?t.message:String(t)},`failed to register plugin schedule subscription`)}continue}(l.cronExpression!==c.cron||l.name!==o)&&t.update(l.id,{cronExpression:c.cron,name:o})&&(a.updated+=1)}for(let[e,n]of s)o.has(e)||t.remove(n.id)&&(a.removed+=1);return a}function yu(e){let{port:t,pluginId:n}=e,r=0;for(let e of t.list()){let i=e.subscriber;!i||i.kind!==`plugin-service`||i.pluginId!==n||e.name.startsWith(mu)&&t.remove(e.id)&&(r+=1)}return r}var bu=class{axisName=`services`;startedByPlugin=new Map;scheduleDeclarations=new Map;constructor(e){this.deps=e}async register(e){let t=e.loaded.module.services;if(!t?.length)return;if(!e.plugin.manifest.capabilities?.includes(`service`)){this.deps.logger.warn({pluginId:e.plugin.id},`plugin declares services but not capabilities:["service"], skipped (fail-closed, RFC-287 D-M3-1)`);return}if(e.verdict.pendingCapabilities.includes(`service`)){this.deps.logger.warn({pluginId:e.plugin.id},`plugin capability "service" declared but not yet granted, skipping services (fail-closed)`);return}let n=e.loaded.compiledPath;if(!n){this.deps.logger.warn({pluginId:e.plugin.id},`plugin declares services but has no compiled entry path; services need a compiled module to run in the service worker (skipped)`);return}let r=this.startedByPlugin.get(e.plugin.id)??[];for(let i of t){if(!i?.id)continue;let t=this.deps.getWorkspaceKey(),a=this.deps.hasStorageCapability(e.plugin.id),{error:o}=await this.deps.pool.start({pluginId:e.plugin.id,serviceId:i.id,compiledPath:n,workspaceDir:this.deps.workspaceDir,workspaceKey:t,factoryCtx:{pluginId:e.plugin.id,pluginDir:e.plugin.dir,workspaceDir:this.deps.workspaceDir},hostCapabilities:this.deps.hostCapabilitiesFor(e.plugin.id),storageDir:a?this.deps.storageDirFor(e.plugin.id,t):``,hasStorageCapability:a,bridge:this.deps.bridgeFor(e.plugin.id)});o&&this.deps.logger.warn({pluginId:e.plugin.id,serviceId:i.id,err:o},`plugin service failed to start`),r.push(i.id),this.scheduleDeclarations.set(`${e.plugin.id}:${i.id}`,i.schedules??[]);let s=this.deps.getSchedulePort?.();if(i.schedules?.length){if(!s)this.deps.logger.debug({pluginId:e.plugin.id,serviceId:i.id,count:i.schedules.length},`plugin declares schedule subscriptions but no scheduler in this process, skipped (RFC-327 D2 boundary)`);else if(!o){let t=vu({port:s,logger:this.deps.logger,pluginId:e.plugin.id,serviceId:i.id,declared:i.schedules});(t.added||t.updated||t.removed)&&this.deps.logger.info({pluginId:e.plugin.id,serviceId:i.id,...t},`plugin schedule subscriptions reconciled`)}}else s&&vu({port:s,logger:this.deps.logger,pluginId:e.plugin.id,serviceId:i.id,declared:[]})}r.length>0&&this.startedByPlugin.set(e.plugin.id,r)}async unregister(e){if(!this.startedByPlugin.has(e))return;this.startedByPlugin.delete(e);for(let t of[...this.scheduleDeclarations.keys()])t.startsWith(`${e}:`)&&this.scheduleDeclarations.delete(t);let t=this.deps.getSchedulePort?.();if(t){let n=yu({port:t,pluginId:e});n>0&&this.deps.logger.info({pluginId:e,removed:n},`plugin schedule subscriptions revoked`)}await this.deps.pool.stopPlugin(e)}async unregisterAll(){for(let e of[...this.startedByPlugin.keys()])await this.unregister(e)}reconcileAllSchedules(){let e=this.deps.getSchedulePort?.();if(e)for(let[t,n]of this.startedByPlugin)for(let r of n){let n=this.scheduleDeclarations.get(`${t}:${r}`);if(n===void 0)continue;let i=vu({port:e,logger:this.deps.logger,pluginId:t,serviceId:r,declared:n});(i.added||i.updated||i.removed)&&this.deps.logger.info({pluginId:t,serviceId:r,...i,source:`scheduler-ready reconcile`},`plugin schedule subscriptions reconciled (M3 scheduler-ready)`)}}};const xu=/^[a-z0-9]+(?:-[a-z0-9]+)*$/,Su=x(n,`plugin-state`);function Cu(e){let t=wu(e);try{return Xr(t,{recursive:!0,force:!0}),{removed:!D(t),dir:t}}catch{return{removed:!1,dir:t}}}function wu(e){if(!xu.test(e))throw Error(`invalid pluginId for scoped storage: ${e} (must be kebab-case)`);return x(Su,e)}var Tu=class{persistence;baseDir;pluginId;workspaceKey;constructor(e,t){if(this.pluginId=e,this.workspaceKey=t,!xu.test(e))throw Error(`invalid pluginId for scoped storage: ${e} (must be kebab-case)`);if(typeof t!=`string`||t.length===0||t.includes(`/`)||t.includes(`\\`)||t.includes(`..`))throw Error(`invalid workspaceKey for scoped storage: ${t}`);if(s()){this.baseDir=`:memory:/plugin-state/${e}/${t}`,this.persistence=sn({type:`memory`});return}let n=S(x(wu(e),t));O(n,{recursive:!0});let r=Jr(n),i=Jr(Su);if(r!==i&&!r.startsWith(i+`/`))throw Error(`scoped storage path escapes plugin-state root: ${r}`);this.baseDir=n,this.persistence=sn({type:`file`,baseDir:n})}async save(e,t){await this.persistence.save({id:e,data:t,version:1,metadata:{}})}async load(e){let t=await this.persistence.load(e);return t?t.data:null}delete(e){return this.persistence.delete(e)}list(){return this.persistence.list()}};function Eu(e){let t=new Set([...e.manifest.codeProviderIds??[],...(e.manifest.contributes?.providers??[]).filter(e=>e.preserveProviderId===!0).map(e=>e.id)]),n=`${e.id}:`;return e=>t.has(e)||e.startsWith(n)}function Du(e,t,n){let r=e.manifest.capabilities??[],i={},a=!1,o=n.startPluginJob;r.includes(`agent.dispatch`)&&!t.pendingCapabilities.includes(`agent.dispatch`)&&o?(i.startJob=async t=>{let r=n.getSessionId?.();if(!r)throw Error(`agent.dispatch unavailable: no active session to attach the job to`);return{jobId:o({pluginId:e.id,title:t.title,prompt:t.prompt,sessionId:r}).id}},a=!0):r.includes(`agent.dispatch`)&&n.logger.warn({pluginId:e.id,pending:t.pendingCapabilities.includes(`agent.dispatch`)},`plugin declares agent.dispatch but it is not available (not yet granted, or host provides no job dispatcher) — skipping (fail-closed, RFC-287 D2)`);let s=n.getSessionMessages,c=ku(n);r.includes(`session.read`)&&!t.pendingCapabilities.includes(`session.read`)&&s?(i.readTranscript=async t=>{if(!c.isSessionAuthorized(e.id,t.sessionId))throw Error(`session not authorized for this plugin`);let n=s(t.sessionId);if(!n)throw Error(`session not found`);if(!c.tryConsumeRead(e.id))throw Error(`readTranscript quota exceeded for this notification`);return dl(n,t.sinceIndex??0,500)},a=!0):r.includes(`session.read`)&&n.logger.warn({pluginId:e.id,pending:t.pendingCapabilities.includes(`session.read`)},`plugin declares session.read but it is not available (not yet granted, or host provides no transcript source) — skipping (fail-closed, RFC-318 D2)`);let l=n.completeText;r.includes(`llm.complete`)&&!t.pendingCapabilities.includes(`llm.complete`)&&l?(i.complete=async t=>{if(t.prompt.length>32e3)throw Error(`prompt exceeds 32000 chars limit`);let n=c.tryConsumeLlm(e.id);if(!n.ok)throw Error(`llm.complete quota exceeded (${n.reason})`);let r=Math.min(t.maxTokens??2048,2048);return l(t.prompt,{maxTokens:r})},a=!0):r.includes(`llm.complete`)&&n.logger.warn({pluginId:e.id,pending:t.pendingCapabilities.includes(`llm.complete`)},`plugin declares llm.complete but it is not available (not yet granted, or host provides no model caller) — skipping (fail-closed, RFC-318 D2)`);let u=n.askUser;r.includes(`user.ask`)&&!t.pendingCapabilities.includes(`user.ask`)&&u?(i.ask=async t=>u(e.id,{header:String(t.header??``),question:String(t.question??``),background:String(t.background??``),recommendation:String(t.recommendation??``),...Array.isArray(t.options)?{options:t.options}:{},...t.allowFreeform===void 0?{}:{allowFreeform:!!t.allowFreeform},...t.multiSelect===void 0?{}:{multiSelect:!!t.multiSelect},...Array.isArray(t.evidence)?{evidence:t.evidence.map(String)}:{}}),a=!0):r.includes(`user.ask`)&&n.logger.warn({pluginId:e.id,pending:t.pendingCapabilities.includes(`user.ask`)},`plugin declares user.ask but it is not available (not yet granted, or host provides no UI sink) — skipping (fail-closed, RFC-344 M3)`);let d=n.notifyUser;return r.includes(`user.notify`)&&!t.pendingCapabilities.includes(`user.notify`)&&d?(i.notify=async t=>{if(!c.tryConsumeNotify(e.id)){n.logger.debug({pluginId:e.id,code:t.code},`plugin user.notify dropped: rate limit exceeded (silent by design, RFC-327 D3)`);return}let r=t.message.replace(/[\u0000-\u001f\u007f-\u009f\u200e\u200f\u202a-\u202e\u2066-\u2069]/g,` `).slice(0,500);d({pluginId:e.id,level:t.level,code:t.code.slice(0,120),message:r})},a=!0):r.includes(`user.notify`)&&n.logger.warn({pluginId:e.id,pending:t.pendingCapabilities.includes(`user.notify`)},`plugin declares user.notify but it is not available (not yet granted, or host provides no UI sink) — skipping (fail-closed, RFC-327 D3)`),a?i:void 0}const Ou=new WeakMap;function ku(e){if(e.capabilityQuota)return e.capabilityQuota;let t=Ou.get(e);return t||(t=new Tc,Ou.set(e,t)),t}const Au=new Map([[`oauthProviderFactories`,`provider`],[`providerFactories`,`provider`],[`wireProtocols`,`wire-protocol`]]);function ju(e){let t=e.manifest.contributes;return!t||typeof t!=`object`?[]:Object.keys(t)}var Mu=class e{contributesSnapshot=new Map;static DEACTIVATE_TIMEOUT_MS=5e3;hooksAxis;monitorsAxis;feedbackAxis;sigilAxis;computedCommandsAxis;computedAgentsAxis;computedSkillsAxis;oauthProviderAxis;codeProviderAxis;wireProtocolAxis;toolsAxis;servicesAxis;axisHandlers;firedEvents=new Set;deferredIds=new Set;loadedModules=new Map;constructor(e){this.deps=e,this.hooksAxis=new Ll(e.hookRegistry),this.monitorsAxis=new Rl(e.hookRegistry,e.logger),this.feedbackAxis=new zl(e.feedbackRegistry,e.logger),this.sigilAxis=new ql(e.sigilResolverRegistry,e.pluginInput,e.logger),this.computedCommandsAxis=new Jl,this.computedAgentsAxis=new Yl,this.computedSkillsAxis=new Xl(e.skillRegistry),this.oauthProviderAxis=new uu(e.authStore,e.logger),this.codeProviderAxis=new du(e.providerRegistry,e.modelRegistry,e.logger),this.wireProtocolAxis=new fu(e.wireProtocolRegistry,e.logger),this.toolsAxis=new pu(e.toolRegistry,e.logger),this.servicesAxis=new bu({pool:e.servicePool??al(),logger:e.logger,workspaceDir:e.workspaceDir,getWorkspaceKey:()=>e.getWorkspaceKey?.()??`default`,bridgeFor:t=>{let n=e.activePlugins().find(e=>e.id===t);if(!n)return{};let r=Du(n,E(n),e);if(!r)return{};let i={};return r.startJob&&(i.startJob=r.startJob),r.readTranscript&&(i.readTranscript=r.readTranscript),r.complete&&(i.complete=r.complete),r.notify&&(i.notify=r.notify),i},hostCapabilitiesFor:t=>{let n=e.activePlugins().find(e=>e.id===t);if(!n)return[];let r=Du(n,E(n),e);if(!r)return[];let i=[];return r.startJob&&i.push(`startJob`),r.readTranscript&&i.push(`readTranscript`),r.complete&&i.push(`complete`),r.notify&&i.push(`notify`),i},storageDirFor:(e,t)=>new Tu(e,t).baseDir,hasStorageCapability:t=>!!e.activePlugins().find(e=>e.id===t)?.manifest.capabilities?.includes(`storage`),...e.getSchedulePort?{getSchedulePort:e.getSchedulePort}:{}}),this.axisHandlers=[this.hooksAxis,this.monitorsAxis,this.feedbackAxis,this.sigilAxis,this.computedCommandsAxis,this.computedAgentsAxis,this.computedSkillsAxis,this.oauthProviderAxis,this.codeProviderAxis,this.wireProtocolAxis,this.toolsAxis,this.servicesAxis]}get deferredPluginIds(){return this.deferredIds}emitMonitorEvent(e){return this.monitorsAxis.dispatch(e)}reconcileServiceSchedules(){this.servicesAxis.reconcileAllSchedules()}get monitorPluginIds(){return this.monitorsAxis.monitorPluginIds}async activateOn(e,t){return this.firedEvents.add(e),this.reload(t)}get commands(){return this.computedCommandsAxis.getComputedCommands()}async callOnDeactivate(t,n){let r;try{await Promise.race([n(),new Promise((n,i)=>{r=setTimeout(()=>{i(Error(`plugin "${t}" onDeactivate timed out after ${e.DEACTIVATE_TIMEOUT_MS}ms`))},e.DEACTIVATE_TIMEOUT_MS),r.unref?.()})])}catch(e){this.deps.logger.warn({pluginId:t,err:String(e)},`plugin onDeactivate failed or timed out`)}finally{r!==void 0&&clearTimeout(r)}}async unregisterAllAxes(){for(let e of this.axisHandlers)await e.unregisterAll()}async unregisterPluginAxes(e,t){let n=t?E(t):void 0;for(let r of this.axisHandlers){let i=Au.get(r.axisName);i!==void 0&&t!==void 0&&n!==void 0&&t.manifest.capabilities?.some(e=>e===i)&&!n.gated&&!n.pendingCapabilities.includes(i)||await r.unregister(e)}ku(this.deps).reset(e)}pluginSignature(e){let t=E(e),n=`${t.gated?`gated`:`ok`}:${[...t.pendingCapabilities].sort().join(`,`)}`,r=`nofile`;for(let t of[`plugin.ts`,`plugin.tsx`])try{let n=Zr(x(e.dir,t));r=`${t}:${n.mtimeMs}:${n.size}`;break}catch{}return`${JSON.stringify(e.manifest)}|${n}|${r}`}async reload(e){let t=this.deps.activePlugins(),n=new Map(t.map(e=>[e.id,e])),r=new Map(t.map(e=>[e.id,this.pluginSignature(e)])),i=[],a=new Set,o=new Set;for(let[e,t]of this.loadedModules)n.get(e)?r.get(e)!==t.signature&&(t.module.module.onDeactivate&&i.push({pluginId:e,onDeactivate:t.module.module.onDeactivate}),o.add(e)):(t.module.module.onDeactivate&&i.push({pluginId:e,onDeactivate:t.module.module.onDeactivate}),a.add(e));for(let{pluginId:e,onDeactivate:t}of i)await this.callOnDeactivate(e,t);for(let e of a)await this.unregisterPluginAxes(e,void 0),this.loadedModules.delete(e);for(let e of o)await this.unregisterPluginAxes(e,n.get(e));this.computedAgentsAxis.setExistingAgentNames(e);let s=new Set;for(let e of this.deps.activePlugins()){if(!Il(ir(e.manifest),this.firedEvents)){s.add(e.id);continue}if(this.loadedModules.get(e.id)&&!o.has(e.id))continue;let t={pluginId:e.id,pluginDir:e.dir,workspaceDir:this.deps.workspaceDir,callMcpTool:(e,t,n)=>this.deps.callMcpTool(e,t,n),logger:{debug:t=>{this.deps.logger.debug({pluginId:e.id},t)},info:t=>{this.deps.logger.info({pluginId:e.id},t),oc(e.id,`info`,t)},warn:t=>{this.deps.logger.warn({pluginId:e.id},t),oc(e.id,`warn`,t)},error:t=>{this.deps.logger.error({pluginId:e.id},t),oc(e.id,`error`,t)}},getWireProtocol:e=>this.deps.wireProtocolRegistry?.get(e),resolveProviderCredential:(()=>{let t=Eu(e);return e=>t(e)?this.deps.providerRegistry?.resolveAccessKey(e)??Promise.resolve(null):Promise.resolve(null)})(),resolveProviderAuth:(()=>{let t=Eu(e);return e=>t(e)?this.deps.providerRegistry?.resolveAuth(e)??Promise.resolve(null):Promise.resolve(null)})(),host:Du(e,E(e),this.deps),listActivePlugins:()=>this.deps.activePlugins().map(e=>({id:e.id,version:e.manifest.version,capabilities:e.manifest.capabilities??[],contributes:this.contributesSnapshot.get(e.id)??ju(e)}))},n=this.deps.useIsolatedLoading!==!1&&Nl(e)?await Fl(e,t,void 0,this.deps.onPluginLoadError):await Xc(e,t,this.deps.onPluginLoadError);if(!n)continue;let i=E(e);if(i.gated){this.deps.logger.warn({pluginId:e.id},`project plugin not trusted, skipping code axes (fail-closed, RFC-124 C1)`);continue}let a;if(e.manifest.capabilities?.includes(`storage`))try{let t=this.deps.getWorkspaceKey?.()??Si;a=new Tu(e.id,t)}catch(t){this.deps.logger.warn({pluginId:e.id,err:String(t)},`failed to construct scoped storage for plugin, storage capability unavailable`)}let c={plugin:e,verdict:i,loaded:n,host:Du(e,i,this.deps),workspaceDir:this.deps.workspaceDir,storage:a};for(let e of this.axisHandlers)await e.register(c);if(n.module.onActivate)try{await n.module.onActivate()}catch(t){this.deps.logger.warn({pluginId:e.id,err:String(t)},`plugin onActivate threw`)}this.contributesSnapshot.set(e.id,ju(e)),this.loadedModules.set(e.id,{module:n,manifest:e.manifest,signature:r.get(e.id)??this.pluginSignature(e)})}return this.deferredIds=s,this.computedAgentsAxis.getAppendedAgents()}async cleanup(){for(let[e,t]of this.loadedModules)t.module.module.onDeactivate&&await this.callOnDeactivate(e,t.module.module.onDeactivate);this.loadedModules.clear(),await this.unregisterAllAxes();let e=ku(this.deps);for(let t of this.deps.activePlugins())e.reset(t.id);this.firedEvents.clear()}};const Nu=C(`@x-otto/coding:panel-compiler`),Pu=e(import.meta.url);function Fu(e){let t=x(e,`panels`);if(!D(t))return{compiled:[],errors:[],skipped:!0};let n;try{n=Kr(t).filter(e=>e.endsWith(`.tsx`))}catch{return{compiled:[],errors:[],skipped:!0}}if(n.length===0)return{compiled:[],errors:[],skipped:!0};let r=x(e,`panels-dist`);O(r,{recursive:!0});let i=Wr(x(Be(),`otto-panel-shims-`)),a=x(i,`react-shim.js`),o=x(i,`ink-shim.js`),s=x(i,`tui-shim.js`);A(a,`const R = globalThis.React
367
+ })`}`}var ml=class{pending=new Map;idCounter=0;boundPluginId=``;hostCallDispatcher=null;setHostCallDispatcher(e){this.hostCallDispatcher=e}constructor(e){this.adapter=e,this.adapter.onMessage(e=>{if(e.type===z.loaded){let t=this.settlePending(`__load__`);t&&t.resolve(e.module);return}if(e.type===z.error){let t=this.settlePending(`__load__`);t&&t.reject(Error(e.error??this.adapter.loadFailedMessage?.()??`plugin isolated transport load failed`));return}if(e.type===z.toolResult){let t=this.settlePending(e.id);t&&t.resolve({result:e.result,error:e.error});return}if(e.type===z.sigilResult){let t=this.settlePending(e.id);t&&t.resolve({result:e.result,error:e.error});return}if(e.type===z.activated||e.type===z.deactivated){let t=this.settlePending(e.id);t&&t.resolve({error:e.error});return}if(e.type===z.hostCall){let t=this.boundPluginId,n=this.hostCallDispatcher,r=t=>{try{this.adapter.send({type:z.hostResult,id:e.id,...t})}catch{}};if(!n){r({error:`host call dispatcher not installed (plugin host capabilities unavailable)`});return}n(t,e.method??``,e.args??[]).then(e=>r({result:e})).catch(e=>r({error:e instanceof Error?e.message:String(e)}));return}}),this.adapter.onError(e=>{this.adapter.onErrorLog?.(e),this.rejectAllPending(e)}),this.adapter.onExit(e=>{if(this.pending.size===0)return;this.adapter.onExitLog?.(e);let t=this.adapter.exitErrorMessage?.(e)??`plugin isolated transport exited unexpectedly (code ${e})`;this.rejectAllPending(Error(t))})}rejectAllPending(e){for(let[,t]of this.pending)t.type===`load`?t.reject(e):t.resolve({error:e.message});this.pending.clear(),this.adapter.unref()}syncRefState(){this.pending.size>0?this.adapter.ref():this.adapter.unref()}trackPending(e,t){this.pending.set(e,t),this.syncRefState()}settlePending(e){let t=this.pending.get(e);return t&&(this.pending.delete(e),this.syncRefState()),t}async load(e,t,n){if(this.pending.has(`__load__`))throw Error(this.adapter.alreadyLoadingMessage?.(e)??`plugin isolated transport already loading ${e}`);return this.boundPluginId=e,new Promise((r,i)=>{this.trackPending(`__load__`,{type:`load`,resolve:r,reject:i}),this.adapter.send({type:z.load,pluginId:e,compiledPath:t,ctx:n,...n.hostMethods?{hostMethods:n.hostMethods}:{},...n.hostExternals?{hostExternals:n.hostExternals}:{}})})}async executeTool(e,t,n){let r=`tool-${++this.idCounter}`,i=n?.timeoutMs??6e4,a=n?.signal;return a?.aborted?{error:`plugin tool execution aborted`}:new Promise(n=>{let o,s,c=()=>{o!==void 0&&clearTimeout(o),s&&a&&a.removeEventListener(`abort`,s)};this.trackPending(r,{type:`tool`,resolve:e=>{c(),n(e)}});let l=e=>{let t=this.settlePending(r);if(t){try{this.adapter.send({type:z.toolCancel,id:r})}catch{}t.resolve({error:e})}};i>0&&(o=setTimeout(()=>{this.adapter.onToolTimeout?.(e,i),l(`plugin tool "${e}" timed out after ${i}ms`)},i),o.unref?.()),a&&(s=()=>l(`plugin tool execution aborted`),a.addEventListener(`abort`,s,{once:!0})),this.adapter.send({type:z.toolExecute,id:r,name:e,params:t})})}async resolveSigil(e,t,n,r){let i=`sigil-${++this.idCounter}`,a=r?.timeoutMs??6e4;return new Promise(r=>{let o;this.trackPending(i,{type:`sigil`,resolve:e=>{o!==void 0&&clearTimeout(o),r(e)}}),a>0&&(o=setTimeout(()=>{let t=this.settlePending(i);t&&t.resolve({error:`sigil resolver "${e}" timed out after ${a}ms`})},a),o.unref?.()),this.adapter.send({type:z.sigilResolve,id:i,name:e,param:t,ctx:n})})}async activate(){let e=`lifecycle-${++this.idCounter}`;return new Promise(t=>{this.trackPending(e,{type:`lifecycle`,resolve:t}),this.adapter.send({type:z.onActivate,id:e})})}async deactivate(){let e=`lifecycle-${++this.idCounter}`;return new Promise(t=>{this.trackPending(e,{type:`lifecycle`,resolve:t}),this.adapter.send({type:z.onDeactivate,id:e})})}clearPending(){this.pending.clear()}};const hl=C(`@x-otto/coding:plugin-worker-pool`);let gl=null,_l=null;function vl(){return _l||(gl||=Wr(x(Be(),`otto-plugin-worker-`)),_l=x(gl,`worker-entry.cjs`),A(_l,pl(`worker`)),_l)}var yl=class extends ml{worker;constructor(){let e=new Pi(vl());e.unref(),super({send:t=>e.postMessage(t),onMessage:t=>e.on(`message`,e=>t(e)),onError:t=>e.on(`error`,e=>t(e)),onExit:t=>e.on(`exit`,t),ref:()=>e.ref(),unref:()=>e.unref(),onToolTimeout:(e,t)=>{hl.warn({tool:e,timeoutMs:t},`plugin tool execution timed out`)},onErrorLog:e=>{hl.warn({err:String(e)},`plugin worker error`)},onExitLog:e=>{hl.warn({code:e},`plugin worker exited unexpectedly with pending requests`)},exitErrorMessage:e=>`plugin worker exited unexpectedly (code ${e})`,loadFailedMessage:()=>`plugin worker load failed`,alreadyLoadingMessage:e=>`plugin worker already loading ${e}`}),this.worker=e}async stop(){try{this.worker.postMessage({type:z.stop}),await this.worker.terminate()}catch{}this.clearPending(),this.worker.unref()}},bl=class{workers=new Map;maxConcurrent;hostCallDispatcher=null;constructor(e=8){this.maxConcurrent=e}setHostCallDispatcher(e){this.hostCallDispatcher=e}async load(e,t,n){if(this.workers.size>=this.maxConcurrent)return null;await this.unload(e);let r=new yl;this.hostCallDispatcher&&r.setHostCallDispatcher(this.hostCallDispatcher),this.workers.set(e,r);try{return await r.load(e,t,n)}catch(t){throw this.workers.delete(e),r.stop().catch(()=>{}),t}}async executeTool(e,t,n,r){let i=this.workers.get(e);if(!i)throw Error(`no worker for plugin ${e}`);return i.executeTool(t,n,r)}async resolveSigil(e,t,n,r,i){let a=this.workers.get(e);if(!a)throw Error(`no worker for plugin ${e}`);return a.resolveSigil(t,n,r,i)}async activate(e){let t=this.workers.get(e);if(!t)throw Error(`no worker for plugin ${e}`);return t.activate()}async deactivate(e){let t=this.workers.get(e);if(!t)throw Error(`no worker for plugin ${e}`);return t.deactivate()}async unload(e){let t=this.workers.get(e);t&&(this.workers.delete(e),await t.stop())}async dispose(){let e=[...this.workers.values()];if(this.workers.clear(),gl){try{Xr(gl,{recursive:!0,force:!0})}catch{}gl=null,_l=null}await Promise.all(e.map(e=>e.stop().catch(()=>{})))}get size(){return this.workers.size}};const xl=C(`@x-otto/coding:plugin-process-pool`);let Sl=null,Cl=null;function wl(){return Cl||(Sl||=Wr(x(Be(),`otto-plugin-process-`)),Cl=x(Sl,`process-entry.cjs`),A(Cl,pl(`process`)),Cl)}var Tl=class extends ml{child;sandboxToDispose;constructor(e){let t=wl(),n=process.execPath,r=[t],i=n,a=r,o;if(Re()){let t=Fe({network:`deny`}),s=t.wrap({command:n,args:r,options:{timeout:0,cwd:e},projectRoot:e});i=s.command,a=s.args,o=t}else xl.warn(`No platform sandbox available for project/repository scope plugin isolation — falling back to plain child_process (still process-isolated, but without OS-level file/network constraints)`);let s=Oi(i,a,{cwd:e,stdio:[`ignore`,`ignore`,`pipe`,`ipc`]});s.unref(),super({send:e=>s.send(e),onMessage:e=>s.on(`message`,t=>e(t)),onError:e=>s.on(`error`,t=>e(t)),onExit:e=>s.on(`exit`,e),ref:()=>{s.channel?.ref(),s.stderr?.ref?.()},unref:()=>{s.channel?.unref(),s.stderr?.unref?.()},onToolTimeout:(e,t)=>{xl.warn({tool:e,timeoutMs:t},`plugin tool execution timed out (isolated process)`)},onErrorLog:e=>{xl.warn({err:String(e)},`plugin process error`)},onExitLog:e=>{xl.warn({code:e},`plugin process exited unexpectedly with pending requests`)},exitErrorMessage:e=>`plugin process exited unexpectedly (code ${e})`,loadFailedMessage:()=>`plugin process load failed`,alreadyLoadingMessage:e=>`plugin process already loading ${e}`}),this.child=s,this.sandboxToDispose=o,this.child.stderr?.on(`data`,e=>{xl.warn({stderr:e.toString().slice(0,500)},`plugin process stderr output`)}),this.child.on(`exit`,()=>{this.sandboxToDispose?.dispose().catch(()=>void 0),this.sandboxToDispose=void 0})}async stop(){try{this.child.send({type:z.stop})}catch{}try{this.child.kill()}catch{}this.clearPending()}},El=class{processes=new Map;maxConcurrent;hostCallDispatcher=null;constructor(e=4){this.maxConcurrent=e}setHostCallDispatcher(e){this.hostCallDispatcher=e}async load(e,t,n){if(this.processes.size>=this.maxConcurrent)return null;await this.unload(e);let r=new Tl(n.workspaceDir);this.hostCallDispatcher&&r.setHostCallDispatcher(this.hostCallDispatcher),this.processes.set(e,r);try{return await r.load(e,t,n)}catch(t){throw this.processes.delete(e),r.stop().catch(()=>{}),t}}async executeTool(e,t,n,r){let i=this.processes.get(e);if(!i)throw Error(`no process for plugin ${e}`);return i.executeTool(t,n,r)}async resolveSigil(e,t,n,r,i){let a=this.processes.get(e);if(!a)throw Error(`no process for plugin ${e}`);return a.resolveSigil(t,n,r,i)}async activate(e){let t=this.processes.get(e);if(!t)throw Error(`no process for plugin ${e}`);return t.activate()}async deactivate(e){let t=this.processes.get(e);if(!t)throw Error(`no process for plugin ${e}`);return t.deactivate()}async unload(e){let t=this.processes.get(e);t&&(this.processes.delete(e),await t.stop())}async dispose(){let e=[...this.processes.values()];if(this.processes.clear(),Sl){try{Xr(Sl,{recursive:!0,force:!0})}catch{}Sl=null,Cl=null}await Promise.all(e.map(e=>e.stop().catch(()=>{})))}get size(){return this.processes.size}};const Dl=C(`@x-otto/coding:plugin-module-loader-isolated`);let Ol=null;function kl(){return Ol||=new bl,Ol}let Al=null;function jl(){return Al||=new El,Al}async function Ml(){await Promise.all([Ol?.dispose()??Promise.resolve(),Al?.dispose()??Promise.resolve()])}function Nl(e){return e===`project`||e===`repository`?jl():kl()}function Pl(e){return!!e.manifest.capabilities?.includes(`tools`)}function Fl(e,t,n){let r={};if(t.contributions&&(r.contributions=t.contributions),t.tools.length>0&&(r.tools=t.tools.map(t=>({name:t.name,description:t.description||t.name,parameters:{safeParse(e){return t.hasParameters?{success:!0,data:e}:{success:!0,data:{}}},...t.parametersSchema===void 0?{}:{toJSONSchema:()=>t.parametersSchema}},async execute(r,i){let{result:a,error:o}=await n.executeTool(e,t.name,r,{signal:i?.signal});if(o)throw Error(o);return a&&typeof a==`object`&&Array.isArray(a.content)?a:{content:[{type:`text`,text:typeof a==`string`?a:JSON.stringify(a??null)}]}}}))),t.hasSigilProviders&&Dl.warn({pluginId:e},`plugin declares sigilProviders but is loaded via the isolated path (tools capability) — dynamic @ search providers are not proxied over RPC and will be inactive; declare input.resolver without tools to use the in-process path, or use static sigilEntries`),t.sigilResolvers?.length>0){r.sigilResolvers={};for(let i of t.sigilResolvers)r.sigilResolvers[i.name]={resolve:(t,r)=>n.resolveSigil(e,i.name,t,r,{timeoutMs:i.timeoutMs}).then(e=>{if(e.error)throw Error(e.error);return e.result??``}),timeoutMs:i.timeoutMs,uiHostOnly:i.uiHostOnly}}return t.hasOnActivate&&(r.onActivate=async()=>{let{error:t}=await n.activate(e);if(t)throw Error(t)}),t.hasOnDeactivate&&(r.onDeactivate=async()=>{let{error:t}=await n.deactivate(e);if(t)throw Error(t)}),r}async function Il(e,t,n,r){if((e.scope===`project`||e.scope===`repository`)&&!Zn(e.dir))return Dl.warn({pluginId:e.id},`project/repository plugin not trusted, skipping isolated code module (fail-closed)`),null;let i=E(e);if(i.pendingCapabilities.length>0)return Dl.warn({pluginId:e.id,pendingCapabilities:i.pendingCapabilities},`plugin declares high-risk capabilities not yet granted, skipping isolated code module before worker execution (fail-closed, RFC-140 D3)`),null;let a=n??Nl(e.scope),o=Xc(e.dir);try{o?Dl.info({pluginId:e.id,compiledPath:o},`using prebuilt plugin module (isolated path, RFC-150 D5)`):o=await Hc(e.dir)}catch(t){let n=String(t);return Dl.warn({pluginId:e.id,err:n},`plugin.ts compile failed (isolated path)`),r?.(e.id,`compile failed: ${n}`),null}if(!o)return null;let s=[...Object.keys(t.host??{}),`listActivePlugins`];if(t.host&&Object.keys(t.host).length>0||t.listActivePlugins){let e=t.host;a.setHostCallDispatcher?.(async(n,r,i)=>{if(r===`listActivePlugins`)return t.listActivePlugins?t.listActivePlugins():[];if(!e||typeof e[r]!=`function`)throw Error(`host method '${r}' not available (not declared or not granted)`);if(!(r in e))throw Error(`host method '${r}' not in whitelist`);let a=e[r];return a(...i)})}try{let n=await a.load(e.id,o,{pluginId:t.pluginId,pluginDir:t.pluginDir,workspaceDir:t.workspaceDir,hostMethods:s,listActivePlugins:!0,hostExternals:zc()});if(n===null){if(e.scope===`project`||e.scope===`repository`){let t=`plugin process pool exhausted (project/repository scope requires isolated execution, refusing to downgrade to in-process)`;return Dl.warn({pluginId:e.id},t),r?.(e.id,t),null}return Dl.info({pluginId:e.id},`plugin worker pool exhausted, falling back to in-process load`),Zc(e,t,r)}return{pluginId:e.id,module:Fl(e.id,n,a),compiledPath:o}}catch(t){let n=String(t);return Dl.warn({pluginId:e.id,err:n},`plugin.ts worker load failed`),r?.(e.id,`worker load failed: ${n}`),null}}function Ll(e,t){return e.includes(`onStartup`)?!0:e.some(e=>t.has(e))}var Rl=class{axisName=`hooks`;hookNamesByPlugin=new Map;constructor(e){this.hookRegistry=e}register(e){let t=e.loaded.module.hooks;if(t){let n=dc(e.plugin.id,t);this.hookRegistry.registerAll(n);let r=this.hookNamesByPlugin.get(e.plugin.id)??[];r.push(...n.map(e=>e.name)),this.hookNamesByPlugin.set(e.plugin.id,r)}}unregister(e){let t=this.hookNamesByPlugin.get(e);if(t){for(let e of t)this.hookRegistry.unregister(e);this.hookNamesByPlugin.delete(e)}}unregisterAll(){for(let e of[...this.hookNamesByPlugin.keys()])this.unregister(e)}},zl=class{axisName=`monitors`;hookNamesByPlugin=new Map;monitorsByPlugin=new Map;constructor(e,t){this.hookRegistry=e,this.logger=t}register(e){let t=e.loaded.module.monitors;if(!t?.length)return;if(!e.plugin.manifest.capabilities?.includes(`monitor`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares monitors but not capabilities:["monitor"], skipped (fail-closed)`);return}let n=bc(e.plugin.id,t);this.hookRegistry.registerAll(n);let r=this.hookNamesByPlugin.get(e.plugin.id)??[];r.push(...n.map(e=>e.name)),this.hookNamesByPlugin.set(e.plugin.id,r),this.monitorsByPlugin.set(e.plugin.id,t)}unregister(e){let t=this.hookNamesByPlugin.get(e);if(t){for(let e of t)this.hookRegistry.unregister(e);this.hookNamesByPlugin.delete(e)}this.monitorsByPlugin.delete(e)}unregisterAll(){for(let e of[...this.hookNamesByPlugin.keys()])this.unregister(e)}async dispatch(e){for(let[t,n]of this.monitorsByPlugin)for(let r of n)try{await r.onEvent(e)}catch(n){this.logger.warn({pluginId:t,monitorId:r.id,eventType:e.type,err:String(n)},`plugin monitor onEvent threw (host event), isolated`)}}get monitorPluginIds(){return[...this.monitorsByPlugin.keys()]}},Bl=class{axisName=`feedback`;feedbackRegisteredSources=new Set;constructor(e,t){this.feedbackRegistry=e,this.logger=t}register(e){let t=e.loaded.module.feedbackProviders;if(!(!t||!this.feedbackRegistry)){if(!e.plugin.manifest.capabilities?.includes(`feedback`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares feedbackProviders but not capabilities:["feedback"], skipped (fail-closed)`);return}this.feedbackRegistry.register(t,e.plugin.id)?this.feedbackRegisteredSources.add(e.plugin.id):this.logger.warn({pluginId:e.plugin.id},`plugin feedbackProviders rejected (already registered by a different plugin)`)}}unregister(e){!this.feedbackRegistry||!this.feedbackRegisteredSources.has(e)||(this.feedbackRegistry.unregister(e),this.feedbackRegisteredSources.delete(e))}unregisterAll(){for(let e of[...this.feedbackRegisteredSources])this.unregister(e)}};const Vl=C(`@x-otto/coding:plugin-sigil-loader`);function Hl(e){return e.startsWith(`!`)||e.startsWith(`#`)}function Ul(e){let t=[];for(let n of e){let e=n.manifest.contributes?.sigilEntries;if(e?.length){if(E(n).gated){Vl.warn({pluginId:n.id},`plugin gated (untrusted), sigilEntries skipped`);continue}for(let r of e){if(Hl(r.value)){Vl.warn({pluginId:n.id,label:r.label},`sigilEntries value starts with '!' or '#' (mode-prefix collision), skipped`);continue}t.push({label:r.label,value:r.value,kind:r.kind,description:r.description,source:n.id,resolverId:r.resolverId?`${n.id}:${r.resolverId}`:void 0})}}}return t}function Wl(e){for(let t of e)t.manifest.contributes?.inputEntries&&Vl.warn({pluginId:t.id},`contributes.inputEntries is deprecated (RFC-210); migrate to contributes.sigilEntries (inline array) — the file-path form is no longer loaded`)}function Gl(e,t){let n=[];for(let[r,i]of Object.entries(t)){let t=`${e}:${r}`;typeof i==`function`?n.push({id:t,resolve:i}):i&&typeof i.resolve==`function`?n.push({id:t,resolve:i.resolve,timeoutMs:i.timeoutMs,uiHostOnly:i.uiHostOnly}):Vl.warn({pluginId:e,name:r},`sigilResolvers entry is neither function nor {resolve}, skipped`)}return n}function Kl(e,t){return t.map(t=>async(n,r)=>(await t(n,r)).filter(e=>!Hl(e.value)).map(t=>({...t,source:e})))}function ql(e,t){for(let n of e)n.resolverId&&!t(n.resolverId)&&Vl.warn({label:n.label,resolverId:n.resolverId,source:n.source},`sigilEntries.resolverId has no matching resolver (declared sigilResolvers missing or capability not granted) — entry will pass through unexpanded at submit`)}var Jl=class{axisName=`sigil`;sigilResolverSourcePluginIds=new Set;sigilProviderUnsubsByPlugin=new Map;constructor(e,t,n){this.sigilResolverRegistry=e,this.pluginInput=t,this.logger=n}register(e){let t=e.loaded.module.sigilResolvers,n=e.loaded.module.sigilProviders;if(t&&Object.keys(t).length>0||n?.length){if(!e.plugin.manifest.capabilities?.includes(`input.resolver`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares sigilResolvers/sigilProviders but not capabilities:["input.resolver"], skipped (fail-closed)`);return}if(e.verdict.pendingCapabilities.includes(`input.resolver`)){this.logger.warn({pluginId:e.plugin.id},`plugin capability "input.resolver" declared but not yet granted, skipping sigil axes (fail-closed)`);return}if(t&&this.sigilResolverRegistry){let n=Gl(e.plugin.id,t);n.length>0&&(this.sigilResolverRegistry.register(n,e.plugin.id),this.sigilResolverSourcePluginIds.add(e.plugin.id))}if(n?.length&&this.pluginInput){let t=this.sigilProviderUnsubsByPlugin.get(e.plugin.id)??[];for(let r of Kl(e.plugin.id,n))t.push(this.pluginInput.registerProvider(`@`,r));this.sigilProviderUnsubsByPlugin.set(e.plugin.id,t)}if(this.sigilResolverRegistry){let t=this.sigilResolverRegistry;ql(Ul([e.plugin]),e=>t.get(e)!==void 0)}}}unregister(e){this.sigilResolverRegistry&&this.sigilResolverSourcePluginIds.has(e)&&(this.sigilResolverRegistry.unregisterBySource(e),this.sigilResolverSourcePluginIds.delete(e));let t=this.sigilProviderUnsubsByPlugin.get(e);if(t){for(let e of t)try{e()}catch{}this.sigilProviderUnsubsByPlugin.delete(e)}}unregisterAll(){let e=new Set([...this.sigilResolverSourcePluginIds,...this.sigilProviderUnsubsByPlugin.keys()]);for(let t of e)this.unregister(t)}},Yl=class{axisName=`computedCommands`;commandsByPlugin=new Map;register(e){let t=e.loaded.module.contributions?.commands;if(t?.length&&e.plugin.scope!==`builtin`){let n=this.commandsByPlugin.get(e.plugin.id)??[];n.push(...fc(e.plugin.id,e.plugin.scope,e.plugin.dir,t)),this.commandsByPlugin.set(e.plugin.id,n)}}unregister(e){this.commandsByPlugin.delete(e)}unregisterAll(){}resetForReload(){this.commandsByPlugin.clear()}getComputedCommands(){return[...this.commandsByPlugin.values()].flat()}},Xl=class{axisName=`computedAgents`;profilesByPlugin=new Map;existingAgentNames=new Set;register(e){let t=e.loaded.module.contributions?.agents;if(!t?.length)return;let n=this.profilesByPlugin.get(e.plugin.id)??[];n.push(...pc(t)),this.profilesByPlugin.set(e.plugin.id,n)}unregister(e){this.profilesByPlugin.delete(e)}unregisterAll(){}setExistingAgentNames(e){this.existingAgentNames=e}resetForReload(e){this.profilesByPlugin.clear(),this.existingAgentNames=e}getAppendedAgents(){let e=new Set(this.existingAgentNames),t=[];for(let n of this.profilesByPlugin.values())for(let r of n)e.has(r.name)||(e.add(r.name),t.push(r));return t}},Zl=class{axisName=`computedSkills`;skillNamesByPlugin=new Map;constructor(e){this.skillRegistry=e}register(e){let t=e.loaded.module.contributions?.skills;if(!t?.length||!this.skillRegistry)return;let n=this.skillNamesByPlugin.get(e.plugin.id)??[];for(let{definition:r,source:i}of mc(e.plugin.id,e.plugin.dir,t))this.skillRegistry.get(r.metadata.name)||(this.skillRegistry.register(r,i),n.push(r.metadata.name));n.length>0&&this.skillNamesByPlugin.set(e.plugin.id,n)}unregister(e){let t=this.skillNamesByPlugin.get(e);if(t){for(let e of t)this.skillRegistry?.unregister(e);this.skillNamesByPlugin.delete(e)}}unregisterAll(){for(let e of[...this.skillNamesByPlugin.keys()])this.unregister(e)}};const B=C(`@x-otto/coding:plugin-provider-loader`);function Ql(e){let t=C(`wire-protocol:${e}`),n=e=>(t,...n)=>e(t,...n);return{debug:n(t.debug.bind(t)),info:n(t.info.bind(t)),warn:n(t.warn.bind(t)),error:n(t.error.bind(t))}}function V(e,t){return`${e}:${t}`}function $l(e){return new Set([...(e.contributes?.providers??[]).filter(e=>e.preserveProviderId===!0&&e.oauthRef).map(e=>e.oauthRef),...e.codeProviderIds??[]])}function eu(e,t){let n=$l(t);return new Set((t.contributes?.oauth??[]).map(t=>n.has(t.id)?t.id:V(e,t.id)))}function tu(e,t){return new Set((t.contributes?.providers??[]).filter(e=>e.catalogOnly!==!0&&e.baseUrl&&e.wireApi).map(t=>t.preserveProviderId===!0?t.id:V(e,t.id)))}function nu(e,t,n){return new Set([...n.codeProviderIds??[],...(n.contributes?.providers??[]).filter(e=>e.preserveProviderId===!0).map(e=>e.id)]).has(t)?t:V(e,t)}function ru(e){return`code:${e}`}function iu(e,t,n,r,i,a,o){let s=e.id.indexOf(`/`),c=s>=0?e.id.slice(s+1):e.id;return{id:e.id,name:c,api:n,provider:t,baseUrl:r,reasoning:e.reasoning??!1,input:e.input??[`text`],cost:e.cost,contextWindow:e.contextWindow,maxOutputTokens:e.maxOutput,imageConstraints:i,supportsTools:a,strengths:e.strengths,thinkingLevels:e.thinkingLevels,thinkingMode:e.thinkingMode,responseBodyPolicy:o}}function au(e,t,n,r,i){return(a,o)=>{let s=e.url.replace(`{baseUrl}`,r??``).replace(`{clientVersion}`,process.env.OTTO_CODEX_CLIENT_VERSION||`1.0.0`),c=e.authScheme??`bearer`,l=c===`x-api-key`||c===`auto`&&o.mode!==`oauth`?{"x-api-key":a}:{authorization:`Bearer ${a}`};return c===`auto`&&o.mode===`oauth`&&o.beta&&e.betaHeaderName&&(l[e.betaHeaderName]=o.beta),{url:s,headers:{...i,...e.headers,...l},mergeProvider:t,modelApi:n,modelIdExclude:e.modelIdExclude}}}function ou(e,t,n,r,i,a){return()=>{let o=r.get(a);if(!o)throw new Ke(`wire protocol '${a}' is not registered — is its provider plugin installed and trusted? (RFC-148)`,{code:`WIRE_PROTOCOL_NOT_REGISTERED`});return o.create({resolveAuth:()=>t.resolveAuth(n).then(e=>e??void 0),resolveBaseUrl:async()=>i,headers:e.headers,tokenDerivedHeaders:e.tokenDerivedHeaders,allowAuthHeaderOverride:e.allowAuthHeaderOverride,logger:Ql(a)})}}function su(e,t,n,r,i,a,o){let s=t.contributes?.oauth;if(s?.length&&n)if(t.capabilities?.includes(`provider`))for(let t of s){let s=r.has(t.id)?t.id:V(e,t.id);if(f.includes(t.id)||n.isReservedId(t.id)){a.rejected.push({id:t.id,reason:`oauth id collides with builtin reserved OAuth provider`}),B.warn({pluginId:e,oauthId:t.id},`plugin oauth id collides with builtin reserved, rejected (R3)`);continue}let c=t.name??i.get(t.id)??t.id,l=t.kind===`pkce`?Ri({...t,id:s,name:c,tokenExchangeEncoding:t.tokenExchangeEncoding??`form`,assumesLoopbackAlways:t.assumesLoopbackAlways??!1,subscriptionScoped:t.subscriptionScoped??!1}):Li({...t,id:s,name:c,allowCustomDomain:t.allowCustomDomain??!1});if(o?.has(s))n.replace(l,e);else if(!n.register(l,e)){a.rejected.push({id:t.id,reason:`oauth registration rejected (id already claimed by another plugin or reserved)`});continue}}else{B.warn({pluginId:e},`plugin declares contributes.oauth but not capabilities:["provider"], skipped (fail-closed)`);for(let e of s)a.rejected.push({id:e.id,reason:`capability "provider" not declared`})}}function cu(e,t,n,r,i,a){let o=t.contributes?.providers;if(!o?.length)return;if(!t.capabilities?.includes(`provider`)){B.warn({pluginId:e},`plugin declares contributes.providers but not capabilities:["provider"], skipped (fail-closed)`);for(let e of o)i.rejected.push({id:e.id,reason:`capability "provider" not declared`});return}let s=new Set;for(let t of o){if(i.registered.includes(t.id)){i.rejected.push({id:t.id,reason:`duplicate provider id in manifest`}),B.warn({pluginId:e,providerId:t.id},`duplicate provider id in manifest, second entry rejected (review F5)`);continue}if(ae(t.id)){i.rejected.push({id:t.id,reason:`reserved builtin provider id`}),B.warn({pluginId:e,providerId:t.id},`plugin provider id collides with builtin, rejected (R3)`);continue}let o=t.preserveProviderId===!0,c=o?t.id:V(e,t.id),l=o?t.id:V(e,t.id);if(t.catalogOnly===!0){let a=l;if(t.oauthRef){let n=o?t.oauthRef:V(e,t.oauthRef);if(!r?.get(n)){i.rejected.push({id:t.id,reason:`oauthRef '${t.oauthRef}' not found in current plugin's oauth table (R7)`}),B.warn({pluginId:e,providerId:t.id,oauthRef:t.oauthRef},`catalog provider oauthRef not found, rejected (R7)`);continue}a=n}if(t.envKey&&!n.authStore.registerEnvKey(l,t.envKey,e)){i.rejected.push({id:t.id,reason:`envKey registration rejected (reserved or claimed)`});continue}if(!le({id:l,name:t.name,env:t.oauthRef?void 0:t.envKey,requiresIntranet:t.requiresIntranet===!0},e)){i.rejected.push({id:t.id,reason:`provider descriptor id already claimed`}),t.envKey&&n.authStore.unregisterEnvKey(l);continue}if(t.models?.length){let r=t.models.map(e=>iu(e,a,c,t.baseUrl??``,void 0,t.supportsTools,t.responseBodyPolicy)),i=n.modelRegistry.registerWithSource(r,e);for(let t of i)B.warn({pluginId:e,modelId:t},`plugin model id collides, rejected`)}i.registered.push(t.id);continue}let u=l;if(t.oauthRef){let n=o?t.oauthRef:V(e,t.oauthRef);if(!r?.get(n)){i.rejected.push({id:t.id,reason:`oauthRef '${t.oauthRef}' not found in current plugin's oauth table (R7: cross-plugin/invalid ref rejected)`}),B.warn({pluginId:e,providerId:t.id,oauthRef:t.oauthRef},`provider oauthRef not found in current plugin oauth table, rejected (R7)`);continue}u=n,t.envKey&&B.warn({pluginId:e,providerId:t.id},`provider declares both oauthRef and envKey; ignoring envKey (R2, oauth takes priority)`)}if(t.envKey&&!t.oauthRef&&!n.authStore.registerEnvKey(l,t.envKey,e)){i.rejected.push({id:t.id,reason:`envKey registration rejected (reserved or claimed by another plugin)`});continue}let d=t.baseUrl,f=t.wireApi;if(!d||!f){i.rejected.push({id:t.id,reason:`baseUrl and wireApi required for non-catalog providers`});continue}let p=t.modelsEndpoint?au(t.modelsEndpoint,l,c,t.baseUrl,t.headers):void 0,m=()=>{t.oauthRef&&r&&!s.has(u)&&r.unregister(u)};if(!le({id:l,name:t.name,env:t.oauthRef?void 0:t.envKey,buildModelsRequest:p,requiresIntranet:t.requiresIntranet===!0},e)){i.rejected.push({id:t.id,reason:`provider descriptor id already claimed by another plugin`}),t.envKey&&!t.oauthRef&&n.authStore.unregisterEnvKey(l),m();continue}t.allowAuthHeaderOverride&&B.warn({pluginId:e,providerId:t.id},`provider declares allowAuthHeaderOverride: custom headers may replace auth headers (RFC-270 D3)`);let h=ou(t,n.authStore,u,n.wireProtocolRegistry,d,f);if(!(a?.has(c)?n.providerRegistry.replacePluginProvider(c,h,e):n.providerRegistry.registerPluginProvider(c,h,e))){i.rejected.push({id:t.id,reason:`api already registered by another plugin or reserved`}),pe(l),t.envKey&&!t.oauthRef&&n.authStore.unregisterEnvKey(l),m();continue}if(t.models?.length){let r=t.models.map(e=>iu(e,u,c,d,t.imageConstraints,t.supportsTools,t.responseBodyPolicy)),i=n.modelRegistry.registerWithSource(r,e);for(let t of i)B.warn({pluginId:e,modelId:t},`plugin model id collides with an existing model, rejected (no silent override)`)}i.registered.push(t.id),t.oauthRef&&s.add(u)}}function lu(e,t,n,r,i){let a={registered:[],rejected:[]},o=n.authStore.oauth;return su(e,t,o,$l(t),new Map((t.contributes?.providers??[]).filter(e=>e.oauthRef&&e.name).map(e=>[e.oauthRef,e.name])),a,r),cu(e,t,n,o,a,i),a}async function uu(e,t,n,r,i){let a=n.authStore.oauth,o=$l(t),s=t.contributes?.oauth;if(s?.length&&a)for(let t of s){let n=o.has(t.id)?t.id:V(e,t.id);r?.has(n)||a.unregister(n)}let c=t.contributes?.providers;if(c?.length){for(let t of c){let r=t.preserveProviderId===!0?t.id:V(e,t.id);pe(r),t.envKey&&!t.oauthRef&&n.authStore.unregisterEnvKey(r)}await n.providerRegistry.unregisterBySource(e,i),n.modelRegistry.unregisterBySource(e)}}var du=class{axisName=`oauthProviderFactories`;oauthIdsByPlugin=new Map;constructor(e,t){this.authStore=e,this.logger=t}register(e){let t=e.loaded.module.oauthProviderFactories;if(!t||!this.authStore)return;if(!e.plugin.manifest.capabilities?.includes(`provider`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares oauthProviderFactories but not capabilities:["provider"], skipped (fail-closed)`);return}if(e.verdict.pendingCapabilities.includes(`provider`)){this.logger.warn({pluginId:e.plugin.id},`plugin capability "provider" not yet granted, skipping oauthProviderFactories (fail-closed)`);return}let n=new Set((e.plugin.manifest.contributes?.providers??[]).filter(e=>e.preserveProviderId===!0&&e.oauthRef).map(e=>e.oauthRef));for(let[r,i]of Object.entries(t)){let t=_c(e.plugin.id,i);if(!t)continue;let a=n.has(r)?r:V(e.plugin.id,r);if(t.id!==a){this.logger.warn({pluginId:e.plugin.id,name:r,expectedId:a,actualId:t.id},`plugin oauth provider id mismatch with manifest oauthRef/preserveProviderId, skipped`);continue}if(this.authStore.oauth.register(t,e.plugin.id)){let n=this.oauthIdsByPlugin.get(e.plugin.id)??new Set;n.add(t.id),this.oauthIdsByPlugin.set(e.plugin.id,n)}else this.logger.warn({pluginId:e.plugin.id,oauthId:t.id},`plugin oauthProviderFactory rejected (reserved or claimed)`)}}unregister(e){if(!this.authStore)return;let t=this.oauthIdsByPlugin.get(e);if(t){for(let e of t)this.authStore.oauth.unregister(e);this.oauthIdsByPlugin.delete(e)}}unregisterAll(){for(let e of[...this.oauthIdsByPlugin.keys()])this.unregister(e)}},fu=class{axisName=`providerFactories`;providerSourcePluginIds=new Set;modelSourcePluginIds=new Set;descriptorIdsByPlugin=new Map;constructor(e,t,n){this.providerRegistry=e,this.modelRegistry=t,this.logger=n}register(e){let t=e.loaded.module.providerFactories;if(!t||!this.providerRegistry)return;if(!e.plugin.manifest.capabilities?.includes(`provider`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares providerFactories but not capabilities:["provider"], skipped (fail-closed)`);return}if(e.verdict.pendingCapabilities.includes(`provider`)){this.logger.warn({pluginId:e.plugin.id},`plugin capability "provider" declared but not yet granted, skipping providerFactories (fail-closed, RFC-124 C2)`);return}let n=e.plugin.manifest.codeProviderModelsEndpoints??{},r=e.plugin.manifest.codeProviderModels??{};for(let[i,a]of Object.entries(t)){let t=nu(e.plugin.id,i,e.plugin.manifest);if(!this.providerRegistry.registerPluginProvider(t,gc(e.plugin.id,a),ru(e.plugin.id))){this.logger.warn({pluginId:e.plugin.id,api:t},`plugin providerFactory rejected (reserved builtin or claimed by another plugin)`);continue}this.providerSourcePluginIds.add(e.plugin.id);let o=n[i];if(o)if(le({id:t,buildModelsRequest:au(o,t,t)},ru(e.plugin.id))){let n=this.descriptorIdsByPlugin.get(e.plugin.id)??new Set;n.add(t),this.descriptorIdsByPlugin.set(e.plugin.id,n)}else this.logger.warn({pluginId:e.plugin.id,api:t},`plugin codeProviderModelsEndpoints descriptor rejected (reserved builtin or claimed by another plugin)`);let s=r[i];if(s?.models?.length&&this.modelRegistry){let n=s.models.map(e=>iu(e,t,t,s.baseUrl,s.imageConstraints,s.supportsTools,s.responseBodyPolicy)),r=this.modelRegistry.registerWithSource(n,e.plugin.id);this.modelSourcePluginIds.add(e.plugin.id),r.length>0&&this.logger.warn({pluginId:e.plugin.id,rejectedModelIds:r},`plugin codeProviderModels contains model ids already claimed by another source, rejected`)}}}async unregister(e){this.providerRegistry&&this.providerSourcePluginIds.has(e)&&(await this.providerRegistry.unregisterBySource(ru(e)),this.providerSourcePluginIds.delete(e)),this.modelRegistry&&this.modelSourcePluginIds.has(e)&&(this.modelRegistry.unregisterBySource(e),this.modelSourcePluginIds.delete(e));let t=this.descriptorIdsByPlugin.get(e);if(t){for(let e of t)pe(e);this.descriptorIdsByPlugin.delete(e)}}async unregisterAll(){let e=new Set([...this.providerSourcePluginIds,...this.modelSourcePluginIds,...this.descriptorIdsByPlugin.keys()]);for(let t of e)await this.unregister(t)}},pu=class{axisName=`wireProtocols`;wireProtocolSourcePluginIds=new Set;cacheReportingApisByPlugin=new Map;constructor(e,t){this.wireProtocolRegistry=e,this.logger=t}register(e){let t=e.loaded.module.wireProtocols;if(!(!t||!this.wireProtocolRegistry)){if(!e.plugin.manifest.capabilities?.includes(`wire-protocol`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares wireProtocols but not capabilities:["wire-protocol"], skipped (fail-closed)`);return}if(e.verdict.pendingCapabilities.includes(`wire-protocol`)){this.logger.warn({pluginId:e.plugin.id},`plugin capability "wire-protocol" declared but not yet granted, skipping wireProtocols (fail-closed, RFC-124 C2 pattern)`);return}for(let[n,r]of Object.entries(t))if(this.wireProtocolRegistry.register(n,r,e.plugin.id)){if(this.wireProtocolSourcePluginIds.add(e.plugin.id),r.meta?.reportsCacheTokens){ce(n);let t=this.cacheReportingApisByPlugin.get(e.plugin.id)??new Set;t.add(n),this.cacheReportingApisByPlugin.set(e.plugin.id,t)}}else this.logger.warn({pluginId:e.plugin.id,wireApi:n},`plugin wireProtocol rejected (already registered by another plugin, first-win)`)}}unregister(e){this.wireProtocolRegistry&&this.wireProtocolSourcePluginIds.has(e)&&(this.wireProtocolRegistry.unregisterBySource(e),this.wireProtocolSourcePluginIds.delete(e));let t=this.cacheReportingApisByPlugin.get(e);if(t){for(let e of t)fe(e);this.cacheReportingApisByPlugin.delete(e)}}unregisterAll(){let e=new Set([...this.wireProtocolSourcePluginIds,...this.cacheReportingApisByPlugin.keys()]);for(let t of e)this.unregister(t)}},mu=class{axisName=`tools`;toolSourcePluginIds=new Set;constructor(e,t){this.toolRegistry=e,this.logger=t}register(e){let t=e.loaded.module.tools;if(!t?.length||!this.toolRegistry)return;if(!e.plugin.manifest.capabilities?.includes(`tools`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares tools but not capabilities:["tools"], skipped (fail-closed)`);return}if(e.verdict.pendingCapabilities.includes(`tools`)){this.logger.warn({pluginId:e.plugin.id},`plugin capability "tools" declared but not yet granted, skipping tools (fail-closed, RFC-124 C2)`);return}let n=this.toolRegistry,r={workspaceDir:e.workspaceDir,logger:{info:t=>this.logger.info({pluginId:e.plugin.id},t),warn:t=>this.logger.warn({pluginId:e.plugin.id},t),error:t=>this.logger.error({pluginId:e.plugin.id},t)},host:e.host,storage:e.storage},i=t.map(t=>yc(e.plugin.id,t,r)).filter(e=>e!==null).filter(t=>n.has(t.name)?(this.logger.warn({pluginId:e.plugin.id,tool:t.name},`plugin tool name collides with an existing tool, rejected (R3, no silent override)`),!1):!0);i.length>0&&(n.register(i,{preset:`full`,source:e.plugin.id}),this.toolSourcePluginIds.add(e.plugin.id))}unregister(e){!this.toolRegistry||!this.toolSourcePluginIds.has(e)||(this.toolRegistry.unregisterBySource(e),this.toolSourcePluginIds.delete(e))}unregisterAll(){for(let e of[...this.toolSourcePluginIds])this.unregister(e)}};const hu=`[plugin]`;function gu(e,t,n){let r=n.name?.trim()||n.key;return`${hu} ${e}:${t}:${n.key} — ${r}`}function _u(e,t,n){let r=e.subscriber;return!r||r.kind!==`plugin-service`||r.pluginId!==t||r.serviceId!==n?!1:e.name.startsWith(hu)}function vu(e,t,n){let r=`${hu} ${t}:${n}:`;if(!e.name.startsWith(r))return;let i=e.name.slice(r.length),a=i.indexOf(` — `);if(!(a<=0))return i.slice(0,a)}function yu(e){let{port:t,logger:n,pluginId:r,serviceId:i}=e,a={added:0,updated:0,removed:0},o=new Map;for(let t of e.declared){let e=t?.key?.trim(),a=t?.cron?.trim();if(!e||!a){n.warn({pluginId:r,serviceId:i,key:t?.key},`plugin schedule subscription missing key or cron, skipped (RFC-327 D2)`);continue}if(o.has(e)){n.warn({pluginId:r,serviceId:i,key:e},`duplicate plugin schedule subscription key, later declaration ignored`);continue}o.set(e,{...t,key:e,cron:a})}let s=new Map;for(let e of t.list()){if(!_u(e,r,i))continue;let t=vu(e,r,i);t!==void 0&&s.set(t,e)}for(let[e,c]of o){let o=gu(r,i,c),l=s.get(e);if(!l){try{t.add({name:o,prompt:`plugin service subscription (${r}:${i}:${e})`,cronExpression:c.cron,recurring:!0,origin:`user`,subscriber:{kind:`plugin-service`,pluginId:r,serviceId:i}}),a.added+=1}catch(t){n.warn({pluginId:r,serviceId:i,key:e,err:t instanceof Error?t.message:String(t)},`failed to register plugin schedule subscription`)}continue}(l.cronExpression!==c.cron||l.name!==o)&&t.update(l.id,{cronExpression:c.cron,name:o})&&(a.updated+=1)}for(let[e,n]of s)o.has(e)||t.remove(n.id)&&(a.removed+=1);return a}function bu(e){let{port:t,pluginId:n}=e,r=0;for(let e of t.list()){let i=e.subscriber;!i||i.kind!==`plugin-service`||i.pluginId!==n||e.name.startsWith(hu)&&t.remove(e.id)&&(r+=1)}return r}var xu=class{axisName=`services`;startedByPlugin=new Map;scheduleDeclarations=new Map;constructor(e){this.deps=e}async register(e){let t=e.loaded.module.services;if(!t?.length)return;if(!e.plugin.manifest.capabilities?.includes(`service`)){this.deps.logger.warn({pluginId:e.plugin.id},`plugin declares services but not capabilities:["service"], skipped (fail-closed, RFC-287 D-M3-1)`);return}if(e.verdict.pendingCapabilities.includes(`service`)){this.deps.logger.warn({pluginId:e.plugin.id},`plugin capability "service" declared but not yet granted, skipping services (fail-closed)`);return}let n=e.loaded.compiledPath;if(!n){this.deps.logger.warn({pluginId:e.plugin.id},`plugin declares services but has no compiled entry path; services need a compiled module to run in the service worker (skipped)`);return}let r=this.startedByPlugin.get(e.plugin.id)??[];for(let i of t){if(!i?.id)continue;let t=this.deps.getWorkspaceKey(),a=this.deps.hasStorageCapability(e.plugin.id),{error:o}=await this.deps.pool.start({pluginId:e.plugin.id,serviceId:i.id,compiledPath:n,workspaceDir:this.deps.workspaceDir,workspaceKey:t,factoryCtx:{pluginId:e.plugin.id,pluginDir:e.plugin.dir,workspaceDir:this.deps.workspaceDir},hostCapabilities:this.deps.hostCapabilitiesFor(e.plugin.id),storageDir:a?this.deps.storageDirFor(e.plugin.id,t):``,hasStorageCapability:a,bridge:this.deps.bridgeFor(e.plugin.id)});o&&this.deps.logger.warn({pluginId:e.plugin.id,serviceId:i.id,err:o},`plugin service failed to start`),r.push(i.id),this.scheduleDeclarations.set(`${e.plugin.id}:${i.id}`,i.schedules??[]);let s=this.deps.getSchedulePort?.();if(i.schedules?.length){if(!s)this.deps.logger.debug({pluginId:e.plugin.id,serviceId:i.id,count:i.schedules.length},`plugin declares schedule subscriptions but no scheduler in this process, skipped (RFC-327 D2 boundary)`);else if(!o){let t=yu({port:s,logger:this.deps.logger,pluginId:e.plugin.id,serviceId:i.id,declared:i.schedules});(t.added||t.updated||t.removed)&&this.deps.logger.info({pluginId:e.plugin.id,serviceId:i.id,...t},`plugin schedule subscriptions reconciled`)}}else s&&yu({port:s,logger:this.deps.logger,pluginId:e.plugin.id,serviceId:i.id,declared:[]})}r.length>0&&this.startedByPlugin.set(e.plugin.id,r)}async unregister(e){if(!this.startedByPlugin.has(e))return;this.startedByPlugin.delete(e);for(let t of[...this.scheduleDeclarations.keys()])t.startsWith(`${e}:`)&&this.scheduleDeclarations.delete(t);let t=this.deps.getSchedulePort?.();if(t){let n=bu({port:t,pluginId:e});n>0&&this.deps.logger.info({pluginId:e,removed:n},`plugin schedule subscriptions revoked`)}await this.deps.pool.stopPlugin(e)}async unregisterAll(){for(let e of[...this.startedByPlugin.keys()])await this.unregister(e)}reconcileAllSchedules(){let e=this.deps.getSchedulePort?.();if(e)for(let[t,n]of this.startedByPlugin)for(let r of n){let n=this.scheduleDeclarations.get(`${t}:${r}`);if(n===void 0)continue;let i=yu({port:e,logger:this.deps.logger,pluginId:t,serviceId:r,declared:n});(i.added||i.updated||i.removed)&&this.deps.logger.info({pluginId:t,serviceId:r,...i,source:`scheduler-ready reconcile`},`plugin schedule subscriptions reconciled (M3 scheduler-ready)`)}}};const Su=/^[a-z0-9]+(?:-[a-z0-9]+)*$/,Cu=x(n,`plugin-state`);function wu(e){let t=Tu(e);try{return Xr(t,{recursive:!0,force:!0}),{removed:!D(t),dir:t}}catch{return{removed:!1,dir:t}}}function Tu(e){if(!Su.test(e))throw Error(`invalid pluginId for scoped storage: ${e} (must be kebab-case)`);return x(Cu,e)}var Eu=class{persistence;baseDir;pluginId;workspaceKey;constructor(e,t){if(this.pluginId=e,this.workspaceKey=t,!Su.test(e))throw Error(`invalid pluginId for scoped storage: ${e} (must be kebab-case)`);if(typeof t!=`string`||t.length===0||t.includes(`/`)||t.includes(`\\`)||t.includes(`..`))throw Error(`invalid workspaceKey for scoped storage: ${t}`);if(s()){this.baseDir=`:memory:/plugin-state/${e}/${t}`,this.persistence=sn({type:`memory`});return}let n=S(x(Tu(e),t));O(n,{recursive:!0});let r=Jr(n),i=Jr(Cu);if(r!==i&&!r.startsWith(i+`/`))throw Error(`scoped storage path escapes plugin-state root: ${r}`);this.baseDir=n,this.persistence=sn({type:`file`,baseDir:n})}async save(e,t){await this.persistence.save({id:e,data:t,version:1,metadata:{}})}async load(e){let t=await this.persistence.load(e);return t?t.data:null}delete(e){return this.persistence.delete(e)}list(){return this.persistence.list()}};function Du(e){let t=new Set([...e.manifest.codeProviderIds??[],...(e.manifest.contributes?.providers??[]).filter(e=>e.preserveProviderId===!0).map(e=>e.id)]),n=`${e.id}:`;return e=>t.has(e)||e.startsWith(n)}function Ou(e,t,n){let r=e.manifest.capabilities??[],i={},a=!1,o=n.startPluginJob;r.includes(`agent.dispatch`)&&!t.pendingCapabilities.includes(`agent.dispatch`)&&o?(i.startJob=async t=>{let r=n.getSessionId?.();if(!r)throw Error(`agent.dispatch unavailable: no active session to attach the job to`);return{jobId:o({pluginId:e.id,title:t.title,prompt:t.prompt,sessionId:r}).id}},a=!0):r.includes(`agent.dispatch`)&&n.logger.warn({pluginId:e.id,pending:t.pendingCapabilities.includes(`agent.dispatch`)},`plugin declares agent.dispatch but it is not available (not yet granted, or host provides no job dispatcher) — skipping (fail-closed, RFC-287 D2)`);let s=n.getSessionMessages,c=Au(n);r.includes(`session.read`)&&!t.pendingCapabilities.includes(`session.read`)&&s?(i.readTranscript=async t=>{if(!c.isSessionAuthorized(e.id,t.sessionId))throw Error(`session not authorized for this plugin`);let n=s(t.sessionId);if(!n)throw Error(`session not found`);if(!c.tryConsumeRead(e.id))throw Error(`readTranscript quota exceeded for this notification`);return fl(n,t.sinceIndex??0,500)},a=!0):r.includes(`session.read`)&&n.logger.warn({pluginId:e.id,pending:t.pendingCapabilities.includes(`session.read`)},`plugin declares session.read but it is not available (not yet granted, or host provides no transcript source) — skipping (fail-closed, RFC-318 D2)`);let l=n.completeText;r.includes(`llm.complete`)&&!t.pendingCapabilities.includes(`llm.complete`)&&l?(i.complete=async t=>{if(t.prompt.length>32e3)throw Error(`prompt exceeds 32000 chars limit`);let n=c.tryConsumeLlm(e.id);if(!n.ok)throw Error(`llm.complete quota exceeded (${n.reason})`);let r=Math.min(t.maxTokens??2048,2048);return l(t.prompt,{maxTokens:r})},a=!0):r.includes(`llm.complete`)&&n.logger.warn({pluginId:e.id,pending:t.pendingCapabilities.includes(`llm.complete`)},`plugin declares llm.complete but it is not available (not yet granted, or host provides no model caller) — skipping (fail-closed, RFC-318 D2)`);let u=n.askUser;r.includes(`user.ask`)&&!t.pendingCapabilities.includes(`user.ask`)&&u?(i.ask=async t=>u(e.id,{header:String(t.header??``),question:String(t.question??``),background:String(t.background??``),recommendation:String(t.recommendation??``),...Array.isArray(t.options)?{options:t.options}:{},...t.allowFreeform===void 0?{}:{allowFreeform:!!t.allowFreeform},...t.multiSelect===void 0?{}:{multiSelect:!!t.multiSelect},...Array.isArray(t.evidence)?{evidence:t.evidence.map(String)}:{}}),a=!0):r.includes(`user.ask`)&&n.logger.warn({pluginId:e.id,pending:t.pendingCapabilities.includes(`user.ask`)},`plugin declares user.ask but it is not available (not yet granted, or host provides no UI sink) — skipping (fail-closed, RFC-344 M3)`);let d=n.notifyUser;return r.includes(`user.notify`)&&!t.pendingCapabilities.includes(`user.notify`)&&d?(i.notify=async t=>{if(!c.tryConsumeNotify(e.id)){n.logger.debug({pluginId:e.id,code:t.code},`plugin user.notify dropped: rate limit exceeded (silent by design, RFC-327 D3)`);return}let r=t.message.replace(/[\u0000-\u001f\u007f-\u009f\u200e\u200f\u202a-\u202e\u2066-\u2069]/g,` `).slice(0,500);d({pluginId:e.id,level:t.level,code:t.code.slice(0,120),message:r})},a=!0):r.includes(`user.notify`)&&n.logger.warn({pluginId:e.id,pending:t.pendingCapabilities.includes(`user.notify`)},`plugin declares user.notify but it is not available (not yet granted, or host provides no UI sink) — skipping (fail-closed, RFC-327 D3)`),a?i:void 0}const ku=new WeakMap;function Au(e){if(e.capabilityQuota)return e.capabilityQuota;let t=ku.get(e);return t||(t=new Ec,ku.set(e,t)),t}const ju=new Map([[`oauthProviderFactories`,`provider`],[`providerFactories`,`provider`],[`wireProtocols`,`wire-protocol`]]);function Mu(e){let t=e.manifest.contributes;return!t||typeof t!=`object`?[]:Object.keys(t)}var Nu=class e{contributesSnapshot=new Map;static DEACTIVATE_TIMEOUT_MS=5e3;hooksAxis;monitorsAxis;feedbackAxis;sigilAxis;computedCommandsAxis;computedAgentsAxis;computedSkillsAxis;oauthProviderAxis;codeProviderAxis;wireProtocolAxis;toolsAxis;servicesAxis;axisHandlers;firedEvents=new Set;deferredIds=new Set;loadedModules=new Map;constructor(e){this.deps=e,this.hooksAxis=new Rl(e.hookRegistry),this.monitorsAxis=new zl(e.hookRegistry,e.logger),this.feedbackAxis=new Bl(e.feedbackRegistry,e.logger),this.sigilAxis=new Jl(e.sigilResolverRegistry,e.pluginInput,e.logger),this.computedCommandsAxis=new Yl,this.computedAgentsAxis=new Xl,this.computedSkillsAxis=new Zl(e.skillRegistry),this.oauthProviderAxis=new du(e.authStore,e.logger),this.codeProviderAxis=new fu(e.providerRegistry,e.modelRegistry,e.logger),this.wireProtocolAxis=new pu(e.wireProtocolRegistry,e.logger),this.toolsAxis=new mu(e.toolRegistry,e.logger),this.servicesAxis=new xu({pool:e.servicePool??ol(),logger:e.logger,workspaceDir:e.workspaceDir,getWorkspaceKey:()=>e.getWorkspaceKey?.()??`default`,bridgeFor:t=>{let n=e.activePlugins().find(e=>e.id===t);if(!n)return{};let r=Ou(n,E(n),e);if(!r)return{};let i={};return r.startJob&&(i.startJob=r.startJob),r.readTranscript&&(i.readTranscript=r.readTranscript),r.complete&&(i.complete=r.complete),r.notify&&(i.notify=r.notify),i},hostCapabilitiesFor:t=>{let n=e.activePlugins().find(e=>e.id===t);if(!n)return[];let r=Ou(n,E(n),e);if(!r)return[];let i=[];return r.startJob&&i.push(`startJob`),r.readTranscript&&i.push(`readTranscript`),r.complete&&i.push(`complete`),r.notify&&i.push(`notify`),i},storageDirFor:(e,t)=>new Eu(e,t).baseDir,hasStorageCapability:t=>!!e.activePlugins().find(e=>e.id===t)?.manifest.capabilities?.includes(`storage`),...e.getSchedulePort?{getSchedulePort:e.getSchedulePort}:{}}),this.axisHandlers=[this.hooksAxis,this.monitorsAxis,this.feedbackAxis,this.sigilAxis,this.computedCommandsAxis,this.computedAgentsAxis,this.computedSkillsAxis,this.oauthProviderAxis,this.codeProviderAxis,this.wireProtocolAxis,this.toolsAxis,this.servicesAxis]}get deferredPluginIds(){return this.deferredIds}emitMonitorEvent(e){return this.monitorsAxis.dispatch(e)}reconcileServiceSchedules(){this.servicesAxis.reconcileAllSchedules()}get monitorPluginIds(){return this.monitorsAxis.monitorPluginIds}async activateOn(e,t){return this.firedEvents.add(e),this.reload(t)}get commands(){return this.computedCommandsAxis.getComputedCommands()}async callOnDeactivate(t,n){let r;try{await Promise.race([n(),new Promise((n,i)=>{r=setTimeout(()=>{i(Error(`plugin "${t}" onDeactivate timed out after ${e.DEACTIVATE_TIMEOUT_MS}ms`))},e.DEACTIVATE_TIMEOUT_MS),r.unref?.()})])}catch(e){this.deps.logger.warn({pluginId:t,err:String(e)},`plugin onDeactivate failed or timed out`)}finally{r!==void 0&&clearTimeout(r)}}async unregisterAllAxes(){for(let e of this.axisHandlers)await e.unregisterAll()}async unregisterPluginAxes(e,t){let n=t?E(t):void 0;for(let r of this.axisHandlers){let i=ju.get(r.axisName);i!==void 0&&t!==void 0&&n!==void 0&&t.manifest.capabilities?.some(e=>e===i)&&!n.gated&&!n.pendingCapabilities.includes(i)||await r.unregister(e)}Au(this.deps).reset(e)}pluginSignature(e){let t=E(e),n=`${t.gated?`gated`:`ok`}:${[...t.pendingCapabilities].sort().join(`,`)}`,r=`nofile`;for(let t of[`plugin.ts`,`plugin.tsx`])try{let n=Zr(x(e.dir,t));r=`${t}:${n.mtimeMs}:${n.size}`;break}catch{}return`${JSON.stringify(e.manifest)}|${n}|${r}`}async reload(e){let t=this.deps.activePlugins(),n=new Map(t.map(e=>[e.id,e])),r=new Map(t.map(e=>[e.id,this.pluginSignature(e)])),i=[],a=new Set,o=new Set;for(let[e,t]of this.loadedModules)n.get(e)?r.get(e)!==t.signature&&(t.module.module.onDeactivate&&i.push({pluginId:e,onDeactivate:t.module.module.onDeactivate}),o.add(e)):(t.module.module.onDeactivate&&i.push({pluginId:e,onDeactivate:t.module.module.onDeactivate}),a.add(e));for(let{pluginId:e,onDeactivate:t}of i)await this.callOnDeactivate(e,t);for(let e of a)await this.unregisterPluginAxes(e,void 0),this.loadedModules.delete(e);for(let e of o)await this.unregisterPluginAxes(e,n.get(e));this.computedAgentsAxis.setExistingAgentNames(e);let s=new Set;for(let e of this.deps.activePlugins()){if(!Ll(ir(e.manifest),this.firedEvents)){s.add(e.id);continue}if(this.loadedModules.get(e.id)&&!o.has(e.id))continue;let t={pluginId:e.id,pluginDir:e.dir,workspaceDir:this.deps.workspaceDir,callMcpTool:(e,t,n)=>this.deps.callMcpTool(e,t,n),logger:{debug:t=>{this.deps.logger.debug({pluginId:e.id},t)},info:t=>{this.deps.logger.info({pluginId:e.id},t),sc(e.id,`info`,t)},warn:t=>{this.deps.logger.warn({pluginId:e.id},t),sc(e.id,`warn`,t)},error:t=>{this.deps.logger.error({pluginId:e.id},t),sc(e.id,`error`,t)}},getWireProtocol:e=>this.deps.wireProtocolRegistry?.get(e),resolveProviderCredential:(()=>{let t=Du(e);return e=>t(e)?this.deps.providerRegistry?.resolveAccessKey(e)??Promise.resolve(null):Promise.resolve(null)})(),resolveProviderAuth:(()=>{let t=Du(e);return e=>t(e)?this.deps.providerRegistry?.resolveAuth(e)??Promise.resolve(null):Promise.resolve(null)})(),host:Ou(e,E(e),this.deps),listActivePlugins:()=>this.deps.activePlugins().map(e=>({id:e.id,version:e.manifest.version,capabilities:e.manifest.capabilities??[],contributes:this.contributesSnapshot.get(e.id)??Mu(e)}))},n=this.deps.useIsolatedLoading!==!1&&Pl(e)?await Il(e,t,void 0,this.deps.onPluginLoadError):await Zc(e,t,this.deps.onPluginLoadError);if(!n)continue;let i=E(e);if(i.gated){this.deps.logger.warn({pluginId:e.id},`project plugin not trusted, skipping code axes (fail-closed, RFC-124 C1)`);continue}let a;if(e.manifest.capabilities?.includes(`storage`))try{let t=this.deps.getWorkspaceKey?.()??Si;a=new Eu(e.id,t)}catch(t){this.deps.logger.warn({pluginId:e.id,err:String(t)},`failed to construct scoped storage for plugin, storage capability unavailable`)}let c={plugin:e,verdict:i,loaded:n,host:Ou(e,i,this.deps),workspaceDir:this.deps.workspaceDir,storage:a};for(let e of this.axisHandlers)await e.register(c);if(n.module.onActivate)try{await n.module.onActivate()}catch(t){this.deps.logger.warn({pluginId:e.id,err:String(t)},`plugin onActivate threw`)}this.contributesSnapshot.set(e.id,Mu(e)),this.loadedModules.set(e.id,{module:n,manifest:e.manifest,signature:r.get(e.id)??this.pluginSignature(e)})}return this.deferredIds=s,this.computedAgentsAxis.getAppendedAgents()}async cleanup(){for(let[e,t]of this.loadedModules)t.module.module.onDeactivate&&await this.callOnDeactivate(e,t.module.module.onDeactivate);this.loadedModules.clear(),await this.unregisterAllAxes();let e=Au(this.deps);for(let t of this.deps.activePlugins())e.reset(t.id);this.firedEvents.clear()}};const Pu=C(`@x-otto/coding:panel-compiler`),Fu=e(import.meta.url);function Iu(e){let t=x(e,`panels`);if(!D(t))return{compiled:[],errors:[],skipped:!0};let n;try{n=Kr(t).filter(e=>e.endsWith(`.tsx`))}catch{return{compiled:[],errors:[],skipped:!0}}if(n.length===0)return{compiled:[],errors:[],skipped:!0};let r=x(e,`panels-dist`);O(r,{recursive:!0});let i=Wr(x(Be(),`otto-panel-shims-`)),a=x(i,`react-shim.js`),o=x(i,`ink-shim.js`),s=x(i,`tui-shim.js`);A(a,`const R = globalThis.React
368
368
  if (!R) throw new Error('otto panel: globalThis.React 未注入(TUI 须在加载面板前 import panel-globals)')
369
369
  export default R
370
370
  export const useState = R.useState, useEffect = R.useEffect, useCallback = R.useCallback,
@@ -389,26 +389,26 @@ export const ScrollIndicatorBelow = T.ScrollIndicatorBelow
389
389
  export const Tabable = T.Tabable
390
390
  export const useTabable = T.useTabable
391
391
  export const TabScope = T.TabScope
392
- `);let c=[],l=[],{buildSync:u}=Pu(`esbuild`);for(let i of n){let n=i.replace(/\.tsx$/,`.mjs`);try{u({entryPoints:[x(t,i)],outfile:x(r,n),bundle:!0,format:`esm`,platform:`node`,alias:{react:a,ink:o,"@x-otto/tui":s},jsx:`transform`,banner:{js:`const { usePluginData } = globalThis.__ottoPanelRuntime || {};const { claim: claimPanelFocus, release: releasePanelFocus, usePanelFocusClaimed, requestClose: requestPanelClose, setHint: setPanelHint } = globalThis.__ottoPanelFocusBridge || { claim(){}, release(){}, usePanelFocusClaimed: () => true, requestClose(){}, setHint(){} };const { getTheme, getFigures } = globalThis.__ottoPanelTheme || { getTheme: () => ({ text: undefined, inactive: '#9498B8', secondary: '#C8CBDB', success: '#7EE095', error: '#FF9592', warning: '#FFC966', special: '#DD78C9', selection: '#4D7CFF', focusBorder: '#4D7CFF', panelBorder: '#9498B8' }), getFigures: () => ({ check: '✓', cross: '✗', pointer: '▶', bullet: '●' }) };const { SPACING, LAYOUT } = globalThis.__ottoPanelSpacing || { SPACING: { none: 0, tight: 1, section: 2, loose: 4 }, LAYOUT: { contentInset: 4, borderInset: 2 } };const { t: t, i18next: panelI18next } = globalThis.__ottoPanelI18n || { t: (k) => k, i18next: { language: 'en' } };const { usePanelBackend } = globalThis.__ottoPanelBackendRuntime || { usePanelBackend: () => ({ call: () => Promise.reject(new Error('otto panel: backend runtime not installed')), cancel(){}, state: undefined, status: 'disabled' }) };`},logLevel:`silent`}),c.push(x(`panels-dist`,n))}catch(t){l.push({entry:i,message:t.message}),Nu.warn({pluginDir:e,entry:i,err:String(t)},`panel compile failed`)}}return Nu.info({pluginDir:e,compiled:c.length,errors:l.length},`compiled plugin panels`),{compiled:c,errors:l,skipped:!1}}const Iu=C(`@x-otto/coding:plugin-install`);function Lu(e){let t=[];return(async()=>{try{let t=await Vc(e);t&&Iu.info({pluginDir:e,outfile:t},`plugin code module compiled at install time`)}catch(n){let r=n instanceof Error?n.message:String(n);Iu.warn({pluginDir:e,err:r},`plugin.ts compile failed at install time (fail-soft, will retry at load time)`),t.push(`plugin.ts 编译失败:${r}(不影响安装,otto 启动时会自动重试编译)`)}try{let{errors:n,skipped:r}=Fu(e);if(!r&&n.length>0)for(let r of n)Iu.warn({pluginDir:e,entry:r.entry,err:r.message},`plugin panel compile failed at install time`),t.push(`面板 ${r.entry} 编译失败:${r.message}`)}catch(n){let r=n instanceof Error?n.message:String(n);Iu.warn({pluginDir:e,err:r},`plugin panel compilation crashed unexpectedly at install time`),t.push(`面板编译异常:${r}`)}})().then(()=>t)}function Ru(e){try{return Ur(e).isSymbolicLink()}catch{return!1}}function zu(e){let t=k(e,`utf8`),n=[],r=!1;for(let e of t.split(`
393
- `)){let t=e.trim();if(t.startsWith(`packages:`)){r=!0;continue}if(r){let e=t.match(/^-\s*['"]?([^'"]+)['"]?(?:\s+#.*)?$/);if(e?.[1]){n.push(e[1]);continue}t.length>0&&!t.startsWith(`-`)&&(r=!1)}}return n}function Bu(e,t){let n=S(e,t.endsWith(`/*`)?t.slice(0,-2):t);if(!n.startsWith(e.endsWith(`/`)?e:e+`/`)&&n!==e)return[];if(!t.endsWith(`/*`))return D(n)?[n]:[];if(!D(n))return[];try{return Kr(n,{withFileTypes:!0}).filter(e=>e.isDirectory()).map(e=>x(n,e.name))}catch{return[]}}function Vu(e,t){let n=a(t);if(!n)return;let r=zu(x(n,`pnpm-workspace.yaml`));for(let t of r)for(let r of Bu(n,t)){let t=x(r,`package.json`);if(!D(t))continue;try{if(JSON.parse(k(t,`utf8`)).name===e)return r}catch{}let n=x(r,T);if(D(n))try{if($n(k(n,`utf8`),n)?.id===e)return r}catch{}}}function Hu(t,n=process.cwd()){let r=[Ii(x(n,`__resolve__.js`)).href,import.meta.url];for(let n of r)try{return b(e(n).resolve(`${t}/package.json`))}catch{}return Vu(t,b(Fi(import.meta.url)))??Vu(t,n)}async function Uu(e){let t=Hu(e.pkg,e.cwd);if(!t)throw Error(`无法解析包 ${e.pkg}(未安装或不可从当前位置解析)。`);let r=x(t,T);if(!D(r))throw Error(`${e.pkg} 不是 otto 插件:缺 ${T}(RFC-044 自描述)。`);let i=$n(k(r,`utf8`),r);if(!i)throw Error(`${e.pkg} 的 ${T} 非法(需合法 kebab-case id)。`);let a=e.ottoDir??n,o=x(a,`plugins`,i.id);O(x(a,`plugins`),{recursive:!0});let s=S(t);if(Ru(o)){try{if(S(qr(o))===s){let e=await Lu(t);return{id:i.id,packageDir:t,dir:o,created:!1,compileWarnings:e,version:i.version}}}catch{}$r(o)}else if(D(o))if((D(x(o,T))?$n(k(x(o,T),`utf8`),o):null)?.id===i.id)Xr(o,{recursive:!0,force:!0});else throw Error(`目标已存在且非本插件,拒绝覆盖:${o}`);Qr(s,o);let c=await Lu(t);return{id:i.id,packageDir:t,dir:o,created:!0,compileWarnings:c,version:i.version}}async function Wu(e){let t=x(e,T);if(!D(t))throw Error(`${e} 不是 otto 插件:缺 ${T}`);let r=$n(k(t,`utf8`),t);if(!r)throw Error(`${e} 的 ${T} 非法。`);let i=x(n,`plugins`,r.id);O(x(n,`plugins`),{recursive:!0});let a=S(e);if(Ru(i)){try{if(S(qr(i))===a){let t=await Lu(e);return{id:r.id,packageDir:e,dir:i,created:!1,compileWarnings:t,version:r.version}}}catch{}$r(i)}else if(D(i))if((D(x(i,T))?$n(k(x(i,T),`utf8`),i):null)?.id===r.id)Xr(i,{recursive:!0,force:!0});else throw Error(`目标已存在且非本插件,拒绝覆盖:${i}`);Qr(a,i);let o=await Lu(e);return{id:r.id,packageDir:e,dir:i,created:!0,compileWarnings:o,version:r.version}}function Gu(e,t){return[...e.filter(e=>e.id!==t.id),t]}function Ku(e,t){return e.filter(e=>e.id!==t)}async function qu(e,t,n=()=>Date.now()){let r=Gu(e.get(`installed_plugins`)??[],{id:t.id,source:t.source,sourceSpec:t.sourceSpec,installedAt:n(),version:t.version,scope:t.scope,capabilities:t.capabilities});await e.persist({installed_plugins:r})}async function Ju(e,t){let n={},r=!1,i=e.get(`installed_plugins`)??[];i.some(e=>e.id===t)&&(n.installed_plugins=Ku(i,t),r=!0);let a=e.get(`disabled_plugins`)??[];a.includes(t)&&(n.disabled_plugins=a.filter(e=>e!==t),r=!0);let o=e.get(`plugin_lifecycle`)?.setupDone??[];o.some(e=>e.id===t)&&(n.plugin_lifecycle={setupDone:o.filter(e=>e.id!==t)},r=!0),r&&await e.persist(n)}function Yu(e,t){let n=[],r=new Set(e.filter(e=>e.scope===`user`).map(e=>e.id)),i=t.filter(e=>e.scope===`global`),a=new Set(i.map(e=>e.id));for(let e of i)r.has(e.id)||n.push({kind:`missing-on-disk`,id:e.id,message:`${e.id}: 清单记录已安装,但磁盘 symlink 缺失,建议重装(otto extension install ${e.id})`});for(let t of e)t.scope===`user`&&!a.has(t.id)&&n.push({kind:`missing-in-registry`,id:t.id,message:`${t.id}: 磁盘已安装,但清单未记录(可能是旧版本 otto 安装的),建议重新安装以补登记`});return n}var Xu=class{lastTopoSort;lastEngineIncompatible=new Map;warnedTopoIssues=new Set;warnedEngineIncompatible=new Set;resolve(e){let{compatible:t,incompatible:n}=Kn(Vn({cwd:e.workspaceDir,homedir:e.homedir??ze(),disabled:e.disabledPlugins,bundledDirs:e.bundledDirs}));this.lastEngineIncompatible=n;let r=or(t);return this.lastTopoSort=r,r.ordered}async diagnose(e,t){for(let[t,n]of this.lastEngineIncompatible)this.warnedEngineIncompatible.has(t)||e.warn({pluginId:t,requiredRange:n,hostApiVersion:On},`plugin engines.otto not satisfied by host, skipping plugin (fail-closed, RFC-148 M0)`);this.warnedEngineIncompatible=new Set(this.lastEngineIncompatible.keys());let n=this.lastTopoSort;if(!n)return;let r=new Set([...n.cyclic.keys(),...n.missingDeps.keys()]);for(let[t,r]of n.cyclic)this.warnedTopoIssues.has(t)||e.warn({pluginId:t,cyclePath:r},`plugin dependency cycle detected, skipping cyclic plugin (fail-closed, RFC-132 D5)`);for(let[r,i]of n.missingDeps)if(!this.warnedTopoIssues.has(r)){e.warn({pluginId:r,missingDeps:i},`plugin dependencies missing, skipping plugin (fail-closed, RFC-132 D5)`);for(let n of i)try{let i=await Uu({pkg:n});t&&await qu(t,{id:i.id,source:`npm`,sourceSpec:n,version:i.version,scope:`global`}),e.info({pluginId:r,missingId:n},`missing plugin dependency auto-installed (RFC-163 D5), will be picked up on next discovery`)}catch(t){e.warn({pluginId:r,missingId:n,err:t instanceof Error?t.message:String(t)},`automatic install of missing plugin dependency failed, manual "otto extension install" may be required (RFC-163 D5)`)}}this.warnedTopoIssues=r}};function Zu(e,t){let{model:n,authStore:r,modelRegistry:i,providerRegistry:a}=e,o=r??_(),s=i??ee(),c=a??re({authStore:o,modelRegistry:s}),l=ie(),u=new Po(s,o),d=e.modelId,f=n??(d?s.tryResolve(d):void 0);return{authStore:o,modelRegistry:s,providerRegistry:c,wireProtocolRegistry:l,modelCatalogManager:u,defaultModel:f,resolveEffectiveModel:()=>{if(f)return f;if(d){let e=s.tryResolve(d);if(e)return e}let e=t().get(`model`);return(e?s.tryResolve(e)??s.find(e):void 0)??s.getAll().find(e=>e.id!==`__otto_setup__`)}}}function Qu(e,t){if(typeof e==`object`&&e){let t=e;if(t.listable===!1||t.transient===!0||typeof t.depth==`number`&&t.depth>0)return!0}return $u(t)}function $u(e){let t=e?.trim().toLowerCase();return t?t===`reply with: ok`||t===`say ok and nothing else`||t.startsWith(`reply with only your model name/identifier`)||t.startsWith(`output exactly the word: probe_ok`)||t.startsWith(`you are a trajectory analyst for an ai coding assistant.`)||t.startsWith(`you are drafting a reusable skill for this project`)||t.startsWith(`you are responsible for completing parent task item`):!1}function ed(e,t,n){let r=(e,r)=>{let i=(r?t.modelRegistry.find(r):void 0)??n();if(!i)throw Error(`configProvider: 无法解析恢复模型(modelId="${r??``}" 未命中、且无默认/settings/注册表模型)`);let a=t.getTools(),o=ba(new Set(a.map(e=>e.name)));return{model:i,systemPrompt:``,tools:a,thinkingLevel:`medium`,maxToolTurns:t.maxToolTurns,promptRefresh:e?lo(t.promptManager,t.getDeclarativeAgentProfiles(),e,a):()=>t.promptManager.assemblePreset({preset:`main`},o),workspaceDir:t.workspaceDir}},i=e.storage?.session;if(i&&`dir`in i&&process.env.OTTO_SESSION_BLOB!==`1`){let n=s(),a=new ii({dbPath:n?`:memory:`:x(i.dir,`sessions.db`)});t.repoRef&&(t.repoRef.current=a);let o=n?ai():oi({lockDir:x(i.dir,`locks`)}),c=new ni({repo:a,workspaceKey:t.getWorkspaceKey??(()=>Si),maxLoadEntries:ln,canStartHistory:e=>e.role!==`tool_result`,writeLease:o,stripInactiveReplacements:!0}),l=async e=>(await a.listSessions(e).catch(()=>[])).filter(e=>!Qu(e.config,e.title)).map(e=>({id:e.id,title:e.title?.trim()||e.id.slice(0,8),messageCount:0,createdAt:new Date(e.createdAt),updatedAt:new Date(e.lastActiveAt),status:e.archived?`archived`:`idle`,pinned:e.pinned,pinGroup:e.pinGroup,writeLocked:o.peekLockedByOther(e.id),entryCount:e.entryCount})),u=e=>o.peekLockedByOther(e),d=e=>o.inspect(e),f=e=>o.forceRelease(e);return Tt({providerRegistry:t.providerRegistry,hookRegistry:t.hookRegistry,logger:t.logger,workspaceDir:t.workspaceDir,clock:t.clock,traceStore:t.traceStore,checkpointStore:t.checkpointStore,memory:t.memory,maxSessions:e.maxSessions,devtools:t.devtools,configProvider:r,residencyGovernor:t.residencyGovernor,getResidencyConfig:t.getResidencyConfig,storage:{kind:`custom`,persistence:c,autoPersist:!0,...n?{panelStatePersistence:rn(),pasteStatePersistence:an()}:{panelStateDir:x(i.dir,`panel-state`)},listColdSessionsOverride:l,isSessionWriteLocked:u,inspectSessionWriteLease:d,forceReleaseSessionWriteLease:f,onDispose:()=>{o.close(),a.close()}}})}i&&`dir`in i&&process.env.OTTO_SESSION_BLOB===`1`&&C(`@x-otto/coding:session-pool-factory`).warn(`OTTO_SESSION_BLOB=1 — blob session persistence is deprecated (M63). Relational append (sessions.db) is the default since M60. The blob escape hatch will be removed when the relational path has proven stable in production.`);let a=i?`dir`in i?{kind:`disk`,sessionDir:i.dir}:`url`in i?(()=>{let n=fa(e.storage,`session`);return{kind:`remote`,sessionUrl:i.url,fetch:n.fetch??globalThis.fetch,getAuth:n.getAuth,timeoutMs:n.timeoutMs,userId:e.userIdentity?.userId,wsKey:t.getWorkspaceKey}})():void 0:void 0;return Tt({providerRegistry:t.providerRegistry,hookRegistry:t.hookRegistry,logger:t.logger,workspaceDir:t.workspaceDir,clock:t.clock,traceStore:t.traceStore,checkpointStore:t.checkpointStore,memory:t.memory,maxSessions:e.maxSessions,storage:a,devtools:t.devtools,configProvider:r,residencyGovernor:t.residencyGovernor})}function td(e){return e.map(e=>({name:e.name,description:typeof e.description==`function`?e.description({projectRoot:``}):e.description,parameters:e.parameters}))}function nd(e,t,n){if(e.length===0)return[];if(!n.getTools)return n.logger.warn(`Swarm member "%s" requested %d tools but leaf has no tool directory (getTools not injected); all hidden (fail closed)`,t,e.length),[];let r=yn(n.getDeclarativeAgentProfiles?.()??[],t),i=r?no(r.defaultTools):void 0,a=oo(n.getTools,void 0,i),o=new Map(a.map(e=>[e.name,e])),s=[],c=new Set;for(let r of e){if(c.has(r.name))continue;c.add(r.name);let e=o.get(r.name);if(!e){n.logger.warn(`Swarm member "%s" tool "%s" not resolvable at leaf (missing from directory or denied by profile allowlist); hidden from model`,t,r.name);continue}s.push(e)}return s}function rd(e,t,n,r){let i=[],a=new Set;for(let o of e){if(a.has(o.name)){n.warn(`Swarm member "%s" duplicate core descriptor "%s"; ignored`,t,o.name);continue}if(o.name!==`handoff_to_agent`){n.warn(`Swarm member "%s" received unknown core tool descriptor "%s"; hidden (fail closed)`,t,o.name);continue}if(o.context.from!==t){n.warn(`Swarm member "%s" handoff descriptor origin mismatch (from="%s"); hidden (fail closed)`,t,o.context.from);continue}if(o.context.allowedTargets.length===0){n.warn(`Swarm member "%s" handoff descriptor has no allowed targets; hidden`,t);continue}a.add(o.name),i.push(li(o.context.from,o.context.allowedTargets,r))}return i}function id(e){return async t=>{let n=Date.now();if(!e.defaultModel)throw Error(`Swarm member turn for agent "${t.agentId}" failed: no default model configured. Configure a model before running swarm/team sessions.`);let r=e.defaultModel,i=nd(t.tools??[],t.agentId,e);t.extraTools?.length&&e.logger.warn(`Swarm member "%s" received %d extraTools via deprecated metadata channel; ignored (use coreTools descriptors)`,t.agentId,t.extraTools.length);let a,o=rd(t.coreTools??[],t.agentId,e.logger,e=>{a||=e}),s=new Set(o.map(e=>e.name)),c=[...o,...i.filter(e=>!s.has(e.name))],l={model:r,systemPrompt:t.systemPrompt??``,messages:[],tools:c,thinkingLevel:t.thinkingLevel??`medium`,maxTokens:t.maxTokens,temperature:t.temperature};l.messages.push({role:`user`,content:[{type:`text`,text:t.prompt}],timestamp:Date.now()});let u=t.sessionId??`swarm:${t.agentId}`,d=t.depth??0,f=new hi({stream:e.stream,logger:e.logger,agentName:t.agentId,maxToolTurns:t.maxToolTurns,toolHookExecutor:jt({hookRegistry:e.hookRegistry,agentName:t.agentId,sessionId:u}),depth:d}),p=()=>f.abort();t.signal?.aborted?f.abort():t.signal?.addEventListener(`abort`,p,{once:!0});let m=`${u}:${t.agentId}`,h=St(f,{id:m,agentName:t.agentId,title:t.agentId,prompt:t.prompt,model:t.model??r.id,origin:`main`,depth:d,abort:()=>f.abort(),messages:l.messages}),g;try{g=await f.run(l)}finally{t.signal?.removeEventListener(`abort`,p),h(),zt.markEnded(m)}return{agentId:t.agentId,messages:l.messages,handoff:t.signal?.aborted?void 0:a,text:g.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
394
- `),tokenUsage:{input:g.usage.inputTokens,output:g.usage.outputTokens,cacheRead:g.usage.cacheReadTokens},durationMs:Date.now()-n}}}function ad(e,t){if(!t.defaultModel)throw Error(`buildSwarmConfig for team "${e.name}" failed: no default model configured.`);return{name:e.name,agents:e.agents,defaultModel:t.defaultModel,pattern:e.pattern,router:e.router,pipeline:e.pipeline,supervisorId:e.supervisorId,entryAgentId:e.entryAgentId,maxHandoffDepth:e.maxHandoffDepth,runId:t.runId,depth:t.depth??0,runAgentTurn:t.runAgentTurn??id(t)}}function od(e,t,n,r,i,a=0){let o=t.getDeclarativeAgentProfiles(),s=[];for(let c of e.agentNames){if(c.startsWith(`team:`)){let o=c.slice(5).trim();if(i+1>5){t.logger.warn(`Team "%s" nesting exceeds max depth %d, member skipped: %s`,e.name,5,c);continue}if(r.has(o)){t.logger.warn(`Team "%s" nesting cycle detected, member skipped: %s`,e.name,c);continue}let l=t.getDeclarativeTeams().find(e=>e.name===o);if(!l){t.logger.warn(`Team "%s" sub-team not found, member skipped: %s`,e.name,c);continue}let u=od(l,t,n,new Set([...r,o]),i+1,a+1);if(u.agents.length===0){t.logger.warn(`Team "%s" sub-team "%s" has no resolvable members, skipped`,e.name,o);continue}let d=ad(u,{providerRegistry:t.providerRegistry,hookRegistry:t.hookRegistry,stream:t.stream,logger:t.logger,defaultModel:n,runId:`team:${o}`,depth:a+1,runAgentTurn:t.runAgentTurn});s.push({kind:`team`,id:c,name:o,description:`Nested team: ${o}`,runNested:async(e,t)=>{let n=await ui(d).run(e,{signal:t});return{agentId:c,messages:[],text:n.output,tokenUsage:{input:0,output:0,cacheRead:0},durationMs:n.durationMs}}});continue}let l=yn(o,c);if(!l){s.push({kind:`agent`,id:c,name:c,description:c,systemPrompt:gn(c),tools:td(t.resolveTools(void 0,void 0)),maxToolTurns:void 0});continue}s.push({kind:`agent`,id:c,name:l.name,description:l.taskTypes[0]??l.name,systemPrompt:l.systemPromptTemplate,tools:td(t.resolveTools(void 0,no(l.defaultTools))),maxToolTurns:l.defaultMaxToolTurns})}return{name:e.name,pattern:e.pattern,agents:s,pipeline:e.pipeline,supervisorId:e.supervisorId,entryAgentId:e.entryAgentId,maxHandoffDepth:e.maxHandoffDepth,router:e.routerStrategy?{strategy:e.routerStrategy,rules:e.rules?.map(e=>({match:e.keywords,agentId:e.agentId})),fallbackAgentId:e.entryAgentId??s[0]?.id}:void 0}}function sd(e){return async(t,n,r,i)=>{let a=e.getDeclarativeTeams().find(e=>e.name===t);if(!a)return{success:!1,error:`Team not found: ${t}`};let o=e.defaultModel;if(!o)return{success:!1,error:`No model configured for team execution.`};if(a.routerStrategy===`llm`)return{success:!1,error:`Team "${t}": router strategy 'llm' is not supported in declarative teams (it needs a customRouter function). Use 'rule', 'round-robin', or 'random'.`};let s=od(a,e,o,new Set([t]),0,i??0);if(s.agents.length===0)return{success:!1,error:`Team "${t}" has no resolvable member agents.`};try{let a=await ui(ad(s,{providerRegistry:e.providerRegistry,hookRegistry:e.hookRegistry,stream:e.stream,logger:e.logger,defaultModel:o,runId:`team:${t}`,depth:i,runAgentTurn:e.runAgentTurn})).run(n,{signal:r});return{success:!0,output:a.output,pattern:a.pattern}}catch(e){return{success:!1,error:e instanceof Error?e.message:String(e)}}}}const cd=`You are describing an image for a text-only AI assistant that cannot see images itself. Produce a concise structured description (aim for well under 500 tokens) covering, when applicable:
392
+ `);let c=[],l=[],{buildSync:u}=Fu(`esbuild`);for(let i of n){let n=i.replace(/\.tsx$/,`.mjs`);try{u({entryPoints:[x(t,i)],outfile:x(r,n),bundle:!0,format:`esm`,platform:`node`,alias:{react:a,ink:o,"@x-otto/tui":s},jsx:`transform`,banner:{js:`const { usePluginData } = globalThis.__ottoPanelRuntime || {};const { claim: claimPanelFocus, release: releasePanelFocus, usePanelFocusClaimed, requestClose: requestPanelClose, setHint: setPanelHint } = globalThis.__ottoPanelFocusBridge || { claim(){}, release(){}, usePanelFocusClaimed: () => true, requestClose(){}, setHint(){} };const { getTheme, getFigures } = globalThis.__ottoPanelTheme || { getTheme: () => ({ text: undefined, inactive: '#9498B8', secondary: '#C8CBDB', success: '#7EE095', error: '#FF9592', warning: '#FFC966', special: '#DD78C9', selection: '#4D7CFF', focusBorder: '#4D7CFF', panelBorder: '#9498B8' }), getFigures: () => ({ check: '✓', cross: '✗', pointer: '▶', bullet: '●' }) };const { SPACING, LAYOUT } = globalThis.__ottoPanelSpacing || { SPACING: { none: 0, tight: 1, section: 2, loose: 4 }, LAYOUT: { contentInset: 4, borderInset: 2 } };const { t: t, i18next: panelI18next } = globalThis.__ottoPanelI18n || { t: (k) => k, i18next: { language: 'en' } };const { usePanelBackend } = globalThis.__ottoPanelBackendRuntime || { usePanelBackend: () => ({ call: () => Promise.reject(new Error('otto panel: backend runtime not installed')), cancel(){}, state: undefined, status: 'disabled' }) };`},logLevel:`silent`}),c.push(x(`panels-dist`,n))}catch(t){l.push({entry:i,message:t.message}),Pu.warn({pluginDir:e,entry:i,err:String(t)},`panel compile failed`)}}return Pu.info({pluginDir:e,compiled:c.length,errors:l.length},`compiled plugin panels`),{compiled:c,errors:l,skipped:!1}}const Lu=C(`@x-otto/coding:plugin-install`);function Ru(e){let t=[];return(async()=>{try{let t=await Hc(e);t&&Lu.info({pluginDir:e,outfile:t},`plugin code module compiled at install time`)}catch(n){let r=n instanceof Error?n.message:String(n);Lu.warn({pluginDir:e,err:r},`plugin.ts compile failed at install time (fail-soft, will retry at load time)`),t.push(`plugin.ts 编译失败:${r}(不影响安装,otto 启动时会自动重试编译)`)}try{let{errors:n,skipped:r}=Iu(e);if(!r&&n.length>0)for(let r of n)Lu.warn({pluginDir:e,entry:r.entry,err:r.message},`plugin panel compile failed at install time`),t.push(`面板 ${r.entry} 编译失败:${r.message}`)}catch(n){let r=n instanceof Error?n.message:String(n);Lu.warn({pluginDir:e,err:r},`plugin panel compilation crashed unexpectedly at install time`),t.push(`面板编译异常:${r}`)}})().then(()=>t)}function zu(e){try{return Ur(e).isSymbolicLink()}catch{return!1}}function Bu(e){let t=k(e,`utf8`),n=[],r=!1;for(let e of t.split(`
393
+ `)){let t=e.trim();if(t.startsWith(`packages:`)){r=!0;continue}if(r){let e=t.match(/^-\s*['"]?([^'"]+)['"]?(?:\s+#.*)?$/);if(e?.[1]){n.push(e[1]);continue}t.length>0&&!t.startsWith(`-`)&&(r=!1)}}return n}function Vu(e,t){let n=S(e,t.endsWith(`/*`)?t.slice(0,-2):t);if(!n.startsWith(e.endsWith(`/`)?e:e+`/`)&&n!==e)return[];if(!t.endsWith(`/*`))return D(n)?[n]:[];if(!D(n))return[];try{return Kr(n,{withFileTypes:!0}).filter(e=>e.isDirectory()).map(e=>x(n,e.name))}catch{return[]}}function Hu(e,t){let n=a(t);if(!n)return;let r=Bu(x(n,`pnpm-workspace.yaml`));for(let t of r)for(let r of Vu(n,t)){let t=x(r,`package.json`);if(!D(t))continue;try{if(JSON.parse(k(t,`utf8`)).name===e)return r}catch{}let n=x(r,T);if(D(n))try{if($n(k(n,`utf8`),n)?.id===e)return r}catch{}}}function Uu(t,n=process.cwd()){let r=[Ii(x(n,`__resolve__.js`)).href,import.meta.url];for(let n of r)try{return b(e(n).resolve(`${t}/package.json`))}catch{}return Hu(t,b(Fi(import.meta.url)))??Hu(t,n)}async function Wu(e){let t=Uu(e.pkg,e.cwd);if(!t)throw Error(`无法解析包 ${e.pkg}(未安装或不可从当前位置解析)。`);let r=x(t,T);if(!D(r))throw Error(`${e.pkg} 不是 otto 插件:缺 ${T}(RFC-044 自描述)。`);let i=$n(k(r,`utf8`),r);if(!i)throw Error(`${e.pkg} 的 ${T} 非法(需合法 kebab-case id)。`);let a=e.ottoDir??n,o=x(a,`plugins`,i.id);O(x(a,`plugins`),{recursive:!0});let s=S(t);if(zu(o)){try{if(S(qr(o))===s){let e=await Ru(t);return{id:i.id,packageDir:t,dir:o,created:!1,compileWarnings:e,version:i.version}}}catch{}$r(o)}else if(D(o))if((D(x(o,T))?$n(k(x(o,T),`utf8`),o):null)?.id===i.id)Xr(o,{recursive:!0,force:!0});else throw Error(`目标已存在且非本插件,拒绝覆盖:${o}`);Qr(s,o);let c=await Ru(t);return{id:i.id,packageDir:t,dir:o,created:!0,compileWarnings:c,version:i.version}}async function Gu(e){let t=x(e,T);if(!D(t))throw Error(`${e} 不是 otto 插件:缺 ${T}`);let r=$n(k(t,`utf8`),t);if(!r)throw Error(`${e} 的 ${T} 非法。`);let i=x(n,`plugins`,r.id);O(x(n,`plugins`),{recursive:!0});let a=S(e);if(zu(i)){try{if(S(qr(i))===a){let t=await Ru(e);return{id:r.id,packageDir:e,dir:i,created:!1,compileWarnings:t,version:r.version}}}catch{}$r(i)}else if(D(i))if((D(x(i,T))?$n(k(x(i,T),`utf8`),i):null)?.id===r.id)Xr(i,{recursive:!0,force:!0});else throw Error(`目标已存在且非本插件,拒绝覆盖:${i}`);Qr(a,i);let o=await Ru(e);return{id:r.id,packageDir:e,dir:i,created:!0,compileWarnings:o,version:r.version}}function Ku(e,t){return[...e.filter(e=>e.id!==t.id),t]}function qu(e,t){return e.filter(e=>e.id!==t)}async function Ju(e,t,n=()=>Date.now()){let r=Ku(e.get(`installed_plugins`)??[],{id:t.id,source:t.source,sourceSpec:t.sourceSpec,installedAt:n(),version:t.version,scope:t.scope,capabilities:t.capabilities});await e.persist({installed_plugins:r})}async function Yu(e,t){let n={},r=!1,i=e.get(`installed_plugins`)??[];i.some(e=>e.id===t)&&(n.installed_plugins=qu(i,t),r=!0);let a=e.get(`disabled_plugins`)??[];a.includes(t)&&(n.disabled_plugins=a.filter(e=>e!==t),r=!0);let o=e.get(`plugin_lifecycle`)?.setupDone??[];o.some(e=>e.id===t)&&(n.plugin_lifecycle={setupDone:o.filter(e=>e.id!==t)},r=!0),r&&await e.persist(n)}function Xu(e,t){let n=[],r=new Set(e.filter(e=>e.scope===`user`).map(e=>e.id)),i=t.filter(e=>e.scope===`global`),a=new Set(i.map(e=>e.id));for(let e of i)r.has(e.id)||n.push({kind:`missing-on-disk`,id:e.id,message:`${e.id}: 清单记录已安装,但磁盘 symlink 缺失,建议重装(otto extension install ${e.id})`});for(let t of e)t.scope===`user`&&!a.has(t.id)&&n.push({kind:`missing-in-registry`,id:t.id,message:`${t.id}: 磁盘已安装,但清单未记录(可能是旧版本 otto 安装的),建议重新安装以补登记`});return n}var Zu=class{lastTopoSort;lastEngineIncompatible=new Map;warnedTopoIssues=new Set;warnedEngineIncompatible=new Set;resolve(e){let{compatible:t,incompatible:n}=Kn(Vn({cwd:e.workspaceDir,homedir:e.homedir??ze(),disabled:e.disabledPlugins,bundledDirs:e.bundledDirs}));this.lastEngineIncompatible=n;let r=or(t);return this.lastTopoSort=r,r.ordered}async diagnose(e,t){for(let[t,n]of this.lastEngineIncompatible)this.warnedEngineIncompatible.has(t)||e.warn({pluginId:t,requiredRange:n,hostApiVersion:On},`plugin engines.otto not satisfied by host, skipping plugin (fail-closed, RFC-148 M0)`);this.warnedEngineIncompatible=new Set(this.lastEngineIncompatible.keys());let n=this.lastTopoSort;if(!n)return;let r=new Set([...n.cyclic.keys(),...n.missingDeps.keys()]);for(let[t,r]of n.cyclic)this.warnedTopoIssues.has(t)||e.warn({pluginId:t,cyclePath:r},`plugin dependency cycle detected, skipping cyclic plugin (fail-closed, RFC-132 D5)`);for(let[r,i]of n.missingDeps)if(!this.warnedTopoIssues.has(r)){e.warn({pluginId:r,missingDeps:i},`plugin dependencies missing, skipping plugin (fail-closed, RFC-132 D5)`);for(let n of i)try{let i=await Wu({pkg:n});t&&await Ju(t,{id:i.id,source:`npm`,sourceSpec:n,version:i.version,scope:`global`}),e.info({pluginId:r,missingId:n},`missing plugin dependency auto-installed (RFC-163 D5), will be picked up on next discovery`)}catch(t){e.warn({pluginId:r,missingId:n,err:t instanceof Error?t.message:String(t)},`automatic install of missing plugin dependency failed, manual "otto extension install" may be required (RFC-163 D5)`)}}this.warnedTopoIssues=r}};function Qu(e,t){let{model:n,authStore:r,modelRegistry:i,providerRegistry:a}=e,o=r??_(),s=i??ee(),c=a??re({authStore:o,modelRegistry:s}),l=ie(),u=new Fo(s,o),d=e.modelId,f=n??(d?s.tryResolve(d):void 0);return{authStore:o,modelRegistry:s,providerRegistry:c,wireProtocolRegistry:l,modelCatalogManager:u,defaultModel:f,resolveEffectiveModel:()=>{if(f)return f;if(d){let e=s.tryResolve(d);if(e)return e}let e=t().get(`model`);return(e?s.tryResolve(e)??s.find(e):void 0)??s.getAll().find(e=>e.id!==`__otto_setup__`)}}}function $u(e,t){if(typeof e==`object`&&e){let t=e;if(t.listable===!1||t.transient===!0||typeof t.depth==`number`&&t.depth>0)return!0}return ed(t)}function ed(e){let t=e?.trim().toLowerCase();return t?t===`reply with: ok`||t===`say ok and nothing else`||t.startsWith(`reply with only your model name/identifier`)||t.startsWith(`output exactly the word: probe_ok`)||t.startsWith(`you are a trajectory analyst for an ai coding assistant.`)||t.startsWith(`you are drafting a reusable skill for this project`)||t.startsWith(`you are responsible for completing parent task item`):!1}function td(e,t,n){let r=(e,r)=>{let i=(r?t.modelRegistry.find(r):void 0)??n();if(!i)throw Error(`configProvider: 无法解析恢复模型(modelId="${r??``}" 未命中、且无默认/settings/注册表模型)`);let a=t.getTools(),o=ba(new Set(a.map(e=>e.name)));return{model:i,systemPrompt:``,tools:a,thinkingLevel:`medium`,maxToolTurns:t.maxToolTurns,promptRefresh:e?lo(t.promptManager,t.getDeclarativeAgentProfiles(),e,a):()=>t.promptManager.assemblePreset({preset:`main`},o),workspaceDir:t.workspaceDir}},i=e.storage?.session;if(i&&`dir`in i&&process.env.OTTO_SESSION_BLOB!==`1`){let n=s(),a=new ii({dbPath:n?`:memory:`:x(i.dir,`sessions.db`)});t.repoRef&&(t.repoRef.current=a);let o=n?ai():oi({lockDir:x(i.dir,`locks`)}),c=new ni({repo:a,workspaceKey:t.getWorkspaceKey??(()=>Si),maxLoadEntries:ln,canStartHistory:e=>e.role!==`tool_result`,writeLease:o,stripInactiveReplacements:!0}),l=async e=>(await a.listSessions(e).catch(()=>[])).filter(e=>!$u(e.config,e.title)).map(e=>({id:e.id,title:e.title?.trim()||e.id.slice(0,8),messageCount:0,createdAt:new Date(e.createdAt),updatedAt:new Date(e.lastActiveAt),status:e.archived?`archived`:`idle`,pinned:e.pinned,pinGroup:e.pinGroup,writeLocked:o.peekLockedByOther(e.id),entryCount:e.entryCount})),u=e=>o.peekLockedByOther(e),d=e=>o.inspect(e),f=e=>o.forceRelease(e);return Tt({providerRegistry:t.providerRegistry,hookRegistry:t.hookRegistry,logger:t.logger,workspaceDir:t.workspaceDir,clock:t.clock,traceStore:t.traceStore,checkpointStore:t.checkpointStore,memory:t.memory,maxSessions:e.maxSessions,devtools:t.devtools,configProvider:r,residencyGovernor:t.residencyGovernor,getResidencyConfig:t.getResidencyConfig,storage:{kind:`custom`,persistence:c,autoPersist:!0,...n?{panelStatePersistence:rn(),pasteStatePersistence:an()}:{panelStateDir:x(i.dir,`panel-state`)},listColdSessionsOverride:l,isSessionWriteLocked:u,inspectSessionWriteLease:d,forceReleaseSessionWriteLease:f,onDispose:()=>{o.close(),a.close()}}})}i&&`dir`in i&&process.env.OTTO_SESSION_BLOB===`1`&&C(`@x-otto/coding:session-pool-factory`).warn(`OTTO_SESSION_BLOB=1 — blob session persistence is deprecated (M63). Relational append (sessions.db) is the default since M60. The blob escape hatch will be removed when the relational path has proven stable in production.`);let a=i?`dir`in i?{kind:`disk`,sessionDir:i.dir}:`url`in i?(()=>{let n=fa(e.storage,`session`);return{kind:`remote`,sessionUrl:i.url,fetch:n.fetch??globalThis.fetch,getAuth:n.getAuth,timeoutMs:n.timeoutMs,userId:e.userIdentity?.userId,wsKey:t.getWorkspaceKey}})():void 0:void 0;return Tt({providerRegistry:t.providerRegistry,hookRegistry:t.hookRegistry,logger:t.logger,workspaceDir:t.workspaceDir,clock:t.clock,traceStore:t.traceStore,checkpointStore:t.checkpointStore,memory:t.memory,maxSessions:e.maxSessions,storage:a,devtools:t.devtools,configProvider:r,residencyGovernor:t.residencyGovernor})}function nd(e){return e.map(e=>({name:e.name,description:typeof e.description==`function`?e.description({projectRoot:``}):e.description,parameters:e.parameters}))}function rd(e,t,n){if(e.length===0)return[];if(!n.getTools)return n.logger.warn(`Swarm member "%s" requested %d tools but leaf has no tool directory (getTools not injected); all hidden (fail closed)`,t,e.length),[];let r=yn(n.getDeclarativeAgentProfiles?.()??[],t),i=r?no(r.defaultTools):void 0,a=oo(n.getTools,void 0,i),o=new Map(a.map(e=>[e.name,e])),s=[],c=new Set;for(let r of e){if(c.has(r.name))continue;c.add(r.name);let e=o.get(r.name);if(!e){n.logger.warn(`Swarm member "%s" tool "%s" not resolvable at leaf (missing from directory or denied by profile allowlist); hidden from model`,t,r.name);continue}s.push(e)}return s}function id(e,t,n,r){let i=[],a=new Set;for(let o of e){if(a.has(o.name)){n.warn(`Swarm member "%s" duplicate core descriptor "%s"; ignored`,t,o.name);continue}if(o.name!==`handoff_to_agent`){n.warn(`Swarm member "%s" received unknown core tool descriptor "%s"; hidden (fail closed)`,t,o.name);continue}if(o.context.from!==t){n.warn(`Swarm member "%s" handoff descriptor origin mismatch (from="%s"); hidden (fail closed)`,t,o.context.from);continue}if(o.context.allowedTargets.length===0){n.warn(`Swarm member "%s" handoff descriptor has no allowed targets; hidden`,t);continue}a.add(o.name),i.push(li(o.context.from,o.context.allowedTargets,r))}return i}function ad(e){return async t=>{let n=Date.now();if(!e.defaultModel)throw Error(`Swarm member turn for agent "${t.agentId}" failed: no default model configured. Configure a model before running swarm/team sessions.`);let r=e.defaultModel,i=rd(t.tools??[],t.agentId,e);t.extraTools?.length&&e.logger.warn(`Swarm member "%s" received %d extraTools via deprecated metadata channel; ignored (use coreTools descriptors)`,t.agentId,t.extraTools.length);let a,o=id(t.coreTools??[],t.agentId,e.logger,e=>{a||=e}),s=new Set(o.map(e=>e.name)),c=[...o,...i.filter(e=>!s.has(e.name))],l={model:r,systemPrompt:t.systemPrompt??``,messages:[],tools:c,thinkingLevel:t.thinkingLevel??`medium`,maxTokens:t.maxTokens,temperature:t.temperature};l.messages.push({role:`user`,content:[{type:`text`,text:t.prompt}],timestamp:Date.now()});let u=t.sessionId??`swarm:${t.agentId}`,d=t.depth??0,f=new hi({stream:e.stream,logger:e.logger,agentName:t.agentId,maxToolTurns:t.maxToolTurns,toolHookExecutor:jt({hookRegistry:e.hookRegistry,agentName:t.agentId,sessionId:u}),depth:d}),p=()=>f.abort();t.signal?.aborted?f.abort():t.signal?.addEventListener(`abort`,p,{once:!0});let m=`${u}:${t.agentId}`,h=St(f,{id:m,agentName:t.agentId,title:t.agentId,prompt:t.prompt,model:t.model??r.id,origin:`main`,depth:d,abort:()=>f.abort(),messages:l.messages}),g;try{g=await f.run(l)}finally{t.signal?.removeEventListener(`abort`,p),h(),zt.markEnded(m)}return{agentId:t.agentId,messages:l.messages,handoff:t.signal?.aborted?void 0:a,text:g.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
394
+ `),tokenUsage:{input:g.usage.inputTokens,output:g.usage.outputTokens,cacheRead:g.usage.cacheReadTokens},durationMs:Date.now()-n}}}function od(e,t){if(!t.defaultModel)throw Error(`buildSwarmConfig for team "${e.name}" failed: no default model configured.`);return{name:e.name,agents:e.agents,defaultModel:t.defaultModel,pattern:e.pattern,router:e.router,pipeline:e.pipeline,supervisorId:e.supervisorId,entryAgentId:e.entryAgentId,maxHandoffDepth:e.maxHandoffDepth,runId:t.runId,depth:t.depth??0,runAgentTurn:t.runAgentTurn??ad(t)}}function sd(e,t,n,r,i,a=0){let o=t.getDeclarativeAgentProfiles(),s=[];for(let c of e.agentNames){if(c.startsWith(`team:`)){let o=c.slice(5).trim();if(i+1>5){t.logger.warn(`Team "%s" nesting exceeds max depth %d, member skipped: %s`,e.name,5,c);continue}if(r.has(o)){t.logger.warn(`Team "%s" nesting cycle detected, member skipped: %s`,e.name,c);continue}let l=t.getDeclarativeTeams().find(e=>e.name===o);if(!l){t.logger.warn(`Team "%s" sub-team not found, member skipped: %s`,e.name,c);continue}let u=sd(l,t,n,new Set([...r,o]),i+1,a+1);if(u.agents.length===0){t.logger.warn(`Team "%s" sub-team "%s" has no resolvable members, skipped`,e.name,o);continue}let d=od(u,{providerRegistry:t.providerRegistry,hookRegistry:t.hookRegistry,stream:t.stream,logger:t.logger,defaultModel:n,runId:`team:${o}`,depth:a+1,runAgentTurn:t.runAgentTurn});s.push({kind:`team`,id:c,name:o,description:`Nested team: ${o}`,runNested:async(e,t)=>{let n=await ui(d).run(e,{signal:t});return{agentId:c,messages:[],text:n.output,tokenUsage:{input:0,output:0,cacheRead:0},durationMs:n.durationMs}}});continue}let l=yn(o,c);if(!l){s.push({kind:`agent`,id:c,name:c,description:c,systemPrompt:gn(c),tools:nd(t.resolveTools(void 0,void 0)),maxToolTurns:void 0});continue}s.push({kind:`agent`,id:c,name:l.name,description:l.taskTypes[0]??l.name,systemPrompt:l.systemPromptTemplate,tools:nd(t.resolveTools(void 0,no(l.defaultTools))),maxToolTurns:l.defaultMaxToolTurns})}return{name:e.name,pattern:e.pattern,agents:s,pipeline:e.pipeline,supervisorId:e.supervisorId,entryAgentId:e.entryAgentId,maxHandoffDepth:e.maxHandoffDepth,router:e.routerStrategy?{strategy:e.routerStrategy,rules:e.rules?.map(e=>({match:e.keywords,agentId:e.agentId})),fallbackAgentId:e.entryAgentId??s[0]?.id}:void 0}}function cd(e){return async(t,n,r,i)=>{let a=e.getDeclarativeTeams().find(e=>e.name===t);if(!a)return{success:!1,error:`Team not found: ${t}`};let o=e.defaultModel;if(!o)return{success:!1,error:`No model configured for team execution.`};if(a.routerStrategy===`llm`)return{success:!1,error:`Team "${t}": router strategy 'llm' is not supported in declarative teams (it needs a customRouter function). Use 'rule', 'round-robin', or 'random'.`};let s=sd(a,e,o,new Set([t]),0,i??0);if(s.agents.length===0)return{success:!1,error:`Team "${t}" has no resolvable member agents.`};try{let a=await ui(od(s,{providerRegistry:e.providerRegistry,hookRegistry:e.hookRegistry,stream:e.stream,logger:e.logger,defaultModel:o,runId:`team:${t}`,depth:i,runAgentTurn:e.runAgentTurn})).run(n,{signal:r});return{success:!0,output:a.output,pattern:a.pattern}}catch(e){return{success:!1,error:e instanceof Error?e.message:String(e)}}}}const ld=`You are describing an image for a text-only AI assistant that cannot see images itself. Produce a concise structured description (aim for well under 500 tokens) covering, when applicable:
395
395
  - Overall layout (columns/sections, relative position and proportions)
396
396
  - Color palette (primary/secondary colors as hex codes)
397
397
  - Text content and font-size hierarchy (headings vs body)
398
398
  - Interactive component inventory (buttons, inputs, nav items, etc.)
399
399
  - Key size ratios/dimensions
400
400
 
401
- If the image is not a UI/design screenshot, give a normal concise description instead. Do not speculate beyond what's visible.`;var ld=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?`${cd}\n\nContext: ${t.contextHint}`:cd},{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 g(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 pi(`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 ud(e){let t=e?.slots?.vision;if(t)return Array.isArray(t)?t:[t]}function dd(e,t){globalThis[e]||Object.defineProperty(globalThis,e,{value:Object.freeze(t()),writable:!1,configurable:!1})}var fd=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,dd(`__ottoPanelRuntime`,()=>({callMcpTool:(e,t,n)=>this.callMcpTool(e,t,n),usePluginData:pd(this)}))}};function pd(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 md=new fd;function hd(e){md.install(e)}const gd=`backend/`;function _d(e){return e.startsWith(gd)?e:`${gd}${e}`}var vd=class{fns=null;get(){return this.fns}install(e){this.fns=e,dd(`__ottoPanelBackendRuntime`,()=>({usePanelBackend:bd(this)}))}};function yd(){return globalThis.__ottoCurrentPanelPluginId}function bd(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=yd(),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,_d(e),t,i)},[n]),cancel:t.useCallback(e=>{!n||!r||r.cancel(n,e)},[n]),state:i,status:o}}}const xd=new vd;function Sd(e){xd.install(e)}function Cd(){let e=process.env.LC_ALL||process.env.LC_MESSAGES||process.env.LANG||``;return/zh/i.test(e)?`zh`:`en`}function wd(e){return!e||e===`auto`?Cd():e}var Td=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=E(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=$l(e.id,e.manifest),r=$l(e.id,t),i=new Set([...n].filter(e=>r.has(e)));i.size>0&&o.set(e.id,i);let a=eu(e.id,e.manifest),c=eu(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 lu(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=cu(n,l,this.deps,o.get(n),s.get(n));e+=r.registered.length,t+=r.rejected.length,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 lu(e,t,this.deps);this.previousSnapshot=[],this.loadedPluginIds=[]}};function Ed(e,n){if(!e)return{devtools:null,logSubscription:null};let r=new t;return{devtools:r,logSubscription:qe(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 Dd=class{registry;auditLog;constructor(e,t){let n=Ae(e.getAll());this.auditLog=new ge,this.registry=ke({toolSets:n}),t.register(De(this.registry,this.auditLog))}};const Od=C(`@x-otto/coding:plugin-context-sources`),kd=64*1024;function Ad(e,t,n){let r=S(t,n);if(!Ls(r,t)){Od.warn({pluginId:e,file:n},`contextSources.content.file resolves outside plugin dir, skipped`);return}try{let e=k(r,`utf8`);return Buffer.byteLength(e,`utf8`)>kd?`${e.slice(0,kd)}\n<!-- truncated -->`:e}catch(t){Od.warn({pluginId:e,file:n,err:String(t)},`contextSources.content.file read failed, skipped`);return}}function jd(e){let t=[];for(let n of e){if(E(n).gated)continue;let e=n.manifest.contributes?.contextSources;if(e?.length){if(!n.manifest.capabilities?.includes(`context`)){Od.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:Ad(n.id,n.dir,r.content.file);if(e!=null)return`<!-- plugin:${n.id} -->\n${e}`}})}}return t}function Md(e){Wt(),Ut(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[w.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.sessionId,processId:n.id,pid:n.pid,command:n.command,port:n.port})}),w.onExit(n=>{e.logger.info({id:n.id,pid:n.pid,status:n.status,exitCode:n.exitCode},`Background process exited`),t(`process.exited`,{sessionId:n.sessionId,processId:n.id,pid:n.pid,command:n.command,status:n.status,exitCode:n.exitCode})})]}const Nd=2e4,Pd=(e,t)=>{let n=ki(`git`,[...e],{cwd:t,timeout:1e4,encoding:`utf-8`,maxBuffer:4194304});return n.error||n.status!==0?null:n.stdout??``};function Fd(e){return e.length<=Nd?e:`${e.slice(0,Nd)}\n[...truncated ${e.length-Nd} chars...]`}function Id(e,t,n,r){let i=S(e),a=He(t)?t:S(i,t);if(a!==i&&!a.startsWith(`${i}/`)||!D(a)||!Zr(a).isFile())return null;let o;try{o=k(a,`utf-8`)}catch{return null}if(o.includes(`\0`))return null;let s=o.split(`
402
- `),c=Math.max(1,n);if(c>s.length)return null;let l=Math.min(s.length,r>0?r:n);return Fd(s.slice(c-1,l).join(`
403
- `))}function Ld(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(`
404
- `)[0]??``);if(!a)return null;let o=parseInt(a[2],10);return Id(e,a[1],o,o+r)}function Rd(e){let t=e?.gitRunner??Pd;return[{id:`file-range`,resolve:(e,t)=>{let n=/^([\w./\-]+):(\d+)(?:-(\d+))?$/.exec(e);if(!n)return``;let r=Id(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=Ld(n.workspaceDir,e,t);return r===null?``:`\n\n@def:${e}:\n\`\`\`\n${r}\n\`\`\`\n`}}]}function zd(e){return{sandbox:new Ca(e.logger),memoryGovernor:new ht({logger:e.logger}),residencyGovernor:new _t,fleetMonitor:new mt({logger:e.logger}),permissionSync:new Sa({logger:e.logger,getToolRegistry:e.getToolRegistry,getPermissionRegistry:e.getPermissionRegistry}),hookRegistry:e.hookRegistry??Te({preset:`default`,onHookTimeout:e.onHookTimeout})}}function Bd(e){let t=Ed(e.inspect,e.loggerName),n=t.devtools,r=t.logSubscription,i=new fi({workspaceDir:e.workspaceDir,projectConfigPath:e.projectConfigPath,projectConfigTrusted:()=>Ir(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;$e(r),Xe(r),e.getI18nRegistry().setLocale(wd(t.language))}),{devtools:n,logSubscription:r,settings:i}}function Vd(e){let t=new ld({getModelRegistry:e.getModelRegistry,providerRegistry:e.providerRegistry,getVisionSlotCandidates:()=>ud(e.getSettings().get(`model_slots`)),isModelUsable:e.isModelUsable,logger:e.logger});return{visionDelegateService:t,sessionConfigResolver:new uo({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 Hd(e){let t=ed(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},e.resolveEffectiveModel),n=t.sessions;return{agentRuntime:t,codingSessionPool:n,swarmAgentRunner:id({hookRegistry:e.hookRegistry,stream:n.stream,logger:e.logger,defaultModel:e.defaultModel,getTools:e.getTools,getDeclarativeAgentProfiles:e.getDeclarativeAgentProfiles}),defaultModel:e.defaultModel}}function Ud(e){let{runSession:t,abortTask:n}=jo({logger:e.logger,getSession:e.getSession,createSession:e.createSession,removeSession:e.removeSession}),r=new ci({hookRegistry:e.hookRegistry,runSession:t,abortTask:n,runAgentTurn:e.swarmAgentRunner,workflowConfig:e.workflowConfig});return{orchestrator:r,runSession:t,runTeam:sd({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:zi()}}function Wd(e){hd(e.callMcpTool);let t=new tc({mcpController:e.mcpController,getActivePlugins:e.getActivePlugins});return Sd({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 Gd(e){let t=new Mu({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,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.notifyUser?{notifyUser:e.notifyUser}:{}}),n=new Td({providerRegistry:e.providerRegistry,authStore:e.authStore,modelRegistry:e.modelRegistry,wireProtocolRegistry:e.wireProtocolRegistry,activePlugins:e.activePlugins,logger:e.logger});return e.i18nRegistry.register(Vs(e.activePlugins())),{pluginModuleManager:t,pluginProviderManager:n,capabilityReloader:new $s(e.settings,e.mcpController,e.skillRegistryForReloader,t,n,e.toolRegistry,e.modelCatalogManager,e.workspaceDir,e.getActivePluginsForReloader,e.i18nRegistry)}}function Kd(e){return{toolsSyncCoordinator:new us({sessionConfigResolver:e.sessionConfigResolver,getSession:e.getSession,listSessionIds:e.listSessionIds,logger:e.logger}),pluginContributionsFacade:new Ts({getWorkspaceDir:()=>e.workspaceDir,settings:e.settings,getActivePlugins:e.getActivePlugins,pluginModuleManager:e.pluginModuleManager,mcpController:e.mcpController})}}function qd(e){let t=new Set(e.hookRegistry.getRegistered().map(e=>e.name)),n=new Dd(e.toolRegistry,e.hookRegistry),r=new ka(e.settings,e.toolRegistry,e.logger,e.workspaceDir,e.getResilienceConfig);return{permissionRegistry:n.registry,auditLog:n.auditLog,mcpController:r,preExistingHooks:t}}function Jd(e){return new Pa({settings:e.settings,mcp:e.mcpController,skills:e.skillRegistry,getAgentProfiles:()=>e.declarativeAgentProfiles,getPlugins:()=>Vn({cwd:e.workspaceDir,homedir:e.pluginHomedir,bundledDirs:e.pluginBundledDirs}),processRuntime:Vt,onPluginToggle:e.onPluginToggle})}function Yd(e){e.pluginInput.register(Pn()),e.pluginInput.registerProvider(`@`,In({cwd:e.workspaceDir})),e.sigilResolvers.register(Rd(),`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=Hl(e.activePlugins());t.length>0&&e.pluginInput.register(t),Ul(e.activePlugins());for(let t of jd(e.activePlugins()))e.agentRuntime.contextSources.register(t);return e.registerHooks(),{ownedHookNames:e.hookRegistry.getRegistered().map(e=>e.name).filter(t=>!e.preExistingHooks.has(t)),processRegistryUnsubs:Md({hasSession:t=>!!e.codingSessionPoolGet(t),emitHook:(t,n)=>e.hookRegistry.emit(t,n),logger:e.logger,repoRoot:e.workspaceDir})}}async function Xd(e,t,n){t()||(await e.load(),n(!0))}function Zd(e){for(let t of e)try{t.apply()}catch(e){throw Error(`deferred config step "${t.label}" failed: ${e.message}`,{cause:e})}}function Qd(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:Ki(e.getScheduleService),searchEcosystem:e.searchEcosystem}}function $d(e){let{orchestrator:t,writeTodos:n,skillProvider:r,autoMemory:i,reloadMemory:a,archiveRecall:o}=e,s=e.processOwner,c=s?{register:e=>w.register({...e,owner:s}),get:e=>w.get(e),getForSession:(e,t)=>w.getForSession(e,t),listForSession:e=>w.listForSession(e),kill:e=>w.kill(e),updateDetectedService:(e,t)=>w.updateDetectedService(e,t)}:w;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=>r.execute(e)}: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}:void 0}}function ef(e,t){return y({name:`tool-guidance-injection`,timing:`system.prompt.transform`,priority:vt.toolGuidance.priority,handle:async(n,r)=>{let i=e.buildToolGuidance(t());i&&(r.systemPrompt=`${r.systemPrompt}\n\n${i}`)}})}const tf=x(process.cwd(),`docs/rfc/RFC-284-core-pack/content.txt`),nf=x(process.cwd(),`docs/rfc/RFC-284-governance-plan.json`);function rf(){if(!D(tf))return;let e=k(tf,`utf8`).trim();return e.length>0?e:void 0}function af(){if(!D(nf))return new Map;let e=JSON.parse(k(nf,`utf8`));return new Map((e.decisions??[]).map(e=>[e.key,e]))}function of(e){return new Set(e.toLowerCase().split(/[^\p{L}\p{N}._/-]+/u).filter(e=>e.length>=3))}function sf(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 cf(e,t){let n=of(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=of(`${e.trigger} ${e.insight}`);for(let e of n)a.has(e)&&(r+=1);return r}function lf(e,t,n){if(!n)return;let r=e.map(e=>{let r=`workspace:${e.id}`,i=t.get(r);if(!i||i.class!==`fact`||i.state!==`active`||i.supersededBy)return;let a=cf(e,n);if(a<=0)return;let o=`[${e.tags.join(`, `)}] ${e.trigger} → ${e.insight}`;return{lesson:e,score:a,text:o,tokens:sf(o)}}).filter(e=>!!e).sort((e,t)=>t.score-e.score||e.tokens-t.tokens||e.lesson.id.localeCompare(t.lesson.id)),i=[],a=0;for(let e of r)if(!(a+e.tokens>1024)&&(i.push(e),a+=e.tokens,i.length>=3))break;if(i.length!==0)return{text:[`### Relevant Lesson Hints`,`Query-specific volatile hints selected from RFC-284 fact lessons:`,...i.map((e,t)=>`${t+1}. workspace:${e.lesson.id} score=${e.score} ${e.text}`)].join(`
405
- `),hitIds:i.map(e=>e.lesson.id)}}function uf(e,t,n){let r=kt({name:`lesson-injection`,priority:vt.lesson.priority,compute:async()=>{let r=rf(),i=n?await n.list():[];if(r){let e=i.length>0?await t.loadRuntimeLessonsTemplate()??void 0:void 0;return[r,i.length>0?_n(i,e):``].filter(e=>e.length>0).join(`
401
+ If the image is not a UI/design screenshot, give a normal concise description instead. Do not speculate beyond what's visible.`;var ud=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?`${ld}\n\nContext: ${t.contextHint}`:ld},{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 g(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 pi(`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 dd(e){let t=e?.slots?.vision;if(t)return Array.isArray(t)?t:[t]}function fd(e,t){globalThis[e]||Object.defineProperty(globalThis,e,{value:Object.freeze(t()),writable:!1,configurable:!1})}var pd=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,fd(`__ottoPanelRuntime`,()=>({callMcpTool:(e,t,n)=>this.callMcpTool(e,t,n),usePluginData:md(this)}))}};function md(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 hd=new pd;function gd(e){hd.install(e)}const _d=`backend/`;function vd(e){return e.startsWith(_d)?e:`${_d}${e}`}var yd=class{fns=null;get(){return this.fns}install(e){this.fns=e,fd(`__ottoPanelBackendRuntime`,()=>({usePanelBackend:xd(this)}))}};function bd(){return globalThis.__ottoCurrentPanelPluginId}function xd(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=bd(),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,vd(e),t,i)},[n]),cancel:t.useCallback(e=>{!n||!r||r.cancel(n,e)},[n]),state:i,status:o}}}const Sd=new yd;function Cd(e){Sd.install(e)}function wd(){let e=process.env.LC_ALL||process.env.LC_MESSAGES||process.env.LANG||``;return/zh/i.test(e)?`zh`:`en`}function Td(e){return!e||e===`auto`?wd():e}var Ed=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=E(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=eu(e.id,e.manifest),r=eu(e.id,t),i=new Set([...n].filter(e=>r.has(e)));i.size>0&&o.set(e.id,i);let a=tu(e.id,e.manifest),c=tu(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 uu(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=lu(n,l,this.deps,o.get(n),s.get(n));e+=r.registered.length,t+=r.rejected.length,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 uu(e,t,this.deps);this.previousSnapshot=[],this.loadedPluginIds=[]}};function Dd(e,n){if(!e)return{devtools:null,logSubscription:null};let r=new t;return{devtools:r,logSubscription:qe(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 Od=class{registry;auditLog;constructor(e,t){let n=Ae(e.getAll());this.auditLog=new ge,this.registry=ke({toolSets:n}),t.register(De(this.registry,this.auditLog))}};const kd=C(`@x-otto/coding:plugin-context-sources`),Ad=64*1024;function jd(e,t,n){let r=S(t,n);if(!Rs(r,t)){kd.warn({pluginId:e,file:n},`contextSources.content.file resolves outside plugin dir, skipped`);return}try{let e=k(r,`utf8`);return Buffer.byteLength(e,`utf8`)>Ad?`${e.slice(0,Ad)}\n<!-- truncated -->`:e}catch(t){kd.warn({pluginId:e,file:n,err:String(t)},`contextSources.content.file read failed, skipped`);return}}function Md(e){let t=[];for(let n of e){if(E(n).gated)continue;let e=n.manifest.contributes?.contextSources;if(e?.length){if(!n.manifest.capabilities?.includes(`context`)){kd.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:jd(n.id,n.dir,r.content.file);if(e!=null)return`<!-- plugin:${n.id} -->\n${e}`}})}}return t}function Nd(e){Wt(),Ut(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[w.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.sessionId,processId:n.id,pid:n.pid,command:n.command,port:n.port})}),w.onExit(n=>{e.logger.info({id:n.id,pid:n.pid,status:n.status,exitCode:n.exitCode},`Background process exited`),t(`process.exited`,{sessionId:n.sessionId,processId:n.id,pid:n.pid,command:n.command,status:n.status,exitCode:n.exitCode})})]}const Pd=2e4,Fd=(e,t)=>{let n=ki(`git`,[...e],{cwd:t,timeout:1e4,encoding:`utf-8`,maxBuffer:4194304});return n.error||n.status!==0?null:n.stdout??``};function Id(e){return e.length<=Pd?e:`${e.slice(0,Pd)}\n[...truncated ${e.length-Pd} chars...]`}function Ld(e,t,n,r){let i=S(e),a=He(t)?t:S(i,t);if(a!==i&&!a.startsWith(`${i}/`)||!D(a)||!Zr(a).isFile())return null;let o;try{o=k(a,`utf-8`)}catch{return null}if(o.includes(`\0`))return null;let s=o.split(`
402
+ `),c=Math.max(1,n);if(c>s.length)return null;let l=Math.min(s.length,r>0?r:n);return Id(s.slice(c-1,l).join(`
403
+ `))}function Rd(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(`
404
+ `)[0]??``);if(!a)return null;let o=parseInt(a[2],10);return Ld(e,a[1],o,o+r)}function zd(e){let t=e?.gitRunner??Fd;return[{id:`file-range`,resolve:(e,t)=>{let n=/^([\w./\-]+):(\d+)(?:-(\d+))?$/.exec(e);if(!n)return``;let r=Ld(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=Rd(n.workspaceDir,e,t);return r===null?``:`\n\n@def:${e}:\n\`\`\`\n${r}\n\`\`\`\n`}}]}function Bd(e){return{sandbox:new Ca(e.logger),memoryGovernor:new ht({logger:e.logger}),residencyGovernor:new _t,fleetMonitor:new mt({logger:e.logger}),permissionSync:new Sa({logger:e.logger,getToolRegistry:e.getToolRegistry,getPermissionRegistry:e.getPermissionRegistry}),hookRegistry:e.hookRegistry??Te({preset:`default`,onHookTimeout:e.onHookTimeout})}}function Vd(e){let t=Dd(e.inspect,e.loggerName),n=t.devtools,r=t.logSubscription,i=new fi({workspaceDir:e.workspaceDir,projectConfigPath:e.projectConfigPath,projectConfigTrusted:()=>Ir(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;$e(r),Xe(r),e.getI18nRegistry().setLocale(Td(t.language))}),{devtools:n,logSubscription:r,settings:i}}function Hd(e){let t=new ud({getModelRegistry:e.getModelRegistry,providerRegistry:e.providerRegistry,getVisionSlotCandidates:()=>dd(e.getSettings().get(`model_slots`)),isModelUsable:e.isModelUsable,logger:e.logger});return{visionDelegateService:t,sessionConfigResolver:new uo({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 Ud(e){let t=td(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},e.resolveEffectiveModel),n=t.sessions;return{agentRuntime:t,codingSessionPool:n,swarmAgentRunner:ad({hookRegistry:e.hookRegistry,stream:n.stream,logger:e.logger,defaultModel:e.defaultModel,getTools:e.getTools,getDeclarativeAgentProfiles:e.getDeclarativeAgentProfiles}),defaultModel:e.defaultModel}}function Wd(e){let{runSession:t,abortTask:n}=Mo({logger:e.logger,getSession:e.getSession,createSession:e.createSession,removeSession:e.removeSession}),r=new ci({hookRegistry:e.hookRegistry,runSession:t,abortTask:n,runAgentTurn:e.swarmAgentRunner,workflowConfig:e.workflowConfig});return{orchestrator:r,runSession:t,runTeam:cd({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:zi()}}function Gd(e){gd(e.callMcpTool);let t=new nc({mcpController:e.mcpController,getActivePlugins:e.getActivePlugins});return Cd({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 Kd(e){let t=new Nu({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,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.notifyUser?{notifyUser:e.notifyUser}:{}}),n=new Ed({providerRegistry:e.providerRegistry,authStore:e.authStore,modelRegistry:e.modelRegistry,wireProtocolRegistry:e.wireProtocolRegistry,activePlugins:e.activePlugins,logger:e.logger});return e.i18nRegistry.register(Hs(e.activePlugins())),{pluginModuleManager:t,pluginProviderManager:n,capabilityReloader:new ec(e.settings,e.mcpController,e.skillRegistryForReloader,t,n,e.toolRegistry,e.modelCatalogManager,e.workspaceDir,e.getActivePluginsForReloader,e.i18nRegistry)}}function qd(e){return{toolsSyncCoordinator:new ds({sessionConfigResolver:e.sessionConfigResolver,getSession:e.getSession,listSessionIds:e.listSessionIds,logger:e.logger}),pluginContributionsFacade:new Es({getWorkspaceDir:()=>e.workspaceDir,settings:e.settings,getActivePlugins:e.getActivePlugins,pluginModuleManager:e.pluginModuleManager,mcpController:e.mcpController})}}function Jd(e){let t=new Set(e.hookRegistry.getRegistered().map(e=>e.name)),n=new Od(e.toolRegistry,e.hookRegistry),r=new ka(e.settings,e.toolRegistry,e.logger,e.workspaceDir,e.getResilienceConfig);return{permissionRegistry:n.registry,auditLog:n.auditLog,mcpController:r,preExistingHooks:t}}function Yd(e){return new Pa({settings:e.settings,mcp:e.mcpController,skills:e.skillRegistry,getAgentProfiles:()=>e.declarativeAgentProfiles,getPlugins:()=>Vn({cwd:e.workspaceDir,homedir:e.pluginHomedir,bundledDirs:e.pluginBundledDirs}),processRuntime:Vt,onPluginToggle:e.onPluginToggle})}function Xd(e){e.pluginInput.register(Pn()),e.pluginInput.registerProvider(`@`,In({cwd:e.workspaceDir})),e.sigilResolvers.register(zd(),`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=Ul(e.activePlugins());t.length>0&&e.pluginInput.register(t),Wl(e.activePlugins());for(let t of Md(e.activePlugins()))e.agentRuntime.contextSources.register(t);return e.registerHooks(),{ownedHookNames:e.hookRegistry.getRegistered().map(e=>e.name).filter(t=>!e.preExistingHooks.has(t)),processRegistryUnsubs:Nd({hasSession:t=>!!e.codingSessionPoolGet(t),emitHook:(t,n)=>e.hookRegistry.emit(t,n),logger:e.logger,repoRoot:e.workspaceDir})}}async function Zd(e,t,n){t()||(await e.load(),n(!0))}function Qd(e){for(let t of e)try{t.apply()}catch(e){throw Error(`deferred config step "${t.label}" failed: ${e.message}`,{cause:e})}}function $d(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:Ki(e.getScheduleService),searchEcosystem:e.searchEcosystem}}function ef(e){let{orchestrator:t,writeTodos:n,skillProvider:r,autoMemory:i,reloadMemory:a,archiveRecall:o}=e,s=e.processOwner,c=s?{register:e=>w.register({...e,owner:s}),get:e=>w.get(e),getForSession:(e,t)=>w.getForSession(e,t),listForSession:e=>w.listForSession(e),kill:e=>w.kill(e),updateDetectedService:(e,t)=>w.updateDetectedService(e,t)}:w;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=>r.execute(e)}: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}:void 0}}function tf(e,t){return y({name:`tool-guidance-injection`,timing:`system.prompt.transform`,priority:vt.toolGuidance.priority,handle:async(n,r)=>{let i=e.buildToolGuidance(t());i&&(r.systemPrompt=`${r.systemPrompt}\n\n${i}`)}})}const nf=x(process.cwd(),`docs/rfc/RFC-284-core-pack/content.txt`),rf=x(process.cwd(),`docs/rfc/RFC-284-governance-plan.json`);function af(){if(!D(nf))return;let e=k(nf,`utf8`).trim();return e.length>0?e:void 0}function of(){if(!D(rf))return new Map;let e=JSON.parse(k(rf,`utf8`));return new Map((e.decisions??[]).map(e=>[e.key,e]))}function sf(e){return new Set(e.toLowerCase().split(/[^\p{L}\p{N}._/-]+/u).filter(e=>e.length>=3))}function cf(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 lf(e,t){let n=sf(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=sf(`${e.trigger} ${e.insight}`);for(let e of n)a.has(e)&&(r+=1);return r}function uf(e,t,n){if(!n)return;let r=e.map(e=>{let r=`workspace:${e.id}`,i=t.get(r);if(!i||i.class!==`fact`||i.state!==`active`||i.supersededBy)return;let a=lf(e,n);if(a<=0)return;let o=`[${e.tags.join(`, `)}] ${e.trigger} → ${e.insight}`;return{lesson:e,score:a,text:o,tokens:cf(o)}}).filter(e=>!!e).sort((e,t)=>t.score-e.score||e.tokens-t.tokens||e.lesson.id.localeCompare(t.lesson.id)),i=[],a=0;for(let e of r)if(!(a+e.tokens>1024)&&(i.push(e),a+=e.tokens,i.length>=3))break;if(i.length!==0)return{text:[`### Relevant Lesson Hints`,`Query-specific volatile hints selected from RFC-284 fact lessons:`,...i.map((e,t)=>`${t+1}. workspace:${e.lesson.id} score=${e.score} ${e.text}`)].join(`
405
+ `),hitIds:i.map(e=>e.lesson.id)}}function df(e,t,n){let r=kt({name:`lesson-injection`,priority:vt.lesson.priority,compute:async()=>{let r=af(),i=n?await n.list():[];if(r){let e=i.length>0?await t.loadRuntimeLessonsTemplate()??void 0:void 0;return[r,i.length>0?_n(i,e):``].filter(e=>e.length>0).join(`
406
406
 
407
- `)||void 0}let a=[...await e.list(),...i];if(a.length!==0)return _n(a,await t.loadRuntimeLessonsTemplate()??void 0)||void 0}}),i=y({name:`lesson-relevant-hints`,timing:`system.prompt.transform`,priority:vt.lesson.priority+1,handle:async(t,n)=>{if(!t.userText)return;let r=af();if(r.size===0)return;let i=lf(await e.list(),r,t.userText);i&&(await e.recordRelevantHits(i.hitIds),n.systemTail=[...n.systemTail??[],i.text])}});return[...r,i]}function df(e){return kt({name:`skill-catalog-injection`,priority:vt.skillCatalog.priority,compute:()=>{let t=e.buildCatalog();if(t)return`${t}\n\nUse the skill tool with a skill name to load its full instructions.`}})}function ff(e,t,n){let r=e.get(t.sessionId);if(!r||r.length===0)return;e.delete(t.sessionId);let i=r.join(`
408
- `),a=n.messages.length-1,o=n.messages[a];if(o&&o.role===`user`&&Array.isArray(o.content)){n.messages[a]={...o,content:[...o.content,{type:`text`,text:i}]};return}n.messages.push({role:`user`,timestamp:Date.now(),content:[{type:`text`,text:i}]})}function pf(e){let t=e.exitCode===void 0?``:`\nexit code: ${e.exitCode}`;return`<background-process-notification>\nid: ${e.processId}\npid: ${e.pid}\ncommand: ${e.command}\nstatus: ${e.status}${t}\n</background-process-notification>`}function mf(){let e=new Map;return[y({name:`background-process-exit-collector`,timing:`process.exited`,handle:t=>{let n=e.get(t.sessionId)??[];n.push(pf(t)),e.set(t.sessionId,n)}}),y({name:`background-process-exit-injector`,timing:`messages.transform`,priority:25,handle:(t,n)=>{ff(e,t,n)}}),y({name:`background-process-notification-cleanup`,timing:`session.deleted`,handle:t=>{e.delete(t.sessionId)}})]}function hf(e){return y({name:`background-process-session-kill`,timing:`session.deleted`,handle:t=>{let n=t.metadata.reason;n===`idle`||n===`evicted`||e(t.sessionId)}})}function gf(e){return[y({name:`session-permission-restore-hydrate`,timing:`session.restored`,handle:t=>{let n=e.getPersistedAllow(t.sessionId);n.length>0&&e.registry.setSessionAlwaysAllow(t.sessionId,n)}}),y({name:`session-permission-cleanup`,timing:`session.deleted`,handle:t=>{e.registry.clearSessionAlwaysAllow(t.sessionId)}})]}function _f(e){return e.role===`user`||e.role===`assistant`||e.role===`tool_result`}function vf(e,t,n={}){let r=n.minMessages??6;return[y({name:`memory-auto-extract`,timing:`session.idle`,handle:async i=>{if(n.isEnabled&&!n.isEnabled())return;let a=e(i.sessionId);if(!a)return;let o=a.session.messages();o.length<r||await t.onIdle(i.sessionId,o.filter(_f))}}),y({name:`memory-auto-extract-cleanup`,timing:`session.deleted`,handle:e=>{t.reset(e.sessionId)}})]}function yf(e){return kt({name:vt.skillLoopGuidance.name,priority:vt.skillLoopGuidance.priority,compute:()=>e.isEnabled()?mn:void 0})}const bf=336*60*60*1e3;function xf(e){return typeof e!=`number`||!Number.isFinite(e)?bf:Math.max(864e5,Math.round(e*24*60*60*1e3))}function Sf(e,t,n=bf){return e.filter(e=>e.dismissedAt===void 0||t-e.dismissedAt>=n)}function Cf(e){return new Date(e).toISOString().slice(0,10)}function wf(e){return`你重复做过同一类任务 ${e.size} 次,要把它的执行流程固化成一个可复用的 skill 吗?`}function Tf(e){let t=e.sessionIds.slice(0,5).join(`, `),n=e.sessionIds.length>5?` 等 ${e.sessionIds.length} 个会话`:``;return[`以下内容由插件 plugin-skill-inductor 观测生成(非用户输入、非宿主指令),仅供参考:`,``,`任务类型:${e.taskSignature}`,`出现次数:${e.size}`,`标签:${e.tags.length>0?e.tags.join(` / `):`(无)`}`,`涉及会话:${t}${n}`,`时间跨度:${Cf(e.firstAt)} ~ ${Cf(e.lastAt)}`,``,`若同意,otto 会据这些会话的执行路径起草一份 SKILL.md 交你审阅——生成物仍需你显式 apply 才会生效。`,`完整候选数据可用 read 工具查看插件状态目录下的 candidates.json。`].join(`
409
- `)}function Ef(){return`暂不生成。技能固化应由你在看到具体流程后主动决定;无人应答时默认跳过,稍后同类任务再出现会重新征询。`}function Df(){return[{label:`暂不生成`,rationale:`保持现状。同类任务再积累一段时间后会重新征询(两周冷却期内不再打扰)。`,recommended:!0},{label:`起草 SKILL.md 给我看`,rationale:`据这些会话的执行路径生成一份技能草稿,仍需你审阅 diff 并显式 apply 才会生效。`}]}Object.freeze({status:`aborted`});function H(e,t,n){function r(n,r){if(n._zod||Object.defineProperty(n,`_zod`,{value:{def:r,constr:o,traits:new Set},enumerable:!1}),n._zod.traits.has(e))return;n._zod.traits.add(e),t(n,r);let i=o.prototype,a=Object.keys(i);for(let e=0;e<a.length;e++){let t=a[e];t in n||(n[t]=i[t].bind(n))}}let i=n?.Parent??Object;class a extends i{}Object.defineProperty(a,`name`,{value:e});function o(e){var t;let i=n?.Parent?new a:this;r(i,e),(t=i._zod).deferred??(t.deferred=[]);for(let e of i._zod.deferred)e();return i}return Object.defineProperty(o,`init`,{value:r}),Object.defineProperty(o,Symbol.hasInstance,{value:t=>n?.Parent&&t instanceof n.Parent?!0:t?._zod?.traits?.has(e)}),Object.defineProperty(o,`name`,{value:e}),o}var Of=class extends Error{constructor(){super(`Encountered Promise during synchronous parse. Use .parseAsync() instead.`)}},kf=class extends Error{constructor(e){super(`Encountered unidirectional transform during encode: ${e}`),this.name=`ZodEncodeError`}};const Af={};function jf(e){return e&&Object.assign(Af,e),Af}function Mf(e){let t=Object.values(e).filter(e=>typeof e==`number`);return Object.entries(e).filter(([e,n])=>t.indexOf(+e)===-1).map(([e,t])=>t)}function Nf(e,t){return typeof t==`bigint`?t.toString():t}function Pf(e){return{get value(){{let t=e();return Object.defineProperty(this,`value`,{value:t}),t}throw Error(`cached value already set`)}}}function Ff(e){return e==null}function If(e){let t=e.startsWith(`^`)?1:0,n=e.endsWith(`$`)?e.length-1:e.length;return e.slice(t,n)}function Lf(e,t){let n=(e.toString().split(`.`)[1]||``).length,r=t.toString(),i=(r.split(`.`)[1]||``).length;if(i===0&&/\d?e-\d?/.test(r)){let e=r.match(/\d?e-(\d?)/);e?.[1]&&(i=Number.parseInt(e[1]))}let a=n>i?n:i;return Number.parseInt(e.toFixed(a).replace(`.`,``))%Number.parseInt(t.toFixed(a).replace(`.`,``))/10**a}const Rf=Symbol(`evaluating`);function U(e,t,n){let r;Object.defineProperty(e,t,{get(){if(r!==Rf)return r===void 0&&(r=Rf,r=n()),r},set(n){Object.defineProperty(e,t,{value:n})},configurable:!0})}function zf(e,t,n){Object.defineProperty(e,t,{value:n,writable:!0,enumerable:!0,configurable:!0})}function Bf(...e){let t={};for(let n of e)Object.assign(t,Object.getOwnPropertyDescriptors(n));return Object.defineProperties({},t)}function Vf(e){return JSON.stringify(e)}function Hf(e){return e.toLowerCase().trim().replace(/[^\w\s-]/g,``).replace(/[\s_-]+/g,`-`).replace(/^-+|-+$/g,``)}const Uf=`captureStackTrace`in Error?Error.captureStackTrace:(...e)=>{};function Wf(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const Gf=Pf(()=>{if(typeof navigator<`u`&&navigator?.userAgent?.includes(`Cloudflare`))return!1;try{return Function(``),!0}catch{return!1}});function Kf(e){if(Wf(e)===!1)return!1;let t=e.constructor;if(t===void 0||typeof t!=`function`)return!0;let n=t.prototype;return!(Wf(n)===!1||Object.prototype.hasOwnProperty.call(n,`isPrototypeOf`)===!1)}function qf(e){return Kf(e)?{...e}:Array.isArray(e)?[...e]:e}const Jf=new Set([`string`,`number`,`symbol`]);function Yf(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function Xf(e,t,n){let r=new e._zod.constr(t??e._zod.def);return(!t||n?.parent)&&(r._zod.parent=e),r}function W(e){let t=e;if(!t)return{};if(typeof t==`string`)return{error:()=>t};if(t?.message!==void 0){if(t?.error!==void 0)throw Error("Cannot specify both `message` and `error` params");t.error=t.message}return delete t.message,typeof t.error==`string`?{...t,error:()=>t.error}:t}function Zf(e){return Object.keys(e).filter(t=>e[t]._zod.optin===`optional`&&e[t]._zod.optout===`optional`)}const Qf={safeint:[-(2**53-1),2**53-1],int32:[-2147483648,2147483647],uint32:[0,4294967295],float32:[-34028234663852886e22,34028234663852886e22],float64:[-Number.MAX_VALUE,Number.MAX_VALUE]};function $f(e,t){let n=e._zod.def,r=n.checks;if(r&&r.length>0)throw Error(`.pick() cannot be used on object schemas containing refinements`);return Xf(e,Bf(e._zod.def,{get shape(){let e={};for(let r in t){if(!(r in n.shape))throw Error(`Unrecognized key: "${r}"`);t[r]&&(e[r]=n.shape[r])}return zf(this,`shape`,e),e},checks:[]}))}function ep(e,t){let n=e._zod.def,r=n.checks;if(r&&r.length>0)throw Error(`.omit() cannot be used on object schemas containing refinements`);return Xf(e,Bf(e._zod.def,{get shape(){let r={...e._zod.def.shape};for(let e in t){if(!(e in n.shape))throw Error(`Unrecognized key: "${e}"`);t[e]&&delete r[e]}return zf(this,`shape`,r),r},checks:[]}))}function tp(e,t){if(!Kf(t))throw Error(`Invalid input to extend: expected a plain object`);let n=e._zod.def.checks;if(n&&n.length>0){let n=e._zod.def.shape;for(let e in t)if(Object.getOwnPropertyDescriptor(n,e)!==void 0)throw Error("Cannot overwrite keys on object schemas containing refinements. Use `.safeExtend()` instead.")}return Xf(e,Bf(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t};return zf(this,`shape`,n),n}}))}function np(e,t){if(!Kf(t))throw Error(`Invalid input to safeExtend: expected a plain object`);return Xf(e,Bf(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t};return zf(this,`shape`,n),n}}))}function rp(e,t){return Xf(e,Bf(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t._zod.def.shape};return zf(this,`shape`,n),n},get catchall(){return t._zod.def.catchall},checks:[]}))}function ip(e,t,n){let r=t._zod.def.checks;if(r&&r.length>0)throw Error(`.partial() cannot be used on object schemas containing refinements`);return Xf(t,Bf(t._zod.def,{get shape(){let r=t._zod.def.shape,i={...r};if(n)for(let t in n){if(!(t in r))throw Error(`Unrecognized key: "${t}"`);n[t]&&(i[t]=e?new e({type:`optional`,innerType:r[t]}):r[t])}else for(let t in r)i[t]=e?new e({type:`optional`,innerType:r[t]}):r[t];return zf(this,`shape`,i),i},checks:[]}))}function ap(e,t,n){return Xf(t,Bf(t._zod.def,{get shape(){let r=t._zod.def.shape,i={...r};if(n)for(let t in n){if(!(t in i))throw Error(`Unrecognized key: "${t}"`);n[t]&&(i[t]=new e({type:`nonoptional`,innerType:r[t]}))}else for(let t in r)i[t]=new e({type:`nonoptional`,innerType:r[t]});return zf(this,`shape`,i),i}}))}function op(e,t=0){if(e.aborted===!0)return!0;for(let n=t;n<e.issues.length;n++)if(e.issues[n]?.continue!==!0)return!0;return!1}function sp(e,t){return t.map(t=>{var n;return(n=t).path??(n.path=[]),t.path.unshift(e),t})}function cp(e){return typeof e==`string`?e:e?.message}function lp(e,t,n){let r={...e,path:e.path??[]};return e.message||(r.message=cp(e.inst?._zod.def?.error?.(e))??cp(t?.error?.(e))??cp(n.customError?.(e))??cp(n.localeError?.(e))??`Invalid input`),delete r.inst,delete r.continue,t?.reportInput||delete r.input,r}function up(e){return Array.isArray(e)?`array`:typeof e==`string`?`string`:`unknown`}function dp(...e){let[t,n,r]=e;return typeof t==`string`?{message:t,code:`custom`,input:n,inst:r}:{...t}}const fp=(e,t)=>{e.name=`$ZodError`,Object.defineProperty(e,`_zod`,{value:e._zod,enumerable:!1}),Object.defineProperty(e,`issues`,{value:t,enumerable:!1}),e.message=JSON.stringify(t,Nf,2),Object.defineProperty(e,`toString`,{value:()=>e.message,enumerable:!1})},pp=H(`$ZodError`,fp),mp=H(`$ZodError`,fp,{Parent:Error});function hp(e,t=e=>e.message){let n={},r=[];for(let i of e.issues)i.path.length>0?(n[i.path[0]]=n[i.path[0]]||[],n[i.path[0]].push(t(i))):r.push(t(i));return{formErrors:r,fieldErrors:n}}function gp(e,t=e=>e.message){let n={_errors:[]},r=e=>{for(let i of e.issues)if(i.code===`invalid_union`&&i.errors.length)i.errors.map(e=>r({issues:e}));else if(i.code===`invalid_key`)r({issues:i.issues});else if(i.code===`invalid_element`)r({issues:i.issues});else if(i.path.length===0)n._errors.push(t(i));else{let e=n,r=0;for(;r<i.path.length;){let n=i.path[r];r===i.path.length-1?(e[n]=e[n]||{_errors:[]},e[n]._errors.push(t(i))):e[n]=e[n]||{_errors:[]},e=e[n],r++}}};return r(e),n}const _p=e=>(t,n,r,i)=>{let a=r?Object.assign(r,{async:!1}):{async:!1},o=t._zod.run({value:n,issues:[]},a);if(o instanceof Promise)throw new Of;if(o.issues.length){let t=new(i?.Err??e)(o.issues.map(e=>lp(e,a,jf())));throw Uf(t,i?.callee),t}return o.value},vp=e=>async(t,n,r,i)=>{let a=r?Object.assign(r,{async:!0}):{async:!0},o=t._zod.run({value:n,issues:[]},a);if(o instanceof Promise&&(o=await o),o.issues.length){let t=new(i?.Err??e)(o.issues.map(e=>lp(e,a,jf())));throw Uf(t,i?.callee),t}return o.value},yp=e=>(t,n,r)=>{let i=r?{...r,async:!1}:{async:!1},a=t._zod.run({value:n,issues:[]},i);if(a instanceof Promise)throw new Of;return a.issues.length?{success:!1,error:new(e??pp)(a.issues.map(e=>lp(e,i,jf())))}:{success:!0,data:a.value}},bp=yp(mp),xp=e=>async(t,n,r)=>{let i=r?Object.assign(r,{async:!0}):{async:!0},a=t._zod.run({value:n,issues:[]},i);return a instanceof Promise&&(a=await a),a.issues.length?{success:!1,error:new e(a.issues.map(e=>lp(e,i,jf())))}:{success:!0,data:a.value}},Sp=xp(mp),Cp=e=>(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return _p(e)(t,n,i)},wp=e=>(t,n,r)=>_p(e)(t,n,r),Tp=e=>async(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return vp(e)(t,n,i)},Ep=e=>async(t,n,r)=>vp(e)(t,n,r),Dp=e=>(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return yp(e)(t,n,i)},Op=e=>(t,n,r)=>yp(e)(t,n,r),kp=e=>async(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return xp(e)(t,n,i)},Ap=e=>async(t,n,r)=>xp(e)(t,n,r),jp=/^[cC][^\s-]{8,}$/,Mp=/^[0-9a-z]+$/,Np=/^[0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{26}$/,Pp=/^[0-9a-vA-V]{20}$/,Fp=/^[A-Za-z0-9]{27}$/,Ip=/^[a-zA-Z0-9_-]{21}$/,Lp=/^P(?:(\d+W)|(?!.*W)(?=\d|T\d)(\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+([.,]\d+)?S)?)?)$/,Rp=/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$/,zp=e=>e?RegExp(`^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-${e}[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$`):/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/,Bp=/^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$/;function Vp(){return RegExp(`^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$`,`u`)}const Hp=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,Up=/^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$/,Wp=/^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/([0-9]|[1-2][0-9]|3[0-2])$/,Gp=/^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,Kp=/^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$/,qp=/^[A-Za-z0-9_-]*$/,Jp=/^\+[1-9]\d{6,14}$/,Yp=`(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))`,Xp=RegExp(`^${Yp}$`);function Zp(e){let t=`(?:[01]\\d|2[0-3]):[0-5]\\d`;return typeof e.precision==`number`?e.precision===-1?`${t}`:e.precision===0?`${t}:[0-5]\\d`:`${t}:[0-5]\\d\\.\\d{${e.precision}}`:`${t}(?::[0-5]\\d(?:\\.\\d+)?)?`}function Qp(e){return RegExp(`^${Zp(e)}$`)}function $p(e){let t=Zp({precision:e.precision}),n=[`Z`];e.local&&n.push(``),e.offset&&n.push(`([+-](?:[01]\\d|2[0-3]):[0-5]\\d)`);let r=`${t}(?:${n.join(`|`)})`;return RegExp(`^${Yp}T(?:${r})$`)}const em=e=>{let t=e?`[\\s\\S]{${e?.minimum??0},${e?.maximum??``}}`:`[\\s\\S]*`;return RegExp(`^${t}$`)},tm=/^-?\d+$/,nm=/^-?\d+(?:\.\d+)?$/,rm=/^[^A-Z]*$/,im=/^[^a-z]*$/,G=H(`$ZodCheck`,(e,t)=>{var n;e._zod??={},e._zod.def=t,(n=e._zod).onattach??(n.onattach=[])}),am={number:`number`,bigint:`bigint`,object:`date`},om=H(`$ZodCheckLessThan`,(e,t)=>{G.init(e,t);let n=am[typeof t.value];e._zod.onattach.push(e=>{let n=e._zod.bag,r=(t.inclusive?n.maximum:n.exclusiveMaximum)??1/0;t.value<r&&(t.inclusive?n.maximum=t.value:n.exclusiveMaximum=t.value)}),e._zod.check=r=>{(t.inclusive?r.value<=t.value:r.value<t.value)||r.issues.push({origin:n,code:`too_big`,maximum:typeof t.value==`object`?t.value.getTime():t.value,input:r.value,inclusive:t.inclusive,inst:e,continue:!t.abort})}}),sm=H(`$ZodCheckGreaterThan`,(e,t)=>{G.init(e,t);let n=am[typeof t.value];e._zod.onattach.push(e=>{let n=e._zod.bag,r=(t.inclusive?n.minimum:n.exclusiveMinimum)??-1/0;t.value>r&&(t.inclusive?n.minimum=t.value:n.exclusiveMinimum=t.value)}),e._zod.check=r=>{(t.inclusive?r.value>=t.value:r.value>t.value)||r.issues.push({origin:n,code:`too_small`,minimum:typeof t.value==`object`?t.value.getTime():t.value,input:r.value,inclusive:t.inclusive,inst:e,continue:!t.abort})}}),cm=H(`$ZodCheckMultipleOf`,(e,t)=>{G.init(e,t),e._zod.onattach.push(e=>{var n;(n=e._zod.bag).multipleOf??(n.multipleOf=t.value)}),e._zod.check=n=>{if(typeof n.value!=typeof t.value)throw Error(`Cannot mix number and bigint in multiple_of check.`);(typeof n.value==`bigint`?n.value%t.value===BigInt(0):Lf(n.value,t.value)===0)||n.issues.push({origin:typeof n.value,code:`not_multiple_of`,divisor:t.value,input:n.value,inst:e,continue:!t.abort})}}),lm=H(`$ZodCheckNumberFormat`,(e,t)=>{G.init(e,t),t.format=t.format||`float64`;let n=t.format?.includes(`int`),r=n?`int`:`number`,[i,a]=Qf[t.format];e._zod.onattach.push(e=>{let r=e._zod.bag;r.format=t.format,r.minimum=i,r.maximum=a,n&&(r.pattern=tm)}),e._zod.check=o=>{let s=o.value;if(n){if(!Number.isInteger(s)){o.issues.push({expected:r,format:t.format,code:`invalid_type`,continue:!1,input:s,inst:e});return}if(!Number.isSafeInteger(s)){s>0?o.issues.push({input:s,code:`too_big`,maximum:2**53-1,note:`Integers must be within the safe integer range.`,inst:e,origin:r,inclusive:!0,continue:!t.abort}):o.issues.push({input:s,code:`too_small`,minimum:-(2**53-1),note:`Integers must be within the safe integer range.`,inst:e,origin:r,inclusive:!0,continue:!t.abort});return}}s<i&&o.issues.push({origin:`number`,input:s,code:`too_small`,minimum:i,inclusive:!0,inst:e,continue:!t.abort}),s>a&&o.issues.push({origin:`number`,input:s,code:`too_big`,maximum:a,inclusive:!0,inst:e,continue:!t.abort})}}),um=H(`$ZodCheckMaxLength`,(e,t)=>{var n;G.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!Ff(t)&&t.length!==void 0}),e._zod.onattach.push(e=>{let n=e._zod.bag.maximum??1/0;t.maximum<n&&(e._zod.bag.maximum=t.maximum)}),e._zod.check=n=>{let r=n.value;if(r.length<=t.maximum)return;let i=up(r);n.issues.push({origin:i,code:`too_big`,maximum:t.maximum,inclusive:!0,input:r,inst:e,continue:!t.abort})}}),dm=H(`$ZodCheckMinLength`,(e,t)=>{var n;G.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!Ff(t)&&t.length!==void 0}),e._zod.onattach.push(e=>{let n=e._zod.bag.minimum??-1/0;t.minimum>n&&(e._zod.bag.minimum=t.minimum)}),e._zod.check=n=>{let r=n.value;if(r.length>=t.minimum)return;let i=up(r);n.issues.push({origin:i,code:`too_small`,minimum:t.minimum,inclusive:!0,input:r,inst:e,continue:!t.abort})}}),fm=H(`$ZodCheckLengthEquals`,(e,t)=>{var n;G.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!Ff(t)&&t.length!==void 0}),e._zod.onattach.push(e=>{let n=e._zod.bag;n.minimum=t.length,n.maximum=t.length,n.length=t.length}),e._zod.check=n=>{let r=n.value,i=r.length;if(i===t.length)return;let a=up(r),o=i>t.length;n.issues.push({origin:a,...o?{code:`too_big`,maximum:t.length}:{code:`too_small`,minimum:t.length},inclusive:!0,exact:!0,input:n.value,inst:e,continue:!t.abort})}}),pm=H(`$ZodCheckStringFormat`,(e,t)=>{var n,r;G.init(e,t),e._zod.onattach.push(e=>{let n=e._zod.bag;n.format=t.format,t.pattern&&(n.patterns??=new Set,n.patterns.add(t.pattern))}),t.pattern?(n=e._zod).check??(n.check=n=>{t.pattern.lastIndex=0,!t.pattern.test(n.value)&&n.issues.push({origin:`string`,code:`invalid_format`,format:t.format,input:n.value,...t.pattern?{pattern:t.pattern.toString()}:{},inst:e,continue:!t.abort})}):(r=e._zod).check??(r.check=()=>{})}),mm=H(`$ZodCheckRegex`,(e,t)=>{pm.init(e,t),e._zod.check=n=>{t.pattern.lastIndex=0,!t.pattern.test(n.value)&&n.issues.push({origin:`string`,code:`invalid_format`,format:`regex`,input:n.value,pattern:t.pattern.toString(),inst:e,continue:!t.abort})}}),hm=H(`$ZodCheckLowerCase`,(e,t)=>{t.pattern??=rm,pm.init(e,t)}),gm=H(`$ZodCheckUpperCase`,(e,t)=>{t.pattern??=im,pm.init(e,t)}),_m=H(`$ZodCheckIncludes`,(e,t)=>{G.init(e,t);let n=Yf(t.includes),r=new RegExp(typeof t.position==`number`?`^.{${t.position}}${n}`:n);t.pattern=r,e._zod.onattach.push(e=>{let t=e._zod.bag;t.patterns??=new Set,t.patterns.add(r)}),e._zod.check=n=>{n.value.includes(t.includes,t.position)||n.issues.push({origin:`string`,code:`invalid_format`,format:`includes`,includes:t.includes,input:n.value,inst:e,continue:!t.abort})}}),vm=H(`$ZodCheckStartsWith`,(e,t)=>{G.init(e,t);let n=RegExp(`^${Yf(t.prefix)}.*`);t.pattern??=n,e._zod.onattach.push(e=>{let t=e._zod.bag;t.patterns??=new Set,t.patterns.add(n)}),e._zod.check=n=>{n.value.startsWith(t.prefix)||n.issues.push({origin:`string`,code:`invalid_format`,format:`starts_with`,prefix:t.prefix,input:n.value,inst:e,continue:!t.abort})}}),ym=H(`$ZodCheckEndsWith`,(e,t)=>{G.init(e,t);let n=RegExp(`.*${Yf(t.suffix)}$`);t.pattern??=n,e._zod.onattach.push(e=>{let t=e._zod.bag;t.patterns??=new Set,t.patterns.add(n)}),e._zod.check=n=>{n.value.endsWith(t.suffix)||n.issues.push({origin:`string`,code:`invalid_format`,format:`ends_with`,suffix:t.suffix,input:n.value,inst:e,continue:!t.abort})}}),bm=H(`$ZodCheckOverwrite`,(e,t)=>{G.init(e,t),e._zod.check=e=>{e.value=t.tx(e.value)}});var xm=class{constructor(e=[]){this.content=[],this.indent=0,this&&(this.args=e)}indented(e){this.indent+=1,e(this),--this.indent}write(e){if(typeof e==`function`){e(this,{execution:`sync`}),e(this,{execution:`async`});return}let t=e.split(`
407
+ `)||void 0}let a=[...await e.list(),...i];if(a.length!==0)return _n(a,await t.loadRuntimeLessonsTemplate()??void 0)||void 0}}),i=y({name:`lesson-relevant-hints`,timing:`system.prompt.transform`,priority:vt.lesson.priority+1,handle:async(t,n)=>{if(!t.userText)return;let r=of();if(r.size===0)return;let i=uf(await e.list(),r,t.userText);i&&(await e.recordRelevantHits(i.hitIds),n.systemTail=[...n.systemTail??[],i.text])}});return[...r,i]}function ff(e){return kt({name:`skill-catalog-injection`,priority:vt.skillCatalog.priority,compute:()=>{let t=e.buildCatalog();if(t)return`${t}\n\nUse the skill tool with a skill name to load its full instructions.`}})}function pf(e,t,n){let r=e.get(t.sessionId);if(!r||r.length===0)return;e.delete(t.sessionId);let i=r.join(`
408
+ `),a=n.messages.length-1,o=n.messages[a];if(o&&o.role===`user`&&Array.isArray(o.content)){n.messages[a]={...o,content:[...o.content,{type:`text`,text:i}]};return}n.messages.push({role:`user`,timestamp:Date.now(),content:[{type:`text`,text:i}]})}function mf(e){let t=e.exitCode===void 0?``:`\nexit code: ${e.exitCode}`;return`<background-process-notification>\nid: ${e.processId}\npid: ${e.pid}\ncommand: ${e.command}\nstatus: ${e.status}${t}\n</background-process-notification>`}function hf(){let e=new Map;return[y({name:`background-process-exit-collector`,timing:`process.exited`,handle:t=>{let n=e.get(t.sessionId)??[];n.push(mf(t)),e.set(t.sessionId,n)}}),y({name:`background-process-exit-injector`,timing:`messages.transform`,priority:25,handle:(t,n)=>{pf(e,t,n)}}),y({name:`background-process-notification-cleanup`,timing:`session.deleted`,handle:t=>{e.delete(t.sessionId)}})]}function gf(e){return y({name:`background-process-session-kill`,timing:`session.deleted`,handle:t=>{let n=t.metadata.reason;n===`idle`||n===`evicted`||e(t.sessionId)}})}function _f(e){return[y({name:`session-permission-restore-hydrate`,timing:`session.restored`,handle:t=>{let n=e.getPersistedAllow(t.sessionId);n.length>0&&e.registry.setSessionAlwaysAllow(t.sessionId,n)}}),y({name:`session-permission-cleanup`,timing:`session.deleted`,handle:t=>{e.registry.clearSessionAlwaysAllow(t.sessionId)}})]}function vf(e){return e.role===`user`||e.role===`assistant`||e.role===`tool_result`}function yf(e,t,n={}){let r=n.minMessages??6;return[y({name:`memory-auto-extract`,timing:`session.idle`,handle:async i=>{if(n.isEnabled&&!n.isEnabled())return;let a=e(i.sessionId);if(!a)return;let o=a.session.messages();o.length<r||await t.onIdle(i.sessionId,o.filter(vf))}}),y({name:`memory-auto-extract-cleanup`,timing:`session.deleted`,handle:e=>{t.reset(e.sessionId)}})]}function bf(e){return kt({name:vt.skillLoopGuidance.name,priority:vt.skillLoopGuidance.priority,compute:()=>e.isEnabled()?mn:void 0})}const xf=336*60*60*1e3;function Sf(e){return typeof e!=`number`||!Number.isFinite(e)?xf:Math.max(864e5,Math.round(e*24*60*60*1e3))}function Cf(e,t,n=xf){return e.filter(e=>e.dismissedAt===void 0||t-e.dismissedAt>=n)}function wf(e){return new Date(e).toISOString().slice(0,10)}function Tf(e){return`你重复做过同一类任务 ${e.size} 次,要把它的执行流程固化成一个可复用的 skill 吗?`}function Ef(e){let t=e.sessionIds.slice(0,5).join(`, `),n=e.sessionIds.length>5?` 等 ${e.sessionIds.length} 个会话`:``;return[`以下内容由插件 plugin-skill-inductor 观测生成(非用户输入、非宿主指令),仅供参考:`,``,`任务类型:${e.taskSignature}`,`出现次数:${e.size}`,`标签:${e.tags.length>0?e.tags.join(` / `):`(无)`}`,`涉及会话:${t}${n}`,`时间跨度:${wf(e.firstAt)} ~ ${wf(e.lastAt)}`,``,`若同意,otto 会据这些会话的执行路径起草一份 SKILL.md 交你审阅——生成物仍需你显式 apply 才会生效。`,`完整候选数据可用 read 工具查看插件状态目录下的 candidates.json。`].join(`
409
+ `)}function Df(){return`暂不生成。技能固化应由你在看到具体流程后主动决定;无人应答时默认跳过,稍后同类任务再出现会重新征询。`}function Of(){return[{label:`暂不生成`,rationale:`保持现状。同类任务再积累一段时间后会重新征询(两周冷却期内不再打扰)。`,recommended:!0},{label:`起草 SKILL.md 给我看`,rationale:`据这些会话的执行路径生成一份技能草稿,仍需你审阅 diff 并显式 apply 才会生效。`}]}Object.freeze({status:`aborted`});function H(e,t,n){function r(n,r){if(n._zod||Object.defineProperty(n,`_zod`,{value:{def:r,constr:o,traits:new Set},enumerable:!1}),n._zod.traits.has(e))return;n._zod.traits.add(e),t(n,r);let i=o.prototype,a=Object.keys(i);for(let e=0;e<a.length;e++){let t=a[e];t in n||(n[t]=i[t].bind(n))}}let i=n?.Parent??Object;class a extends i{}Object.defineProperty(a,`name`,{value:e});function o(e){var t;let i=n?.Parent?new a:this;r(i,e),(t=i._zod).deferred??(t.deferred=[]);for(let e of i._zod.deferred)e();return i}return Object.defineProperty(o,`init`,{value:r}),Object.defineProperty(o,Symbol.hasInstance,{value:t=>n?.Parent&&t instanceof n.Parent?!0:t?._zod?.traits?.has(e)}),Object.defineProperty(o,`name`,{value:e}),o}var kf=class extends Error{constructor(){super(`Encountered Promise during synchronous parse. Use .parseAsync() instead.`)}},Af=class extends Error{constructor(e){super(`Encountered unidirectional transform during encode: ${e}`),this.name=`ZodEncodeError`}};const jf={};function Mf(e){return e&&Object.assign(jf,e),jf}function Nf(e){let t=Object.values(e).filter(e=>typeof e==`number`);return Object.entries(e).filter(([e,n])=>t.indexOf(+e)===-1).map(([e,t])=>t)}function Pf(e,t){return typeof t==`bigint`?t.toString():t}function Ff(e){return{get value(){{let t=e();return Object.defineProperty(this,`value`,{value:t}),t}throw Error(`cached value already set`)}}}function If(e){return e==null}function Lf(e){let t=e.startsWith(`^`)?1:0,n=e.endsWith(`$`)?e.length-1:e.length;return e.slice(t,n)}function Rf(e,t){let n=(e.toString().split(`.`)[1]||``).length,r=t.toString(),i=(r.split(`.`)[1]||``).length;if(i===0&&/\d?e-\d?/.test(r)){let e=r.match(/\d?e-(\d?)/);e?.[1]&&(i=Number.parseInt(e[1]))}let a=n>i?n:i;return Number.parseInt(e.toFixed(a).replace(`.`,``))%Number.parseInt(t.toFixed(a).replace(`.`,``))/10**a}const zf=Symbol(`evaluating`);function U(e,t,n){let r;Object.defineProperty(e,t,{get(){if(r!==zf)return r===void 0&&(r=zf,r=n()),r},set(n){Object.defineProperty(e,t,{value:n})},configurable:!0})}function Bf(e,t,n){Object.defineProperty(e,t,{value:n,writable:!0,enumerable:!0,configurable:!0})}function Vf(...e){let t={};for(let n of e)Object.assign(t,Object.getOwnPropertyDescriptors(n));return Object.defineProperties({},t)}function Hf(e){return JSON.stringify(e)}function Uf(e){return e.toLowerCase().trim().replace(/[^\w\s-]/g,``).replace(/[\s_-]+/g,`-`).replace(/^-+|-+$/g,``)}const Wf=`captureStackTrace`in Error?Error.captureStackTrace:(...e)=>{};function Gf(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const Kf=Ff(()=>{if(typeof navigator<`u`&&navigator?.userAgent?.includes(`Cloudflare`))return!1;try{return Function(``),!0}catch{return!1}});function qf(e){if(Gf(e)===!1)return!1;let t=e.constructor;if(t===void 0||typeof t!=`function`)return!0;let n=t.prototype;return!(Gf(n)===!1||Object.prototype.hasOwnProperty.call(n,`isPrototypeOf`)===!1)}function Jf(e){return qf(e)?{...e}:Array.isArray(e)?[...e]:e}const Yf=new Set([`string`,`number`,`symbol`]);function Xf(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function Zf(e,t,n){let r=new e._zod.constr(t??e._zod.def);return(!t||n?.parent)&&(r._zod.parent=e),r}function W(e){let t=e;if(!t)return{};if(typeof t==`string`)return{error:()=>t};if(t?.message!==void 0){if(t?.error!==void 0)throw Error("Cannot specify both `message` and `error` params");t.error=t.message}return delete t.message,typeof t.error==`string`?{...t,error:()=>t.error}:t}function Qf(e){return Object.keys(e).filter(t=>e[t]._zod.optin===`optional`&&e[t]._zod.optout===`optional`)}const $f={safeint:[-(2**53-1),2**53-1],int32:[-2147483648,2147483647],uint32:[0,4294967295],float32:[-34028234663852886e22,34028234663852886e22],float64:[-Number.MAX_VALUE,Number.MAX_VALUE]};function ep(e,t){let n=e._zod.def,r=n.checks;if(r&&r.length>0)throw Error(`.pick() cannot be used on object schemas containing refinements`);return Zf(e,Vf(e._zod.def,{get shape(){let e={};for(let r in t){if(!(r in n.shape))throw Error(`Unrecognized key: "${r}"`);t[r]&&(e[r]=n.shape[r])}return Bf(this,`shape`,e),e},checks:[]}))}function tp(e,t){let n=e._zod.def,r=n.checks;if(r&&r.length>0)throw Error(`.omit() cannot be used on object schemas containing refinements`);return Zf(e,Vf(e._zod.def,{get shape(){let r={...e._zod.def.shape};for(let e in t){if(!(e in n.shape))throw Error(`Unrecognized key: "${e}"`);t[e]&&delete r[e]}return Bf(this,`shape`,r),r},checks:[]}))}function np(e,t){if(!qf(t))throw Error(`Invalid input to extend: expected a plain object`);let n=e._zod.def.checks;if(n&&n.length>0){let n=e._zod.def.shape;for(let e in t)if(Object.getOwnPropertyDescriptor(n,e)!==void 0)throw Error("Cannot overwrite keys on object schemas containing refinements. Use `.safeExtend()` instead.")}return Zf(e,Vf(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t};return Bf(this,`shape`,n),n}}))}function rp(e,t){if(!qf(t))throw Error(`Invalid input to safeExtend: expected a plain object`);return Zf(e,Vf(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t};return Bf(this,`shape`,n),n}}))}function ip(e,t){return Zf(e,Vf(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t._zod.def.shape};return Bf(this,`shape`,n),n},get catchall(){return t._zod.def.catchall},checks:[]}))}function ap(e,t,n){let r=t._zod.def.checks;if(r&&r.length>0)throw Error(`.partial() cannot be used on object schemas containing refinements`);return Zf(t,Vf(t._zod.def,{get shape(){let r=t._zod.def.shape,i={...r};if(n)for(let t in n){if(!(t in r))throw Error(`Unrecognized key: "${t}"`);n[t]&&(i[t]=e?new e({type:`optional`,innerType:r[t]}):r[t])}else for(let t in r)i[t]=e?new e({type:`optional`,innerType:r[t]}):r[t];return Bf(this,`shape`,i),i},checks:[]}))}function op(e,t,n){return Zf(t,Vf(t._zod.def,{get shape(){let r=t._zod.def.shape,i={...r};if(n)for(let t in n){if(!(t in i))throw Error(`Unrecognized key: "${t}"`);n[t]&&(i[t]=new e({type:`nonoptional`,innerType:r[t]}))}else for(let t in r)i[t]=new e({type:`nonoptional`,innerType:r[t]});return Bf(this,`shape`,i),i}}))}function sp(e,t=0){if(e.aborted===!0)return!0;for(let n=t;n<e.issues.length;n++)if(e.issues[n]?.continue!==!0)return!0;return!1}function cp(e,t){return t.map(t=>{var n;return(n=t).path??(n.path=[]),t.path.unshift(e),t})}function lp(e){return typeof e==`string`?e:e?.message}function up(e,t,n){let r={...e,path:e.path??[]};return e.message||(r.message=lp(e.inst?._zod.def?.error?.(e))??lp(t?.error?.(e))??lp(n.customError?.(e))??lp(n.localeError?.(e))??`Invalid input`),delete r.inst,delete r.continue,t?.reportInput||delete r.input,r}function dp(e){return Array.isArray(e)?`array`:typeof e==`string`?`string`:`unknown`}function fp(...e){let[t,n,r]=e;return typeof t==`string`?{message:t,code:`custom`,input:n,inst:r}:{...t}}const pp=(e,t)=>{e.name=`$ZodError`,Object.defineProperty(e,`_zod`,{value:e._zod,enumerable:!1}),Object.defineProperty(e,`issues`,{value:t,enumerable:!1}),e.message=JSON.stringify(t,Pf,2),Object.defineProperty(e,`toString`,{value:()=>e.message,enumerable:!1})},mp=H(`$ZodError`,pp),hp=H(`$ZodError`,pp,{Parent:Error});function gp(e,t=e=>e.message){let n={},r=[];for(let i of e.issues)i.path.length>0?(n[i.path[0]]=n[i.path[0]]||[],n[i.path[0]].push(t(i))):r.push(t(i));return{formErrors:r,fieldErrors:n}}function _p(e,t=e=>e.message){let n={_errors:[]},r=e=>{for(let i of e.issues)if(i.code===`invalid_union`&&i.errors.length)i.errors.map(e=>r({issues:e}));else if(i.code===`invalid_key`)r({issues:i.issues});else if(i.code===`invalid_element`)r({issues:i.issues});else if(i.path.length===0)n._errors.push(t(i));else{let e=n,r=0;for(;r<i.path.length;){let n=i.path[r];r===i.path.length-1?(e[n]=e[n]||{_errors:[]},e[n]._errors.push(t(i))):e[n]=e[n]||{_errors:[]},e=e[n],r++}}};return r(e),n}const vp=e=>(t,n,r,i)=>{let a=r?Object.assign(r,{async:!1}):{async:!1},o=t._zod.run({value:n,issues:[]},a);if(o instanceof Promise)throw new kf;if(o.issues.length){let t=new(i?.Err??e)(o.issues.map(e=>up(e,a,Mf())));throw Wf(t,i?.callee),t}return o.value},yp=e=>async(t,n,r,i)=>{let a=r?Object.assign(r,{async:!0}):{async:!0},o=t._zod.run({value:n,issues:[]},a);if(o instanceof Promise&&(o=await o),o.issues.length){let t=new(i?.Err??e)(o.issues.map(e=>up(e,a,Mf())));throw Wf(t,i?.callee),t}return o.value},bp=e=>(t,n,r)=>{let i=r?{...r,async:!1}:{async:!1},a=t._zod.run({value:n,issues:[]},i);if(a instanceof Promise)throw new kf;return a.issues.length?{success:!1,error:new(e??mp)(a.issues.map(e=>up(e,i,Mf())))}:{success:!0,data:a.value}},xp=bp(hp),Sp=e=>async(t,n,r)=>{let i=r?Object.assign(r,{async:!0}):{async:!0},a=t._zod.run({value:n,issues:[]},i);return a instanceof Promise&&(a=await a),a.issues.length?{success:!1,error:new e(a.issues.map(e=>up(e,i,Mf())))}:{success:!0,data:a.value}},Cp=Sp(hp),wp=e=>(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return vp(e)(t,n,i)},Tp=e=>(t,n,r)=>vp(e)(t,n,r),Ep=e=>async(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return yp(e)(t,n,i)},Dp=e=>async(t,n,r)=>yp(e)(t,n,r),Op=e=>(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return bp(e)(t,n,i)},kp=e=>(t,n,r)=>bp(e)(t,n,r),Ap=e=>async(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return Sp(e)(t,n,i)},jp=e=>async(t,n,r)=>Sp(e)(t,n,r),Mp=/^[cC][^\s-]{8,}$/,Np=/^[0-9a-z]+$/,Pp=/^[0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{26}$/,Fp=/^[0-9a-vA-V]{20}$/,Ip=/^[A-Za-z0-9]{27}$/,Lp=/^[a-zA-Z0-9_-]{21}$/,Rp=/^P(?:(\d+W)|(?!.*W)(?=\d|T\d)(\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+([.,]\d+)?S)?)?)$/,zp=/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$/,Bp=e=>e?RegExp(`^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-${e}[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$`):/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/,Vp=/^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$/;function Hp(){return RegExp(`^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$`,`u`)}const Up=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,Wp=/^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$/,Gp=/^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/([0-9]|[1-2][0-9]|3[0-2])$/,Kp=/^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,qp=/^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$/,Jp=/^[A-Za-z0-9_-]*$/,Yp=/^\+[1-9]\d{6,14}$/,Xp=`(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))`,Zp=RegExp(`^${Xp}$`);function Qp(e){let t=`(?:[01]\\d|2[0-3]):[0-5]\\d`;return typeof e.precision==`number`?e.precision===-1?`${t}`:e.precision===0?`${t}:[0-5]\\d`:`${t}:[0-5]\\d\\.\\d{${e.precision}}`:`${t}(?::[0-5]\\d(?:\\.\\d+)?)?`}function $p(e){return RegExp(`^${Qp(e)}$`)}function em(e){let t=Qp({precision:e.precision}),n=[`Z`];e.local&&n.push(``),e.offset&&n.push(`([+-](?:[01]\\d|2[0-3]):[0-5]\\d)`);let r=`${t}(?:${n.join(`|`)})`;return RegExp(`^${Xp}T(?:${r})$`)}const tm=e=>{let t=e?`[\\s\\S]{${e?.minimum??0},${e?.maximum??``}}`:`[\\s\\S]*`;return RegExp(`^${t}$`)},nm=/^-?\d+$/,rm=/^-?\d+(?:\.\d+)?$/,im=/^[^A-Z]*$/,am=/^[^a-z]*$/,G=H(`$ZodCheck`,(e,t)=>{var n;e._zod??={},e._zod.def=t,(n=e._zod).onattach??(n.onattach=[])}),om={number:`number`,bigint:`bigint`,object:`date`},sm=H(`$ZodCheckLessThan`,(e,t)=>{G.init(e,t);let n=om[typeof t.value];e._zod.onattach.push(e=>{let n=e._zod.bag,r=(t.inclusive?n.maximum:n.exclusiveMaximum)??1/0;t.value<r&&(t.inclusive?n.maximum=t.value:n.exclusiveMaximum=t.value)}),e._zod.check=r=>{(t.inclusive?r.value<=t.value:r.value<t.value)||r.issues.push({origin:n,code:`too_big`,maximum:typeof t.value==`object`?t.value.getTime():t.value,input:r.value,inclusive:t.inclusive,inst:e,continue:!t.abort})}}),cm=H(`$ZodCheckGreaterThan`,(e,t)=>{G.init(e,t);let n=om[typeof t.value];e._zod.onattach.push(e=>{let n=e._zod.bag,r=(t.inclusive?n.minimum:n.exclusiveMinimum)??-1/0;t.value>r&&(t.inclusive?n.minimum=t.value:n.exclusiveMinimum=t.value)}),e._zod.check=r=>{(t.inclusive?r.value>=t.value:r.value>t.value)||r.issues.push({origin:n,code:`too_small`,minimum:typeof t.value==`object`?t.value.getTime():t.value,input:r.value,inclusive:t.inclusive,inst:e,continue:!t.abort})}}),lm=H(`$ZodCheckMultipleOf`,(e,t)=>{G.init(e,t),e._zod.onattach.push(e=>{var n;(n=e._zod.bag).multipleOf??(n.multipleOf=t.value)}),e._zod.check=n=>{if(typeof n.value!=typeof t.value)throw Error(`Cannot mix number and bigint in multiple_of check.`);(typeof n.value==`bigint`?n.value%t.value===BigInt(0):Rf(n.value,t.value)===0)||n.issues.push({origin:typeof n.value,code:`not_multiple_of`,divisor:t.value,input:n.value,inst:e,continue:!t.abort})}}),um=H(`$ZodCheckNumberFormat`,(e,t)=>{G.init(e,t),t.format=t.format||`float64`;let n=t.format?.includes(`int`),r=n?`int`:`number`,[i,a]=$f[t.format];e._zod.onattach.push(e=>{let r=e._zod.bag;r.format=t.format,r.minimum=i,r.maximum=a,n&&(r.pattern=nm)}),e._zod.check=o=>{let s=o.value;if(n){if(!Number.isInteger(s)){o.issues.push({expected:r,format:t.format,code:`invalid_type`,continue:!1,input:s,inst:e});return}if(!Number.isSafeInteger(s)){s>0?o.issues.push({input:s,code:`too_big`,maximum:2**53-1,note:`Integers must be within the safe integer range.`,inst:e,origin:r,inclusive:!0,continue:!t.abort}):o.issues.push({input:s,code:`too_small`,minimum:-(2**53-1),note:`Integers must be within the safe integer range.`,inst:e,origin:r,inclusive:!0,continue:!t.abort});return}}s<i&&o.issues.push({origin:`number`,input:s,code:`too_small`,minimum:i,inclusive:!0,inst:e,continue:!t.abort}),s>a&&o.issues.push({origin:`number`,input:s,code:`too_big`,maximum:a,inclusive:!0,inst:e,continue:!t.abort})}}),dm=H(`$ZodCheckMaxLength`,(e,t)=>{var n;G.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!If(t)&&t.length!==void 0}),e._zod.onattach.push(e=>{let n=e._zod.bag.maximum??1/0;t.maximum<n&&(e._zod.bag.maximum=t.maximum)}),e._zod.check=n=>{let r=n.value;if(r.length<=t.maximum)return;let i=dp(r);n.issues.push({origin:i,code:`too_big`,maximum:t.maximum,inclusive:!0,input:r,inst:e,continue:!t.abort})}}),fm=H(`$ZodCheckMinLength`,(e,t)=>{var n;G.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!If(t)&&t.length!==void 0}),e._zod.onattach.push(e=>{let n=e._zod.bag.minimum??-1/0;t.minimum>n&&(e._zod.bag.minimum=t.minimum)}),e._zod.check=n=>{let r=n.value;if(r.length>=t.minimum)return;let i=dp(r);n.issues.push({origin:i,code:`too_small`,minimum:t.minimum,inclusive:!0,input:r,inst:e,continue:!t.abort})}}),pm=H(`$ZodCheckLengthEquals`,(e,t)=>{var n;G.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!If(t)&&t.length!==void 0}),e._zod.onattach.push(e=>{let n=e._zod.bag;n.minimum=t.length,n.maximum=t.length,n.length=t.length}),e._zod.check=n=>{let r=n.value,i=r.length;if(i===t.length)return;let a=dp(r),o=i>t.length;n.issues.push({origin:a,...o?{code:`too_big`,maximum:t.length}:{code:`too_small`,minimum:t.length},inclusive:!0,exact:!0,input:n.value,inst:e,continue:!t.abort})}}),mm=H(`$ZodCheckStringFormat`,(e,t)=>{var n,r;G.init(e,t),e._zod.onattach.push(e=>{let n=e._zod.bag;n.format=t.format,t.pattern&&(n.patterns??=new Set,n.patterns.add(t.pattern))}),t.pattern?(n=e._zod).check??(n.check=n=>{t.pattern.lastIndex=0,!t.pattern.test(n.value)&&n.issues.push({origin:`string`,code:`invalid_format`,format:t.format,input:n.value,...t.pattern?{pattern:t.pattern.toString()}:{},inst:e,continue:!t.abort})}):(r=e._zod).check??(r.check=()=>{})}),hm=H(`$ZodCheckRegex`,(e,t)=>{mm.init(e,t),e._zod.check=n=>{t.pattern.lastIndex=0,!t.pattern.test(n.value)&&n.issues.push({origin:`string`,code:`invalid_format`,format:`regex`,input:n.value,pattern:t.pattern.toString(),inst:e,continue:!t.abort})}}),gm=H(`$ZodCheckLowerCase`,(e,t)=>{t.pattern??=im,mm.init(e,t)}),_m=H(`$ZodCheckUpperCase`,(e,t)=>{t.pattern??=am,mm.init(e,t)}),vm=H(`$ZodCheckIncludes`,(e,t)=>{G.init(e,t);let n=Xf(t.includes),r=new RegExp(typeof t.position==`number`?`^.{${t.position}}${n}`:n);t.pattern=r,e._zod.onattach.push(e=>{let t=e._zod.bag;t.patterns??=new Set,t.patterns.add(r)}),e._zod.check=n=>{n.value.includes(t.includes,t.position)||n.issues.push({origin:`string`,code:`invalid_format`,format:`includes`,includes:t.includes,input:n.value,inst:e,continue:!t.abort})}}),ym=H(`$ZodCheckStartsWith`,(e,t)=>{G.init(e,t);let n=RegExp(`^${Xf(t.prefix)}.*`);t.pattern??=n,e._zod.onattach.push(e=>{let t=e._zod.bag;t.patterns??=new Set,t.patterns.add(n)}),e._zod.check=n=>{n.value.startsWith(t.prefix)||n.issues.push({origin:`string`,code:`invalid_format`,format:`starts_with`,prefix:t.prefix,input:n.value,inst:e,continue:!t.abort})}}),bm=H(`$ZodCheckEndsWith`,(e,t)=>{G.init(e,t);let n=RegExp(`.*${Xf(t.suffix)}$`);t.pattern??=n,e._zod.onattach.push(e=>{let t=e._zod.bag;t.patterns??=new Set,t.patterns.add(n)}),e._zod.check=n=>{n.value.endsWith(t.suffix)||n.issues.push({origin:`string`,code:`invalid_format`,format:`ends_with`,suffix:t.suffix,input:n.value,inst:e,continue:!t.abort})}}),xm=H(`$ZodCheckOverwrite`,(e,t)=>{G.init(e,t),e._zod.check=e=>{e.value=t.tx(e.value)}});var Sm=class{constructor(e=[]){this.content=[],this.indent=0,this&&(this.args=e)}indented(e){this.indent+=1,e(this),--this.indent}write(e){if(typeof e==`function`){e(this,{execution:`sync`}),e(this,{execution:`async`});return}let t=e.split(`
410
410
  `).filter(e=>e),n=Math.min(...t.map(e=>e.length-e.trimStart().length)),r=t.map(e=>e.slice(n)).map(e=>` `.repeat(this.indent*2)+e);for(let e of r)this.content.push(e)}compile(){let e=Function,t=this?.args,n=[...(this?.content??[``]).map(e=>` ${e}`)];return new e(...t,n.join(`
411
- `))}};const Sm={major:4,minor:3,patch:6},K=H(`$ZodType`,(e,t)=>{var n;e??={},e._zod.def=t,e._zod.bag=e._zod.bag||{},e._zod.version=Sm;let r=[...e._zod.def.checks??[]];e._zod.traits.has(`$ZodCheck`)&&r.unshift(e);for(let t of r)for(let n of t._zod.onattach)n(e);if(r.length===0)(n=e._zod).deferred??(n.deferred=[]),e._zod.deferred?.push(()=>{e._zod.run=e._zod.parse});else{let t=(e,t,n)=>{let r=op(e),i;for(let a of t){if(a._zod.def.when){if(!a._zod.def.when(e))continue}else if(r)continue;let t=e.issues.length,o=a._zod.check(e);if(o instanceof Promise&&n?.async===!1)throw new Of;if(i||o instanceof Promise)i=(i??Promise.resolve()).then(async()=>{await o,e.issues.length!==t&&(r||=op(e,t))});else{if(e.issues.length===t)continue;r||=op(e,t)}}return i?i.then(()=>e):e},n=(n,i,a)=>{if(op(n))return n.aborted=!0,n;let o=t(i,r,a);if(o instanceof Promise){if(a.async===!1)throw new Of;return o.then(t=>e._zod.parse(t,a))}return e._zod.parse(o,a)};e._zod.run=(i,a)=>{if(a.skipChecks)return e._zod.parse(i,a);if(a.direction===`backward`){let t=e._zod.parse({value:i.value,issues:[]},{...a,skipChecks:!0});return t instanceof Promise?t.then(e=>n(e,i,a)):n(t,i,a)}let o=e._zod.parse(i,a);if(o instanceof Promise){if(a.async===!1)throw new Of;return o.then(e=>t(e,r,a))}return t(o,r,a)}}U(e,`~standard`,()=>({validate:t=>{try{let n=bp(e,t);return n.success?{value:n.data}:{issues:n.error?.issues}}catch{return Sp(e,t).then(e=>e.success?{value:e.data}:{issues:e.error?.issues})}},vendor:`zod`,version:1}))}),Cm=H(`$ZodString`,(e,t)=>{K.init(e,t),e._zod.pattern=[...e?._zod.bag?.patterns??[]].pop()??em(e._zod.bag),e._zod.parse=(n,r)=>{if(t.coerce)try{n.value=String(n.value)}catch{}return typeof n.value==`string`||n.issues.push({expected:`string`,code:`invalid_type`,input:n.value,inst:e}),n}}),q=H(`$ZodStringFormat`,(e,t)=>{pm.init(e,t),Cm.init(e,t)}),wm=H(`$ZodGUID`,(e,t)=>{t.pattern??=Rp,q.init(e,t)}),Tm=H(`$ZodUUID`,(e,t)=>{if(t.version){let e={v1:1,v2:2,v3:3,v4:4,v5:5,v6:6,v7:7,v8:8}[t.version];if(e===void 0)throw Error(`Invalid UUID version: "${t.version}"`);t.pattern??=zp(e)}else t.pattern??=zp();q.init(e,t)}),Em=H(`$ZodEmail`,(e,t)=>{t.pattern??=Bp,q.init(e,t)}),Dm=H(`$ZodURL`,(e,t)=>{q.init(e,t),e._zod.check=n=>{try{let r=n.value.trim(),i=new URL(r);t.hostname&&(t.hostname.lastIndex=0,t.hostname.test(i.hostname)||n.issues.push({code:`invalid_format`,format:`url`,note:`Invalid hostname`,pattern:t.hostname.source,input:n.value,inst:e,continue:!t.abort})),t.protocol&&(t.protocol.lastIndex=0,t.protocol.test(i.protocol.endsWith(`:`)?i.protocol.slice(0,-1):i.protocol)||n.issues.push({code:`invalid_format`,format:`url`,note:`Invalid protocol`,pattern:t.protocol.source,input:n.value,inst:e,continue:!t.abort})),t.normalize?n.value=i.href:n.value=r;return}catch{n.issues.push({code:`invalid_format`,format:`url`,input:n.value,inst:e,continue:!t.abort})}}}),Om=H(`$ZodEmoji`,(e,t)=>{t.pattern??=Vp(),q.init(e,t)}),km=H(`$ZodNanoID`,(e,t)=>{t.pattern??=Ip,q.init(e,t)}),Am=H(`$ZodCUID`,(e,t)=>{t.pattern??=jp,q.init(e,t)}),jm=H(`$ZodCUID2`,(e,t)=>{t.pattern??=Mp,q.init(e,t)}),Mm=H(`$ZodULID`,(e,t)=>{t.pattern??=Np,q.init(e,t)}),Nm=H(`$ZodXID`,(e,t)=>{t.pattern??=Pp,q.init(e,t)}),Pm=H(`$ZodKSUID`,(e,t)=>{t.pattern??=Fp,q.init(e,t)}),Fm=H(`$ZodISODateTime`,(e,t)=>{t.pattern??=$p(t),q.init(e,t)}),Im=H(`$ZodISODate`,(e,t)=>{t.pattern??=Xp,q.init(e,t)}),Lm=H(`$ZodISOTime`,(e,t)=>{t.pattern??=Qp(t),q.init(e,t)}),Rm=H(`$ZodISODuration`,(e,t)=>{t.pattern??=Lp,q.init(e,t)}),zm=H(`$ZodIPv4`,(e,t)=>{t.pattern??=Hp,q.init(e,t),e._zod.bag.format=`ipv4`}),Bm=H(`$ZodIPv6`,(e,t)=>{t.pattern??=Up,q.init(e,t),e._zod.bag.format=`ipv6`,e._zod.check=n=>{try{new URL(`http://[${n.value}]`)}catch{n.issues.push({code:`invalid_format`,format:`ipv6`,input:n.value,inst:e,continue:!t.abort})}}}),Vm=H(`$ZodCIDRv4`,(e,t)=>{t.pattern??=Wp,q.init(e,t)}),Hm=H(`$ZodCIDRv6`,(e,t)=>{t.pattern??=Gp,q.init(e,t),e._zod.check=n=>{let r=n.value.split(`/`);try{if(r.length!==2)throw Error();let[e,t]=r;if(!t)throw Error();let n=Number(t);if(`${n}`!==t||n<0||n>128)throw Error();new URL(`http://[${e}]`)}catch{n.issues.push({code:`invalid_format`,format:`cidrv6`,input:n.value,inst:e,continue:!t.abort})}}});function Um(e){if(e===``)return!0;if(e.length%4!=0)return!1;try{return atob(e),!0}catch{return!1}}const Wm=H(`$ZodBase64`,(e,t)=>{t.pattern??=Kp,q.init(e,t),e._zod.bag.contentEncoding=`base64`,e._zod.check=n=>{Um(n.value)||n.issues.push({code:`invalid_format`,format:`base64`,input:n.value,inst:e,continue:!t.abort})}});function Gm(e){if(!qp.test(e))return!1;let t=e.replace(/[-_]/g,e=>e===`-`?`+`:`/`);return Um(t.padEnd(Math.ceil(t.length/4)*4,`=`))}const Km=H(`$ZodBase64URL`,(e,t)=>{t.pattern??=qp,q.init(e,t),e._zod.bag.contentEncoding=`base64url`,e._zod.check=n=>{Gm(n.value)||n.issues.push({code:`invalid_format`,format:`base64url`,input:n.value,inst:e,continue:!t.abort})}}),qm=H(`$ZodE164`,(e,t)=>{t.pattern??=Jp,q.init(e,t)});function Jm(e,t=null){try{let n=e.split(`.`);if(n.length!==3)return!1;let[r]=n;if(!r)return!1;let i=JSON.parse(atob(r));return!(`typ`in i&&i?.typ!==`JWT`||!i.alg||t&&(!(`alg`in i)||i.alg!==t))}catch{return!1}}const Ym=H(`$ZodJWT`,(e,t)=>{q.init(e,t),e._zod.check=n=>{Jm(n.value,t.alg)||n.issues.push({code:`invalid_format`,format:`jwt`,input:n.value,inst:e,continue:!t.abort})}}),Xm=H(`$ZodNumber`,(e,t)=>{K.init(e,t),e._zod.pattern=e._zod.bag.pattern??nm,e._zod.parse=(n,r)=>{if(t.coerce)try{n.value=Number(n.value)}catch{}let i=n.value;if(typeof i==`number`&&!Number.isNaN(i)&&Number.isFinite(i))return n;let a=typeof i==`number`?Number.isNaN(i)?`NaN`:Number.isFinite(i)?void 0:`Infinity`:void 0;return n.issues.push({expected:`number`,code:`invalid_type`,input:i,inst:e,...a?{received:a}:{}}),n}}),Zm=H(`$ZodNumberFormat`,(e,t)=>{lm.init(e,t),Xm.init(e,t)}),Qm=H(`$ZodUnknown`,(e,t)=>{K.init(e,t),e._zod.parse=e=>e}),$m=H(`$ZodNever`,(e,t)=>{K.init(e,t),e._zod.parse=(t,n)=>(t.issues.push({expected:`never`,code:`invalid_type`,input:t.value,inst:e}),t)});function eh(e,t,n){e.issues.length&&t.issues.push(...sp(n,e.issues)),t.value[n]=e.value}const th=H(`$ZodArray`,(e,t)=>{K.init(e,t),e._zod.parse=(n,r)=>{let i=n.value;if(!Array.isArray(i))return n.issues.push({expected:`array`,code:`invalid_type`,input:i,inst:e}),n;n.value=Array(i.length);let a=[];for(let e=0;e<i.length;e++){let o=i[e],s=t.element._zod.run({value:o,issues:[]},r);s instanceof Promise?a.push(s.then(t=>eh(t,n,e))):eh(s,n,e)}return a.length?Promise.all(a).then(()=>n):n}});function nh(e,t,n,r,i){if(e.issues.length){if(i&&!(n in r))return;t.issues.push(...sp(n,e.issues))}e.value===void 0?n in r&&(t.value[n]=void 0):t.value[n]=e.value}function rh(e){let t=Object.keys(e.shape);for(let n of t)if(!e.shape?.[n]?._zod?.traits?.has(`$ZodType`))throw Error(`Invalid element at key "${n}": expected a Zod schema`);let n=Zf(e.shape);return{...e,keys:t,keySet:new Set(t),numKeys:t.length,optionalKeys:new Set(n)}}function ih(e,t,n,r,i,a){let o=[],s=i.keySet,c=i.catchall._zod,l=c.def.type,u=c.optout===`optional`;for(let i in t){if(s.has(i))continue;if(l===`never`){o.push(i);continue}let a=c.run({value:t[i],issues:[]},r);a instanceof Promise?e.push(a.then(e=>nh(e,n,i,t,u))):nh(a,n,i,t,u)}return o.length&&n.issues.push({code:`unrecognized_keys`,keys:o,input:t,inst:a}),e.length?Promise.all(e).then(()=>n):n}const ah=H(`$ZodObject`,(e,t)=>{if(K.init(e,t),!Object.getOwnPropertyDescriptor(t,`shape`)?.get){let e=t.shape;Object.defineProperty(t,`shape`,{get:()=>{let n={...e};return Object.defineProperty(t,`shape`,{value:n}),n}})}let n=Pf(()=>rh(t));U(e._zod,`propValues`,()=>{let e=t.shape,n={};for(let t in e){let r=e[t]._zod;if(r.values){n[t]??(n[t]=new Set);for(let e of r.values)n[t].add(e)}}return n});let r=Wf,i=t.catchall,a;e._zod.parse=(t,o)=>{a??=n.value;let s=t.value;if(!r(s))return t.issues.push({expected:`object`,code:`invalid_type`,input:s,inst:e}),t;t.value={};let c=[],l=a.shape;for(let e of a.keys){let n=l[e],r=n._zod.optout===`optional`,i=n._zod.run({value:s[e],issues:[]},o);i instanceof Promise?c.push(i.then(n=>nh(n,t,e,s,r))):nh(i,t,e,s,r)}return i?ih(c,s,t,o,n.value,e):c.length?Promise.all(c).then(()=>t):t}}),oh=H(`$ZodObjectJIT`,(e,t)=>{ah.init(e,t);let n=e._zod.parse,r=Pf(()=>rh(t)),i=e=>{let t=new xm([`shape`,`payload`,`ctx`]),n=r.value,i=e=>{let t=Vf(e);return`shape[${t}]._zod.run({ value: input[${t}], issues: [] }, ctx)`};t.write(`const input = payload.value;`);let a=Object.create(null),o=0;for(let e of n.keys)a[e]=`key_${o++}`;t.write(`const newResult = {};`);for(let r of n.keys){let n=a[r],o=Vf(r),s=e[r]?._zod?.optout===`optional`;t.write(`const ${n} = ${i(r)};`),s?t.write(`
411
+ `))}};const Cm={major:4,minor:3,patch:6},K=H(`$ZodType`,(e,t)=>{var n;e??={},e._zod.def=t,e._zod.bag=e._zod.bag||{},e._zod.version=Cm;let r=[...e._zod.def.checks??[]];e._zod.traits.has(`$ZodCheck`)&&r.unshift(e);for(let t of r)for(let n of t._zod.onattach)n(e);if(r.length===0)(n=e._zod).deferred??(n.deferred=[]),e._zod.deferred?.push(()=>{e._zod.run=e._zod.parse});else{let t=(e,t,n)=>{let r=sp(e),i;for(let a of t){if(a._zod.def.when){if(!a._zod.def.when(e))continue}else if(r)continue;let t=e.issues.length,o=a._zod.check(e);if(o instanceof Promise&&n?.async===!1)throw new kf;if(i||o instanceof Promise)i=(i??Promise.resolve()).then(async()=>{await o,e.issues.length!==t&&(r||=sp(e,t))});else{if(e.issues.length===t)continue;r||=sp(e,t)}}return i?i.then(()=>e):e},n=(n,i,a)=>{if(sp(n))return n.aborted=!0,n;let o=t(i,r,a);if(o instanceof Promise){if(a.async===!1)throw new kf;return o.then(t=>e._zod.parse(t,a))}return e._zod.parse(o,a)};e._zod.run=(i,a)=>{if(a.skipChecks)return e._zod.parse(i,a);if(a.direction===`backward`){let t=e._zod.parse({value:i.value,issues:[]},{...a,skipChecks:!0});return t instanceof Promise?t.then(e=>n(e,i,a)):n(t,i,a)}let o=e._zod.parse(i,a);if(o instanceof Promise){if(a.async===!1)throw new kf;return o.then(e=>t(e,r,a))}return t(o,r,a)}}U(e,`~standard`,()=>({validate:t=>{try{let n=xp(e,t);return n.success?{value:n.data}:{issues:n.error?.issues}}catch{return Cp(e,t).then(e=>e.success?{value:e.data}:{issues:e.error?.issues})}},vendor:`zod`,version:1}))}),wm=H(`$ZodString`,(e,t)=>{K.init(e,t),e._zod.pattern=[...e?._zod.bag?.patterns??[]].pop()??tm(e._zod.bag),e._zod.parse=(n,r)=>{if(t.coerce)try{n.value=String(n.value)}catch{}return typeof n.value==`string`||n.issues.push({expected:`string`,code:`invalid_type`,input:n.value,inst:e}),n}}),q=H(`$ZodStringFormat`,(e,t)=>{mm.init(e,t),wm.init(e,t)}),Tm=H(`$ZodGUID`,(e,t)=>{t.pattern??=zp,q.init(e,t)}),Em=H(`$ZodUUID`,(e,t)=>{if(t.version){let e={v1:1,v2:2,v3:3,v4:4,v5:5,v6:6,v7:7,v8:8}[t.version];if(e===void 0)throw Error(`Invalid UUID version: "${t.version}"`);t.pattern??=Bp(e)}else t.pattern??=Bp();q.init(e,t)}),Dm=H(`$ZodEmail`,(e,t)=>{t.pattern??=Vp,q.init(e,t)}),Om=H(`$ZodURL`,(e,t)=>{q.init(e,t),e._zod.check=n=>{try{let r=n.value.trim(),i=new URL(r);t.hostname&&(t.hostname.lastIndex=0,t.hostname.test(i.hostname)||n.issues.push({code:`invalid_format`,format:`url`,note:`Invalid hostname`,pattern:t.hostname.source,input:n.value,inst:e,continue:!t.abort})),t.protocol&&(t.protocol.lastIndex=0,t.protocol.test(i.protocol.endsWith(`:`)?i.protocol.slice(0,-1):i.protocol)||n.issues.push({code:`invalid_format`,format:`url`,note:`Invalid protocol`,pattern:t.protocol.source,input:n.value,inst:e,continue:!t.abort})),t.normalize?n.value=i.href:n.value=r;return}catch{n.issues.push({code:`invalid_format`,format:`url`,input:n.value,inst:e,continue:!t.abort})}}}),km=H(`$ZodEmoji`,(e,t)=>{t.pattern??=Hp(),q.init(e,t)}),Am=H(`$ZodNanoID`,(e,t)=>{t.pattern??=Lp,q.init(e,t)}),jm=H(`$ZodCUID`,(e,t)=>{t.pattern??=Mp,q.init(e,t)}),Mm=H(`$ZodCUID2`,(e,t)=>{t.pattern??=Np,q.init(e,t)}),Nm=H(`$ZodULID`,(e,t)=>{t.pattern??=Pp,q.init(e,t)}),Pm=H(`$ZodXID`,(e,t)=>{t.pattern??=Fp,q.init(e,t)}),Fm=H(`$ZodKSUID`,(e,t)=>{t.pattern??=Ip,q.init(e,t)}),Im=H(`$ZodISODateTime`,(e,t)=>{t.pattern??=em(t),q.init(e,t)}),Lm=H(`$ZodISODate`,(e,t)=>{t.pattern??=Zp,q.init(e,t)}),Rm=H(`$ZodISOTime`,(e,t)=>{t.pattern??=$p(t),q.init(e,t)}),zm=H(`$ZodISODuration`,(e,t)=>{t.pattern??=Rp,q.init(e,t)}),Bm=H(`$ZodIPv4`,(e,t)=>{t.pattern??=Up,q.init(e,t),e._zod.bag.format=`ipv4`}),Vm=H(`$ZodIPv6`,(e,t)=>{t.pattern??=Wp,q.init(e,t),e._zod.bag.format=`ipv6`,e._zod.check=n=>{try{new URL(`http://[${n.value}]`)}catch{n.issues.push({code:`invalid_format`,format:`ipv6`,input:n.value,inst:e,continue:!t.abort})}}}),Hm=H(`$ZodCIDRv4`,(e,t)=>{t.pattern??=Gp,q.init(e,t)}),Um=H(`$ZodCIDRv6`,(e,t)=>{t.pattern??=Kp,q.init(e,t),e._zod.check=n=>{let r=n.value.split(`/`);try{if(r.length!==2)throw Error();let[e,t]=r;if(!t)throw Error();let n=Number(t);if(`${n}`!==t||n<0||n>128)throw Error();new URL(`http://[${e}]`)}catch{n.issues.push({code:`invalid_format`,format:`cidrv6`,input:n.value,inst:e,continue:!t.abort})}}});function Wm(e){if(e===``)return!0;if(e.length%4!=0)return!1;try{return atob(e),!0}catch{return!1}}const Gm=H(`$ZodBase64`,(e,t)=>{t.pattern??=qp,q.init(e,t),e._zod.bag.contentEncoding=`base64`,e._zod.check=n=>{Wm(n.value)||n.issues.push({code:`invalid_format`,format:`base64`,input:n.value,inst:e,continue:!t.abort})}});function Km(e){if(!Jp.test(e))return!1;let t=e.replace(/[-_]/g,e=>e===`-`?`+`:`/`);return Wm(t.padEnd(Math.ceil(t.length/4)*4,`=`))}const qm=H(`$ZodBase64URL`,(e,t)=>{t.pattern??=Jp,q.init(e,t),e._zod.bag.contentEncoding=`base64url`,e._zod.check=n=>{Km(n.value)||n.issues.push({code:`invalid_format`,format:`base64url`,input:n.value,inst:e,continue:!t.abort})}}),Jm=H(`$ZodE164`,(e,t)=>{t.pattern??=Yp,q.init(e,t)});function Ym(e,t=null){try{let n=e.split(`.`);if(n.length!==3)return!1;let[r]=n;if(!r)return!1;let i=JSON.parse(atob(r));return!(`typ`in i&&i?.typ!==`JWT`||!i.alg||t&&(!(`alg`in i)||i.alg!==t))}catch{return!1}}const Xm=H(`$ZodJWT`,(e,t)=>{q.init(e,t),e._zod.check=n=>{Ym(n.value,t.alg)||n.issues.push({code:`invalid_format`,format:`jwt`,input:n.value,inst:e,continue:!t.abort})}}),Zm=H(`$ZodNumber`,(e,t)=>{K.init(e,t),e._zod.pattern=e._zod.bag.pattern??rm,e._zod.parse=(n,r)=>{if(t.coerce)try{n.value=Number(n.value)}catch{}let i=n.value;if(typeof i==`number`&&!Number.isNaN(i)&&Number.isFinite(i))return n;let a=typeof i==`number`?Number.isNaN(i)?`NaN`:Number.isFinite(i)?void 0:`Infinity`:void 0;return n.issues.push({expected:`number`,code:`invalid_type`,input:i,inst:e,...a?{received:a}:{}}),n}}),Qm=H(`$ZodNumberFormat`,(e,t)=>{um.init(e,t),Zm.init(e,t)}),$m=H(`$ZodUnknown`,(e,t)=>{K.init(e,t),e._zod.parse=e=>e}),eh=H(`$ZodNever`,(e,t)=>{K.init(e,t),e._zod.parse=(t,n)=>(t.issues.push({expected:`never`,code:`invalid_type`,input:t.value,inst:e}),t)});function th(e,t,n){e.issues.length&&t.issues.push(...cp(n,e.issues)),t.value[n]=e.value}const nh=H(`$ZodArray`,(e,t)=>{K.init(e,t),e._zod.parse=(n,r)=>{let i=n.value;if(!Array.isArray(i))return n.issues.push({expected:`array`,code:`invalid_type`,input:i,inst:e}),n;n.value=Array(i.length);let a=[];for(let e=0;e<i.length;e++){let o=i[e],s=t.element._zod.run({value:o,issues:[]},r);s instanceof Promise?a.push(s.then(t=>th(t,n,e))):th(s,n,e)}return a.length?Promise.all(a).then(()=>n):n}});function rh(e,t,n,r,i){if(e.issues.length){if(i&&!(n in r))return;t.issues.push(...cp(n,e.issues))}e.value===void 0?n in r&&(t.value[n]=void 0):t.value[n]=e.value}function ih(e){let t=Object.keys(e.shape);for(let n of t)if(!e.shape?.[n]?._zod?.traits?.has(`$ZodType`))throw Error(`Invalid element at key "${n}": expected a Zod schema`);let n=Qf(e.shape);return{...e,keys:t,keySet:new Set(t),numKeys:t.length,optionalKeys:new Set(n)}}function ah(e,t,n,r,i,a){let o=[],s=i.keySet,c=i.catchall._zod,l=c.def.type,u=c.optout===`optional`;for(let i in t){if(s.has(i))continue;if(l===`never`){o.push(i);continue}let a=c.run({value:t[i],issues:[]},r);a instanceof Promise?e.push(a.then(e=>rh(e,n,i,t,u))):rh(a,n,i,t,u)}return o.length&&n.issues.push({code:`unrecognized_keys`,keys:o,input:t,inst:a}),e.length?Promise.all(e).then(()=>n):n}const oh=H(`$ZodObject`,(e,t)=>{if(K.init(e,t),!Object.getOwnPropertyDescriptor(t,`shape`)?.get){let e=t.shape;Object.defineProperty(t,`shape`,{get:()=>{let n={...e};return Object.defineProperty(t,`shape`,{value:n}),n}})}let n=Ff(()=>ih(t));U(e._zod,`propValues`,()=>{let e=t.shape,n={};for(let t in e){let r=e[t]._zod;if(r.values){n[t]??(n[t]=new Set);for(let e of r.values)n[t].add(e)}}return n});let r=Gf,i=t.catchall,a;e._zod.parse=(t,o)=>{a??=n.value;let s=t.value;if(!r(s))return t.issues.push({expected:`object`,code:`invalid_type`,input:s,inst:e}),t;t.value={};let c=[],l=a.shape;for(let e of a.keys){let n=l[e],r=n._zod.optout===`optional`,i=n._zod.run({value:s[e],issues:[]},o);i instanceof Promise?c.push(i.then(n=>rh(n,t,e,s,r))):rh(i,t,e,s,r)}return i?ah(c,s,t,o,n.value,e):c.length?Promise.all(c).then(()=>t):t}}),sh=H(`$ZodObjectJIT`,(e,t)=>{oh.init(e,t);let n=e._zod.parse,r=Ff(()=>ih(t)),i=e=>{let t=new Sm([`shape`,`payload`,`ctx`]),n=r.value,i=e=>{let t=Hf(e);return`shape[${t}]._zod.run({ value: input[${t}], issues: [] }, ctx)`};t.write(`const input = payload.value;`);let a=Object.create(null),o=0;for(let e of n.keys)a[e]=`key_${o++}`;t.write(`const newResult = {};`);for(let r of n.keys){let n=a[r],o=Hf(r),s=e[r]?._zod?.optout===`optional`;t.write(`const ${n} = ${i(r)};`),s?t.write(`
412
412
  if (${n}.issues.length) {
413
413
  if (${o} in input) {
414
414
  payload.issues = payload.issues.concat(${n}.issues.map(iss => ({
@@ -442,13 +442,13 @@ If the image is not a UI/design screenshot, give a normal concise description in
442
442
  newResult[${o}] = ${n}.value;
443
443
  }
444
444
 
445
- `)}t.write(`payload.value = newResult;`),t.write(`return payload;`);let s=t.compile();return(t,n)=>s(e,t,n)},a,o=Wf,s=!Af.jitless,c=s&&Gf.value,l=t.catchall,u;e._zod.parse=(d,f)=>{u??=r.value;let p=d.value;return o(p)?s&&c&&f?.async===!1&&f.jitless!==!0?(a||=i(t.shape),d=a(d,f),l?ih([],p,d,f,u,e):d):n(d,f):(d.issues.push({expected:`object`,code:`invalid_type`,input:p,inst:e}),d)}});function sh(e,t,n,r){for(let n of e)if(n.issues.length===0)return t.value=n.value,t;let i=e.filter(e=>!op(e));return i.length===1?(t.value=i[0].value,i[0]):(t.issues.push({code:`invalid_union`,input:t.value,inst:n,errors:e.map(e=>e.issues.map(e=>lp(e,r,jf())))}),t)}const ch=H(`$ZodUnion`,(e,t)=>{K.init(e,t),U(e._zod,`optin`,()=>t.options.some(e=>e._zod.optin===`optional`)?`optional`:void 0),U(e._zod,`optout`,()=>t.options.some(e=>e._zod.optout===`optional`)?`optional`:void 0),U(e._zod,`values`,()=>{if(t.options.every(e=>e._zod.values))return new Set(t.options.flatMap(e=>Array.from(e._zod.values)))}),U(e._zod,`pattern`,()=>{if(t.options.every(e=>e._zod.pattern)){let e=t.options.map(e=>e._zod.pattern);return RegExp(`^(${e.map(e=>If(e.source)).join(`|`)})$`)}});let n=t.options.length===1,r=t.options[0]._zod.run;e._zod.parse=(i,a)=>{if(n)return r(i,a);let o=!1,s=[];for(let e of t.options){let t=e._zod.run({value:i.value,issues:[]},a);if(t instanceof Promise)s.push(t),o=!0;else{if(t.issues.length===0)return t;s.push(t)}}return o?Promise.all(s).then(t=>sh(t,i,e,a)):sh(s,i,e,a)}}),lh=H(`$ZodIntersection`,(e,t)=>{K.init(e,t),e._zod.parse=(e,n)=>{let r=e.value,i=t.left._zod.run({value:r,issues:[]},n),a=t.right._zod.run({value:r,issues:[]},n);return i instanceof Promise||a instanceof Promise?Promise.all([i,a]).then(([t,n])=>dh(e,t,n)):dh(e,i,a)}});function uh(e,t){if(e===t||e instanceof Date&&t instanceof Date&&+e==+t)return{valid:!0,data:e};if(Kf(e)&&Kf(t)){let n=Object.keys(t),r=Object.keys(e).filter(e=>n.indexOf(e)!==-1),i={...e,...t};for(let n of r){let r=uh(e[n],t[n]);if(!r.valid)return{valid:!1,mergeErrorPath:[n,...r.mergeErrorPath]};i[n]=r.data}return{valid:!0,data:i}}if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return{valid:!1,mergeErrorPath:[]};let n=[];for(let r=0;r<e.length;r++){let i=e[r],a=t[r],o=uh(i,a);if(!o.valid)return{valid:!1,mergeErrorPath:[r,...o.mergeErrorPath]};n.push(o.data)}return{valid:!0,data:n}}return{valid:!1,mergeErrorPath:[]}}function dh(e,t,n){let r=new Map,i;for(let n of t.issues)if(n.code===`unrecognized_keys`){i??=n;for(let e of n.keys)r.has(e)||r.set(e,{}),r.get(e).l=!0}else e.issues.push(n);for(let t of n.issues)if(t.code===`unrecognized_keys`)for(let e of t.keys)r.has(e)||r.set(e,{}),r.get(e).r=!0;else e.issues.push(t);let a=[...r].filter(([,e])=>e.l&&e.r).map(([e])=>e);if(a.length&&i&&e.issues.push({...i,keys:a}),op(e))return e;let o=uh(t.value,n.value);if(!o.valid)throw Error(`Unmergable intersection. Error path: ${JSON.stringify(o.mergeErrorPath)}`);return e.value=o.data,e}const fh=H(`$ZodEnum`,(e,t)=>{K.init(e,t);let n=Mf(t.entries),r=new Set(n);e._zod.values=r,e._zod.pattern=RegExp(`^(${n.filter(e=>Jf.has(typeof e)).map(e=>typeof e==`string`?Yf(e):e.toString()).join(`|`)})$`),e._zod.parse=(t,i)=>{let a=t.value;return r.has(a)||t.issues.push({code:`invalid_value`,values:n,input:a,inst:e}),t}}),ph=H(`$ZodTransform`,(e,t)=>{K.init(e,t),e._zod.parse=(n,r)=>{if(r.direction===`backward`)throw new kf(e.constructor.name);let i=t.transform(n.value,n);if(r.async)return(i instanceof Promise?i:Promise.resolve(i)).then(e=>(n.value=e,n));if(i instanceof Promise)throw new Of;return n.value=i,n}});function mh(e,t){return e.issues.length&&t===void 0?{issues:[],value:void 0}:e}const hh=H(`$ZodOptional`,(e,t)=>{K.init(e,t),e._zod.optin=`optional`,e._zod.optout=`optional`,U(e._zod,`values`,()=>t.innerType._zod.values?new Set([...t.innerType._zod.values,void 0]):void 0),U(e._zod,`pattern`,()=>{let e=t.innerType._zod.pattern;return e?RegExp(`^(${If(e.source)})?$`):void 0}),e._zod.parse=(e,n)=>{if(t.innerType._zod.optin===`optional`){let r=t.innerType._zod.run(e,n);return r instanceof Promise?r.then(t=>mh(t,e.value)):mh(r,e.value)}return e.value===void 0?e:t.innerType._zod.run(e,n)}}),gh=H(`$ZodExactOptional`,(e,t)=>{hh.init(e,t),U(e._zod,`values`,()=>t.innerType._zod.values),U(e._zod,`pattern`,()=>t.innerType._zod.pattern),e._zod.parse=(e,n)=>t.innerType._zod.run(e,n)}),_h=H(`$ZodNullable`,(e,t)=>{K.init(e,t),U(e._zod,`optin`,()=>t.innerType._zod.optin),U(e._zod,`optout`,()=>t.innerType._zod.optout),U(e._zod,`pattern`,()=>{let e=t.innerType._zod.pattern;return e?RegExp(`^(${If(e.source)}|null)$`):void 0}),U(e._zod,`values`,()=>t.innerType._zod.values?new Set([...t.innerType._zod.values,null]):void 0),e._zod.parse=(e,n)=>e.value===null?e:t.innerType._zod.run(e,n)}),vh=H(`$ZodDefault`,(e,t)=>{K.init(e,t),e._zod.optin=`optional`,U(e._zod,`values`,()=>t.innerType._zod.values),e._zod.parse=(e,n)=>{if(n.direction===`backward`)return t.innerType._zod.run(e,n);if(e.value===void 0)return e.value=t.defaultValue,e;let r=t.innerType._zod.run(e,n);return r instanceof Promise?r.then(e=>yh(e,t)):yh(r,t)}});function yh(e,t){return e.value===void 0&&(e.value=t.defaultValue),e}const bh=H(`$ZodPrefault`,(e,t)=>{K.init(e,t),e._zod.optin=`optional`,U(e._zod,`values`,()=>t.innerType._zod.values),e._zod.parse=(e,n)=>(n.direction===`backward`||e.value===void 0&&(e.value=t.defaultValue),t.innerType._zod.run(e,n))}),xh=H(`$ZodNonOptional`,(e,t)=>{K.init(e,t),U(e._zod,`values`,()=>{let e=t.innerType._zod.values;return e?new Set([...e].filter(e=>e!==void 0)):void 0}),e._zod.parse=(n,r)=>{let i=t.innerType._zod.run(n,r);return i instanceof Promise?i.then(t=>Sh(t,e)):Sh(i,e)}});function Sh(e,t){return!e.issues.length&&e.value===void 0&&e.issues.push({code:`invalid_type`,expected:`nonoptional`,input:e.value,inst:t}),e}const Ch=H(`$ZodCatch`,(e,t)=>{K.init(e,t),U(e._zod,`optin`,()=>t.innerType._zod.optin),U(e._zod,`optout`,()=>t.innerType._zod.optout),U(e._zod,`values`,()=>t.innerType._zod.values),e._zod.parse=(e,n)=>{if(n.direction===`backward`)return t.innerType._zod.run(e,n);let r=t.innerType._zod.run(e,n);return r instanceof Promise?r.then(r=>(e.value=r.value,r.issues.length&&(e.value=t.catchValue({...e,error:{issues:r.issues.map(e=>lp(e,n,jf()))},input:e.value}),e.issues=[]),e)):(e.value=r.value,r.issues.length&&(e.value=t.catchValue({...e,error:{issues:r.issues.map(e=>lp(e,n,jf()))},input:e.value}),e.issues=[]),e)}}),wh=H(`$ZodPipe`,(e,t)=>{K.init(e,t),U(e._zod,`values`,()=>t.in._zod.values),U(e._zod,`optin`,()=>t.in._zod.optin),U(e._zod,`optout`,()=>t.out._zod.optout),U(e._zod,`propValues`,()=>t.in._zod.propValues),e._zod.parse=(e,n)=>{if(n.direction===`backward`){let r=t.out._zod.run(e,n);return r instanceof Promise?r.then(e=>Th(e,t.in,n)):Th(r,t.in,n)}let r=t.in._zod.run(e,n);return r instanceof Promise?r.then(e=>Th(e,t.out,n)):Th(r,t.out,n)}});function Th(e,t,n){return e.issues.length?(e.aborted=!0,e):t._zod.run({value:e.value,issues:e.issues},n)}const Eh=H(`$ZodReadonly`,(e,t)=>{K.init(e,t),U(e._zod,`propValues`,()=>t.innerType._zod.propValues),U(e._zod,`values`,()=>t.innerType._zod.values),U(e._zod,`optin`,()=>t.innerType?._zod?.optin),U(e._zod,`optout`,()=>t.innerType?._zod?.optout),e._zod.parse=(e,n)=>{if(n.direction===`backward`)return t.innerType._zod.run(e,n);let r=t.innerType._zod.run(e,n);return r instanceof Promise?r.then(Dh):Dh(r)}});function Dh(e){return e.value=Object.freeze(e.value),e}const Oh=H(`$ZodCustom`,(e,t)=>{G.init(e,t),K.init(e,t),e._zod.parse=(e,t)=>e,e._zod.check=n=>{let r=n.value,i=t.fn(r);if(i instanceof Promise)return i.then(t=>kh(t,n,r,e));kh(i,n,r,e)}});function kh(e,t,n,r){if(!e){let e={code:`custom`,input:n,inst:r,path:[...r._zod.def.path??[]],continue:!r._zod.def.abort};r._zod.def.params&&(e.params=r._zod.def.params),t.issues.push(dp(e))}}var Ah,jh=class{constructor(){this._map=new WeakMap,this._idmap=new Map}add(e,...t){let n=t[0];return this._map.set(e,n),n&&typeof n==`object`&&`id`in n&&this._idmap.set(n.id,e),this}clear(){return this._map=new WeakMap,this._idmap=new Map,this}remove(e){let t=this._map.get(e);return t&&typeof t==`object`&&`id`in t&&this._idmap.delete(t.id),this._map.delete(e),this}get(e){let t=e._zod.parent;if(t){let n={...this.get(t)??{}};delete n.id;let r={...n,...this._map.get(e)};return Object.keys(r).length?r:void 0}return this._map.get(e)}has(e){return this._map.has(e)}};function Mh(){return new jh}(Ah=globalThis).__zod_globalRegistry??(Ah.__zod_globalRegistry=Mh());const Nh=globalThis.__zod_globalRegistry;function Ph(e,t){return new e({type:`string`,...W(t)})}function Fh(e,t){return new e({type:`string`,format:`email`,check:`string_format`,abort:!1,...W(t)})}function Ih(e,t){return new e({type:`string`,format:`guid`,check:`string_format`,abort:!1,...W(t)})}function Lh(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,...W(t)})}function Rh(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,version:`v4`,...W(t)})}function zh(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,version:`v6`,...W(t)})}function Bh(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,version:`v7`,...W(t)})}function Vh(e,t){return new e({type:`string`,format:`url`,check:`string_format`,abort:!1,...W(t)})}function Hh(e,t){return new e({type:`string`,format:`emoji`,check:`string_format`,abort:!1,...W(t)})}function Uh(e,t){return new e({type:`string`,format:`nanoid`,check:`string_format`,abort:!1,...W(t)})}function Wh(e,t){return new e({type:`string`,format:`cuid`,check:`string_format`,abort:!1,...W(t)})}function Gh(e,t){return new e({type:`string`,format:`cuid2`,check:`string_format`,abort:!1,...W(t)})}function Kh(e,t){return new e({type:`string`,format:`ulid`,check:`string_format`,abort:!1,...W(t)})}function qh(e,t){return new e({type:`string`,format:`xid`,check:`string_format`,abort:!1,...W(t)})}function Jh(e,t){return new e({type:`string`,format:`ksuid`,check:`string_format`,abort:!1,...W(t)})}function Yh(e,t){return new e({type:`string`,format:`ipv4`,check:`string_format`,abort:!1,...W(t)})}function Xh(e,t){return new e({type:`string`,format:`ipv6`,check:`string_format`,abort:!1,...W(t)})}function Zh(e,t){return new e({type:`string`,format:`cidrv4`,check:`string_format`,abort:!1,...W(t)})}function Qh(e,t){return new e({type:`string`,format:`cidrv6`,check:`string_format`,abort:!1,...W(t)})}function $h(e,t){return new e({type:`string`,format:`base64`,check:`string_format`,abort:!1,...W(t)})}function eg(e,t){return new e({type:`string`,format:`base64url`,check:`string_format`,abort:!1,...W(t)})}function tg(e,t){return new e({type:`string`,format:`e164`,check:`string_format`,abort:!1,...W(t)})}function ng(e,t){return new e({type:`string`,format:`jwt`,check:`string_format`,abort:!1,...W(t)})}function rg(e,t){return new e({type:`string`,format:`datetime`,check:`string_format`,offset:!1,local:!1,precision:null,...W(t)})}function ig(e,t){return new e({type:`string`,format:`date`,check:`string_format`,...W(t)})}function ag(e,t){return new e({type:`string`,format:`time`,check:`string_format`,precision:null,...W(t)})}function og(e,t){return new e({type:`string`,format:`duration`,check:`string_format`,...W(t)})}function sg(e,t){return new e({type:`number`,checks:[],...W(t)})}function cg(e,t){return new e({type:`number`,check:`number_format`,abort:!1,format:`safeint`,...W(t)})}function lg(e){return new e({type:`unknown`})}function ug(e,t){return new e({type:`never`,...W(t)})}function dg(e,t){return new om({check:`less_than`,...W(t),value:e,inclusive:!1})}function fg(e,t){return new om({check:`less_than`,...W(t),value:e,inclusive:!0})}function pg(e,t){return new sm({check:`greater_than`,...W(t),value:e,inclusive:!1})}function mg(e,t){return new sm({check:`greater_than`,...W(t),value:e,inclusive:!0})}function hg(e,t){return new cm({check:`multiple_of`,...W(t),value:e})}function gg(e,t){return new um({check:`max_length`,...W(t),maximum:e})}function _g(e,t){return new dm({check:`min_length`,...W(t),minimum:e})}function vg(e,t){return new fm({check:`length_equals`,...W(t),length:e})}function yg(e,t){return new mm({check:`string_format`,format:`regex`,...W(t),pattern:e})}function bg(e){return new hm({check:`string_format`,format:`lowercase`,...W(e)})}function xg(e){return new gm({check:`string_format`,format:`uppercase`,...W(e)})}function Sg(e,t){return new _m({check:`string_format`,format:`includes`,...W(t),includes:e})}function Cg(e,t){return new vm({check:`string_format`,format:`starts_with`,...W(t),prefix:e})}function wg(e,t){return new ym({check:`string_format`,format:`ends_with`,...W(t),suffix:e})}function Tg(e){return new bm({check:`overwrite`,tx:e})}function Eg(e){return Tg(t=>t.normalize(e))}function Dg(){return Tg(e=>e.trim())}function Og(){return Tg(e=>e.toLowerCase())}function kg(){return Tg(e=>e.toUpperCase())}function Ag(){return Tg(e=>Hf(e))}function jg(e,t,n){return new e({type:`array`,element:t,...W(n)})}function Mg(e,t,n){return new e({type:`custom`,check:`custom`,fn:t,...W(n)})}function Ng(e){let t=Pg(n=>(n.addIssue=e=>{if(typeof e==`string`)n.issues.push(dp(e,n.value,t._zod.def));else{let r=e;r.fatal&&(r.continue=!1),r.code??=`custom`,r.input??=n.value,r.inst??=t,r.continue??=!t._zod.def.abort,n.issues.push(dp(r))}},e(n.value,n)));return t}function Pg(e,t){let n=new G({check:`custom`,...W(t)});return n._zod.check=e,n}function Fg(e){let t=e?.target??`draft-2020-12`;return t===`draft-4`&&(t=`draft-04`),t===`draft-7`&&(t=`draft-07`),{processors:e.processors??{},metadataRegistry:e?.metadata??Nh,target:t,unrepresentable:e?.unrepresentable??`throw`,override:e?.override??(()=>{}),io:e?.io??`output`,counter:0,seen:new Map,cycles:e?.cycles??`ref`,reused:e?.reused??`inline`,external:e?.external??void 0}}function J(e,t,n={path:[],schemaPath:[]}){var r;let i=e._zod.def,a=t.seen.get(e);if(a)return a.count++,n.schemaPath.includes(e)&&(a.cycle=n.path),a.schema;let o={schema:{},count:1,cycle:void 0,path:n.path};t.seen.set(e,o);let s=e._zod.toJSONSchema?.();if(s)o.schema=s;else{let r={...n,schemaPath:[...n.schemaPath,e],path:n.path};if(e._zod.processJSONSchema)e._zod.processJSONSchema(t,o.schema,r);else{let n=o.schema,a=t.processors[i.type];if(!a)throw Error(`[toJSONSchema]: Non-representable type encountered: ${i.type}`);a(e,t,n,r)}let a=e._zod.parent;a&&(o.ref||=a,J(a,t,r),t.seen.get(a).isParent=!0)}let c=t.metadataRegistry.get(e);return c&&Object.assign(o.schema,c),t.io===`input`&&Y(e)&&(delete o.schema.examples,delete o.schema.default),t.io===`input`&&o.schema._prefault&&((r=o.schema).default??(r.default=o.schema._prefault)),delete o.schema._prefault,t.seen.get(e).schema}function Ig(e,t){let n=e.seen.get(t);if(!n)throw Error(`Unprocessed schema. This is a bug in Zod.`);let r=new Map;for(let t of e.seen.entries()){let n=e.metadataRegistry.get(t[0])?.id;if(n){let e=r.get(n);if(e&&e!==t[0])throw Error(`Duplicate schema id "${n}" detected during JSON Schema conversion. Two different schemas cannot share the same id when converted together.`);r.set(n,t[0])}}let i=t=>{let r=e.target===`draft-2020-12`?`$defs`:`definitions`;if(e.external){let n=e.external.registry.get(t[0])?.id,i=e.external.uri??(e=>e);if(n)return{ref:i(n)};let a=t[1].defId??t[1].schema.id??`schema${e.counter++}`;return t[1].defId=a,{defId:a,ref:`${i(`__shared`)}#/${r}/${a}`}}if(t[1]===n)return{ref:`#`};let i=`#/${r}/`,a=t[1].schema.id??`__schema${e.counter++}`;return{defId:a,ref:i+a}},a=e=>{if(e[1].schema.$ref)return;let t=e[1],{ref:n,defId:r}=i(e);t.def={...t.schema},r&&(t.defId=r);let a=t.schema;for(let e in a)delete a[e];a.$ref=n};if(e.cycles===`throw`)for(let t of e.seen.entries()){let e=t[1];if(e.cycle)throw Error(`Cycle detected: #/${e.cycle?.join(`/`)}/<root>
445
+ `)}t.write(`payload.value = newResult;`),t.write(`return payload;`);let s=t.compile();return(t,n)=>s(e,t,n)},a,o=Gf,s=!jf.jitless,c=s&&Kf.value,l=t.catchall,u;e._zod.parse=(d,f)=>{u??=r.value;let p=d.value;return o(p)?s&&c&&f?.async===!1&&f.jitless!==!0?(a||=i(t.shape),d=a(d,f),l?ah([],p,d,f,u,e):d):n(d,f):(d.issues.push({expected:`object`,code:`invalid_type`,input:p,inst:e}),d)}});function ch(e,t,n,r){for(let n of e)if(n.issues.length===0)return t.value=n.value,t;let i=e.filter(e=>!sp(e));return i.length===1?(t.value=i[0].value,i[0]):(t.issues.push({code:`invalid_union`,input:t.value,inst:n,errors:e.map(e=>e.issues.map(e=>up(e,r,Mf())))}),t)}const lh=H(`$ZodUnion`,(e,t)=>{K.init(e,t),U(e._zod,`optin`,()=>t.options.some(e=>e._zod.optin===`optional`)?`optional`:void 0),U(e._zod,`optout`,()=>t.options.some(e=>e._zod.optout===`optional`)?`optional`:void 0),U(e._zod,`values`,()=>{if(t.options.every(e=>e._zod.values))return new Set(t.options.flatMap(e=>Array.from(e._zod.values)))}),U(e._zod,`pattern`,()=>{if(t.options.every(e=>e._zod.pattern)){let e=t.options.map(e=>e._zod.pattern);return RegExp(`^(${e.map(e=>Lf(e.source)).join(`|`)})$`)}});let n=t.options.length===1,r=t.options[0]._zod.run;e._zod.parse=(i,a)=>{if(n)return r(i,a);let o=!1,s=[];for(let e of t.options){let t=e._zod.run({value:i.value,issues:[]},a);if(t instanceof Promise)s.push(t),o=!0;else{if(t.issues.length===0)return t;s.push(t)}}return o?Promise.all(s).then(t=>ch(t,i,e,a)):ch(s,i,e,a)}}),uh=H(`$ZodIntersection`,(e,t)=>{K.init(e,t),e._zod.parse=(e,n)=>{let r=e.value,i=t.left._zod.run({value:r,issues:[]},n),a=t.right._zod.run({value:r,issues:[]},n);return i instanceof Promise||a instanceof Promise?Promise.all([i,a]).then(([t,n])=>fh(e,t,n)):fh(e,i,a)}});function dh(e,t){if(e===t||e instanceof Date&&t instanceof Date&&+e==+t)return{valid:!0,data:e};if(qf(e)&&qf(t)){let n=Object.keys(t),r=Object.keys(e).filter(e=>n.indexOf(e)!==-1),i={...e,...t};for(let n of r){let r=dh(e[n],t[n]);if(!r.valid)return{valid:!1,mergeErrorPath:[n,...r.mergeErrorPath]};i[n]=r.data}return{valid:!0,data:i}}if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return{valid:!1,mergeErrorPath:[]};let n=[];for(let r=0;r<e.length;r++){let i=e[r],a=t[r],o=dh(i,a);if(!o.valid)return{valid:!1,mergeErrorPath:[r,...o.mergeErrorPath]};n.push(o.data)}return{valid:!0,data:n}}return{valid:!1,mergeErrorPath:[]}}function fh(e,t,n){let r=new Map,i;for(let n of t.issues)if(n.code===`unrecognized_keys`){i??=n;for(let e of n.keys)r.has(e)||r.set(e,{}),r.get(e).l=!0}else e.issues.push(n);for(let t of n.issues)if(t.code===`unrecognized_keys`)for(let e of t.keys)r.has(e)||r.set(e,{}),r.get(e).r=!0;else e.issues.push(t);let a=[...r].filter(([,e])=>e.l&&e.r).map(([e])=>e);if(a.length&&i&&e.issues.push({...i,keys:a}),sp(e))return e;let o=dh(t.value,n.value);if(!o.valid)throw Error(`Unmergable intersection. Error path: ${JSON.stringify(o.mergeErrorPath)}`);return e.value=o.data,e}const ph=H(`$ZodEnum`,(e,t)=>{K.init(e,t);let n=Nf(t.entries),r=new Set(n);e._zod.values=r,e._zod.pattern=RegExp(`^(${n.filter(e=>Yf.has(typeof e)).map(e=>typeof e==`string`?Xf(e):e.toString()).join(`|`)})$`),e._zod.parse=(t,i)=>{let a=t.value;return r.has(a)||t.issues.push({code:`invalid_value`,values:n,input:a,inst:e}),t}}),mh=H(`$ZodTransform`,(e,t)=>{K.init(e,t),e._zod.parse=(n,r)=>{if(r.direction===`backward`)throw new Af(e.constructor.name);let i=t.transform(n.value,n);if(r.async)return(i instanceof Promise?i:Promise.resolve(i)).then(e=>(n.value=e,n));if(i instanceof Promise)throw new kf;return n.value=i,n}});function hh(e,t){return e.issues.length&&t===void 0?{issues:[],value:void 0}:e}const gh=H(`$ZodOptional`,(e,t)=>{K.init(e,t),e._zod.optin=`optional`,e._zod.optout=`optional`,U(e._zod,`values`,()=>t.innerType._zod.values?new Set([...t.innerType._zod.values,void 0]):void 0),U(e._zod,`pattern`,()=>{let e=t.innerType._zod.pattern;return e?RegExp(`^(${Lf(e.source)})?$`):void 0}),e._zod.parse=(e,n)=>{if(t.innerType._zod.optin===`optional`){let r=t.innerType._zod.run(e,n);return r instanceof Promise?r.then(t=>hh(t,e.value)):hh(r,e.value)}return e.value===void 0?e:t.innerType._zod.run(e,n)}}),_h=H(`$ZodExactOptional`,(e,t)=>{gh.init(e,t),U(e._zod,`values`,()=>t.innerType._zod.values),U(e._zod,`pattern`,()=>t.innerType._zod.pattern),e._zod.parse=(e,n)=>t.innerType._zod.run(e,n)}),vh=H(`$ZodNullable`,(e,t)=>{K.init(e,t),U(e._zod,`optin`,()=>t.innerType._zod.optin),U(e._zod,`optout`,()=>t.innerType._zod.optout),U(e._zod,`pattern`,()=>{let e=t.innerType._zod.pattern;return e?RegExp(`^(${Lf(e.source)}|null)$`):void 0}),U(e._zod,`values`,()=>t.innerType._zod.values?new Set([...t.innerType._zod.values,null]):void 0),e._zod.parse=(e,n)=>e.value===null?e:t.innerType._zod.run(e,n)}),yh=H(`$ZodDefault`,(e,t)=>{K.init(e,t),e._zod.optin=`optional`,U(e._zod,`values`,()=>t.innerType._zod.values),e._zod.parse=(e,n)=>{if(n.direction===`backward`)return t.innerType._zod.run(e,n);if(e.value===void 0)return e.value=t.defaultValue,e;let r=t.innerType._zod.run(e,n);return r instanceof Promise?r.then(e=>bh(e,t)):bh(r,t)}});function bh(e,t){return e.value===void 0&&(e.value=t.defaultValue),e}const xh=H(`$ZodPrefault`,(e,t)=>{K.init(e,t),e._zod.optin=`optional`,U(e._zod,`values`,()=>t.innerType._zod.values),e._zod.parse=(e,n)=>(n.direction===`backward`||e.value===void 0&&(e.value=t.defaultValue),t.innerType._zod.run(e,n))}),Sh=H(`$ZodNonOptional`,(e,t)=>{K.init(e,t),U(e._zod,`values`,()=>{let e=t.innerType._zod.values;return e?new Set([...e].filter(e=>e!==void 0)):void 0}),e._zod.parse=(n,r)=>{let i=t.innerType._zod.run(n,r);return i instanceof Promise?i.then(t=>Ch(t,e)):Ch(i,e)}});function Ch(e,t){return!e.issues.length&&e.value===void 0&&e.issues.push({code:`invalid_type`,expected:`nonoptional`,input:e.value,inst:t}),e}const wh=H(`$ZodCatch`,(e,t)=>{K.init(e,t),U(e._zod,`optin`,()=>t.innerType._zod.optin),U(e._zod,`optout`,()=>t.innerType._zod.optout),U(e._zod,`values`,()=>t.innerType._zod.values),e._zod.parse=(e,n)=>{if(n.direction===`backward`)return t.innerType._zod.run(e,n);let r=t.innerType._zod.run(e,n);return r instanceof Promise?r.then(r=>(e.value=r.value,r.issues.length&&(e.value=t.catchValue({...e,error:{issues:r.issues.map(e=>up(e,n,Mf()))},input:e.value}),e.issues=[]),e)):(e.value=r.value,r.issues.length&&(e.value=t.catchValue({...e,error:{issues:r.issues.map(e=>up(e,n,Mf()))},input:e.value}),e.issues=[]),e)}}),Th=H(`$ZodPipe`,(e,t)=>{K.init(e,t),U(e._zod,`values`,()=>t.in._zod.values),U(e._zod,`optin`,()=>t.in._zod.optin),U(e._zod,`optout`,()=>t.out._zod.optout),U(e._zod,`propValues`,()=>t.in._zod.propValues),e._zod.parse=(e,n)=>{if(n.direction===`backward`){let r=t.out._zod.run(e,n);return r instanceof Promise?r.then(e=>Eh(e,t.in,n)):Eh(r,t.in,n)}let r=t.in._zod.run(e,n);return r instanceof Promise?r.then(e=>Eh(e,t.out,n)):Eh(r,t.out,n)}});function Eh(e,t,n){return e.issues.length?(e.aborted=!0,e):t._zod.run({value:e.value,issues:e.issues},n)}const Dh=H(`$ZodReadonly`,(e,t)=>{K.init(e,t),U(e._zod,`propValues`,()=>t.innerType._zod.propValues),U(e._zod,`values`,()=>t.innerType._zod.values),U(e._zod,`optin`,()=>t.innerType?._zod?.optin),U(e._zod,`optout`,()=>t.innerType?._zod?.optout),e._zod.parse=(e,n)=>{if(n.direction===`backward`)return t.innerType._zod.run(e,n);let r=t.innerType._zod.run(e,n);return r instanceof Promise?r.then(Oh):Oh(r)}});function Oh(e){return e.value=Object.freeze(e.value),e}const kh=H(`$ZodCustom`,(e,t)=>{G.init(e,t),K.init(e,t),e._zod.parse=(e,t)=>e,e._zod.check=n=>{let r=n.value,i=t.fn(r);if(i instanceof Promise)return i.then(t=>Ah(t,n,r,e));Ah(i,n,r,e)}});function Ah(e,t,n,r){if(!e){let e={code:`custom`,input:n,inst:r,path:[...r._zod.def.path??[]],continue:!r._zod.def.abort};r._zod.def.params&&(e.params=r._zod.def.params),t.issues.push(fp(e))}}var jh,Mh=class{constructor(){this._map=new WeakMap,this._idmap=new Map}add(e,...t){let n=t[0];return this._map.set(e,n),n&&typeof n==`object`&&`id`in n&&this._idmap.set(n.id,e),this}clear(){return this._map=new WeakMap,this._idmap=new Map,this}remove(e){let t=this._map.get(e);return t&&typeof t==`object`&&`id`in t&&this._idmap.delete(t.id),this._map.delete(e),this}get(e){let t=e._zod.parent;if(t){let n={...this.get(t)??{}};delete n.id;let r={...n,...this._map.get(e)};return Object.keys(r).length?r:void 0}return this._map.get(e)}has(e){return this._map.has(e)}};function Nh(){return new Mh}(jh=globalThis).__zod_globalRegistry??(jh.__zod_globalRegistry=Nh());const Ph=globalThis.__zod_globalRegistry;function Fh(e,t){return new e({type:`string`,...W(t)})}function Ih(e,t){return new e({type:`string`,format:`email`,check:`string_format`,abort:!1,...W(t)})}function Lh(e,t){return new e({type:`string`,format:`guid`,check:`string_format`,abort:!1,...W(t)})}function Rh(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,...W(t)})}function zh(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,version:`v4`,...W(t)})}function Bh(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,version:`v6`,...W(t)})}function Vh(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,version:`v7`,...W(t)})}function Hh(e,t){return new e({type:`string`,format:`url`,check:`string_format`,abort:!1,...W(t)})}function Uh(e,t){return new e({type:`string`,format:`emoji`,check:`string_format`,abort:!1,...W(t)})}function Wh(e,t){return new e({type:`string`,format:`nanoid`,check:`string_format`,abort:!1,...W(t)})}function Gh(e,t){return new e({type:`string`,format:`cuid`,check:`string_format`,abort:!1,...W(t)})}function Kh(e,t){return new e({type:`string`,format:`cuid2`,check:`string_format`,abort:!1,...W(t)})}function qh(e,t){return new e({type:`string`,format:`ulid`,check:`string_format`,abort:!1,...W(t)})}function Jh(e,t){return new e({type:`string`,format:`xid`,check:`string_format`,abort:!1,...W(t)})}function Yh(e,t){return new e({type:`string`,format:`ksuid`,check:`string_format`,abort:!1,...W(t)})}function Xh(e,t){return new e({type:`string`,format:`ipv4`,check:`string_format`,abort:!1,...W(t)})}function Zh(e,t){return new e({type:`string`,format:`ipv6`,check:`string_format`,abort:!1,...W(t)})}function Qh(e,t){return new e({type:`string`,format:`cidrv4`,check:`string_format`,abort:!1,...W(t)})}function $h(e,t){return new e({type:`string`,format:`cidrv6`,check:`string_format`,abort:!1,...W(t)})}function eg(e,t){return new e({type:`string`,format:`base64`,check:`string_format`,abort:!1,...W(t)})}function tg(e,t){return new e({type:`string`,format:`base64url`,check:`string_format`,abort:!1,...W(t)})}function ng(e,t){return new e({type:`string`,format:`e164`,check:`string_format`,abort:!1,...W(t)})}function rg(e,t){return new e({type:`string`,format:`jwt`,check:`string_format`,abort:!1,...W(t)})}function ig(e,t){return new e({type:`string`,format:`datetime`,check:`string_format`,offset:!1,local:!1,precision:null,...W(t)})}function ag(e,t){return new e({type:`string`,format:`date`,check:`string_format`,...W(t)})}function og(e,t){return new e({type:`string`,format:`time`,check:`string_format`,precision:null,...W(t)})}function sg(e,t){return new e({type:`string`,format:`duration`,check:`string_format`,...W(t)})}function cg(e,t){return new e({type:`number`,checks:[],...W(t)})}function lg(e,t){return new e({type:`number`,check:`number_format`,abort:!1,format:`safeint`,...W(t)})}function ug(e){return new e({type:`unknown`})}function dg(e,t){return new e({type:`never`,...W(t)})}function fg(e,t){return new sm({check:`less_than`,...W(t),value:e,inclusive:!1})}function pg(e,t){return new sm({check:`less_than`,...W(t),value:e,inclusive:!0})}function mg(e,t){return new cm({check:`greater_than`,...W(t),value:e,inclusive:!1})}function hg(e,t){return new cm({check:`greater_than`,...W(t),value:e,inclusive:!0})}function gg(e,t){return new lm({check:`multiple_of`,...W(t),value:e})}function _g(e,t){return new dm({check:`max_length`,...W(t),maximum:e})}function vg(e,t){return new fm({check:`min_length`,...W(t),minimum:e})}function yg(e,t){return new pm({check:`length_equals`,...W(t),length:e})}function bg(e,t){return new hm({check:`string_format`,format:`regex`,...W(t),pattern:e})}function xg(e){return new gm({check:`string_format`,format:`lowercase`,...W(e)})}function Sg(e){return new _m({check:`string_format`,format:`uppercase`,...W(e)})}function Cg(e,t){return new vm({check:`string_format`,format:`includes`,...W(t),includes:e})}function wg(e,t){return new ym({check:`string_format`,format:`starts_with`,...W(t),prefix:e})}function Tg(e,t){return new bm({check:`string_format`,format:`ends_with`,...W(t),suffix:e})}function Eg(e){return new xm({check:`overwrite`,tx:e})}function Dg(e){return Eg(t=>t.normalize(e))}function Og(){return Eg(e=>e.trim())}function kg(){return Eg(e=>e.toLowerCase())}function Ag(){return Eg(e=>e.toUpperCase())}function jg(){return Eg(e=>Uf(e))}function Mg(e,t,n){return new e({type:`array`,element:t,...W(n)})}function Ng(e,t,n){return new e({type:`custom`,check:`custom`,fn:t,...W(n)})}function Pg(e){let t=Fg(n=>(n.addIssue=e=>{if(typeof e==`string`)n.issues.push(fp(e,n.value,t._zod.def));else{let r=e;r.fatal&&(r.continue=!1),r.code??=`custom`,r.input??=n.value,r.inst??=t,r.continue??=!t._zod.def.abort,n.issues.push(fp(r))}},e(n.value,n)));return t}function Fg(e,t){let n=new G({check:`custom`,...W(t)});return n._zod.check=e,n}function Ig(e){let t=e?.target??`draft-2020-12`;return t===`draft-4`&&(t=`draft-04`),t===`draft-7`&&(t=`draft-07`),{processors:e.processors??{},metadataRegistry:e?.metadata??Ph,target:t,unrepresentable:e?.unrepresentable??`throw`,override:e?.override??(()=>{}),io:e?.io??`output`,counter:0,seen:new Map,cycles:e?.cycles??`ref`,reused:e?.reused??`inline`,external:e?.external??void 0}}function J(e,t,n={path:[],schemaPath:[]}){var r;let i=e._zod.def,a=t.seen.get(e);if(a)return a.count++,n.schemaPath.includes(e)&&(a.cycle=n.path),a.schema;let o={schema:{},count:1,cycle:void 0,path:n.path};t.seen.set(e,o);let s=e._zod.toJSONSchema?.();if(s)o.schema=s;else{let r={...n,schemaPath:[...n.schemaPath,e],path:n.path};if(e._zod.processJSONSchema)e._zod.processJSONSchema(t,o.schema,r);else{let n=o.schema,a=t.processors[i.type];if(!a)throw Error(`[toJSONSchema]: Non-representable type encountered: ${i.type}`);a(e,t,n,r)}let a=e._zod.parent;a&&(o.ref||=a,J(a,t,r),t.seen.get(a).isParent=!0)}let c=t.metadataRegistry.get(e);return c&&Object.assign(o.schema,c),t.io===`input`&&Y(e)&&(delete o.schema.examples,delete o.schema.default),t.io===`input`&&o.schema._prefault&&((r=o.schema).default??(r.default=o.schema._prefault)),delete o.schema._prefault,t.seen.get(e).schema}function Lg(e,t){let n=e.seen.get(t);if(!n)throw Error(`Unprocessed schema. This is a bug in Zod.`);let r=new Map;for(let t of e.seen.entries()){let n=e.metadataRegistry.get(t[0])?.id;if(n){let e=r.get(n);if(e&&e!==t[0])throw Error(`Duplicate schema id "${n}" detected during JSON Schema conversion. Two different schemas cannot share the same id when converted together.`);r.set(n,t[0])}}let i=t=>{let r=e.target===`draft-2020-12`?`$defs`:`definitions`;if(e.external){let n=e.external.registry.get(t[0])?.id,i=e.external.uri??(e=>e);if(n)return{ref:i(n)};let a=t[1].defId??t[1].schema.id??`schema${e.counter++}`;return t[1].defId=a,{defId:a,ref:`${i(`__shared`)}#/${r}/${a}`}}if(t[1]===n)return{ref:`#`};let i=`#/${r}/`,a=t[1].schema.id??`__schema${e.counter++}`;return{defId:a,ref:i+a}},a=e=>{if(e[1].schema.$ref)return;let t=e[1],{ref:n,defId:r}=i(e);t.def={...t.schema},r&&(t.defId=r);let a=t.schema;for(let e in a)delete a[e];a.$ref=n};if(e.cycles===`throw`)for(let t of e.seen.entries()){let e=t[1];if(e.cycle)throw Error(`Cycle detected: #/${e.cycle?.join(`/`)}/<root>
446
446
 
447
- Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.`)}for(let n of e.seen.entries()){let r=n[1];if(t===n[0]){a(n);continue}if(e.external){let r=e.external.registry.get(n[0])?.id;if(t!==n[0]&&r){a(n);continue}}if(e.metadataRegistry.get(n[0])?.id){a(n);continue}if(r.cycle){a(n);continue}if(r.count>1&&e.reused===`ref`){a(n);continue}}}function Lg(e,t){let n=e.seen.get(t);if(!n)throw Error(`Unprocessed schema. This is a bug in Zod.`);let r=t=>{let n=e.seen.get(t);if(n.ref===null)return;let i=n.def??n.schema,a={...i},o=n.ref;if(n.ref=null,o){r(o);let n=e.seen.get(o),s=n.schema;if(s.$ref&&(e.target===`draft-07`||e.target===`draft-04`||e.target===`openapi-3.0`)?(i.allOf=i.allOf??[],i.allOf.push(s)):Object.assign(i,s),Object.assign(i,a),t._zod.parent===o)for(let e in i)e===`$ref`||e===`allOf`||e in a||delete i[e];if(s.$ref&&n.def)for(let e in i)e===`$ref`||e===`allOf`||e in n.def&&JSON.stringify(i[e])===JSON.stringify(n.def[e])&&delete i[e]}let s=t._zod.parent;if(s&&s!==o){r(s);let t=e.seen.get(s);if(t?.schema.$ref&&(i.$ref=t.schema.$ref,t.def))for(let e in i)e===`$ref`||e===`allOf`||e in t.def&&JSON.stringify(i[e])===JSON.stringify(t.def[e])&&delete i[e]}e.override({zodSchema:t,jsonSchema:i,path:n.path??[]})};for(let t of[...e.seen.entries()].reverse())r(t[0]);let i={};if(e.target===`draft-2020-12`?i.$schema=`https://json-schema.org/draft/2020-12/schema`:e.target===`draft-07`?i.$schema=`http://json-schema.org/draft-07/schema#`:e.target===`draft-04`?i.$schema=`http://json-schema.org/draft-04/schema#`:e.target,e.external?.uri){let n=e.external.registry.get(t)?.id;if(!n)throw Error("Schema is missing an `id` property");i.$id=e.external.uri(n)}Object.assign(i,n.def??n.schema);let a=e.external?.defs??{};for(let t of e.seen.entries()){let e=t[1];e.def&&e.defId&&(a[e.defId]=e.def)}e.external||Object.keys(a).length>0&&(e.target===`draft-2020-12`?i.$defs=a:i.definitions=a);try{let n=JSON.parse(JSON.stringify(i));return Object.defineProperty(n,`~standard`,{value:{...t[`~standard`],jsonSchema:{input:zg(t,`input`,e.processors),output:zg(t,`output`,e.processors)}},enumerable:!1,writable:!1}),n}catch{throw Error(`Error converting schema to JSON.`)}}function Y(e,t){let n=t??{seen:new Set};if(n.seen.has(e))return!1;n.seen.add(e);let r=e._zod.def;if(r.type===`transform`)return!0;if(r.type===`array`)return Y(r.element,n);if(r.type===`set`)return Y(r.valueType,n);if(r.type===`lazy`)return Y(r.getter(),n);if(r.type===`promise`||r.type===`optional`||r.type===`nonoptional`||r.type===`nullable`||r.type===`readonly`||r.type===`default`||r.type===`prefault`)return Y(r.innerType,n);if(r.type===`intersection`)return Y(r.left,n)||Y(r.right,n);if(r.type===`record`||r.type===`map`)return Y(r.keyType,n)||Y(r.valueType,n);if(r.type===`pipe`)return Y(r.in,n)||Y(r.out,n);if(r.type===`object`){for(let e in r.shape)if(Y(r.shape[e],n))return!0;return!1}if(r.type===`union`){for(let e of r.options)if(Y(e,n))return!0;return!1}if(r.type===`tuple`){for(let e of r.items)if(Y(e,n))return!0;return!!(r.rest&&Y(r.rest,n))}return!1}const Rg=(e,t={})=>n=>{let r=Fg({...n,processors:t});return J(e,r),Ig(r,e),Lg(r,e)},zg=(e,t,n={})=>r=>{let{libraryOptions:i,target:a}=r??{},o=Fg({...i??{},target:a,io:t,processors:n});return J(e,o),Ig(o,e),Lg(o,e)},Bg={guid:`uuid`,url:`uri`,datetime:`date-time`,json_string:`json-string`,regex:``},Vg=(e,t,n,r)=>{let i=n;i.type=`string`;let{minimum:a,maximum:o,format:s,patterns:c,contentEncoding:l}=e._zod.bag;if(typeof a==`number`&&(i.minLength=a),typeof o==`number`&&(i.maxLength=o),s&&(i.format=Bg[s]??s,i.format===``&&delete i.format,s===`time`&&delete i.format),l&&(i.contentEncoding=l),c&&c.size>0){let e=[...c];e.length===1?i.pattern=e[0].source:e.length>1&&(i.allOf=[...e.map(e=>({...t.target===`draft-07`||t.target===`draft-04`||t.target===`openapi-3.0`?{type:`string`}:{},pattern:e.source}))])}},Hg=(e,t,n,r)=>{let i=n,{minimum:a,maximum:o,format:s,multipleOf:c,exclusiveMaximum:l,exclusiveMinimum:u}=e._zod.bag;typeof s==`string`&&s.includes(`int`)?i.type=`integer`:i.type=`number`,typeof u==`number`&&(t.target===`draft-04`||t.target===`openapi-3.0`?(i.minimum=u,i.exclusiveMinimum=!0):i.exclusiveMinimum=u),typeof a==`number`&&(i.minimum=a,typeof u==`number`&&t.target!==`draft-04`&&(u>=a?delete i.minimum:delete i.exclusiveMinimum)),typeof l==`number`&&(t.target===`draft-04`||t.target===`openapi-3.0`?(i.maximum=l,i.exclusiveMaximum=!0):i.exclusiveMaximum=l),typeof o==`number`&&(i.maximum=o,typeof l==`number`&&t.target!==`draft-04`&&(l<=o?delete i.maximum:delete i.exclusiveMaximum)),typeof c==`number`&&(i.multipleOf=c)},Ug=(e,t,n,r)=>{n.not={}},Wg=(e,t,n,r)=>{let i=e._zod.def,a=Mf(i.entries);a.every(e=>typeof e==`number`)&&(n.type=`number`),a.every(e=>typeof e==`string`)&&(n.type=`string`),n.enum=a},Gg=(e,t,n,r)=>{if(t.unrepresentable===`throw`)throw Error(`Custom types cannot be represented in JSON Schema`)},Kg=(e,t,n,r)=>{if(t.unrepresentable===`throw`)throw Error(`Transforms cannot be represented in JSON Schema`)},qg=(e,t,n,r)=>{let i=n,a=e._zod.def,{minimum:o,maximum:s}=e._zod.bag;typeof o==`number`&&(i.minItems=o),typeof s==`number`&&(i.maxItems=s),i.type=`array`,i.items=J(a.element,t,{...r,path:[...r.path,`items`]})},Jg=(e,t,n,r)=>{let i=n,a=e._zod.def;i.type=`object`,i.properties={};let o=a.shape;for(let e in o)i.properties[e]=J(o[e],t,{...r,path:[...r.path,`properties`,e]});let s=new Set(Object.keys(o)),c=new Set([...s].filter(e=>{let n=a.shape[e]._zod;return t.io===`input`?n.optin===void 0:n.optout===void 0}));c.size>0&&(i.required=Array.from(c)),a.catchall?._zod.def.type===`never`?i.additionalProperties=!1:a.catchall?a.catchall&&(i.additionalProperties=J(a.catchall,t,{...r,path:[...r.path,`additionalProperties`]})):t.io===`output`&&(i.additionalProperties=!1)},Yg=(e,t,n,r)=>{let i=e._zod.def,a=i.inclusive===!1,o=i.options.map((e,n)=>J(e,t,{...r,path:[...r.path,a?`oneOf`:`anyOf`,n]}));a?n.oneOf=o:n.anyOf=o},Xg=(e,t,n,r)=>{let i=e._zod.def,a=J(i.left,t,{...r,path:[...r.path,`allOf`,0]}),o=J(i.right,t,{...r,path:[...r.path,`allOf`,1]}),s=e=>`allOf`in e&&Object.keys(e).length===1;n.allOf=[...s(a)?a.allOf:[a],...s(o)?o.allOf:[o]]},Zg=(e,t,n,r)=>{let i=e._zod.def,a=J(i.innerType,t,r),o=t.seen.get(e);t.target===`openapi-3.0`?(o.ref=i.innerType,n.nullable=!0):n.anyOf=[a,{type:`null`}]},Qg=(e,t,n,r)=>{let i=e._zod.def;J(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},$g=(e,t,n,r)=>{let i=e._zod.def;J(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType,n.default=JSON.parse(JSON.stringify(i.defaultValue))},e_=(e,t,n,r)=>{let i=e._zod.def;J(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType,t.io===`input`&&(n._prefault=JSON.parse(JSON.stringify(i.defaultValue)))},t_=(e,t,n,r)=>{let i=e._zod.def;J(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType;let o;try{o=i.catchValue(void 0)}catch{throw Error(`Dynamic catch values are not supported in JSON Schema`)}n.default=o},n_=(e,t,n,r)=>{let i=e._zod.def,a=t.io===`input`?i.in._zod.def.type===`transform`?i.out:i.in:i.out;J(a,t,r);let o=t.seen.get(e);o.ref=a},r_=(e,t,n,r)=>{let i=e._zod.def;J(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType,n.readOnly=!0},i_=(e,t,n,r)=>{let i=e._zod.def;J(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},a_=H(`ZodISODateTime`,(e,t)=>{Fm.init(e,t),$.init(e,t)});function o_(e){return rg(a_,e)}const s_=H(`ZodISODate`,(e,t)=>{Im.init(e,t),$.init(e,t)});function c_(e){return ig(s_,e)}const l_=H(`ZodISOTime`,(e,t)=>{Lm.init(e,t),$.init(e,t)});function u_(e){return ag(l_,e)}const d_=H(`ZodISODuration`,(e,t)=>{Rm.init(e,t),$.init(e,t)});function f_(e){return og(d_,e)}const p_=(e,t)=>{pp.init(e,t),e.name=`ZodError`,Object.defineProperties(e,{format:{value:t=>gp(e,t)},flatten:{value:t=>hp(e,t)},addIssue:{value:t=>{e.issues.push(t),e.message=JSON.stringify(e.issues,Nf,2)}},addIssues:{value:t=>{e.issues.push(...t),e.message=JSON.stringify(e.issues,Nf,2)}},isEmpty:{get(){return e.issues.length===0}}})};H(`ZodError`,p_);const X=H(`ZodError`,p_,{Parent:Error}),m_=_p(X),h_=vp(X),g_=yp(X),__=xp(X),v_=Cp(X),y_=wp(X),b_=Tp(X),x_=Ep(X),S_=Dp(X),C_=Op(X),w_=kp(X),T_=Ap(X),Z=H(`ZodType`,(e,t)=>(K.init(e,t),Object.assign(e[`~standard`],{jsonSchema:{input:zg(e,`input`),output:zg(e,`output`)}}),e.toJSONSchema=Rg(e,{}),e.def=t,e.type=t.type,Object.defineProperty(e,`_def`,{value:t}),e.check=(...n)=>e.clone(Bf(t,{checks:[...t.checks??[],...n.map(e=>typeof e==`function`?{_zod:{check:e,def:{check:`custom`},onattach:[]}}:e)]}),{parent:!0}),e.with=e.check,e.clone=(t,n)=>Xf(e,t,n),e.brand=()=>e,e.register=((t,n)=>(t.add(e,n),e)),e.parse=(t,n)=>m_(e,t,n,{callee:e.parse}),e.safeParse=(t,n)=>g_(e,t,n),e.parseAsync=async(t,n)=>h_(e,t,n,{callee:e.parseAsync}),e.safeParseAsync=async(t,n)=>__(e,t,n),e.spa=e.safeParseAsync,e.encode=(t,n)=>v_(e,t,n),e.decode=(t,n)=>y_(e,t,n),e.encodeAsync=async(t,n)=>b_(e,t,n),e.decodeAsync=async(t,n)=>x_(e,t,n),e.safeEncode=(t,n)=>S_(e,t,n),e.safeDecode=(t,n)=>C_(e,t,n),e.safeEncodeAsync=async(t,n)=>w_(e,t,n),e.safeDecodeAsync=async(t,n)=>T_(e,t,n),e.refine=(t,n)=>e.check(Mv(t,n)),e.superRefine=t=>e.check(Nv(t)),e.overwrite=t=>e.check(Tg(t)),e.optional=()=>mv(e),e.exactOptional=()=>gv(e),e.nullable=()=>vv(e),e.nullish=()=>mv(vv(e)),e.nonoptional=t=>wv(e,t),e.array=()=>nv(e),e.or=t=>ov([e,t]),e.and=t=>cv(e,t),e.transform=t=>Ov(e,fv(t)),e.default=t=>bv(e,t),e.prefault=t=>Sv(e,t),e.catch=t=>Ev(e,t),e.pipe=t=>Ov(e,t),e.readonly=()=>Av(e),e.describe=t=>{let n=e.clone();return Nh.add(n,{description:t}),n},Object.defineProperty(e,`description`,{get(){return Nh.get(e)?.description},configurable:!0}),e.meta=(...t)=>{if(t.length===0)return Nh.get(e);let n=e.clone();return Nh.add(n,t[0]),n},e.isOptional=()=>e.safeParse(void 0).success,e.isNullable=()=>e.safeParse(null).success,e.apply=t=>t(e),e)),E_=H(`_ZodString`,(e,t)=>{Cm.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Vg(e,t,n,r);let n=e._zod.bag;e.format=n.format??null,e.minLength=n.minimum??null,e.maxLength=n.maximum??null,e.regex=(...t)=>e.check(yg(...t)),e.includes=(...t)=>e.check(Sg(...t)),e.startsWith=(...t)=>e.check(Cg(...t)),e.endsWith=(...t)=>e.check(wg(...t)),e.min=(...t)=>e.check(_g(...t)),e.max=(...t)=>e.check(gg(...t)),e.length=(...t)=>e.check(vg(...t)),e.nonempty=(...t)=>e.check(_g(1,...t)),e.lowercase=t=>e.check(bg(t)),e.uppercase=t=>e.check(xg(t)),e.trim=()=>e.check(Dg()),e.normalize=(...t)=>e.check(Eg(...t)),e.toLowerCase=()=>e.check(Og()),e.toUpperCase=()=>e.check(kg()),e.slugify=()=>e.check(Ag())}),D_=H(`ZodString`,(e,t)=>{Cm.init(e,t),E_.init(e,t),e.email=t=>e.check(Fh(O_,t)),e.url=t=>e.check(Vh(j_,t)),e.jwt=t=>e.check(ng(K_,t)),e.emoji=t=>e.check(Hh(M_,t)),e.guid=t=>e.check(Ih(k_,t)),e.uuid=t=>e.check(Lh(A_,t)),e.uuidv4=t=>e.check(Rh(A_,t)),e.uuidv6=t=>e.check(zh(A_,t)),e.uuidv7=t=>e.check(Bh(A_,t)),e.nanoid=t=>e.check(Uh(N_,t)),e.guid=t=>e.check(Ih(k_,t)),e.cuid=t=>e.check(Wh(P_,t)),e.cuid2=t=>e.check(Gh(F_,t)),e.ulid=t=>e.check(Kh(I_,t)),e.base64=t=>e.check($h(U_,t)),e.base64url=t=>e.check(eg(W_,t)),e.xid=t=>e.check(qh(L_,t)),e.ksuid=t=>e.check(Jh(R_,t)),e.ipv4=t=>e.check(Yh(z_,t)),e.ipv6=t=>e.check(Xh(B_,t)),e.cidrv4=t=>e.check(Zh(V_,t)),e.cidrv6=t=>e.check(Qh(H_,t)),e.e164=t=>e.check(tg(G_,t)),e.datetime=t=>e.check(o_(t)),e.date=t=>e.check(c_(t)),e.time=t=>e.check(u_(t)),e.duration=t=>e.check(f_(t))});function Q(e){return Ph(D_,e)}const $=H(`ZodStringFormat`,(e,t)=>{q.init(e,t),E_.init(e,t)}),O_=H(`ZodEmail`,(e,t)=>{Em.init(e,t),$.init(e,t)}),k_=H(`ZodGUID`,(e,t)=>{wm.init(e,t),$.init(e,t)}),A_=H(`ZodUUID`,(e,t)=>{Tm.init(e,t),$.init(e,t)}),j_=H(`ZodURL`,(e,t)=>{Dm.init(e,t),$.init(e,t)}),M_=H(`ZodEmoji`,(e,t)=>{Om.init(e,t),$.init(e,t)}),N_=H(`ZodNanoID`,(e,t)=>{km.init(e,t),$.init(e,t)}),P_=H(`ZodCUID`,(e,t)=>{Am.init(e,t),$.init(e,t)}),F_=H(`ZodCUID2`,(e,t)=>{jm.init(e,t),$.init(e,t)}),I_=H(`ZodULID`,(e,t)=>{Mm.init(e,t),$.init(e,t)}),L_=H(`ZodXID`,(e,t)=>{Nm.init(e,t),$.init(e,t)}),R_=H(`ZodKSUID`,(e,t)=>{Pm.init(e,t),$.init(e,t)}),z_=H(`ZodIPv4`,(e,t)=>{zm.init(e,t),$.init(e,t)}),B_=H(`ZodIPv6`,(e,t)=>{Bm.init(e,t),$.init(e,t)}),V_=H(`ZodCIDRv4`,(e,t)=>{Vm.init(e,t),$.init(e,t)}),H_=H(`ZodCIDRv6`,(e,t)=>{Hm.init(e,t),$.init(e,t)}),U_=H(`ZodBase64`,(e,t)=>{Wm.init(e,t),$.init(e,t)}),W_=H(`ZodBase64URL`,(e,t)=>{Km.init(e,t),$.init(e,t)}),G_=H(`ZodE164`,(e,t)=>{qm.init(e,t),$.init(e,t)}),K_=H(`ZodJWT`,(e,t)=>{Ym.init(e,t),$.init(e,t)}),q_=H(`ZodNumber`,(e,t)=>{Xm.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Hg(e,t,n,r),e.gt=(t,n)=>e.check(pg(t,n)),e.gte=(t,n)=>e.check(mg(t,n)),e.min=(t,n)=>e.check(mg(t,n)),e.lt=(t,n)=>e.check(dg(t,n)),e.lte=(t,n)=>e.check(fg(t,n)),e.max=(t,n)=>e.check(fg(t,n)),e.int=t=>e.check(X_(t)),e.safe=t=>e.check(X_(t)),e.positive=t=>e.check(pg(0,t)),e.nonnegative=t=>e.check(mg(0,t)),e.negative=t=>e.check(dg(0,t)),e.nonpositive=t=>e.check(fg(0,t)),e.multipleOf=(t,n)=>e.check(hg(t,n)),e.step=(t,n)=>e.check(hg(t,n)),e.finite=()=>e;let n=e._zod.bag;e.minValue=Math.max(n.minimum??-1/0,n.exclusiveMinimum??-1/0)??null,e.maxValue=Math.min(n.maximum??1/0,n.exclusiveMaximum??1/0)??null,e.isInt=(n.format??``).includes(`int`)||Number.isSafeInteger(n.multipleOf??.5),e.isFinite=!0,e.format=n.format??null});function J_(e){return sg(q_,e)}const Y_=H(`ZodNumberFormat`,(e,t)=>{Zm.init(e,t),q_.init(e,t)});function X_(e){return cg(Y_,e)}const Z_=H(`ZodUnknown`,(e,t)=>{Qm.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(e,t,n)=>void 0});function Q_(){return lg(Z_)}const $_=H(`ZodNever`,(e,t)=>{$m.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Ug(e,t,n,r)});function ev(e){return ug($_,e)}const tv=H(`ZodArray`,(e,t)=>{th.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>qg(e,t,n,r),e.element=t.element,e.min=(t,n)=>e.check(_g(t,n)),e.nonempty=t=>e.check(_g(1,t)),e.max=(t,n)=>e.check(gg(t,n)),e.length=(t,n)=>e.check(vg(t,n)),e.unwrap=()=>e.element});function nv(e,t){return jg(tv,e,t)}const rv=H(`ZodObject`,(e,t)=>{oh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Jg(e,t,n,r),U(e,`shape`,()=>t.shape),e.keyof=()=>uv(Object.keys(e._zod.def.shape)),e.catchall=t=>e.clone({...e._zod.def,catchall:t}),e.passthrough=()=>e.clone({...e._zod.def,catchall:Q_()}),e.loose=()=>e.clone({...e._zod.def,catchall:Q_()}),e.strict=()=>e.clone({...e._zod.def,catchall:ev()}),e.strip=()=>e.clone({...e._zod.def,catchall:void 0}),e.extend=t=>tp(e,t),e.safeExtend=t=>np(e,t),e.merge=t=>rp(e,t),e.pick=t=>$f(e,t),e.omit=t=>ep(e,t),e.partial=(...t)=>ip(pv,e,t[0]),e.required=(...t)=>ap(Cv,e,t[0])});function iv(e,t){return new rv({type:`object`,shape:e??{},...W(t)})}const av=H(`ZodUnion`,(e,t)=>{ch.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Yg(e,t,n,r),e.options=t.options});function ov(e,t){return new av({type:`union`,options:e,...W(t)})}const sv=H(`ZodIntersection`,(e,t)=>{lh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Xg(e,t,n,r)});function cv(e,t){return new sv({type:`intersection`,left:e,right:t})}const lv=H(`ZodEnum`,(e,t)=>{fh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Wg(e,t,n,r),e.enum=t.entries,e.options=Object.values(t.entries);let n=new Set(Object.keys(t.entries));e.extract=(e,r)=>{let i={};for(let r of e)if(n.has(r))i[r]=t.entries[r];else throw Error(`Key ${r} not found in enum`);return new lv({...t,checks:[],...W(r),entries:i})},e.exclude=(e,r)=>{let i={...t.entries};for(let t of e)if(n.has(t))delete i[t];else throw Error(`Key ${t} not found in enum`);return new lv({...t,checks:[],...W(r),entries:i})}});function uv(e,t){return new lv({type:`enum`,entries:Array.isArray(e)?Object.fromEntries(e.map(e=>[e,e])):e,...W(t)})}const dv=H(`ZodTransform`,(e,t)=>{ph.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Kg(e,t,n,r),e._zod.parse=(n,r)=>{if(r.direction===`backward`)throw new kf(e.constructor.name);n.addIssue=r=>{if(typeof r==`string`)n.issues.push(dp(r,n.value,t));else{let t=r;t.fatal&&(t.continue=!1),t.code??=`custom`,t.input??=n.value,t.inst??=e,n.issues.push(dp(t))}};let i=t.transform(n.value,n);return i instanceof Promise?i.then(e=>(n.value=e,n)):(n.value=i,n)}});function fv(e){return new dv({type:`transform`,transform:e})}const pv=H(`ZodOptional`,(e,t)=>{hh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>i_(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function mv(e){return new pv({type:`optional`,innerType:e})}const hv=H(`ZodExactOptional`,(e,t)=>{gh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>i_(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function gv(e){return new hv({type:`optional`,innerType:e})}const _v=H(`ZodNullable`,(e,t)=>{_h.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Zg(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function vv(e){return new _v({type:`nullable`,innerType:e})}const yv=H(`ZodDefault`,(e,t)=>{vh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>$g(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeDefault=e.unwrap});function bv(e,t){return new yv({type:`default`,innerType:e,get defaultValue(){return typeof t==`function`?t():qf(t)}})}const xv=H(`ZodPrefault`,(e,t)=>{bh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>e_(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Sv(e,t){return new xv({type:`prefault`,innerType:e,get defaultValue(){return typeof t==`function`?t():qf(t)}})}const Cv=H(`ZodNonOptional`,(e,t)=>{xh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Qg(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function wv(e,t){return new Cv({type:`nonoptional`,innerType:e,...W(t)})}const Tv=H(`ZodCatch`,(e,t)=>{Ch.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>t_(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeCatch=e.unwrap});function Ev(e,t){return new Tv({type:`catch`,innerType:e,catchValue:typeof t==`function`?t:()=>t})}const Dv=H(`ZodPipe`,(e,t)=>{wh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>n_(e,t,n,r),e.in=t.in,e.out=t.out});function Ov(e,t){return new Dv({type:`pipe`,in:e,out:t})}const kv=H(`ZodReadonly`,(e,t)=>{Eh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>r_(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Av(e){return new kv({type:`readonly`,innerType:e})}const jv=H(`ZodCustom`,(e,t)=>{Oh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Gg(e,t,n,r)});function Mv(e,t={}){return Mg(jv,e,t)}function Nv(e){return Ng(e)}const Pv=[`plugin-skill-inductor`],Fv=iv({id:Q().min(1).max(64),taskSignature:Q().min(1).max(200),tags:nv(Q().max(32)).max(5),sessionIds:nv(Q().max(64)).max(50),size:J_().int().min(1).max(1e3),firstAt:J_().int().nonnegative(),lastAt:J_().int().nonnegative(),dismissedAt:J_().int().nonnegative().optional()});function Iv(e,t){if(typeof t!=`string`||t.length===0||t.includes(`/`)||t.includes(`\\`)||t.includes(`..`))throw Error(`invalid workspaceKey for candidate file: ${t}`);return x(wu(e),t,`candidates.json`)}function Lv(e){if(!Pv.includes(e.pluginId))return[];let t;try{let n=Iv(e.pluginId,e.workspaceKey);if(!D(n))return[];t=k(n,`utf8`)}catch{return[]}let n;try{n=JSON.parse(t)?.data?.items}catch{return[]}if(!Array.isArray(n))return[];let r=[];for(let e of n){let t=Fv.safeParse(e);t.success&&r.push(t.data)}return r}function Rv(e){return(e.selectedOptionLabels??[]).includes(`起草 SKILL.md 给我看`)}async function zv(e){let t;try{t=await e.requestGrill({header:`技能沉淀提议`,question:wf(e.brief),background:Tf(e.brief),recommendation:Ef(),options:Df(),askedBy:`skill-loop`})}catch(t){return e.logger?.warn(`skill-loop proposal failed: ${t instanceof Error?t.message:String(t)}`),`error`}return Rv(t)?`accepted`:Bv(e)?`dismissed`:(e.logger?.warn(`skill-loop: failed to persist dismissal, candidate may resurface`),`error`)}function Bv(e){if(s())return!0;let t=Iv(e.pluginId,e.workspaceKey),n=`${t}.host.tmp`;try{let r=JSON.parse(k(t,`utf8`)),i=r?.data?.items;if(!Array.isArray(i))return!1;let a=i.find(t=>t?.id===e.brief.id);return a?(a.dismissedAt=e.now,A(n,JSON.stringify(r)),Yr(n,t),!0):!1}catch{try{$r(n)}catch{}return!1}}const Vv=Pv[0],Hv=Si;async function Uv(e,t){if(!e.isEnabled())return`disabled`;let n=e.now?e.now():Date.now();try{let n=e.getMinMessages?.();e.notifyServices({type:`session.idle`,sessionId:t,...typeof n==`number`?{options:{minMessages:n}}:{}})}catch(t){e.logger.warn({err:String(t)},`skill-loop: notifying inductor service failed (extraction skipped this round)`)}let r;try{r=Sf(Lv({pluginId:Vv,workspaceKey:e.getWorkspaceKey()??Si}),n,xf(e.getCooldownDays?.()))}catch(t){return e.logger.warn({err:String(t)},`skill-loop: reading candidates failed`),`no-candidates`}if(r.length===0)return`no-candidates`;let i=e.getRequestGrill(t);if(!i)return`no-session`;let a=r[0];if(!a)return`no-candidates`;let o=await zv({requestGrill:i,brief:a,pluginId:Vv,workspaceKey:e.getWorkspaceKey()??Si,now:n,logger:{warn:t=>e.logger.warn(t)}});return o===`accepted`&&(e.logger.info({sessionId:t,candidateId:a.id},`skill-loop: user accepted candidate`),e.onAccepted?.({sessionId:t,brief:a})),o}function Wv(e){return[y({name:`skill-loop`,timing:`session.idle`,handle:async t=>{try{await Uv(e,t.sessionId)}catch(t){e.logger.warn({err:String(t)},`skill-loop: unexpected failure`)}}})]}const Gv=`[sandbox-escalation]`;function Kv(e){return y({name:`sandbox-guard`,timing:`tool.execute.before`,priority:6,enabled:!0,handle:(t,n)=>{if(n.cancelled)return;let r=e.getContext();if(!r||t.readonly)return;let i=t.args,a=t.paths?[...t.paths]:[],o=i?.command;if(typeof o==`string`&&a.push(...Me(o)),a.length===0)return;let s=typeof i?.targetDir==`string`?i.targetDir:`.`,c=S(r.projectRoot,s),l=_e({writePaths:a.map(e=>S(c,e))},r);if(l.verdict===`deny`){n.cancelled=!0,n.decision=`deny`,n.decisionReason=l.reason??`sandbox policy`,n.cancelReason=`Sandbox denied: ${n.decisionReason}`;return}if(l.verdict===`ask`){if(r.autoAllowBashIfSandboxed===!0&&t.toolName===`bash`&&n.decision!==`deny`&&n.decision!==`ask`)return;n.decision!==`deny`&&(n.decision=`ask`,n.decisionReason=`${Gv} ${l.reason??`requires approval`}`)}}})}function qv(e){let t=[`id: ${e.jobId}`,`title: ${e.title}`,`status: ${e.status}`];return e.summary&&t.push(`summary: ${e.summary}`),e.outputPath&&t.push(`output_file: ${e.outputPath}`),e.worktree&&(t.push(`worktree_path: ${e.worktree.path}`),e.worktree.branch&&t.push(`worktree_branch: ${e.worktree.branch}`)),`<delegate-notification>\n${t.join(`
448
- `)}\n</delegate-notification>`}function Jv(){let e=new Map,t=new Set;return{hooks:[y({name:`agent-job-notification-injector`,timing:`messages.transform`,priority:25,handle:(t,n)=>{ff(e,t,n)}}),y({name:`agent-job-notification-cleanup`,timing:`session.deleted`,handle:n=>{if(e.delete(n.sessionId),t.add(n.sessionId),t.size>200){let e=t.values().next().value;e!==void 0&&t.delete(e)}}})],notify:(n,r)=>{if(t.has(n))return;let i=e.get(n)??[];i.push(qv(r)),e.set(n,i)}}}const Yv=iv({taskSignature:Q().min(1).max(200),outcome:uv([`success`,`partial`,`failure`]),at:J_().int().nonnegative(),steps:nv(iv({tool:Q().max(64)})).max(20)});function Xv(e,t){return x(wu(e),t,`episodes.json`)}function Zv(e,t){let n;try{let r=Xv(e,t);if(!D(r))return{total:0,success:0,recent:[]};n=k(r,`utf8`)}catch{return{total:0,success:0,recent:[]}}let r;try{r=JSON.parse(n)?.data?.items}catch{return{total:0,success:0,recent:[]}}if(!Array.isArray(r))return{total:0,success:0,recent:[]};let i=0,a=[];for(let e of r){let t=Yv.safeParse(e);t.success&&(t.data.outcome===`success`&&(i+=1),a.push({signature:t.data.taskSignature,at:t.data.at}))}let o=a.sort((e,t)=>t.at-e.at).slice(0,5).map(e=>e.signature);return{total:a.length,success:i,recent:o}}function Qv(e){let t=Pv[0],n={pluginInstalled:e.pluginInstalled,episodeCount:0,successCount:0,candidateCount:0,pendingCount:0,coolingCount:0,recentSignatures:[],pending:[],nextProposalHint:null};if(!e.pluginInstalled)return n;let r=Zv(t,e.workspaceKey),i=Lv({pluginId:t,workspaceKey:e.workspaceKey}),a=xf(e.cooldownDays),o=Sf(i,e.now,a);return{pluginInstalled:!0,episodeCount:r.total,successCount:r.success,candidateCount:i.length,pendingCount:o.length,coolingCount:i.length-o.length,recentSignatures:r.recent,pending:o.slice(0,5),nextProposalHint:$v({pending:o.length,success:r.success,minClusterSize:e.minClusterSize??3})}}function $v(e){return e.pending>0?null:e.success===0?`no-episodes`:e.success<e.minClusterSize?`not-enough-successes`:`no-cluster-yet`}const ey=iv({tool:Q().min(1).max(64),intent:Q().max(160)}),ty=iv({taskSignature:Q().min(1).max(200),steps:nv(ey).max(20),outcome:uv([`success`,`partial`,`failure`]),sessionId:Q().max(64),at:J_().int().nonnegative()});function ny(e){let t=e.limit??8,n;try{let t=x(wu(e.pluginId),e.workspaceKey,`episodes.json`);if(!D(t))return[];n=k(t,`utf8`)}catch{return[]}let r;try{r=JSON.parse(n)?.data?.items}catch{return[]}if(!Array.isArray(r))return[];let i=new Set(e.sessionIds),a=[];for(let e of r){let n=ty.safeParse(e);if(n.success&&i.has(n.data.sessionId)&&n.data.outcome===`success`&&(a.push({sessionId:n.data.sessionId,outcome:n.data.outcome,steps:n.data.steps}),a.length>=t))break}return a}function ry(e){return e.length===0?`(No recorded execution paths are available for these sessions.)`:e.map((e,t)=>{let n=e.steps.map((e,t)=>` ${t+1}. ${e.tool} — ${e.intent}`).join(`
447
+ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.`)}for(let n of e.seen.entries()){let r=n[1];if(t===n[0]){a(n);continue}if(e.external){let r=e.external.registry.get(n[0])?.id;if(t!==n[0]&&r){a(n);continue}}if(e.metadataRegistry.get(n[0])?.id){a(n);continue}if(r.cycle){a(n);continue}if(r.count>1&&e.reused===`ref`){a(n);continue}}}function Rg(e,t){let n=e.seen.get(t);if(!n)throw Error(`Unprocessed schema. This is a bug in Zod.`);let r=t=>{let n=e.seen.get(t);if(n.ref===null)return;let i=n.def??n.schema,a={...i},o=n.ref;if(n.ref=null,o){r(o);let n=e.seen.get(o),s=n.schema;if(s.$ref&&(e.target===`draft-07`||e.target===`draft-04`||e.target===`openapi-3.0`)?(i.allOf=i.allOf??[],i.allOf.push(s)):Object.assign(i,s),Object.assign(i,a),t._zod.parent===o)for(let e in i)e===`$ref`||e===`allOf`||e in a||delete i[e];if(s.$ref&&n.def)for(let e in i)e===`$ref`||e===`allOf`||e in n.def&&JSON.stringify(i[e])===JSON.stringify(n.def[e])&&delete i[e]}let s=t._zod.parent;if(s&&s!==o){r(s);let t=e.seen.get(s);if(t?.schema.$ref&&(i.$ref=t.schema.$ref,t.def))for(let e in i)e===`$ref`||e===`allOf`||e in t.def&&JSON.stringify(i[e])===JSON.stringify(t.def[e])&&delete i[e]}e.override({zodSchema:t,jsonSchema:i,path:n.path??[]})};for(let t of[...e.seen.entries()].reverse())r(t[0]);let i={};if(e.target===`draft-2020-12`?i.$schema=`https://json-schema.org/draft/2020-12/schema`:e.target===`draft-07`?i.$schema=`http://json-schema.org/draft-07/schema#`:e.target===`draft-04`?i.$schema=`http://json-schema.org/draft-04/schema#`:e.target,e.external?.uri){let n=e.external.registry.get(t)?.id;if(!n)throw Error("Schema is missing an `id` property");i.$id=e.external.uri(n)}Object.assign(i,n.def??n.schema);let a=e.external?.defs??{};for(let t of e.seen.entries()){let e=t[1];e.def&&e.defId&&(a[e.defId]=e.def)}e.external||Object.keys(a).length>0&&(e.target===`draft-2020-12`?i.$defs=a:i.definitions=a);try{let n=JSON.parse(JSON.stringify(i));return Object.defineProperty(n,`~standard`,{value:{...t[`~standard`],jsonSchema:{input:Bg(t,`input`,e.processors),output:Bg(t,`output`,e.processors)}},enumerable:!1,writable:!1}),n}catch{throw Error(`Error converting schema to JSON.`)}}function Y(e,t){let n=t??{seen:new Set};if(n.seen.has(e))return!1;n.seen.add(e);let r=e._zod.def;if(r.type===`transform`)return!0;if(r.type===`array`)return Y(r.element,n);if(r.type===`set`)return Y(r.valueType,n);if(r.type===`lazy`)return Y(r.getter(),n);if(r.type===`promise`||r.type===`optional`||r.type===`nonoptional`||r.type===`nullable`||r.type===`readonly`||r.type===`default`||r.type===`prefault`)return Y(r.innerType,n);if(r.type===`intersection`)return Y(r.left,n)||Y(r.right,n);if(r.type===`record`||r.type===`map`)return Y(r.keyType,n)||Y(r.valueType,n);if(r.type===`pipe`)return Y(r.in,n)||Y(r.out,n);if(r.type===`object`){for(let e in r.shape)if(Y(r.shape[e],n))return!0;return!1}if(r.type===`union`){for(let e of r.options)if(Y(e,n))return!0;return!1}if(r.type===`tuple`){for(let e of r.items)if(Y(e,n))return!0;return!!(r.rest&&Y(r.rest,n))}return!1}const zg=(e,t={})=>n=>{let r=Ig({...n,processors:t});return J(e,r),Lg(r,e),Rg(r,e)},Bg=(e,t,n={})=>r=>{let{libraryOptions:i,target:a}=r??{},o=Ig({...i??{},target:a,io:t,processors:n});return J(e,o),Lg(o,e),Rg(o,e)},Vg={guid:`uuid`,url:`uri`,datetime:`date-time`,json_string:`json-string`,regex:``},Hg=(e,t,n,r)=>{let i=n;i.type=`string`;let{minimum:a,maximum:o,format:s,patterns:c,contentEncoding:l}=e._zod.bag;if(typeof a==`number`&&(i.minLength=a),typeof o==`number`&&(i.maxLength=o),s&&(i.format=Vg[s]??s,i.format===``&&delete i.format,s===`time`&&delete i.format),l&&(i.contentEncoding=l),c&&c.size>0){let e=[...c];e.length===1?i.pattern=e[0].source:e.length>1&&(i.allOf=[...e.map(e=>({...t.target===`draft-07`||t.target===`draft-04`||t.target===`openapi-3.0`?{type:`string`}:{},pattern:e.source}))])}},Ug=(e,t,n,r)=>{let i=n,{minimum:a,maximum:o,format:s,multipleOf:c,exclusiveMaximum:l,exclusiveMinimum:u}=e._zod.bag;typeof s==`string`&&s.includes(`int`)?i.type=`integer`:i.type=`number`,typeof u==`number`&&(t.target===`draft-04`||t.target===`openapi-3.0`?(i.minimum=u,i.exclusiveMinimum=!0):i.exclusiveMinimum=u),typeof a==`number`&&(i.minimum=a,typeof u==`number`&&t.target!==`draft-04`&&(u>=a?delete i.minimum:delete i.exclusiveMinimum)),typeof l==`number`&&(t.target===`draft-04`||t.target===`openapi-3.0`?(i.maximum=l,i.exclusiveMaximum=!0):i.exclusiveMaximum=l),typeof o==`number`&&(i.maximum=o,typeof l==`number`&&t.target!==`draft-04`&&(l<=o?delete i.maximum:delete i.exclusiveMaximum)),typeof c==`number`&&(i.multipleOf=c)},Wg=(e,t,n,r)=>{n.not={}},Gg=(e,t,n,r)=>{let i=e._zod.def,a=Nf(i.entries);a.every(e=>typeof e==`number`)&&(n.type=`number`),a.every(e=>typeof e==`string`)&&(n.type=`string`),n.enum=a},Kg=(e,t,n,r)=>{if(t.unrepresentable===`throw`)throw Error(`Custom types cannot be represented in JSON Schema`)},qg=(e,t,n,r)=>{if(t.unrepresentable===`throw`)throw Error(`Transforms cannot be represented in JSON Schema`)},Jg=(e,t,n,r)=>{let i=n,a=e._zod.def,{minimum:o,maximum:s}=e._zod.bag;typeof o==`number`&&(i.minItems=o),typeof s==`number`&&(i.maxItems=s),i.type=`array`,i.items=J(a.element,t,{...r,path:[...r.path,`items`]})},Yg=(e,t,n,r)=>{let i=n,a=e._zod.def;i.type=`object`,i.properties={};let o=a.shape;for(let e in o)i.properties[e]=J(o[e],t,{...r,path:[...r.path,`properties`,e]});let s=new Set(Object.keys(o)),c=new Set([...s].filter(e=>{let n=a.shape[e]._zod;return t.io===`input`?n.optin===void 0:n.optout===void 0}));c.size>0&&(i.required=Array.from(c)),a.catchall?._zod.def.type===`never`?i.additionalProperties=!1:a.catchall?a.catchall&&(i.additionalProperties=J(a.catchall,t,{...r,path:[...r.path,`additionalProperties`]})):t.io===`output`&&(i.additionalProperties=!1)},Xg=(e,t,n,r)=>{let i=e._zod.def,a=i.inclusive===!1,o=i.options.map((e,n)=>J(e,t,{...r,path:[...r.path,a?`oneOf`:`anyOf`,n]}));a?n.oneOf=o:n.anyOf=o},Zg=(e,t,n,r)=>{let i=e._zod.def,a=J(i.left,t,{...r,path:[...r.path,`allOf`,0]}),o=J(i.right,t,{...r,path:[...r.path,`allOf`,1]}),s=e=>`allOf`in e&&Object.keys(e).length===1;n.allOf=[...s(a)?a.allOf:[a],...s(o)?o.allOf:[o]]},Qg=(e,t,n,r)=>{let i=e._zod.def,a=J(i.innerType,t,r),o=t.seen.get(e);t.target===`openapi-3.0`?(o.ref=i.innerType,n.nullable=!0):n.anyOf=[a,{type:`null`}]},$g=(e,t,n,r)=>{let i=e._zod.def;J(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},e_=(e,t,n,r)=>{let i=e._zod.def;J(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType,n.default=JSON.parse(JSON.stringify(i.defaultValue))},t_=(e,t,n,r)=>{let i=e._zod.def;J(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType,t.io===`input`&&(n._prefault=JSON.parse(JSON.stringify(i.defaultValue)))},n_=(e,t,n,r)=>{let i=e._zod.def;J(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType;let o;try{o=i.catchValue(void 0)}catch{throw Error(`Dynamic catch values are not supported in JSON Schema`)}n.default=o},r_=(e,t,n,r)=>{let i=e._zod.def,a=t.io===`input`?i.in._zod.def.type===`transform`?i.out:i.in:i.out;J(a,t,r);let o=t.seen.get(e);o.ref=a},i_=(e,t,n,r)=>{let i=e._zod.def;J(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType,n.readOnly=!0},a_=(e,t,n,r)=>{let i=e._zod.def;J(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},o_=H(`ZodISODateTime`,(e,t)=>{Im.init(e,t),$.init(e,t)});function s_(e){return ig(o_,e)}const c_=H(`ZodISODate`,(e,t)=>{Lm.init(e,t),$.init(e,t)});function l_(e){return ag(c_,e)}const u_=H(`ZodISOTime`,(e,t)=>{Rm.init(e,t),$.init(e,t)});function d_(e){return og(u_,e)}const f_=H(`ZodISODuration`,(e,t)=>{zm.init(e,t),$.init(e,t)});function p_(e){return sg(f_,e)}const m_=(e,t)=>{mp.init(e,t),e.name=`ZodError`,Object.defineProperties(e,{format:{value:t=>_p(e,t)},flatten:{value:t=>gp(e,t)},addIssue:{value:t=>{e.issues.push(t),e.message=JSON.stringify(e.issues,Pf,2)}},addIssues:{value:t=>{e.issues.push(...t),e.message=JSON.stringify(e.issues,Pf,2)}},isEmpty:{get(){return e.issues.length===0}}})};H(`ZodError`,m_);const X=H(`ZodError`,m_,{Parent:Error}),h_=vp(X),g_=yp(X),__=bp(X),v_=Sp(X),y_=wp(X),b_=Tp(X),x_=Ep(X),S_=Dp(X),C_=Op(X),w_=kp(X),T_=Ap(X),E_=jp(X),Z=H(`ZodType`,(e,t)=>(K.init(e,t),Object.assign(e[`~standard`],{jsonSchema:{input:Bg(e,`input`),output:Bg(e,`output`)}}),e.toJSONSchema=zg(e,{}),e.def=t,e.type=t.type,Object.defineProperty(e,`_def`,{value:t}),e.check=(...n)=>e.clone(Vf(t,{checks:[...t.checks??[],...n.map(e=>typeof e==`function`?{_zod:{check:e,def:{check:`custom`},onattach:[]}}:e)]}),{parent:!0}),e.with=e.check,e.clone=(t,n)=>Zf(e,t,n),e.brand=()=>e,e.register=((t,n)=>(t.add(e,n),e)),e.parse=(t,n)=>h_(e,t,n,{callee:e.parse}),e.safeParse=(t,n)=>__(e,t,n),e.parseAsync=async(t,n)=>g_(e,t,n,{callee:e.parseAsync}),e.safeParseAsync=async(t,n)=>v_(e,t,n),e.spa=e.safeParseAsync,e.encode=(t,n)=>y_(e,t,n),e.decode=(t,n)=>b_(e,t,n),e.encodeAsync=async(t,n)=>x_(e,t,n),e.decodeAsync=async(t,n)=>S_(e,t,n),e.safeEncode=(t,n)=>C_(e,t,n),e.safeDecode=(t,n)=>w_(e,t,n),e.safeEncodeAsync=async(t,n)=>T_(e,t,n),e.safeDecodeAsync=async(t,n)=>E_(e,t,n),e.refine=(t,n)=>e.check(Nv(t,n)),e.superRefine=t=>e.check(Pv(t)),e.overwrite=t=>e.check(Eg(t)),e.optional=()=>hv(e),e.exactOptional=()=>_v(e),e.nullable=()=>yv(e),e.nullish=()=>hv(yv(e)),e.nonoptional=t=>Tv(e,t),e.array=()=>rv(e),e.or=t=>sv([e,t]),e.and=t=>lv(e,t),e.transform=t=>kv(e,pv(t)),e.default=t=>xv(e,t),e.prefault=t=>Cv(e,t),e.catch=t=>Dv(e,t),e.pipe=t=>kv(e,t),e.readonly=()=>jv(e),e.describe=t=>{let n=e.clone();return Ph.add(n,{description:t}),n},Object.defineProperty(e,`description`,{get(){return Ph.get(e)?.description},configurable:!0}),e.meta=(...t)=>{if(t.length===0)return Ph.get(e);let n=e.clone();return Ph.add(n,t[0]),n},e.isOptional=()=>e.safeParse(void 0).success,e.isNullable=()=>e.safeParse(null).success,e.apply=t=>t(e),e)),D_=H(`_ZodString`,(e,t)=>{wm.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Hg(e,t,n,r);let n=e._zod.bag;e.format=n.format??null,e.minLength=n.minimum??null,e.maxLength=n.maximum??null,e.regex=(...t)=>e.check(bg(...t)),e.includes=(...t)=>e.check(Cg(...t)),e.startsWith=(...t)=>e.check(wg(...t)),e.endsWith=(...t)=>e.check(Tg(...t)),e.min=(...t)=>e.check(vg(...t)),e.max=(...t)=>e.check(_g(...t)),e.length=(...t)=>e.check(yg(...t)),e.nonempty=(...t)=>e.check(vg(1,...t)),e.lowercase=t=>e.check(xg(t)),e.uppercase=t=>e.check(Sg(t)),e.trim=()=>e.check(Og()),e.normalize=(...t)=>e.check(Dg(...t)),e.toLowerCase=()=>e.check(kg()),e.toUpperCase=()=>e.check(Ag()),e.slugify=()=>e.check(jg())}),O_=H(`ZodString`,(e,t)=>{wm.init(e,t),D_.init(e,t),e.email=t=>e.check(Ih(k_,t)),e.url=t=>e.check(Hh(M_,t)),e.jwt=t=>e.check(rg(q_,t)),e.emoji=t=>e.check(Uh(N_,t)),e.guid=t=>e.check(Lh(A_,t)),e.uuid=t=>e.check(Rh(j_,t)),e.uuidv4=t=>e.check(zh(j_,t)),e.uuidv6=t=>e.check(Bh(j_,t)),e.uuidv7=t=>e.check(Vh(j_,t)),e.nanoid=t=>e.check(Wh(P_,t)),e.guid=t=>e.check(Lh(A_,t)),e.cuid=t=>e.check(Gh(F_,t)),e.cuid2=t=>e.check(Kh(I_,t)),e.ulid=t=>e.check(qh(L_,t)),e.base64=t=>e.check(eg(W_,t)),e.base64url=t=>e.check(tg(G_,t)),e.xid=t=>e.check(Jh(R_,t)),e.ksuid=t=>e.check(Yh(z_,t)),e.ipv4=t=>e.check(Xh(B_,t)),e.ipv6=t=>e.check(Zh(V_,t)),e.cidrv4=t=>e.check(Qh(H_,t)),e.cidrv6=t=>e.check($h(U_,t)),e.e164=t=>e.check(ng(K_,t)),e.datetime=t=>e.check(s_(t)),e.date=t=>e.check(l_(t)),e.time=t=>e.check(d_(t)),e.duration=t=>e.check(p_(t))});function Q(e){return Fh(O_,e)}const $=H(`ZodStringFormat`,(e,t)=>{q.init(e,t),D_.init(e,t)}),k_=H(`ZodEmail`,(e,t)=>{Dm.init(e,t),$.init(e,t)}),A_=H(`ZodGUID`,(e,t)=>{Tm.init(e,t),$.init(e,t)}),j_=H(`ZodUUID`,(e,t)=>{Em.init(e,t),$.init(e,t)}),M_=H(`ZodURL`,(e,t)=>{Om.init(e,t),$.init(e,t)}),N_=H(`ZodEmoji`,(e,t)=>{km.init(e,t),$.init(e,t)}),P_=H(`ZodNanoID`,(e,t)=>{Am.init(e,t),$.init(e,t)}),F_=H(`ZodCUID`,(e,t)=>{jm.init(e,t),$.init(e,t)}),I_=H(`ZodCUID2`,(e,t)=>{Mm.init(e,t),$.init(e,t)}),L_=H(`ZodULID`,(e,t)=>{Nm.init(e,t),$.init(e,t)}),R_=H(`ZodXID`,(e,t)=>{Pm.init(e,t),$.init(e,t)}),z_=H(`ZodKSUID`,(e,t)=>{Fm.init(e,t),$.init(e,t)}),B_=H(`ZodIPv4`,(e,t)=>{Bm.init(e,t),$.init(e,t)}),V_=H(`ZodIPv6`,(e,t)=>{Vm.init(e,t),$.init(e,t)}),H_=H(`ZodCIDRv4`,(e,t)=>{Hm.init(e,t),$.init(e,t)}),U_=H(`ZodCIDRv6`,(e,t)=>{Um.init(e,t),$.init(e,t)}),W_=H(`ZodBase64`,(e,t)=>{Gm.init(e,t),$.init(e,t)}),G_=H(`ZodBase64URL`,(e,t)=>{qm.init(e,t),$.init(e,t)}),K_=H(`ZodE164`,(e,t)=>{Jm.init(e,t),$.init(e,t)}),q_=H(`ZodJWT`,(e,t)=>{Xm.init(e,t),$.init(e,t)}),J_=H(`ZodNumber`,(e,t)=>{Zm.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Ug(e,t,n,r),e.gt=(t,n)=>e.check(mg(t,n)),e.gte=(t,n)=>e.check(hg(t,n)),e.min=(t,n)=>e.check(hg(t,n)),e.lt=(t,n)=>e.check(fg(t,n)),e.lte=(t,n)=>e.check(pg(t,n)),e.max=(t,n)=>e.check(pg(t,n)),e.int=t=>e.check(Z_(t)),e.safe=t=>e.check(Z_(t)),e.positive=t=>e.check(mg(0,t)),e.nonnegative=t=>e.check(hg(0,t)),e.negative=t=>e.check(fg(0,t)),e.nonpositive=t=>e.check(pg(0,t)),e.multipleOf=(t,n)=>e.check(gg(t,n)),e.step=(t,n)=>e.check(gg(t,n)),e.finite=()=>e;let n=e._zod.bag;e.minValue=Math.max(n.minimum??-1/0,n.exclusiveMinimum??-1/0)??null,e.maxValue=Math.min(n.maximum??1/0,n.exclusiveMaximum??1/0)??null,e.isInt=(n.format??``).includes(`int`)||Number.isSafeInteger(n.multipleOf??.5),e.isFinite=!0,e.format=n.format??null});function Y_(e){return cg(J_,e)}const X_=H(`ZodNumberFormat`,(e,t)=>{Qm.init(e,t),J_.init(e,t)});function Z_(e){return lg(X_,e)}const Q_=H(`ZodUnknown`,(e,t)=>{$m.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(e,t,n)=>void 0});function $_(){return ug(Q_)}const ev=H(`ZodNever`,(e,t)=>{eh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Wg(e,t,n,r)});function tv(e){return dg(ev,e)}const nv=H(`ZodArray`,(e,t)=>{nh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Jg(e,t,n,r),e.element=t.element,e.min=(t,n)=>e.check(vg(t,n)),e.nonempty=t=>e.check(vg(1,t)),e.max=(t,n)=>e.check(_g(t,n)),e.length=(t,n)=>e.check(yg(t,n)),e.unwrap=()=>e.element});function rv(e,t){return Mg(nv,e,t)}const iv=H(`ZodObject`,(e,t)=>{sh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Yg(e,t,n,r),U(e,`shape`,()=>t.shape),e.keyof=()=>dv(Object.keys(e._zod.def.shape)),e.catchall=t=>e.clone({...e._zod.def,catchall:t}),e.passthrough=()=>e.clone({...e._zod.def,catchall:$_()}),e.loose=()=>e.clone({...e._zod.def,catchall:$_()}),e.strict=()=>e.clone({...e._zod.def,catchall:tv()}),e.strip=()=>e.clone({...e._zod.def,catchall:void 0}),e.extend=t=>np(e,t),e.safeExtend=t=>rp(e,t),e.merge=t=>ip(e,t),e.pick=t=>ep(e,t),e.omit=t=>tp(e,t),e.partial=(...t)=>ap(mv,e,t[0]),e.required=(...t)=>op(wv,e,t[0])});function av(e,t){return new iv({type:`object`,shape:e??{},...W(t)})}const ov=H(`ZodUnion`,(e,t)=>{lh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Xg(e,t,n,r),e.options=t.options});function sv(e,t){return new ov({type:`union`,options:e,...W(t)})}const cv=H(`ZodIntersection`,(e,t)=>{uh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Zg(e,t,n,r)});function lv(e,t){return new cv({type:`intersection`,left:e,right:t})}const uv=H(`ZodEnum`,(e,t)=>{ph.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Gg(e,t,n,r),e.enum=t.entries,e.options=Object.values(t.entries);let n=new Set(Object.keys(t.entries));e.extract=(e,r)=>{let i={};for(let r of e)if(n.has(r))i[r]=t.entries[r];else throw Error(`Key ${r} not found in enum`);return new uv({...t,checks:[],...W(r),entries:i})},e.exclude=(e,r)=>{let i={...t.entries};for(let t of e)if(n.has(t))delete i[t];else throw Error(`Key ${t} not found in enum`);return new uv({...t,checks:[],...W(r),entries:i})}});function dv(e,t){return new uv({type:`enum`,entries:Array.isArray(e)?Object.fromEntries(e.map(e=>[e,e])):e,...W(t)})}const fv=H(`ZodTransform`,(e,t)=>{mh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>qg(e,t,n,r),e._zod.parse=(n,r)=>{if(r.direction===`backward`)throw new Af(e.constructor.name);n.addIssue=r=>{if(typeof r==`string`)n.issues.push(fp(r,n.value,t));else{let t=r;t.fatal&&(t.continue=!1),t.code??=`custom`,t.input??=n.value,t.inst??=e,n.issues.push(fp(t))}};let i=t.transform(n.value,n);return i instanceof Promise?i.then(e=>(n.value=e,n)):(n.value=i,n)}});function pv(e){return new fv({type:`transform`,transform:e})}const mv=H(`ZodOptional`,(e,t)=>{gh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>a_(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function hv(e){return new mv({type:`optional`,innerType:e})}const gv=H(`ZodExactOptional`,(e,t)=>{_h.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>a_(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function _v(e){return new gv({type:`optional`,innerType:e})}const vv=H(`ZodNullable`,(e,t)=>{vh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Qg(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function yv(e){return new vv({type:`nullable`,innerType:e})}const bv=H(`ZodDefault`,(e,t)=>{yh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>e_(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeDefault=e.unwrap});function xv(e,t){return new bv({type:`default`,innerType:e,get defaultValue(){return typeof t==`function`?t():Jf(t)}})}const Sv=H(`ZodPrefault`,(e,t)=>{xh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>t_(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Cv(e,t){return new Sv({type:`prefault`,innerType:e,get defaultValue(){return typeof t==`function`?t():Jf(t)}})}const wv=H(`ZodNonOptional`,(e,t)=>{Sh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>$g(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Tv(e,t){return new wv({type:`nonoptional`,innerType:e,...W(t)})}const Ev=H(`ZodCatch`,(e,t)=>{wh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>n_(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeCatch=e.unwrap});function Dv(e,t){return new Ev({type:`catch`,innerType:e,catchValue:typeof t==`function`?t:()=>t})}const Ov=H(`ZodPipe`,(e,t)=>{Th.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>r_(e,t,n,r),e.in=t.in,e.out=t.out});function kv(e,t){return new Ov({type:`pipe`,in:e,out:t})}const Av=H(`ZodReadonly`,(e,t)=>{Dh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>i_(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function jv(e){return new Av({type:`readonly`,innerType:e})}const Mv=H(`ZodCustom`,(e,t)=>{kh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Kg(e,t,n,r)});function Nv(e,t={}){return Ng(Mv,e,t)}function Pv(e){return Pg(e)}const Fv=[`plugin-skill-inductor`],Iv=av({id:Q().min(1).max(64),taskSignature:Q().min(1).max(200),tags:rv(Q().max(32)).max(5),sessionIds:rv(Q().max(64)).max(50),size:Y_().int().min(1).max(1e3),firstAt:Y_().int().nonnegative(),lastAt:Y_().int().nonnegative(),dismissedAt:Y_().int().nonnegative().optional()});function Lv(e,t){if(typeof t!=`string`||t.length===0||t.includes(`/`)||t.includes(`\\`)||t.includes(`..`))throw Error(`invalid workspaceKey for candidate file: ${t}`);return x(Tu(e),t,`candidates.json`)}function Rv(e){if(!Fv.includes(e.pluginId))return[];let t;try{let n=Lv(e.pluginId,e.workspaceKey);if(!D(n))return[];t=k(n,`utf8`)}catch{return[]}let n;try{n=JSON.parse(t)?.data?.items}catch{return[]}if(!Array.isArray(n))return[];let r=[];for(let e of n){let t=Iv.safeParse(e);t.success&&r.push(t.data)}return r}function zv(e){return(e.selectedOptionLabels??[]).includes(`起草 SKILL.md 给我看`)}async function Bv(e){let t;try{t=await e.requestGrill({header:`技能沉淀提议`,question:Tf(e.brief),background:Ef(e.brief),recommendation:Df(),options:Of(),askedBy:`skill-loop`})}catch(t){return e.logger?.warn(`skill-loop proposal failed: ${t instanceof Error?t.message:String(t)}`),`error`}return zv(t)?`accepted`:Vv(e)?`dismissed`:(e.logger?.warn(`skill-loop: failed to persist dismissal, candidate may resurface`),`error`)}function Vv(e){if(s())return!0;let t=Lv(e.pluginId,e.workspaceKey),n=`${t}.host.tmp`;try{let r=JSON.parse(k(t,`utf8`)),i=r?.data?.items;if(!Array.isArray(i))return!1;let a=i.find(t=>t?.id===e.brief.id);return a?(a.dismissedAt=e.now,A(n,JSON.stringify(r)),Yr(n,t),!0):!1}catch{try{$r(n)}catch{}return!1}}const Hv=Fv[0],Uv=Si;async function Wv(e,t){if(!e.isEnabled())return`disabled`;let n=e.now?e.now():Date.now();try{let n=e.getMinMessages?.();e.notifyServices({type:`session.idle`,sessionId:t,...typeof n==`number`?{options:{minMessages:n}}:{}})}catch(t){e.logger.warn({err:String(t)},`skill-loop: notifying inductor service failed (extraction skipped this round)`)}let r;try{r=Cf(Rv({pluginId:Hv,workspaceKey:e.getWorkspaceKey()??Si}),n,Sf(e.getCooldownDays?.()))}catch(t){return e.logger.warn({err:String(t)},`skill-loop: reading candidates failed`),`no-candidates`}if(r.length===0)return`no-candidates`;let i=e.getRequestGrill(t);if(!i)return`no-session`;let a=r[0];if(!a)return`no-candidates`;let o=await Bv({requestGrill:i,brief:a,pluginId:Hv,workspaceKey:e.getWorkspaceKey()??Si,now:n,logger:{warn:t=>e.logger.warn(t)}});return o===`accepted`&&(e.logger.info({sessionId:t,candidateId:a.id},`skill-loop: user accepted candidate`),e.onAccepted?.({sessionId:t,brief:a})),o}function Gv(e){return[y({name:`skill-loop`,timing:`session.idle`,handle:async t=>{try{await Wv(e,t.sessionId)}catch(t){e.logger.warn({err:String(t)},`skill-loop: unexpected failure`)}}})]}const Kv=`[sandbox-escalation]`;function qv(e){return y({name:`sandbox-guard`,timing:`tool.execute.before`,priority:6,enabled:!0,handle:(t,n)=>{if(n.cancelled)return;let r=e.getContext();if(!r||t.readonly)return;let i=t.args,a=t.paths?[...t.paths]:[],o=i?.command;if(typeof o==`string`&&a.push(...Me(o)),a.length===0)return;let s=typeof i?.targetDir==`string`?i.targetDir:`.`,c=S(r.projectRoot,s),l=_e({writePaths:a.map(e=>S(c,e))},r);if(l.verdict===`deny`){n.cancelled=!0,n.decision=`deny`,n.decisionReason=l.reason??`sandbox policy`,n.cancelReason=`Sandbox denied: ${n.decisionReason}`;return}if(l.verdict===`ask`){if(r.autoAllowBashIfSandboxed===!0&&t.toolName===`bash`&&n.decision!==`deny`&&n.decision!==`ask`)return;n.decision!==`deny`&&(n.decision=`ask`,n.decisionReason=`${Kv} ${l.reason??`requires approval`}`)}}})}function Jv(e){let t=[`id: ${e.jobId}`,`title: ${e.title}`,`status: ${e.status}`];return e.summary&&t.push(`summary: ${e.summary}`),e.outputPath&&t.push(`output_file: ${e.outputPath}`),e.worktree&&(t.push(`worktree_path: ${e.worktree.path}`),e.worktree.branch&&t.push(`worktree_branch: ${e.worktree.branch}`)),`<delegate-notification>\n${t.join(`
448
+ `)}\n</delegate-notification>`}function Yv(){let e=new Map,t=new Set;return{hooks:[y({name:`agent-job-notification-injector`,timing:`messages.transform`,priority:25,handle:(t,n)=>{pf(e,t,n)}}),y({name:`agent-job-notification-cleanup`,timing:`session.deleted`,handle:n=>{if(e.delete(n.sessionId),t.add(n.sessionId),t.size>200){let e=t.values().next().value;e!==void 0&&t.delete(e)}}})],notify:(n,r)=>{if(t.has(n))return;let i=e.get(n)??[];i.push(Jv(r)),e.set(n,i)}}}const Xv=av({taskSignature:Q().min(1).max(200),outcome:dv([`success`,`partial`,`failure`]),at:Y_().int().nonnegative(),steps:rv(av({tool:Q().max(64)})).max(20)});function Zv(e,t){return x(Tu(e),t,`episodes.json`)}function Qv(e,t){let n;try{let r=Zv(e,t);if(!D(r))return{total:0,success:0,recent:[]};n=k(r,`utf8`)}catch{return{total:0,success:0,recent:[]}}let r;try{r=JSON.parse(n)?.data?.items}catch{return{total:0,success:0,recent:[]}}if(!Array.isArray(r))return{total:0,success:0,recent:[]};let i=0,a=[];for(let e of r){let t=Xv.safeParse(e);t.success&&(t.data.outcome===`success`&&(i+=1),a.push({signature:t.data.taskSignature,at:t.data.at}))}let o=a.sort((e,t)=>t.at-e.at).slice(0,5).map(e=>e.signature);return{total:a.length,success:i,recent:o}}function $v(e){let t=Fv[0],n={pluginInstalled:e.pluginInstalled,episodeCount:0,successCount:0,candidateCount:0,pendingCount:0,coolingCount:0,recentSignatures:[],pending:[],nextProposalHint:null};if(!e.pluginInstalled)return n;let r=Qv(t,e.workspaceKey),i=Rv({pluginId:t,workspaceKey:e.workspaceKey}),a=Sf(e.cooldownDays),o=Cf(i,e.now,a);return{pluginInstalled:!0,episodeCount:r.total,successCount:r.success,candidateCount:i.length,pendingCount:o.length,coolingCount:i.length-o.length,recentSignatures:r.recent,pending:o.slice(0,5),nextProposalHint:ey({pending:o.length,success:r.success,minClusterSize:e.minClusterSize??3})}}function ey(e){return e.pending>0?null:e.success===0?`no-episodes`:e.success<e.minClusterSize?`not-enough-successes`:`no-cluster-yet`}const ty=av({tool:Q().min(1).max(64),intent:Q().max(160)}),ny=av({taskSignature:Q().min(1).max(200),steps:rv(ty).max(20),outcome:dv([`success`,`partial`,`failure`]),sessionId:Q().max(64),at:Y_().int().nonnegative()});function ry(e){let t=e.limit??8,n;try{let t=x(Tu(e.pluginId),e.workspaceKey,`episodes.json`);if(!D(t))return[];n=k(t,`utf8`)}catch{return[]}let r;try{r=JSON.parse(n)?.data?.items}catch{return[]}if(!Array.isArray(r))return[];let i=new Set(e.sessionIds),a=[];for(let e of r){let n=ny.safeParse(e);if(n.success&&i.has(n.data.sessionId)&&n.data.outcome===`success`&&(a.push({sessionId:n.data.sessionId,outcome:n.data.outcome,steps:n.data.steps}),a.length>=t))break}return a}function iy(e){return e.length===0?`(No recorded execution paths are available for these sessions.)`:e.map((e,t)=>{let n=e.steps.map((e,t)=>` ${t+1}. ${e.tool} — ${e.intent}`).join(`
449
449
  `);return`Run ${t+1} (session ${e.sessionId}):\n${n||` (no steps recorded)`}`}).join(`
450
450
 
451
- `)}function iy(e,t=[]){let n=e.sessionIds.join(`, `);return`You are drafting a reusable skill for this project, based on a recurring task pattern that otto observed.
451
+ `)}function ay(e,t=[]){let n=e.sessionIds.join(`, `);return`You are drafting a reusable skill for this project, based on a recurring task pattern that otto observed.
452
452
 
453
453
  ## The pattern
454
454
 
@@ -462,7 +462,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
462
462
  These are the actual tool sequences otto observed for this task type. They are your evidence —
463
463
  you do not need to (and cannot) go looking for the original sessions.
464
464
 
465
- ${ry(t)}
465
+ ${iy(t)}
466
466
 
467
467
  ## What to do
468
468
 
@@ -500,7 +500,7 @@ If the recorded paths turn out to be too varied, too thin, or not actually the s
500
500
  library permanently; skipping costs nothing — otto will offer again if the pattern recurs.
501
501
 
502
502
  The draft you produce is a proposal: it will be reviewed as a diff and only takes effect if the
503
- user explicitly applies it.`}function ay(e){return`Draft skill: ${e.taskSignature.length>60?`${e.taskSignature.slice(0,60)}…`:e.taskSignature}`}function oy(e){try{let t=ny({pluginId:e.pluginId,workspaceKey:e.workspaceKey,sessionIds:e.brief.sessionIds});return{jobId:e.startJob({title:ay(e.brief),prompt:iy(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 sy(e){e.hookRegistry.register(ef(e.toolRegistry,e.getDefaultToolPreset)),e.hookRegistry.register(we(e.failureSignals)),e.hookRegistry.register(Ee(e.failureSignals)),e.hookRegistry.registerAll(e.contextSourcesBuildHooks(e.workspaceDir,e.memory)),e.memory&&e.hookRegistry.registerAll(Dt(e.memory)),e.hookRegistry.registerAll(At({getTodoList:t=>e.getSession(t)?.session.getTodoList()}));let t=/-milestone\.md$/,n=/^Status:\s*Done\b/m;e.hookRegistry.registerAll(Et({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(uf(e.learningStore,e.promptManager,e.localLearningStore)),e.skillRegistry&&e.hookRegistry.registerAll(df(e.skillRegistry)),e.hookRegistry.registerAll(pr({workspaceDir:e.workspaceDir})),e.hookRegistry.registerAll(mf()),e.hookRegistry.on(`session.deleted`,`rfc047-notification-detach`,t=>e.notificationDispatcher.detach(t.sessionId));let r=Jv();e.hookRegistry.registerAll(r.hooks),e.hookRegistry.register(hf(e=>{w.killAllForSession(e)})),e.hookRegistry.registerAll(gf({registry:e.permissionRegistry,getPersistedAllow:t=>e.codingSessionPool.getSessionPermissionAllow(t)})),e.hookRegistry.register(Kv({getContext:()=>{let t=je(e.workspaceDir,ze());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:be(n,e.workspaceDir,Be(),e.sandbox.writablePaths),deniedRoots:t,networkAllowed:e.sandbox.isNetworkAllowed,autoAllowBashIfSandboxed:e.sandbox.autoAllowBashIfSandboxed}}})),e.hookRegistry.registerAll(vf(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(yf({isEnabled:i})),e.hookRegistry.registerAll(Wv({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})=>{oy({startJob:t=>e.startSkillDraftJob({...t,origin:`user`}),brief:n,sessionId:t,pluginId:Vv,workspaceKey:e.getWorkspaceKey()??Hv,logger:{warn:t=>e.logger.warn(t)}})},logger:e.logger})),e.hookRegistry.register(Se({getOnFileEdited:e.getEditFileCallback,dedupCache:e.editFilesDedup})),{agentJobNotify:r.notify}}function cy(e,t,n,r){return Qd({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},t,n,r)}function ly(e,t){return Ie(t,$d(cy(e,t,e.skillRegistry?un(e.skillRegistry,t):void 0,!1))).getAvailable(e.defaultToolPreset)}function uy(e){return e.toolRegistry.getAvailable(e.defaultToolPreset).filter(e=>e.name.startsWith(`mcp__`))}function dy(e,t){let n=t.skillProvider??(e.skillRegistry?un(e.skillRegistry,e.workspaceDir):void 0);t.sandbox&&e.sandbox.pin(t.sandbox);let r={registerChild(e,t){return{pid:Vt.registerChild(e,t).pid??0}}};return Ie(e.workspaceDir,{...$d(cy(e,e.workspaceDir,n,t.lsp===!0)),processTracker:r})}function fy(e){e.agentJobNotify=sy({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,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),logger:e.logger}).agentJobNotify}function py(e){return{async readFile(e){try{return await Mi(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return null;throw e}},async writeFile(e,t){await Ai(b(e),{recursive:!0}),await tn(e,t)},async writeFileExclusive(e,t){await Ai(b(e),{recursive:!0});try{let n=await ji(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??wi,now:e?.now??(()=>new Date().toISOString()),...e?.confirmTrust?{confirmTrust:e.confirmTrust}:{}}}async function my(e){if(e.ensureNotDisposed(),await e.ensureSettingsLoaded(),!e.workspaceRef&&!e.pendingWorkspaceInit&&!e.parentWorkspaceExisted)try{let t=Ci(py()),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 tt(`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 Gs(e.workspaceDir,{plugins:e.activePlugins()}),e.declarativeTeams=await Zs(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=()=>tt(`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 tt(`completeWorkspaceDependentStartup (session restoreAll)`,()=>hy(e)):tt(`sweepOrphanTraceFiles (headless)`,()=>Sy(e)),e.devtools&&await e.devtools.start(),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`&&Cy(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(),Ze(`app.start() internal phases complete`),e.logger.info(`App started`)}async function hy(e){if(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)}}}Sy(e)}function gy(e){return!!e.pendingWorkspaceInit}function _y(e){return!!e.parentWorkspaceExisted}async function vy(e){let t=e.parentWorkspaceExisted;if(!t)return e.workspaceRef;e.parentWorkspaceExisted=void 0;try{return e.workspaceRef=await Ci(py()).resolveLocal(t.parentRoot),await hy(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 yy(e){let t=e.parentWorkspaceExisted;if(!t)return e.workspaceRef;e.parentWorkspaceExisted=void 0;try{return e.workspaceRef=await Ci(py()).createLocal(t.currentRoot),await hy(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 by(e){let t=e.pendingWorkspaceInit;if(!t)return e.workspaceRef;e.pendingWorkspaceInit=void 0;try{return e.workspaceRef=await Ci(py()).createLocal(t.root),await hy(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 xy(e,t){let n=e.workspaceRef?.root;if(!n)return!1;let r=py(),i=await Ti(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,...i.remote?{remote:i.remote}:{}};return await Di(n,a,r),e.workspaceRef={key:Ei(a.id),id:a.id,backend:e.workspaceRef.backend,root:n,...a.remote?{remote:a.remote}:{},...a.memorySyncEnabled?{memorySyncEnabled:!0}:{}},!0}async function Sy(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:[x(t,`trace`),x(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 Cy(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`,()=>w.killAllForOwner(e.processOwnerId)),await n(`mcpController`,()=>e.mcpController.stop()),await n(`processRuntime`,()=>Vt.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`,()=>jl()),await n(`pluginServices`,()=>ol()),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(`authStore`,()=>e._authStore.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`)}async function wy(e,t,n){let r=n.current;if(!r)throw Error(`导出归档仅支持关系化 SQLite 后端(sessions.db)。当前后端不支持。`);let i=await si(e,r);if(!i)throw Error(`会话 ${e.slice(0,8)} 不存在或无法加载`);let a=JSON.stringify(i,null,2),o=pi(`sha256`).update(a,`utf-8`).digest(`hex`);await Ai(b(t),{recursive:!0}),await Ni(t,a,`utf-8`);let s=await Mi(t,`utf-8`),c=pi(`sha256`).update(s,`utf-8`).digest(`hex`);if(o!==c)throw Error(`Checksum 校验失败:写入前 sha256=${o.slice(0,16)},读回 sha256=${c.slice(0,16)}。导出文件 ${t} 可能已损坏,操作整体失败。`);return{entryCount:i.entries.length,checksum:o,path:t}}async function Ty(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}}let Ey=0;function Dy(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 Oy=class{processOwnerId=`app-${++Ey}`;get processOwner(){return this.processOwnerId}settings;toolRegistry;hookRegistry;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 nt({store:(()=>{let e=new at(ze());return s()?dt(e):e})()});completeText;clock;fileStateManager;learningStore;localLearningStore;memoryAutoExtractor;promptManager;orchestrator;runSession;writeTodos;sessionConfigResolver;runTeam;skillRegistry;i18nRegistry;_pendingProviderCapabilities=[];get pendingProviderCapabilities(){return this._pendingProviderCapabilities}declarativeAgentProfiles=[];extensions;pluginInput=Rn();sigilResolvers=new Ia;expandSigilChips(e,t){return Ga(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 Fa;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 he;diagnoser=new me(this.failureSignals);pluginHealthTracker=Sc();pluginCapabilityQuota=new Tc;inquiryCenter=new Dc;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;notificationDispatcher;presenceTracker;followUpPendingProbe;toolsSyncCoordinator;onMcpStartupSettled;pendingMcpStartupResult;setMcpStartupCallback(e){this.onMcpStartupSettled=e,this.pendingMcpStartupResult&&=(e(this.pendingMcpStartupResult),void 0)}pluginContributionsFacade;buildToolsForWorkspace(e){return ly(this,e)}connectorTools(){return uy(this)}get agentJobs(){return this.agentJobServiceInstance||=Do({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 Fo(this)}resolveModel(e){return Io(this,e)}listProviders(){return Lo(this)}registerHook(e){Ro(this,e)}unregisterHook(e){return zo(this,e)}async hydrateModelCache(){return Bo(this)}getSessionAvailableModels(e){return Vo(this,e)}async refreshModels(){return Uo(this)}async reloadCapabilities(){let e=await Ty({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{mcpTools:e.mcpTools,models:e.models,agents:e.agents,teams:e.teams,pendingProviderCapabilities:e.pendingProviderCapabilities,i18nEntries:e.i18nEntries}}syncSessionTools(){return this.toolsSyncCoordinator.resync()}syncSessionToolsFor(e){return this.toolsSyncCoordinator.resyncOne(e)}pluginTopology=new Xu;pluginModuleManager;pluginProviderManager;capabilityReloader;computedPluginCommands(){return this.pluginContributionsFacade.computedPluginCommands()}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:c,promptWallClockBudgetMs:l,sessionCostBudgetUSD:u,stallDetection:d,workspaceDir:f,workspaceId:p,pluginHomedir:m,pluginBundledDirs:h}=e;this.maxSessions=i??ri,this.maxToolTurns=a??gt.maxToolTurns,this.maxToolTurnExtensions=o,this.promptOutputTokenBudget=c,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??s(),this._pluginHomedir=m??ze(),this._pluginBundledDirs=h??[],this._resilienceOverride=e.resilience,this.logger=C(n.name,{level:n.level,destination:n.destination});let g={};this.sessionRepoRef=g,this.sessionStorageDir=e.storage?.session&&`dir`in e.storage.session?e.storage.session.dir:void 0;let _=zd({logger:this.logger,hookRegistry:e.hookRegistry,getToolRegistry:()=>this.toolRegistry,getPermissionRegistry:()=>this.permissionRegistry,onHookTimeout:({hookName:e,timeoutMs:t})=>{let n=cc(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 ee=Zu(e,()=>this.settings);this._authStore=ee.authStore,this._modelRegistry=ee.modelRegistry,this.providerRegistry=ee.providerRegistry,this.wireProtocolRegistry=ee.wireProtocolRegistry,this.modelCatalogManager=ee.modelCatalogManager;let te=ee.defaultModel,re=ee.resolveEffectiveModel,ie=e.modelId,v=_a({options:e,workspaceDir:this.workspaceDir,providerRegistry:this.providerRegistry,defaultModel:te,resolveEffectiveModel:re,repoRef:g,getWorkspaceRef:()=>this.workspaceRef,onMemoryConflict:e.onMemoryConflict,getActiveSessionBytes:()=>{let e=this.codingSessionPool?.active?.session;return e instanceof ti?e.estimatedContentBytes:void 0},getEffectiveMaxBytes:()=>{let e=this.codingSessionPool;if(e)return e.getResidencyDiagnostics().maxBytesPerSession},getCoverageThresholds:()=>{let e=this.settings.get(`residency`),t=(e,t)=>t!=null&&process.env[e]===void 0?t:void 0;return{warn:t(`OTTO_MEMORY_COVERAGE_WARN_THRESHOLD`,e?.coverage_warn_threshold),error:t(`OTTO_MEMORY_COVERAGE_ERROR_THRESHOLD`,e?.coverage_error_threshold),floor:t(`OTTO_MEMORY_COVERAGE_FLOOR_THRESHOLD`,e?.coverage_floor_threshold)}}});this.storage={storageHost:v.storageHost,autoMemory:v.autoMemory,memory:v.memory,traceStore:v.traceStore,traceLive:v.traceLive,checkpointStore:v.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=v.clock;let ae=Bd({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=ae.devtools,this.globalLogSubscription=ae.logSubscription,this.settings=ae.settings;let oe=Mo({getConfig:()=>this.settings.get(`notification`),getCwd:()=>this.workspaceDir,isFollowUpPending:()=>this.followUpPendingProbe?.()??!1,emitHookNotification:e=>void this.hookRegistry.emit(`notification`,e)});this.notificationDispatcher=oe.dispatcher,this.presenceTracker=oe.presenceTracker;let se=this.settings,ce=xa({skillProvider:e.skillProvider,workspaceDir:this.workspaceDir,activePlugins:()=>this.activePlugins(),resolveEffectiveModel:re,providerRegistry:this.providerRegistry,prompt:e.prompt,memoryStore:v.memoryStore,memoryAutoExtractConfig:{enabled:!0,get everyNTurns(){return se.get(`memory_auto_extract`)?.every_n_turns},get maxLessons(){return se.get(`memory_auto_extract`)?.max_lessons},get similarityThreshold(){return se.get(`memory_auto_extract`)?.similarity_threshold}}});this.skillRegistry=ce.skillRegistry,this.fileStateManager=ce.fileStateManager,this.learningStore=ce.learningStore,this.localLearningStore=ce.localLearningStore,this.memoryAutoExtractor=ce.memoryAutoExtractor,this.completeText=ce.completeText,this.promptManager=ce.promptManager;let le=ne(this._authStore,`delegation`),ue=Vd({getModelRegistry:()=>this.modelRegistry,providerRegistry:this.providerRegistry,authStore:this._authStore,getSettings:()=>this.settings,promptManager:this.promptManager,getTools:()=>this.tools,getDeclarativeAgentProfiles:()=>this.getEnabledAgentProfiles(),defaultModel:te,explicitModelId:ie,isModelUsable:le,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()}),de=ue.visionDelegateService;this.sessionConfigResolver=ue.sessionConfigResolver;let fe=Hd({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:de,resolveEffectiveModel:re,defaultModel:te});this.agentRuntime=fe.agentRuntime,this.codingSessionPool=fe.codingSessionPool,Dy(this);let pe=fe.swarmAgentRunner,me=Ud({hookRegistry:this.hookRegistry,stream:this.codingSessionPool.stream,logger:this.logger,defaultModel:fe.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:pe,workflowConfig:{retry:this.settings.get(`workflow`)?.retry,circuitBreaker:this.settings.get(`workflow`)?.circuitBreaker}});this.orchestrator=me.orchestrator,this.runSession=me.runSession,this.runTeam=me.runTeam,this.writeTodos=me.writeTodos,this.toolRegistry=this.initToolRegistry(e);let he=qd({toolRegistry:this.toolRegistry,hookRegistry:this.hookRegistry,settings:this.settings,workspaceDir:this.workspaceDir,logger:this.logger,getResilienceConfig:()=>this.getResilienceConfig()});this.permissionRegistry=he.permissionRegistry,this.auditLog=he.auditLog,this.mcpController=he.mcpController;let ge=he.preExistingHooks;this.extensions=Jd({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=Wd({mcpController:this.mcpController,callMcpTool:(e,t,n)=>this.callMcpTool(e,t,n),getActivePlugins:()=>this.activePlugins()}).panelBackendController;let _e=Yd({pluginInput:this.pluginInput,sigilResolvers:this.sigilResolvers,settings:this.settings,workspaceDir:this.workspaceDir,activePlugins:()=>this.activePlugins(),agentRuntime:this.agentRuntime,hookRegistry:this.hookRegistry,preExistingHooks:ge,codingSessionPoolGet:e=>this.codingSessionPool.getSession(e),logger:this.logger,registerHooks:()=>this.registerHooks()});this.ownedHookNames=_e.ownedHookNames,this.processRegistryUnsubs=_e.processRegistryUnsubs,this.i18nRegistry=new jn;let ve=Gd({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)=>this.pluginHealthTracker.recordError(e,t),getSchedulePort:()=>this.scheduleServiceInstance,settings:this.settings,mcpController:this.mcpController,skillRegistryForReloader:this.skillRegistry,modelCatalogManager:this.modelCatalogManager,getActivePluginsForReloader:()=>this.activePlugins(),i18nRegistry:this.i18nRegistry});this.pluginModuleManager=ve.pluginModuleManager,this.pluginProviderManager=ve.pluginProviderManager,this.capabilityReloader=ve.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 ye=Kd({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()});this.toolsSyncCoordinator=ye.toolsSyncCoordinator,this.pluginContributionsFacade=ye.pluginContributionsFacade}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 Xd(this.settings,()=>this.settingsLoaded,e=>{this.settingsLoaded=e}),Zd(this.deferredConfigSteps())}freezeResilienceConfig(){this._resilienceConfig===void 0&&(this._resilienceConfig=l(this._resilienceOverride,this.settings.get(`resilience`)))}_residencyConfig;freezeResidencyConfig(){if(this._residencyConfig!==void 0)return;let e=this.settings.get(`residency`),t=(e,t)=>t!=null&&process.env[e]===void 0?t:void 0;this._residencyConfig={totalBytes:t(`OTTO_SESSION_TOTAL_RESIDENCY_BUDGET`,e?.total_bytes),minPerSessionBytes:t(`OTTO_SESSION_MIN_PER_SESSION_BYTES`,e?.min_per_session_bytes),maxPerSessionBytes:t(`OTTO_SESSION_MAX_PER_SESSION_BYTES`,e?.max_per_session_bytes),maxContentBytes:t(`OTTO_SESSION_MAX_CONTENT_BYTES`,e?.max_content_bytes),maxHistoryMessages:t(`OTTO_SESSION_MAX_HISTORY_MESSAGES`,e?.max_history_messages),resumeWindowMessages:t(`OTTO_SESSION_RESUME_WINDOW_MESSAGES`,e?.resume_window_messages),compactionTimeoutMs:t(`OTTO_SESSION_COMPACTION_TIMEOUT_MS`,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 Yo(this,e,t)}getPermissionMode(){return Xo(this)}async setPermissionMode(e){return Zo(this,e)}getSessionAlwaysAllow(e){return Qo(this,e)}bashAlwaysAllowPrefix(e){return ve(e)}isWellFormedAllowEntry(e){return Ne(e)}async disallowToolAlways(e){return $o(this,e)}clearSessionAlwaysAllow(e){es(this,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)}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)}updateSettings(e){return this.settings.update(e)}resolveA2uiRendererPayload(e){return eo(Za(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 my(this)}async completeWorkspaceDependentStartup(){return hy(this)}needsWorkspaceInit(){return gy(this)}async confirmWorkspaceInit(){return by(this)}hasParentWorkspace(){return _y(this)}async adoptParentWorkspace(){return vy(this)}async createLocalWorkspace(){return yy(this)}async setWorkspaceMemorySyncEnabled(e){return xy(this,e)}async sweepOrphanTraceFiles(){return Sy(this)}async stop(){return Cy(this)}async createSession(e={}){return ts(this,e)}registerNotificationChannel(e){Go(this,e)}registerInAppNotificationChannel(e){Ko(this,e)}setUserAskRenderer(e){this.userAskRenderer=e}async askPluginUser(e,t){let n={...Ay(t),id:`plugin_ask_${++this.userAskSeq}`,askedBy:`plugin:${e}`},r=this.userAskRenderer;if(!this._interactive||!r)return ky();let i=this.inquiryCenter.enqueue({id:n.id,origin:{kind:`plugin`,pluginId:e},question:n});if(!i.accepted)return ky();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,ky()),e}}notifyUserInteraction(){qo(this)}setTerminalFocus(e){Jo(this,e)}setFollowUpPendingProbe(e){this.followUpPendingProbe=e}notifyPluginServices(e){let t=al(),n=0;for(let r of this.activePlugins())for(let i of t.runningServiceIds(r.id))t.notify(r.id,i,e)&&(this.pluginCapabilityQuota.onNotifyDelivered(r.id,e.sessionId),n+=1);return n}notifyPluginServiceSchedule(e,t){return this.activePlugins().some(t=>t.id===e.pluginId)?al().notify(e.pluginId,e.serviceId,{type:`schedule.tick`,scheduleId:t.scheduleId,occurrenceId:t.occurrenceId,occurredAt:t.occurredAt}):!1}getSession(e){return ns(this,e)}async shareSession(e,t){return rs(this,e,t)}getActiveSession(){return is(this)}listSessions(e){return as(this,e)}async listAllSessions(e){return os(this,e)}async removeSession(e){return ss(this,e)}async exportSessionArchive(e,t){return wy(e,t,this.sessionRepoRef??{})}archiveSession(e){return cs(this,e)}async forkSession(e,t){return ls(this,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 dy(this,e)}async buildModelCatalog(e){return Wo(this,e)}setSessionAvailableModels(e,t){Ho(this,e,t)}registerHooks(){fy(this)}get activeSandbox(){return this.sandbox.activeName}approveSandboxBypass(e){this.sandbox.approveBypass(e)}ensureNotDisposed(){if(this.disposed)throw Error(`App has been stopped and cannot be reused.`)}};function ky(){return{answer:``,acceptedRecommendation:!1,resolvedBy:`human`}}function Ay(e){return{header:jy(e.header,160),question:jy(e.question,2e3),background:jy(e.background,4e3),recommendation:jy(e.recommendation,1e3),...e.options?{options:e.options.slice(0,8).map(e=>({label:jy(e.label,120),rationale:jy(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=>jy(e,1e3))}:{}}}function jy(e,t){return String(e??``).replace(/[--Ÿ‎‏‪-‮⁦-⁩]/g,` `).slice(0,t)}function My(e){return new Oy(e)}function Ny(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:()=>Oo(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 Py(e){return{createSession:async t=>Ny(await e.createSession(t)),jobs:Lt,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.model=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 Fy=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 Iy(e){return e.absolutePaths.length>0||e.bareSpecifiers.length>0}function Ly(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:`)||Fy.has(e)||n.includes(e)||n.push(e)}return{absolutePaths:t,bareSpecifiers:n}}function Ry(e,t){let n=Ly(t);if(!Iy(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(`
504
- `))}function zy(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 By(e,t=E){let n=t(e);return n.gated||!(e.manifest.capabilities?.includes(`tools`)??!1)?!1:!n.pendingCapabilities.includes(`tools`)}async function Vy(e,t,n){let r=[];for(let i of e){if(!By(i,t))continue;let e=i.manifest.contributes?.perfMetrics;if(!e?.length)continue;let a=Ml(i.scope);for(let t of e){let e=(async()=>{try{let{result:e,error:n}=await zy(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 Hy=20;function Uy(e,t=20){let n=ic(e);if(!n||!D(n))return[];let r;try{r=k(n,`utf8`)}catch{return[]}let i=r.split(`
505
- `).filter(e=>e.trim().length>0).slice(-t),a=[];for(let e of i)try{a.push(JSON.parse(e))}catch{}return a}function Wy(e,t,n){let r=e?.manifest.contributes?.contextKeys;return{...t,...Un(r,n)}}function Gy(e,t){let n=e.manifest.scripts?.[t];if(!n)return Promise.reject(Error(`plugin ${e.id} 无脚本「${t}」`));let r=Ye(n);return r.safe?new Promise((r,i)=>{let a=Oi(n,{shell:!0,cwd:e.dir,stdio:`ignore`,env:Je()});a.on(`error`,i),a.on(`exit`,e=>e===0?r():i(Error(`脚本「${t}」退出码 ${e}`)))}):Promise.reject(Error(`脚本「${t}」被安全检查拦截:${r.reason}`))}function Ky(e){let t=e.startsWith(`chrome://`);process.platform===`darwin`?Oi(`open`,t?[`-a`,`Google Chrome`,e]:[e],{detached:!0,stdio:`ignore`}).unref():process.platform===`win32`?Oi(`cmd`,[`/c`,`start`,``,e],{detached:!0,stdio:`ignore`}).unref():Oi(t?`google-chrome`:`xdg-open`,[e],{detached:!0,stdio:`ignore`}).unref()}const qy=C(`@x-otto/coding:plugin-cli-passthrough`);function Jy(e){let t=e.manifest.contributes?.cli?.bin,n=t?x(e.dir,t):Yy(e.dir);if(n)return Xy(n,e.dir)}function Yy(e){let t=x(e,`package.json`);if(D(t))try{let n=JSON.parse(k(t,`utf8`));if(typeof n.bin==`string`)return x(e,n.bin);if(n.bin&&typeof n.bin==`object`){let t=Object.values(n.bin)[0];return typeof t==`string`?x(e,t):void 0}return}catch{return}}function Xy(e,t){if(!D(e))return;let n,r;try{n=Jr(e),r=Jr(t)}catch{return}let i=r.endsWith(`/`)?r:`${r}/`;if(!n.startsWith(i)&&n!==r){qy.warn({candidate:e,pluginDir:t},`Plugin CLI bin resolves outside plugin directory (symlink escape rejected)`);return}try{if(!Zr(n).isFile())return}catch{return}return n}function Zy(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)){qy.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 Qy(e,t){let n=Zy(e,t),r=new Map;for(let[e,t]of n){if(t.length===1){r.set(e,t[0]);continue}qy.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 $y(e,t,n){let r=Zy(e,t).get(n);return r&&r.length>=2?r.map(e=>e.id):void 0}function eb(e,t,n,r=6e4){return new Promise((i,a)=>{let o=Oi(e,t,{stdio:`inherit`,cwd:n,env:Je()}),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 tb(e,t={}){return Vn({cwd:t.workspaceDir??process.cwd(),homedir:t.homedir??ze(),bundledDirs:t.bundledDirs}).find(t=>t.id===e)}function nb(e,t,n={}){let r=tb(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)`}.`};cr(r.dir),a.length>0&&Jn(r.dir,a);let c=E(r);return{ok:!0,granted:[...a],pending:c.pendingCapabilities}}function rb(e,t={}){let n=tb(e,t);if(!n)return{found:!1,trusted:!1,gated:!1,declared:[],granted:[],pending:[]};let r=E(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 ib(e,t={}){let n=tb(e,t);return n?(ur(n.dir),!0):!1}const ab=C(`@x-otto/coding:plugin-theme-preset-loader`),ob=new Set([`dark`,`light`,`system`,`builtin`]);function sb(e){let t=[];for(let n of e){let e=n.manifest.contributes?.themePresets;if(!e?.length)continue;if(E(n).gated){ab.warn({pluginId:n.id},`plugin gated (untrusted), themePresets skipped`);continue}let r=e;r.length>Dn&&(ab.warn({pluginId:n.id,declared:r.length,limit:Dn},`plugin declares more theme presets than the per-plugin limit, truncated`),r=r.slice(0,Dn));for(let e of r){if(ob.has(e.localId)){ab.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{vo as AgentJobService,pt as AgentSession,Oy as App,bt as CodingSessionPool,Hv as DEFAULT_WORKSPACE_KEY,Pa as ExtensionManager,bn as HIGH_RISK_CAPABILITIES,Vv as INDUCTOR_PLUGIN_ID,Ji as InstallManager,Hy as PLUGIN_LOG_TAIL_LINES,kn as PLUGIN_MANIFEST_FILENAME,An as POINT,Yi as RegistryClient,Gv as SANDBOX_ESCALATION_MARKER,Bi as SCHEDULE_LEASE_MIGRATIONS,yt as SandboxUnavailableError,Vi as ScheduleRegistry,Hi as SchedulerService,Ia as SigilResolverRegistry,m as apiCredentialId,Ry as assertPortableArtifact,nb as authorizePlugin,Wy as buildExtensionContext,pa as buildMemoryStore,Qy as buildPluginCliRegistry,Xi as builtinOfficialSource,wt as captureFiles,Zi as checkArchiveBomb,Qi as checkGitUpgrades,Yu as checkPluginConsistency,$i as checkUpgrades,dr as claudeTrustStorePath,ea as cleanTempDir,Vy as collectPluginPerfMetrics,sb as collectPluginThemePresets,Vc as compilePluginModule,Fu as compilePluginPanels,Wc as computeSourceHash,My as createApp,ta as createArchive,Nn as createBuiltinHashtags,Rd as createBuiltinResolvers,fr as createClaudeHookBridgeHooks,Fn as createFileProvider,Py as createFrontendPort,uf as createLessonInjectionHooks,Ui as createLocalFireOwnership,Ln as createPluginInputRegistry,Wi as createRemoteFireOwnership,Gi as createRemoteScheduleStore,qi as createScheduleStore,Ot as createSessionStableInjectionHooks,df as createSkillCatalogInjectionHooks,na as createTempDir,ef as createToolGuidanceHook,mr as defaultHookRunner,Nt as defaultMaxToolTurnExtensions,As as defaultPostInstallExecutor,Ft as deriveSessionTitle,hr as detectClaudeExecutableSurface,zn as detectPluginExecutableSurface,gr as detectProjectConfigGating,ra as detectUninstallTarget,_r as discoverFileCommands,Bn as discoverPlugins,Hn as dispatch,yr as evaluateClaudeTrust,Wn as evaluatePluginTrust,xr as evaluateWorkspaceTrustPrompt,Sr as expandCommandBody,Ga as expandSigilChips,ia as extractArchive,$y as findPluginCliNameConflict,Ly as findPortabilityViolations,i as findWorkspaceRoot,ko as getIncompleteSubagentReason,Oo as getLastAssistantText,It as globalAgentJobRegistry,Rt as globalAgentObservability,Bt as globalProcessRegistry,qn as grantPluginCapabilities,Yn as grantedPluginCapabilities,Iy as hasPortabilityViolations,rb as inspectPluginAuthorization,Wu as installPluginFromDir,Uu as installPluginFromPackage,zc as installPluginHostExternals,Cr as interpretPreToolUse,Qu as isInternalDelegatedSession,Xn as isPluginTrusted,wr as isProjectTrusted,Er as isStrictProjectConfigEnabled,aa as listInstalledItems,Dr as loadClaudeHooksConfig,Xc as loadPluginModule,kr as matchesHookMatcher,Gt as messagesFromSnapshot,Ky as openTarget,Ar as parseClaudeHooks,jr as parseDotMcpJson,Qn as parsePluginManifest,oa as parseRegistry,er as pluginTrustStorePath,Cu as purgePluginState,tr as readHighRiskCapabilities,Uy as readPluginLogTail,Qv as readSkillLoopStatus,ho as readTaskOutputTail,Kt as reconstructMessages,qu as recordPluginInstalled,Ju as recordPluginUninstalled,Ku as removeInstalledPluginEntry,nr as resolveActions,Nr as resolveClaudeMcpServers,Rc as resolveHostExternalPaths,Hu as resolvePackageDir,Jy as resolvePluginCliBin,Ea as resolvePluginMcpServers,Fr as resolveProjectConfigTrusted,Jt as resolveSessionTitle,Xt as restoreFiles,ib as revokePluginAuthorization,Kc as rewriteArtifactSourceHash,Gy as runPluginScript,sa as scanInstalledVersions,ar as sigilOf,eb as spawnPluginCli,sr as trustPlugin,Lr as trustProject,ca as uninstall,lr as untrustPlugin,Rr as untrustProject,Gu as upsertInstalledPluginEntry,la as validateExtractedPaths};
503
+ user explicitly applies it.`}function oy(e){return`Draft skill: ${e.taskSignature.length>60?`${e.taskSignature.slice(0,60)}…`:e.taskSignature}`}function sy(e){try{let t=ry({pluginId:e.pluginId,workspaceKey:e.workspaceKey,sessionIds:e.brief.sessionIds});return{jobId:e.startJob({title:oy(e.brief),prompt:ay(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 cy(e){e.hookRegistry.register(tf(e.toolRegistry,e.getDefaultToolPreset)),e.hookRegistry.register(we(e.failureSignals)),e.hookRegistry.register(Ee(e.failureSignals)),e.hookRegistry.registerAll(e.contextSourcesBuildHooks(e.workspaceDir,e.memory)),e.memory&&e.hookRegistry.registerAll(Dt(e.memory)),e.hookRegistry.registerAll(At({getTodoList:t=>e.getSession(t)?.session.getTodoList()}));let t=/-milestone\.md$/,n=/^Status:\s*Done\b/m;e.hookRegistry.registerAll(Et({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(df(e.learningStore,e.promptManager,e.localLearningStore)),e.skillRegistry&&e.hookRegistry.registerAll(ff(e.skillRegistry)),e.hookRegistry.registerAll(pr({workspaceDir:e.workspaceDir})),e.hookRegistry.registerAll(hf()),e.hookRegistry.on(`session.deleted`,`rfc047-notification-detach`,t=>e.notificationDispatcher.detach(t.sessionId));let r=Yv();e.hookRegistry.registerAll(r.hooks),e.hookRegistry.register(gf(e=>{w.killAllForSession(e)})),e.hookRegistry.registerAll(_f({registry:e.permissionRegistry,getPersistedAllow:t=>e.codingSessionPool.getSessionPermissionAllow(t)})),e.hookRegistry.register(qv({getContext:()=>{let t=je(e.workspaceDir,ze());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:be(n,e.workspaceDir,Be(),e.sandbox.writablePaths),deniedRoots:t,networkAllowed:e.sandbox.isNetworkAllowed,autoAllowBashIfSandboxed:e.sandbox.autoAllowBashIfSandboxed}}})),e.hookRegistry.registerAll(yf(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(bf({isEnabled:i})),e.hookRegistry.registerAll(Gv({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})=>{sy({startJob:t=>e.startSkillDraftJob({...t,origin:`user`}),brief:n,sessionId:t,pluginId:Hv,workspaceKey:e.getWorkspaceKey()??Uv,logger:{warn:t=>e.logger.warn(t)}})},logger:e.logger})),e.hookRegistry.register(Se({getOnFileEdited:e.getEditFileCallback,dedupCache:e.editFilesDedup})),{agentJobNotify:r.notify}}function ly(e,t,n,r){return $d({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},t,n,r)}function uy(e,t){return Ie(t,ef(ly(e,t,e.skillRegistry?un(e.skillRegistry,t):void 0,!1))).getAvailable(e.defaultToolPreset)}function dy(e){return e.toolRegistry.getAvailable(e.defaultToolPreset).filter(e=>e.name.startsWith(`mcp__`))}function fy(e,t){let n=t.skillProvider??(e.skillRegistry?un(e.skillRegistry,e.workspaceDir):void 0);t.sandbox&&e.sandbox.pin(t.sandbox);let r={registerChild(e,t){return{pid:Vt.registerChild(e,t).pid??0}}};return Ie(e.workspaceDir,{...ef(ly(e,e.workspaceDir,n,t.lsp===!0)),processTracker:r})}function py(e){e.agentJobNotify=cy({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,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),logger:e.logger}).agentJobNotify}function my(e){return{async readFile(e){try{return await Mi(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return null;throw e}},async writeFile(e,t){await Ai(b(e),{recursive:!0}),await tn(e,t)},async writeFileExclusive(e,t){await Ai(b(e),{recursive:!0});try{let n=await ji(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??wi,now:e?.now??(()=>new Date().toISOString()),...e?.confirmTrust?{confirmTrust:e.confirmTrust}:{}}}async function hy(e){if(e.ensureNotDisposed(),await e.ensureSettingsLoaded(),!e.workspaceRef&&!e.pendingWorkspaceInit&&!e.parentWorkspaceExisted)try{let t=Ci(my()),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 tt(`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 Ks(e.workspaceDir,{plugins:e.activePlugins()}),e.declarativeTeams=await Qs(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=()=>tt(`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 tt(`completeWorkspaceDependentStartup (session restoreAll)`,()=>gy(e)):tt(`sweepOrphanTraceFiles (headless)`,()=>Cy(e)),e.devtools&&await e.devtools.start(),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`&&wy(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(),Ze(`app.start() internal phases complete`),e.logger.info(`App started`)}async function gy(e){if(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)}}}Cy(e)}function _y(e){return!!e.pendingWorkspaceInit}function vy(e){return!!e.parentWorkspaceExisted}async function yy(e){let t=e.parentWorkspaceExisted;if(!t)return e.workspaceRef;e.parentWorkspaceExisted=void 0;try{return e.workspaceRef=await Ci(my()).resolveLocal(t.parentRoot),await gy(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 by(e){let t=e.parentWorkspaceExisted;if(!t)return e.workspaceRef;e.parentWorkspaceExisted=void 0;try{return e.workspaceRef=await Ci(my()).createLocal(t.currentRoot),await gy(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 xy(e){let t=e.pendingWorkspaceInit;if(!t)return e.workspaceRef;e.pendingWorkspaceInit=void 0;try{return e.workspaceRef=await Ci(my()).createLocal(t.root),await gy(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 Sy(e,t){let n=e.workspaceRef?.root;if(!n)return!1;let r=my(),i=await Ti(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,...i.remote?{remote:i.remote}:{}};return await Di(n,a,r),e.workspaceRef={key:Ei(a.id),id:a.id,backend:e.workspaceRef.backend,root:n,...a.remote?{remote:a.remote}:{},...a.memorySyncEnabled?{memorySyncEnabled:!0}:{}},!0}async function Cy(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:[x(t,`trace`),x(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 wy(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`,()=>w.killAllForOwner(e.processOwnerId)),await n(`mcpController`,()=>e.mcpController.stop()),await n(`processRuntime`,()=>Vt.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`,()=>Ml()),await n(`pluginServices`,()=>sl()),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(`authStore`,()=>e._authStore.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`)}async function Ty(e,t,n){let r=n.current;if(!r)throw Error(`导出归档仅支持关系化 SQLite 后端(sessions.db)。当前后端不支持。`);let i=await si(e,r);if(!i)throw Error(`会话 ${e.slice(0,8)} 不存在或无法加载`);let a=JSON.stringify(i,null,2),o=pi(`sha256`).update(a,`utf-8`).digest(`hex`);await Ai(b(t),{recursive:!0}),await Ni(t,a,`utf-8`);let s=await Mi(t,`utf-8`),c=pi(`sha256`).update(s,`utf-8`).digest(`hex`);if(o!==c)throw Error(`Checksum 校验失败:写入前 sha256=${o.slice(0,16)},读回 sha256=${c.slice(0,16)}。导出文件 ${t} 可能已损坏,操作整体失败。`);return{entryCount:i.entries.length,checksum:o,path:t}}async function Ey(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}}let Dy=0;function Oy(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 ky=class{processOwnerId=`app-${++Dy}`;get processOwner(){return this.processOwnerId}settings;toolRegistry;hookRegistry;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 nt({store:(()=>{let e=new at(ze());return s()?dt(e):e})()});completeText;clock;fileStateManager;learningStore;localLearningStore;memoryAutoExtractor;promptManager;orchestrator;runSession;writeTodos;sessionConfigResolver;runTeam;skillRegistry;i18nRegistry;_pendingProviderCapabilities=[];get pendingProviderCapabilities(){return this._pendingProviderCapabilities}declarativeAgentProfiles=[];extensions;pluginInput=Rn();sigilResolvers=new Ia;expandSigilChips(e,t){return Ga(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 Fa;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 he;diagnoser=new me(this.failureSignals);pluginHealthTracker=Cc();pluginCapabilityQuota=new Ec;inquiryCenter=new Oc;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;notificationDispatcher;presenceTracker;followUpPendingProbe;toolsSyncCoordinator;onMcpStartupSettled;pendingMcpStartupResult;setMcpStartupCallback(e){this.onMcpStartupSettled=e,this.pendingMcpStartupResult&&=(e(this.pendingMcpStartupResult),void 0)}pluginContributionsFacade;buildToolsForWorkspace(e){return uy(this,e)}connectorTools(){return dy(this)}get agentJobs(){return this.agentJobServiceInstance||=Oo({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 Io(this)}resolveModel(e){return Lo(this,e)}listProviders(){return Ro(this)}registerHook(e){zo(this,e)}unregisterHook(e){return Bo(this,e)}async hydrateModelCache(){return Vo(this)}getSessionAvailableModels(e){return Ho(this,e)}async refreshModels(){return Wo(this)}async reloadCapabilities(){let e=await Ey({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{mcpTools:e.mcpTools,models:e.models,agents:e.agents,teams:e.teams,pendingProviderCapabilities:e.pendingProviderCapabilities,i18nEntries:e.i18nEntries}}syncSessionTools(){return this.toolsSyncCoordinator.resync()}syncSessionToolsFor(e){return this.toolsSyncCoordinator.resyncOne(e)}pluginTopology=new Zu;pluginModuleManager;pluginProviderManager;capabilityReloader;computedPluginCommands(){return this.pluginContributionsFacade.computedPluginCommands()}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:c,promptWallClockBudgetMs:l,sessionCostBudgetUSD:u,stallDetection:d,workspaceDir:f,workspaceId:p,pluginHomedir:m,pluginBundledDirs:h}=e;this.maxSessions=i??ri,this.maxToolTurns=a??gt.maxToolTurns,this.maxToolTurnExtensions=o,this.promptOutputTokenBudget=c,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??s(),this._pluginHomedir=m??ze(),this._pluginBundledDirs=h??[],this._resilienceOverride=e.resilience,this.logger=C(n.name,{level:n.level,destination:n.destination});let g={};this.sessionRepoRef=g,this.sessionStorageDir=e.storage?.session&&`dir`in e.storage.session?e.storage.session.dir:void 0;let _=Bd({logger:this.logger,hookRegistry:e.hookRegistry,getToolRegistry:()=>this.toolRegistry,getPermissionRegistry:()=>this.permissionRegistry,onHookTimeout:({hookName:e,timeoutMs:t})=>{let n=lc(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 ee=Qu(e,()=>this.settings);this._authStore=ee.authStore,this._modelRegistry=ee.modelRegistry,this.providerRegistry=ee.providerRegistry,this.wireProtocolRegistry=ee.wireProtocolRegistry,this.modelCatalogManager=ee.modelCatalogManager;let te=ee.defaultModel,re=ee.resolveEffectiveModel,ie=e.modelId,v=_a({options:e,workspaceDir:this.workspaceDir,providerRegistry:this.providerRegistry,defaultModel:te,resolveEffectiveModel:re,repoRef:g,getWorkspaceRef:()=>this.workspaceRef,onMemoryConflict:e.onMemoryConflict,getActiveSessionBytes:()=>{let e=this.codingSessionPool?.active?.session;return e instanceof ti?e.estimatedContentBytes:void 0},getEffectiveMaxBytes:()=>{let e=this.codingSessionPool;if(e)return e.getResidencyDiagnostics().maxBytesPerSession},getCoverageThresholds:()=>{let e=this.settings.get(`residency`),t=(e,t)=>t!=null&&process.env[e]===void 0?t:void 0;return{warn:t(`OTTO_MEMORY_COVERAGE_WARN_THRESHOLD`,e?.coverage_warn_threshold),error:t(`OTTO_MEMORY_COVERAGE_ERROR_THRESHOLD`,e?.coverage_error_threshold),floor:t(`OTTO_MEMORY_COVERAGE_FLOOR_THRESHOLD`,e?.coverage_floor_threshold)}}});this.storage={storageHost:v.storageHost,autoMemory:v.autoMemory,memory:v.memory,traceStore:v.traceStore,traceLive:v.traceLive,checkpointStore:v.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=v.clock;let ae=Vd({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=ae.devtools,this.globalLogSubscription=ae.logSubscription,this.settings=ae.settings;let oe=No({getConfig:()=>this.settings.get(`notification`),getCwd:()=>this.workspaceDir,isFollowUpPending:()=>this.followUpPendingProbe?.()??!1,emitHookNotification:e=>void this.hookRegistry.emit(`notification`,e)});this.notificationDispatcher=oe.dispatcher,this.presenceTracker=oe.presenceTracker;let se=this.settings,ce=xa({skillProvider:e.skillProvider,workspaceDir:this.workspaceDir,activePlugins:()=>this.activePlugins(),resolveEffectiveModel:re,providerRegistry:this.providerRegistry,prompt:e.prompt,memoryStore:v.memoryStore,memoryAutoExtractConfig:{enabled:!0,get everyNTurns(){return se.get(`memory_auto_extract`)?.every_n_turns},get maxLessons(){return se.get(`memory_auto_extract`)?.max_lessons},get similarityThreshold(){return se.get(`memory_auto_extract`)?.similarity_threshold}}});this.skillRegistry=ce.skillRegistry,this.fileStateManager=ce.fileStateManager,this.learningStore=ce.learningStore,this.localLearningStore=ce.localLearningStore,this.memoryAutoExtractor=ce.memoryAutoExtractor,this.completeText=ce.completeText,this.promptManager=ce.promptManager;let le=ne(this._authStore,`delegation`),ue=Hd({getModelRegistry:()=>this.modelRegistry,providerRegistry:this.providerRegistry,authStore:this._authStore,getSettings:()=>this.settings,promptManager:this.promptManager,getTools:()=>this.tools,getDeclarativeAgentProfiles:()=>this.getEnabledAgentProfiles(),defaultModel:te,explicitModelId:ie,isModelUsable:le,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()}),de=ue.visionDelegateService;this.sessionConfigResolver=ue.sessionConfigResolver;let fe=Ud({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:de,resolveEffectiveModel:re,defaultModel:te});this.agentRuntime=fe.agentRuntime,this.codingSessionPool=fe.codingSessionPool,Oy(this);let pe=fe.swarmAgentRunner,me=Wd({hookRegistry:this.hookRegistry,stream:this.codingSessionPool.stream,logger:this.logger,defaultModel:fe.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:pe,workflowConfig:{retry:this.settings.get(`workflow`)?.retry,circuitBreaker:this.settings.get(`workflow`)?.circuitBreaker}});this.orchestrator=me.orchestrator,this.runSession=me.runSession,this.runTeam=me.runTeam,this.writeTodos=me.writeTodos,this.toolRegistry=this.initToolRegistry(e);let he=Jd({toolRegistry:this.toolRegistry,hookRegistry:this.hookRegistry,settings:this.settings,workspaceDir:this.workspaceDir,logger:this.logger,getResilienceConfig:()=>this.getResilienceConfig()});this.permissionRegistry=he.permissionRegistry,this.auditLog=he.auditLog,this.mcpController=he.mcpController;let ge=he.preExistingHooks;this.extensions=Yd({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=Gd({mcpController:this.mcpController,callMcpTool:(e,t,n)=>this.callMcpTool(e,t,n),getActivePlugins:()=>this.activePlugins()}).panelBackendController;let _e=Xd({pluginInput:this.pluginInput,sigilResolvers:this.sigilResolvers,settings:this.settings,workspaceDir:this.workspaceDir,activePlugins:()=>this.activePlugins(),agentRuntime:this.agentRuntime,hookRegistry:this.hookRegistry,preExistingHooks:ge,codingSessionPoolGet:e=>this.codingSessionPool.getSession(e),logger:this.logger,registerHooks:()=>this.registerHooks()});this.ownedHookNames=_e.ownedHookNames,this.processRegistryUnsubs=_e.processRegistryUnsubs,this.i18nRegistry=new jn;let ve=Kd({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)=>this.pluginHealthTracker.recordError(e,t),getSchedulePort:()=>this.scheduleServiceInstance,settings:this.settings,mcpController:this.mcpController,skillRegistryForReloader:this.skillRegistry,modelCatalogManager:this.modelCatalogManager,getActivePluginsForReloader:()=>this.activePlugins(),i18nRegistry:this.i18nRegistry});this.pluginModuleManager=ve.pluginModuleManager,this.pluginProviderManager=ve.pluginProviderManager,this.capabilityReloader=ve.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 ye=qd({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()});this.toolsSyncCoordinator=ye.toolsSyncCoordinator,this.pluginContributionsFacade=ye.pluginContributionsFacade}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 Zd(this.settings,()=>this.settingsLoaded,e=>{this.settingsLoaded=e}),Qd(this.deferredConfigSteps())}freezeResilienceConfig(){this._resilienceConfig===void 0&&(this._resilienceConfig=l(this._resilienceOverride,this.settings.get(`resilience`)))}_residencyConfig;freezeResidencyConfig(){if(this._residencyConfig!==void 0)return;let e=this.settings.get(`residency`),t=(e,t)=>t!=null&&process.env[e]===void 0?t:void 0;this._residencyConfig={totalBytes:t(`OTTO_SESSION_TOTAL_RESIDENCY_BUDGET`,e?.total_bytes),minPerSessionBytes:t(`OTTO_SESSION_MIN_PER_SESSION_BYTES`,e?.min_per_session_bytes),maxPerSessionBytes:t(`OTTO_SESSION_MAX_PER_SESSION_BYTES`,e?.max_per_session_bytes),maxContentBytes:t(`OTTO_SESSION_MAX_CONTENT_BYTES`,e?.max_content_bytes),maxHistoryMessages:t(`OTTO_SESSION_MAX_HISTORY_MESSAGES`,e?.max_history_messages),resumeWindowMessages:t(`OTTO_SESSION_RESUME_WINDOW_MESSAGES`,e?.resume_window_messages),compactionTimeoutMs:t(`OTTO_SESSION_COMPACTION_TIMEOUT_MS`,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 Xo(this,e,t)}getPermissionMode(){return Zo(this)}async setPermissionMode(e){return Qo(this,e)}getSessionAlwaysAllow(e){return $o(this,e)}bashAlwaysAllowPrefix(e){return ve(e)}isWellFormedAllowEntry(e){return Ne(e)}async disallowToolAlways(e){return es(this,e)}clearSessionAlwaysAllow(e){ts(this,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)}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)}updateSettings(e){return this.settings.update(e)}resolveA2uiRendererPayload(e){return eo(Za(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 hy(this)}async completeWorkspaceDependentStartup(){return gy(this)}needsWorkspaceInit(){return _y(this)}async confirmWorkspaceInit(){return xy(this)}hasParentWorkspace(){return vy(this)}async adoptParentWorkspace(){return yy(this)}async createLocalWorkspace(){return by(this)}async setWorkspaceMemorySyncEnabled(e){return Sy(this,e)}async sweepOrphanTraceFiles(){return Cy(this)}async stop(){return wy(this)}async createSession(e={}){return ns(this,e)}registerNotificationChannel(e){Ko(this,e)}registerInAppNotificationChannel(e){qo(this,e)}setUserAskRenderer(e){this.userAskRenderer=e}async askPluginUser(e,t){let n={...jy(t),id:`plugin_ask_${++this.userAskSeq}`,askedBy:`plugin:${e}`},r=this.userAskRenderer;if(!this._interactive||!r)return Ay();let i=this.inquiryCenter.enqueue({id:n.id,origin:{kind:`plugin`,pluginId:e},question:n});if(!i.accepted)return Ay();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,Ay()),e}}notifyUserInteraction(){Jo(this)}setTerminalFocus(e){Yo(this,e)}setFollowUpPendingProbe(e){this.followUpPendingProbe=e}notifyPluginServices(e){let t=ol(),n=0;for(let r of this.activePlugins())for(let i of t.runningServiceIds(r.id))t.notify(r.id,i,e)&&(this.pluginCapabilityQuota.onNotifyDelivered(r.id,e.sessionId),n+=1);return n}notifyPluginServiceSchedule(e,t){return this.activePlugins().some(t=>t.id===e.pluginId)?ol().notify(e.pluginId,e.serviceId,{type:`schedule.tick`,scheduleId:t.scheduleId,occurrenceId:t.occurrenceId,occurredAt:t.occurredAt}):!1}getSession(e){return rs(this,e)}async shareSession(e,t){return is(this,e,t)}getActiveSession(){return as(this)}listSessions(e){return os(this,e)}async listAllSessions(e){return ss(this,e)}async removeSession(e){return cs(this,e)}async exportSessionArchive(e,t){return Ty(e,t,this.sessionRepoRef??{})}archiveSession(e){return ls(this,e)}async forkSession(e,t){return us(this,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 fy(this,e)}async buildModelCatalog(e){return Go(this,e)}setSessionAvailableModels(e,t){Uo(this,e,t)}registerHooks(){py(this)}get activeSandbox(){return this.sandbox.activeName}approveSandboxBypass(e){this.sandbox.approveBypass(e)}ensureNotDisposed(){if(this.disposed)throw Error(`App has been stopped and cannot be reused.`)}};function Ay(){return{answer:``,acceptedRecommendation:!1,resolvedBy:`human`}}function jy(e){return{header:My(e.header,160),question:My(e.question,2e3),background:My(e.background,4e3),recommendation:My(e.recommendation,1e3),...e.options?{options:e.options.slice(0,8).map(e=>({label:My(e.label,120),rationale:My(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=>My(e,1e3))}:{}}}function My(e,t){return String(e??``).replace(/[--Ÿ‎‏‪-‮⁦-⁩]/g,` `).slice(0,t)}function Ny(e){return new ky(e)}function Py(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:()=>ko(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 Fy(e){return{createSession:async t=>Py(await e.createSession(t)),jobs:Lt,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.model=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 Iy=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 Ly(e){return e.absolutePaths.length>0||e.bareSpecifiers.length>0}function Ry(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:`)||Iy.has(e)||n.includes(e)||n.push(e)}return{absolutePaths:t,bareSpecifiers:n}}function zy(e,t){let n=Ry(t);if(!Ly(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(`
504
+ `))}function By(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 Vy(e,t=E){let n=t(e);return n.gated||!(e.manifest.capabilities?.includes(`tools`)??!1)?!1:!n.pendingCapabilities.includes(`tools`)}async function Hy(e,t,n){let r=[];for(let i of e){if(!Vy(i,t))continue;let e=i.manifest.contributes?.perfMetrics;if(!e?.length)continue;let a=Nl(i.scope);for(let t of e){let e=(async()=>{try{let{result:e,error:n}=await By(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 Uy=20;function Wy(e,t=20){let n=ac(e);if(!n||!D(n))return[];let r;try{r=k(n,`utf8`)}catch{return[]}let i=r.split(`
505
+ `).filter(e=>e.trim().length>0).slice(-t),a=[];for(let e of i)try{a.push(JSON.parse(e))}catch{}return a}function Gy(e,t,n){let r=e?.manifest.contributes?.contextKeys;return{...t,...Un(r,n)}}function Ky(e,t){let n=e.manifest.scripts?.[t];if(!n)return Promise.reject(Error(`plugin ${e.id} 无脚本「${t}」`));let r=Ye(n);return r.safe?new Promise((r,i)=>{let a=Oi(n,{shell:!0,cwd:e.dir,stdio:`ignore`,env:Je()});a.on(`error`,i),a.on(`exit`,e=>e===0?r():i(Error(`脚本「${t}」退出码 ${e}`)))}):Promise.reject(Error(`脚本「${t}」被安全检查拦截:${r.reason}`))}function qy(e){let t=e.startsWith(`chrome://`);process.platform===`darwin`?Oi(`open`,t?[`-a`,`Google Chrome`,e]:[e],{detached:!0,stdio:`ignore`}).unref():process.platform===`win32`?Oi(`cmd`,[`/c`,`start`,``,e],{detached:!0,stdio:`ignore`}).unref():Oi(t?`google-chrome`:`xdg-open`,[e],{detached:!0,stdio:`ignore`}).unref()}const Jy=C(`@x-otto/coding:plugin-cli-passthrough`);function Yy(e){let t=e.manifest.contributes?.cli?.bin,n=t?x(e.dir,t):Xy(e.dir);if(n)return Zy(n,e.dir)}function Xy(e){let t=x(e,`package.json`);if(D(t))try{let n=JSON.parse(k(t,`utf8`));if(typeof n.bin==`string`)return x(e,n.bin);if(n.bin&&typeof n.bin==`object`){let t=Object.values(n.bin)[0];return typeof t==`string`?x(e,t):void 0}return}catch{return}}function Zy(e,t){if(!D(e))return;let n,r;try{n=Jr(e),r=Jr(t)}catch{return}let i=r.endsWith(`/`)?r:`${r}/`;if(!n.startsWith(i)&&n!==r){Jy.warn({candidate:e,pluginDir:t},`Plugin CLI bin resolves outside plugin directory (symlink escape rejected)`);return}try{if(!Zr(n).isFile())return}catch{return}return n}function Qy(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)){Jy.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 $y(e,t){let n=Qy(e,t),r=new Map;for(let[e,t]of n){if(t.length===1){r.set(e,t[0]);continue}Jy.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 eb(e,t,n){let r=Qy(e,t).get(n);return r&&r.length>=2?r.map(e=>e.id):void 0}function tb(e,t,n,r=6e4){return new Promise((i,a)=>{let o=Oi(e,t,{stdio:`inherit`,cwd:n,env:Je()}),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 nb(e,t={}){return Vn({cwd:t.workspaceDir??process.cwd(),homedir:t.homedir??ze(),bundledDirs:t.bundledDirs}).find(t=>t.id===e)}function rb(e,t,n={}){let r=nb(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)`}.`};cr(r.dir),a.length>0&&Jn(r.dir,a);let c=E(r);return{ok:!0,granted:[...a],pending:c.pendingCapabilities}}function ib(e,t={}){let n=nb(e,t);if(!n)return{found:!1,trusted:!1,gated:!1,declared:[],granted:[],pending:[]};let r=E(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 ab(e,t={}){let n=nb(e,t);return n?(ur(n.dir),!0):!1}const ob=C(`@x-otto/coding:plugin-theme-preset-loader`),sb=new Set([`dark`,`light`,`system`,`builtin`]);function cb(e){let t=[];for(let n of e){let e=n.manifest.contributes?.themePresets;if(!e?.length)continue;if(E(n).gated){ob.warn({pluginId:n.id},`plugin gated (untrusted), themePresets skipped`);continue}let r=e;r.length>Dn&&(ob.warn({pluginId:n.id,declared:r.length,limit:Dn},`plugin declares more theme presets than the per-plugin limit, truncated`),r=r.slice(0,Dn));for(let e of r){if(sb.has(e.localId)){ob.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{yo as AgentJobService,pt as AgentSession,ky as App,bt as CodingSessionPool,Uv as DEFAULT_WORKSPACE_KEY,Pa as ExtensionManager,bn as HIGH_RISK_CAPABILITIES,Hv as INDUCTOR_PLUGIN_ID,Ji as InstallManager,Uy as PLUGIN_LOG_TAIL_LINES,kn as PLUGIN_MANIFEST_FILENAME,An as POINT,Yi as RegistryClient,Kv as SANDBOX_ESCALATION_MARKER,Bi as SCHEDULE_LEASE_MIGRATIONS,yt as SandboxUnavailableError,Vi as ScheduleRegistry,Hi as SchedulerService,Ia as SigilResolverRegistry,m as apiCredentialId,zy as assertPortableArtifact,rb as authorizePlugin,Gy as buildExtensionContext,pa as buildMemoryStore,$y as buildPluginCliRegistry,Xi as builtinOfficialSource,wt as captureFiles,Zi as checkArchiveBomb,Qi as checkGitUpgrades,Xu as checkPluginConsistency,$i as checkUpgrades,dr as claudeTrustStorePath,ea as cleanTempDir,Hy as collectPluginPerfMetrics,cb as collectPluginThemePresets,Hc as compilePluginModule,Iu as compilePluginPanels,Gc as computeSourceHash,Ny as createApp,ta as createArchive,Nn as createBuiltinHashtags,zd as createBuiltinResolvers,fr as createClaudeHookBridgeHooks,Fn as createFileProvider,Fy as createFrontendPort,df as createLessonInjectionHooks,Ui as createLocalFireOwnership,Ln as createPluginInputRegistry,Wi as createRemoteFireOwnership,Gi as createRemoteScheduleStore,qi as createScheduleStore,Ot as createSessionStableInjectionHooks,ff as createSkillCatalogInjectionHooks,na as createTempDir,tf as createToolGuidanceHook,mr as defaultHookRunner,Nt as defaultMaxToolTurnExtensions,js as defaultPostInstallExecutor,Ft as deriveSessionTitle,hr as detectClaudeExecutableSurface,zn as detectPluginExecutableSurface,gr as detectProjectConfigGating,ra as detectUninstallTarget,_r as discoverFileCommands,Bn as discoverPlugins,Hn as dispatch,yr as evaluateClaudeTrust,Wn as evaluatePluginTrust,xr as evaluateWorkspaceTrustPrompt,Sr as expandCommandBody,Ga as expandSigilChips,ia as extractArchive,eb as findPluginCliNameConflict,Ry as findPortabilityViolations,i as findWorkspaceRoot,Ao as getIncompleteSubagentReason,ko as getLastAssistantText,It as globalAgentJobRegistry,Rt as globalAgentObservability,Bt as globalProcessRegistry,qn as grantPluginCapabilities,Yn as grantedPluginCapabilities,Ly as hasPortabilityViolations,ib as inspectPluginAuthorization,Gu as installPluginFromDir,Wu as installPluginFromPackage,Bc as installPluginHostExternals,Cr as interpretPreToolUse,$u as isInternalDelegatedSession,Xn as isPluginTrusted,wr as isProjectTrusted,Er as isStrictProjectConfigEnabled,aa as listInstalledItems,Dr as loadClaudeHooksConfig,Zc as loadPluginModule,kr as matchesHookMatcher,Gt as messagesFromSnapshot,qy as openTarget,Ar as parseClaudeHooks,jr as parseDotMcpJson,Qn as parsePluginManifest,oa as parseRegistry,er as pluginTrustStorePath,wu as purgePluginState,tr as readHighRiskCapabilities,Wy as readPluginLogTail,$v as readSkillLoopStatus,go as readTaskOutputTail,Kt as reconstructMessages,Ju as recordPluginInstalled,Yu as recordPluginUninstalled,qu as removeInstalledPluginEntry,nr as resolveActions,Nr as resolveClaudeMcpServers,zc as resolveHostExternalPaths,Uu as resolvePackageDir,Yy as resolvePluginCliBin,Ea as resolvePluginMcpServers,Fr as resolveProjectConfigTrusted,Jt as resolveSessionTitle,Xt as restoreFiles,ab as revokePluginAuthorization,qc as rewriteArtifactSourceHash,Ky as runPluginScript,sa as scanInstalledVersions,ar as sigilOf,tb as spawnPluginCli,sr as trustPlugin,Lr as trustProject,ca as uninstall,lr as untrustPlugin,Rr as untrustProject,Ku as upsertInstalledPluginEntry,la as validateExtractedPaths};
506
506
  //# sourceMappingURL=index.js.map