@x-otto/coding 0.0.1-alpha.2 → 0.0.1-alpha.21

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,19 @@
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 Ve,extname as He,isAbsolute as Ue,join as b,relative as We,resolve as x,sep as Ge}from"node:path";import{CodedError as Ke,ProviderError as qe,attachLogListener as Je,buildAllowedEnv as Ye,checkShellCommand as Xe,createLogger as S,installGlobalProxyDispatcher as Ze,markStartupPhase as Qe,parseFrontmatterList as $e,setDefaultProxy as et,splitFrontmatter as tt,traceStartupPhase as nt}from"@x-otto/shared";import{AutoMemory as rt,DEFAULT_MEMORY_SOURCES as it,FileStateManager as at,FileSystemMemoryStore as ot,HttpMemoryStore as st,InMemoryArchiveStorage as ct,OperationalLearningStore as lt,createMemoryAutoExtractor as ut,createMemoryManager as dt,createOverlayMemoryStore as ft,discoverAgentsSources as pt}from"@x-otto/memory";import{AgentSession as mt,FleetMonitor as ht,MemoryGovernor as gt,RUNTIME_DEFAULTS as _t,ResidencyGovernor as vt,SYSTEM_PROMPT_SECTIONS as yt,SandboxUnavailableError as bt,SessionPool as xt,applyDiff as St,attachAgentObserver as Ct,buildEngineStores as wt,captureFiles as Tt,createAgentRuntime as Et,createDocSyncReminderHooks as Dt,createMemoryDeltaHooks as Ot,createSessionStableInjectionHooks as kt,createSessionStableInjectionHooks as At,createTodoReminderHooks as jt,createToolHookExecutor as Mt,createWorktree as Nt,defaultMaxToolTurnExtensions as Pt,defaultMaxToolTurnExtensions as Ft,deriveSessionTitle as It,globalAgentJobRegistry as Lt,globalAgentJobRegistry as Rt,globalAgentObservability as zt,globalAgentObservability as Bt,globalProcessRegistry as Vt,globalProcessRegistry as C,globalProcessRuntime as Ht,hasRepoDrifted as Ut,installAgentJobReaper as Wt,installProcessReaper as Gt,messagesFromSnapshot as Kt,reconstructMessages as qt,removeWorktree as Jt,resolveSessionTitle as Yt,resolveTodoContinuationConfig as Xt,restoreFiles as Zt,revertDiff as Qt,touchesCapabilitySurface as $t,touchesForbiddenZone as en,worktreeDiff as tn}from"@x-otto/runtime";import{atomicWriteFile as nn,createFileStorageHost as rn,createInMemoryPanelStatePersistence as an,createInMemoryPasteStatePersistence as on,createLiveTappedAppendLog as sn,createPersistence as cn}from"@x-otto/persistence";import{SESSION_MAX_PER_SESSION_BYTES as ln,SESSION_RESUME_WINDOW_MESSAGES as un}from"@x-otto/session-contract";import{createRegistrySkillProvider as dn,createSkillRegistry as fn}from"@x-otto/skill";import{BUILTIN_PROMPTS_DIR as pn,PromptManager as mn,SKILL_LOOP_GUIDANCE as hn,SUBAGENT_GUARDRAILS as gn,assembleGenericSubAgentPrompt as _n,buildLessonInjection as vn,createPromptProvider as yn,resolveAgentProfile as bn}from"@x-otto/prompt";import{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 w,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 T,evaluateWhen as Gn,filterEngineCompatible as Kn,grantPluginCapabilities as qn,grantedPluginCapabilities as Jn,isPluginTrusted as Yn,isPluginTrusted as Xn,parsePluginManifest as Zn,parsePluginManifest as Qn,pluginTrustStorePath as $n,readHighRiskCapabilities as er,resolveActions as tr,resolveActions as nr,resolveActivationEvents as rr,sigilOf as ir,topoSortPlugins as ar,trustPlugin as or,untrustPlugin as sr}from"@x-otto/plugin";import{claudeTrustStorePath as cr,createClaudeHookBridgeHooks as lr,createClaudeHookBridgeHooks as ur,defaultHookRunner as dr,detectClaudeExecutableSurface as fr,detectProjectConfigGating as pr,discoverFileCommands as mr,discoverFileCommands as hr,evaluateClaudeTrust as gr,evaluateClaudeTrust as _r,evaluateWorkspaceTrustPrompt as vr,expandCommandBody as yr,interpretPreToolUse as br,isProjectTrusted as xr,isProjectTrusted as Sr,isStrictProjectConfigEnabled as Cr,loadClaudeHooksConfig as wr,mapClaudeAgentToolNames as Tr,matchesHookMatcher as Er,parseClaudeHooks as Dr,parseDotMcpJson as Or,parseDotMcpJson as kr,resolveClaudeMcpServers as Ar,resolveClaudeMcpServers as jr,resolveProjectConfigTrusted as Mr,resolveProjectConfigTrusted as Nr,trustProject as Pr,untrustProject as Fr}from"@x-otto/claude-compat";import{McpManager as Ir}from"@x-otto/mcp";import{appendFileSync as Lr,closeSync as Rr,constants as zr,existsSync as E,lstatSync as Br,mkdirSync as D,mkdtempSync as Vr,openSync as Hr,readFileSync as O,readdirSync as Ur,readlinkSync as Wr,realpathSync as Gr,renameSync as Kr,rmSync as qr,statSync as Jr,symlinkSync as Yr,unlinkSync as Xr,writeFileSync as k,writeSync as Zr}from"node:fs";import{InMemorySession as Qr,RelationalSessionPersistence as $r,SESSION_MAX as ei,SqliteSessionRepository as ti,createNoopSessionWriteLeaseManager as ni,createSessionWriteLeaseManager as ri,reassembleSnapshot as ii}from"@x-otto/session";import{Orchestrator as ai,createHandoffTool as oi,createSwarm as si}from"@x-otto/orchestrator";import{BUILTIN_AGENT_PROFILES as ci,SettingsManager as li}from"@x-otto/setting";import{createHash as ui,randomUUID as di}from"node:crypto";import{Agent as fi}from"@x-otto/agent";import{CallbackChannel as pi,CommandChannel as mi,NotificationDispatcher as hi,PresenceTracker as gi,TerminalChannel as _i,TimestampPresenceGate as vi}from"@x-otto/notification";import{DEFAULT_WORKSPACE_KEY as yi,createWorkspaceResolver as bi,genWorkspaceId as xi,readMarker as Si,workspaceKey as Ci,writeMarker as wi}from"@x-otto/workspace";import{spawn as Ti,spawnSync as Ei}from"node:child_process";import{mkdir as Di,open as Oi,readFile as ki,writeFile as Ai}from"node:fs/promises";import{Worker as ji}from"node:worker_threads";import{fileURLToPath as Mi,pathToFileURL as Ni}from"node:url";import{DeviceFlowOAuthTemplate as Pi,PKCEOAuthTemplate as Fi}from"@x-otto/provider";import{createTodoStore as Ii}from"@x-otto/orchestration-contracts";import{SCHEDULE_LEASE_MIGRATIONS as Li,ScheduleRegistry as Ri,SchedulerService as zi,createLocalFireOwnership as Bi,createRemoteFireOwnership as Vi,createRemoteScheduleStore as Hi,createScheduleCapability as Ui,createScheduleStore as Wi}from"@x-otto/schedule";import{InstallManager as Gi,RegistryClient as Ki,builtinOfficialSource as qi,checkArchiveBomb as Ji,checkGitUpgrades as Yi,checkUpgrades as Xi,cleanTempDir as Zi,createArchive as Qi,createTempDir as $i,detectUninstallTarget as ea,extractArchive as ta,listInstalledItems as na,parseRegistry as ra,scanInstalledVersions as ia,uninstall as aa,validateExtractedPaths as oa}from"@x-otto/install";b(ze(),`.otto`);const sa=c(process.env.OTTO_REMOTE_STORAGE_TIMEOUT_MS,3e4),ca=S(`@x-otto/coding:rfc344-compaction-cost`);function la(e,t){if(!e?.remote?.getAuth)throw Error(`storage.${t}.url is configured, so storage.remote.getAuth is required.`);return e.remote}function ua(e,t,n,r,i){let a=da(e,t,n,r,i);return a&&s()?ft(a):a}function da(e,t,n,r,i){let a=e?.memory;if(a&&`dir`in a)return new ot(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 st({baseUrl:o,getAuth:a.getAuth,fetch:a.fetch??globalThis.fetch,timeoutMs:a.timeoutMs??sa,userId:n?.userId,workspaceKey:()=>r?.()?.key,isWorkspaceSyncEnabled:()=>r?.()?.memorySyncEnabled===!0,localDir:t,onConflict:i})}if(t)return new ot(t)}function fa(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 pa(e){let{model:t,getModel:n,memoryStore:r,providerRegistry:i,autoMemory:a,workspaceDir:s,getLoadSessionEntries:c,getActiveSessionBytes:l,getEffectiveMaxBytes:u,getCoverageThresholds:d}=e,f=fa({model:t,getModel:n,providerRegistry:i,onUsage:e=>ca.info({inputTokens:e.inputTokens,outputTokens:e.outputTokens,cacheReadTokens:e.cacheReadTokens,cacheWriteTokens:e.cacheWriteTokens},`[RFC-344] compaction summarize request cost`)}),p=it.filter(e=>e.writable),m=pt(s??process.cwd()),h=o()?[{path:`~/.claude/CLAUDE.md`,writable:!1},...pt(s??process.cwd(),{fileName:`CLAUDE.md`})]:[],g=[...p,...h,...m],_=r&&a?[...g,a.asSource()]:void 0;return dt({summarize:f,model:t?{contextWindow:t.contextWindow,maxOutput:t.maxOutputTokens}:void 0,getContextWindow:()=>(n?.()??t)?.contextWindow,maxContentBytes:ln,getMaxContentBytes:u,getCoverageThresholds:d,getEstimatedBytes:l,memoryStore:r,sources:_,archiveStorage:new ct,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 ma(e){let{options:t,workspaceDir:n,providerRegistry:r,defaultModel:i,resolveEffectiveModel:a,repoRef:o,getWorkspaceRef:c}=e,l=t.storage?.host?{host:rn({baseDir:t.storage.host.dir,namespaces:t.storage.host.namespaces}),token:t.storage.host.token}:null,u=ua(t.storage,n,t.userIdentity,c,e.onMemoryConflict),d=u?new rt({store:u}):null,f=t.memory??pa({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=wt({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??sa}:void 0,ephemeral:s()},{traceStore:t.traceStore,checkpointStore:t.checkpointStore}),{store:h,live:g}=sn(m.traceStore);return{storageHost:l,autoMemory:d,memory:f,traceStore:h,traceLive:g,checkpointStore:m.checkpointStore,clock:t.clock,memoryStore:u}}const ha={delegation:`task_delegate`,"task-observability":`task_inspect`,"file-state-refresh":`capture_file_state`},ga=new Set(Object.keys(ha));function _a(e){let t=new Set;for(let[n,r]of Object.entries(ha))e.has(r)&&t.add(n);return t}function va(e){let{skillProvider:t,workspaceDir:n,activePlugins:r,resolveEffectiveModel:i,providerRegistry:a,prompt:c,memoryStore:l,memoryAutoExtractConfig:u}=e,d=o()&&_r(n).gated,f=t?null:fn({workspaceDir:n,library:{...d?{projectDirs:[`.otto/skills`]}:{},pluginDirs:r().filter(e=>e.manifest.contributes?.skills!==!1).filter(e=>!T(e).gated).map(e=>({id:e.id,dir:b(e.dir,`skills`)}))}}),p=new at,m=s(),h=new lt({path:`${n}/.otto/lessons.json`,...l?{store:l,storePath:`./.otto/lessons.json`}:{},ephemeral:m});return{skillRegistry:f,fileStateManager:p,learningStore:h,localLearningStore:new lt({path:`${n}/.otto/local/lessons.json`,ephemeral:m}),memoryAutoExtractor:ut({llm:fa({getModel:i,providerRegistry:a}),store:h,config:u??{enabled:!0}}),completeText:fa({getModel:i,providerRegistry:a}),promptManager:new mn({provider:yn(c??{type:`local`,baseDir:pn}),knownCapabilities:ga})}}var ya=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}`}))}},ba=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 xa(e){return typeof e==`string`&&(e.startsWith(`./`)||e.startsWith(`../`)||e.startsWith(`.\\`))}function Sa(e,t){let n={...e};return xa(n.command)&&!Ue(n.command)&&(n.command=x(t,n.command)),Array.isArray(n.args)&&(n.args=n.args.map(e=>xa(e)?x(t,e):e)),n}function Ca(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=T(e);if(t.gated||!(e.manifest.capabilities?.includes(`mcp.server`)??!1)||t.pendingCapabilities.includes(`mcp.server`))continue;let r=kr(e.dir);for(let[t,i]of Object.entries(r))n[t]={...Sa(i,e.dir),_pluginId:e.id}}return n}const wa=(e,t,n)=>{let r=Ht.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 Ta(e){return e.code===`MCP_UNAUTHORIZED`?`MCP server "${e.name}" requires authentication. Run 'otto mcp login ${e.name}' to authenticate.`:null}var Ea=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?jr(this.workspaceDir):{},plugin:this.workspaceDir?Ca({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 Ir({skipOnError:!0,processSpawnFactory:wa,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=Ta(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)}},Da=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)}},Oa=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})}},ka=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]})}},Aa=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=T(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}}))}},ja=class{providers;deps;constructor(e){this.deps=e,this.providers=[new Da(e.mcp),...e.skills?[new Oa(e.settings,e.skills)]:[],new ka(e.settings,e.getAgentProfiles),...e.getPlugins?[new Aa(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)}},Ma=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}},Na=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 Pa=S(`@x-otto/coding:sigil-expand`),Fa=/\[@([a-z][\w.-]*):((?:\\\]|[^\]])+)\]/g,Ia=/\[@([a-z][\w.-]*)\]/g,La=/@([\w./\-]+):(\d+)(?:-(\d+))?/g,Ra=/@def:([A-Za-z_]\w*)/g;function za(e,t){let n=new Set,r=[];for(let i of[Fa,Ia]){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,`]`)})}}La.lastIndex=0;for(let i of e.matchAll(La)){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)}))}Ra.lastIndex=0;for(let i of e.matchAll(Ra)){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 Ba(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 Va(e,t){return e.length<=t?e:`${e.slice(0,t)}\n[...truncated ${e.length-t} chars...]`}async function Ha(e,t,n,r){let i=za(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 Pa.debug({chip:e.raw},`uiHostOnly resolver skipped in non-uiHost context`),null;let c=i.timeoutMs??1e4,l=await Ba(Promise.resolve().then(()=>i.resolve(e.param,s)),c);return l===``?null:[e.raw,Va(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`){Pa.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 Ua=e(import.meta.url);function Wa(e,t){let n=t.entries(e);if(!n?.length)return[];let r=T(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=b(e.dir,t.entryPath(r));if(!E(n)){t.logger.warn({pluginId:e.id,...t.idLogFields(r),modulePath:n},`${t.noun} entry not found, skipped`);continue}try{delete Ua.cache[n];let a=Ua(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 Ga(e,t,n){if(!n)return e.flatMap(e=>Wa(e,t));let r=new Map,i=[];for(let a of e)for(let e of Wa(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 Ka=S(`@x-otto/coding:plugin-a2ui-renderer-loader`),qa={capability:`a2ui.renderer`,axis:`a2uiRenderers`,noun:`a2ui renderer`,pendingNote:`RFC-210 D5`,logger:Ka,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 Ja(e){return Ga(e,qa)}function Ya(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 Xa=2e3;async function Za(e,t){for(let n of e)if(Ya(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 ${Xa}ms`)),Xa))]);if(Array.isArray(e)&&e.length>0)return e}catch(e){Ka.warn({a2uiRendererId:n.id,err:String(e)},`toPayload failed, trying next candidate (fail-soft)`)}return null}const Qa={file_read:[`read`],file_write:[`write`],file_edit:[`edit`],shell:[`bash`],search:[`find`,`grep`]};function $a(e){if(e===void 0)return;if(e.length===0)return[];let t=new Set;for(let n of e){let e=Qa[n];if(e&&e.length>0){for(let n of e)t.add(n);continue}t.add(n)}return[...t]}function eo(){return process.env.OTTO_SUBAGENT_MODEL_POLICY===`off`}var to=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(eo())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 no(e,t){let n=new Set(t);return e.filter(e=>n.has(e.name))}function ro(e,t,n,r,i){let a;return a=t||(n?no(e(),n):e()),r?.length&&(a=a.filter(e=>!r.includes(e.name))),i||(a=a.filter(e=>!Pe.has(e.name))),a}function io(e,t,n,r){let i=n?[...t.disallowedToolNames??[],...r]:t.disallowedToolNames;return ro(e,void 0,t.toolNames,i,t.allowSubagents)}const ao=[`edit`,`write`,`lsp_rename`,`bash`];function oo(e,t,n,r){let i=bn([...t,...ci],n),a=_a(new Set(r.map(e=>e.name)));return()=>e.assemblePreset({preset:`subagent`,agentName:n,profile:i,promptMode:i?.promptMode},a)}var so=class{modelResolver;constructor(e){this.deps=e,this.modelResolver=new to(e)}readAgentSources(e,t){let n=e?this.deps.settings.get(`agents`)?.[e]:void 0,r=t===`subagent`&&e?bn([...this.deps.getDeclarativeAgentProfiles(),...ci],e):void 0;return{slot:n?.default_workflow_slot,profileTier:r?.preferredModelTier,toolNames:n?.tools??$a(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 io(this.deps.getTools,i,n,ao)}resolveTools(e,t,n,r){return ro(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??[],...ao]:n.disallowedToolNames,u=this.resolveTools(e.tools,n.toolNames,l,n.allowSubagents);s.supportsTools===!1&&(u=[]);let d=_a(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??Ft(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=Xt(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,retryAccelerate:e.retryAccelerate,streamRetry:e.streamRetry??this.deps.getResilienceConfig?.().stream,networkDisconnectRetry:e.networkDisconnectRetry??co(this.deps.getResilienceConfig?.().networkDisconnect),describeImages:this.deps.describeImages}}};function co(e){if(e)return{maxRetries:e.maxRetries,initialDelayMs:e.intervalMs,backoffFactor:1,maxDelayMs:e.intervalMs}}const lo=zr.O_NOFOLLOW??0;function uo(e,t){let n=Hr(e,zr.O_WRONLY|zr.O_APPEND|zr.O_CREAT|lo,384);try{Zr(n,t.endsWith(`
1
+ import{createRequire as e}from"node:module";import{Devtools as t}from"@x-otto/devtools";import{AUTH_PATH as n,OTTO_HOME as r,SDK_VERSION as i,findWorkspaceRoot as a,findWorkspaceRoot as o,isClaudeCompatEnabled as s,isShadowModeEnabled as c,mergeResilienceConfig as l,normalizeEnv as u}from"@x-otto/env";import{CATEGORY_POLICY as d,ModelCatalogStore as f,OAUTH_PROVIDER_IDS as p,SETUP_MODEL_ID as m,TIER_TO_SLOT as h,apiCredentialId as g,builtinSlotModels as ee,collectModelCapabilityFacts as _,complete as te,createCredentialBackendRegistry as ne,createDefaultAuthStore as re,createDefaultModelRegistry as ie,createModelSlot as ae,createModelUsabilityGate as oe,createProviderRegistry as se,createWireProtocolRegistry as ce,fetchModels as le,isBuiltinProviderId as ue,mergeFetchedModels as de,rankModelsBySlotAffinity as fe,registerCacheReportingApi as pe,registerProviderDescriptor as me,resolveModelsRequest as he,stream as ge,unregisterCacheReportingApi as _e,unregisterProviderDescriptor as ve}from"@x-otto/ai";import{Diagnoser as ye,FailureSignalStore as be,PermissionAuditLog as xe,assessSandboxSafety as Se,bashAlwaysAllowPrefix as Ce,compilePolicyFromSetting as we,computeSandboxRoots as Te,createDisabledToolsPolicy as Ee,createEgressAllowlistPolicy as De,createFailureSignalHook as Oe,createPermissionDenyHook as ke,createPermissionGuardHook as Ae,createPermissionModePolicy as je,createPermissionRegistry as Me,createPermissionToolSetsFromRegistry as Ne,defaultDeniedRoots as Pe,extractWriteTargets as Fe,isWellFormedAllowEntry as Ie}from"@x-otto/guard";import{CapabilityGapReportStore as Le,ORCHESTRATION_TOOL_NAMES as Re,createPlatformSandbox as ze,createToolRegistry as Be,credentialDenyReadPaths as Ve,isPlatformSandboxAvailable as He}from"@x-otto/tools";import{appendFileSync as Ue,closeSync as We,constants as Ge,existsSync as v,fsyncSync as Ke,lstatSync as qe,mkdirSync as y,mkdtempSync as Je,openSync as Ye,readFileSync as b,readdirSync as Xe,readlinkSync as Ze,realpathSync as Qe,renameSync as $e,rmSync as et,statSync as tt,symlinkSync as nt,unlinkSync as rt,writeFileSync as x,writeSync as it}from"node:fs";import{homedir as at,tmpdir as ot}from"node:os";import{dirname as S,extname as st,isAbsolute as ct,join as C,relative as lt,resolve as w,sep as ut}from"node:path";import{CodedError as dt,ProviderError as ft,attachLogListener as pt,buildAllowedEnv as mt,checkShellCommand as ht,createLogger as T,installGlobalProxyDispatcher as gt,mapClaudeAgentToolNames as _t,markStartupPhase as vt,parseFrontmatterList as yt,setDefaultProxy as bt,splitFrontmatter as xt,traceStartupPhase as St}from"@x-otto/shared";import{AutoMemory as Ct,DEFAULT_MEMORY_SOURCES as wt,EvolutionSignalStore as Tt,FileStateManager as Et,FileSystemMemoryStore as Dt,HttpMemoryStore as Ot,InMemoryArchiveStorage as kt,OperationalLearningStore as At,computeLessonContentHash as jt,createMemoryAutoExtractor as Mt,createMemoryManager as Nt,createOverlayMemoryStore as Pt,createSignalLog as Ft,discoverAgentsSources as It,formatMessageForSummary as Lt}from"@x-otto/memory";import{Agent as Rt,wireSnapshotStore as zt}from"@x-otto/agent";import{AgentSession as Bt,FleetMonitor as Vt,HostRegistry as Ht,MemoryGovernor as Ut,RUNTIME_DEFAULTS as Wt,ResidencyGovernor as Gt,SandboxUnavailableError as Kt,SessionPool as qt,applyDiff as Jt,attachAgentObserver as Yt,buildEngineStores as Xt,captureFiles as Zt,checkApply as Qt,createAgentRuntime as $t,createDocSyncReminderHooks as en,createLlmEscalationReviewer as tn,createMemoryDeltaHooks as nn,createSessionStableInjectionHooks as rn,createTodoReminderHooks as an,createToolHookExecutor as on,createWorktree as sn,decideApply as cn,defaultMaxToolTurnExtensions as ln,defaultMaxToolTurnExtensions as un,definePromptSection as dn,deriveSessionTitle as fn,globalAgentJobRegistry as pn,globalAgentJobRegistry as mn,globalAgentObservability as hn,globalAgentObservability as gn,globalProcessRuntime as _n,globalProcessRuntime as E,globalToolResultStore as vn,hasRepoDrifted as yn,installAgentJobReaper as bn,installExitReaper as xn,messagesFromSnapshot as Sn,reconstructMessages as Cn,removeWorktree as wn,resolveSessionTitle as Tn,resolveTodoContinuationConfig as En,restoreFiles as Dn,revertDiff as On,touchesCapabilitySurface as kn,touchesForbiddenZone as An,worktreeDiff as jn}from"@x-otto/runtime";import{atomicWriteFile as Mn,createFileStorageHost as Nn,createInMemoryPanelStatePersistence as Pn,createInMemoryPasteStatePersistence as Fn,createLiveTappedAppendLog as In,createPersistence as Ln}from"@x-otto/persistence";import{SESSION_MAX_PER_SESSION_BYTES as Rn,SESSION_RESUME_WINDOW_MESSAGES as zn}from"@x-otto/session-contract";import{createRegistrySkillProvider as Bn,createSkillRegistry as Vn}from"@x-otto/skill";import{BUILTIN_PROMPTS_DIR as Hn,PromptManager as Un,SUBAGENT_GUARDRAILS as Wn,assembleGenericSubAgentPrompt as Gn,buildLessonInjection as Kn,createPromptProvider as qn,resolveAgentProfile as Jn}from"@x-otto/prompt";import{HIGH_RISK_CAPABILITIES as Yn,HIGH_RISK_CAPABILITIES as Xn,ID_RE as Zn,MAX_I18N_ENTRIES_PER_PLUGIN as Qn,MAX_I18N_FILE_BYTES as $n,MAX_I18N_LOCALE_FILES_PER_PLUGIN as er,MAX_I18N_TRANSLATION_BYTES as tr,MAX_THEME_PRESETS_PER_PLUGIN as nr,PLUGIN_API_VERSION as rr,PLUGIN_MANIFEST_FILENAME as ir,PLUGIN_MANIFEST_FILENAME as D,POINT as ar,PluginI18nRegistry as or,SHELL_POINTS as sr,createBuiltinHashtags as cr,createBuiltinHashtags as lr,createFileProvider as ur,createFileProvider as dr,createPluginInputRegistry as fr,createPluginInputRegistry as pr,detectPluginExecutableSurface as mr,discoverPlugins as hr,discoverPlugins as gr,dispatch as _r,evaluateContextKeys as vr,evaluatePluginTrust as yr,evaluatePluginTrust as O,evaluateWhen as br,filterEngineCompatible as xr,grantPluginCapabilities as Sr,grantPluginCapabilities as Cr,grantPluginCapabilitiesWithVersion as wr,grantedPluginCapabilities as Tr,grantedPluginCapabilitiesForVersion as Er,isPluginTrusted as Dr,isPluginTrusted as Or,isSensitiveField as kr,mergeConfigWithDefaults as Ar,parsePluginManifest as jr,parsePluginManifest as Mr,pluginTrustStorePath as Nr,readHighRiskCapabilities as Pr,redactSensitiveFields as Fr,resolveActions as Ir,resolveActions as Lr,resolveActivationEvents as Rr,resolveManifestPlane as zr,sigilOf as Br,topoSortPlugins as Vr,trustPlugin as Hr,trustPlugin as Ur,untrustPlugin as Wr,untrustPlugin as Gr}from"@x-otto/plugin";import{claudeTrustStorePath as Kr,createClaudeHookBridgeHooks as qr,createClaudeHookBridgeHooks as Jr,defaultHookRunner as Yr,detectClaudeExecutableSurface as Xr,discoverFileCommands as Zr,discoverFileCommands as Qr,evaluateClaudeTrust as $r,evaluateClaudeTrust as ei,expandCommandBody as ti,interpretPreToolUse as ni,isProjectTrusted as ri,loadClaudeHooksConfig as ii,matchesHookMatcher as ai,parseClaudeHooks as oi,resolveClaudeMcpServers as si,resolveClaudeMcpServers as ci,trustProject as li,untrustProject as ui}from"@x-otto/claude-compat";import{McpManager as di,parseDotMcpJson as fi,parseDotMcpJson as pi}from"@x-otto/mcp";import{InMemorySession as mi,RelationalSessionPersistence as hi,SESSION_MAX as gi,SqliteSessionRepository as _i,createNoopSessionWriteLeaseManager as vi,createSessionWriteLeaseManager as yi,reassembleSnapshot as bi,rowToEntry as xi}from"@x-otto/session";import{Orchestrator as Si,createHandoffTool as Ci,createSwarm as wi}from"@x-otto/orchestrator";import{BUILTIN_AGENT_PROFILES as Ti,SettingsManager as Ei,detectProjectConfigGating as Di,evaluateWorkspaceTrustPrompt as Oi,isProjectTrusted as ki,isStrictProjectConfigEnabled as Ai,parseResilienceEnvOverride as ji,resolveProjectConfigTrusted as Mi,resolveProjectConfigTrusted as Ni,validateResilienceOverride as Pi}from"@x-otto/setting";import{createHash as Fi,randomUUID as Ii}from"node:crypto";import{CallbackChannel as Li,CommandChannel as Ri,NotificationDispatcher as zi,PresenceTracker as Bi,TerminalChannel as Vi,TimestampPresenceGate as Hi}from"@x-otto/notification";import{DEFAULT_WORKSPACE_KEY as Ui,createWorkspaceResolver as Wi,genWorkspaceId as Gi,readMarker as Ki,workspaceKey as qi,writeMarker as Ji}from"@x-otto/workspace";import{mkdir as Yi,open as Xi,readFile as Zi,writeFile as Qi}from"node:fs/promises";import{spawn as $i,spawnSync as ea}from"node:child_process";import{createHookRegistry as ta,defineHook as k,isWaterfallTiming as na}from"@x-otto/hooks";import{Worker as ra}from"node:worker_threads";import{fileURLToPath as ia,pathToFileURL as aa}from"node:url";import{DeviceFlowOAuthTemplate as oa,PKCEOAuthTemplate as sa}from"@x-otto/provider";import{createTodoStore as ca}from"@x-otto/orchestration-contracts";import{SCHEDULE_LEASE_MIGRATIONS as la,ScheduleRegistry as ua,SchedulerService as da,createLocalFireOwnership as fa,createRemoteFireOwnership as pa,createRemoteScheduleStore as ma,createScheduleCapability as ha,createScheduleStore as ga}from"@x-otto/schedule";import{SYSTEM_PROMPT_SECTIONS as A,applySectionBudget as _a,boundFragment as va,contextFragmentBytes as ya,getToolCallsByAssistantMessage as ba}from"@x-otto/interchange";import{RegistryClient as xa,builtinOfficialSource as Sa,checkArchiveBomb as Ca,checkGitUpgrades as wa,checkUpgrades as Ta,cleanTempDir as Ea,createArchive as Da,createTempDir as Oa,detectUninstallTarget as ka,extractArchive as Aa,install as ja,installSkill as Ma,listInstalledItems as Na,parseRegistry as Pa,scanInstalledVersions as Fa,uninstall as Ia,validateExtractedPaths as La}from"@x-otto/install";C(at(),`.otto`);const Ra=u(process.env.OTTO_REMOTE_STORAGE_TIMEOUT_MS,3e4),za=T(`@x-otto/coding:rfc344-compaction-cost`),Ba=T(`@x-otto/coding:rfc387-prefix-degradation`);function Va(e,t){if(!e?.remote?.getAuth)throw Error(`storage.${t}.url is configured, so storage.remote.getAuth is required.`);return e.remote}function Ha(e,t,n,r,i){let a=Ua(e,t,n,r,i);return a&&c()?Pt(a):a}function Ua(e,t,n,r,i){let a=e?.memory;if(a&&`dir`in a)return new Dt(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??Ra,userId:n?.userId,workspaceKey:()=>r?.()?.key,isWorkspaceSyncEnabled:()=>r?.()?.memorySyncEnabled===!0,localDir:t,onConflict:i})}if(t)return new Dt(t)}function Wa(e,t){let n=()=>({ok:!1,fallbackText:Ka(e)});if(!t||t.length===0)return n();let r=e[0],i=e[e.length-1];if(!r||!i)return n();let a=t.findIndex(e=>Ga(e,r));if(a<0)return n();let o=-1;for(let e=t.length-1;e>=a;e--)if(Ga(t[e],i)){o=e;break}return o<0||o-a+1>e.length*2?n():{ok:!0,messages:t.slice(a,o+1)}}function Ga(e,t){if(e.role!==t.role)return!1;if(e.role===`tool_result`&&t.role===`tool_result`)return e.toolCallId===t.toolCallId;if(e.role===`assistant`&&t.role===`assistant`){let n=Array.isArray(e.content)?e.content.filter(e=>e.type===`tool_call`):[],r=Array.isArray(t.content)?t.content.filter(e=>e.type===`tool_call`):[];if(n.length>0&&r.length>0&&n.length===r.length)return n.every((e,t)=>e.id===r[t].id)}return JSON.stringify(e.content)===JSON.stringify(t.content)}function Ka(e){return e.map(Lt).join(`
2
+
3
+ `)}function qa(e){let{model:t,getModel:n,providerRegistry:r,onUsage:i,getWireSnapshot:a}=e;return async(e,o)=>{let s=n?.()??t;if(!s)throw Error(`No model available — sign in or pick a model first.`);let c=r.get(s.api),l=o?.prefix?.sessionId,u=l&&a?a(l):void 0,d=u!==void 0&&u.modelId===s.id;l&&a&&!d&&Ba.info({sessionId:l,reason:u===void 0?`snapshot-missing`:`model-mismatch`,snapshotModelId:u?.modelId,currentModelId:s.id},`[RFC-387] compaction prefix degraded to legacy (no snapshot assembly)`);let f=d?u.context:void 0,p=o?.prefix?.messages,m=p&&p.length>0&&f?.messages?Wa(p,f.messages):void 0;p&&p.length>0&&f?.messages&&m?.ok!==!0&&Ba.info({sessionId:l,reason:`replay-mismatch`},`[RFC-436] compaction messages replay degraded to rendered text`);let h;h=m?.ok===!0?[...m.messages,{role:`user`,content:e,timestamp:Date.now()}]:m?[{role:`user`,content:`${e}\n<conversation>\n${m.fallbackText}\n</conversation>`,timestamp:Date.now()}]:[{role:`user`,content:e,timestamp:Date.now()}];let g=await ge(s,c,{model:s,systemPrompt:f?.systemPrompt??``,...f?.systemPromptSegments?{systemPromptSegments:f.systemPromptSegments}:{},messages:h,...f?.tools?{tools:f.tools}:{},cacheRetention:o?.prefix?.cacheRetention??`long`,maxTokens:o?.maxTokens},{signal:o?.signal}).result();return i&&g.usage&&i(g.usage,{sessionId:o?.prefix?.sessionId}),g.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
4
+ `)}}function Ja(e,t){return{compactionLock:{acquire:async(t,n)=>{let r=e(t);if(!r)return!0;let i=r.compactionLockState?.(),a=i?.phase===`start`&&Date.now()-i.timestamp>6e4;return i?.phase===`start`&&!a?!1:(r.appendCompactionLock?.(`start`,n),!0)},release:async(t,n)=>{let r=e(t);if(!r)return;let i=r.compactionLockState?.();i?.phase!==`start`||i.token!==n||r.appendCompactionLock?.(`end`,n)}},compactionSpill:async(e,n)=>{let r=t();if(r)return vn.spill(r.id,e,n)}}}function Ya(e){return()=>{let t=e(),n=(e,t)=>t!=null&&process.env[e]===void 0?t:void 0;return{warn:n(`OTTO_MEMORY_COVERAGE_WARN_THRESHOLD`,t?.coverage_warn_threshold),error:n(`OTTO_MEMORY_COVERAGE_ERROR_THRESHOLD`,t?.coverage_error_threshold),floor:n(`OTTO_MEMORY_COVERAGE_FLOOR_THRESHOLD`,t?.coverage_floor_threshold)}}}function Xa(e){return e.includes(`./.otto/AGENTS.md`)?0:e.includes(`~/.otto/AGENTS.md`)?1:2}function Za(e,t){try{let n=C(t,S(e.indexPath),`memory`),r=new Map;for(let e of Xe(n,{withFileTypes:!0}))!e.isFile()||!e.name.endsWith(`.md`)||r.set(`memory/${e.name}`,tt(C(n,e.name)).mtimeMs);return r}catch{return}}function Qa(e){let{model:t,getModel:n,memoryStore:r,providerRegistry:i,autoMemory:a,workspaceDir:o,getLoadSessionEntries:c,getActiveSessionBytes:l,getEffectiveMaxBytes:u,getRealInputTokens:d,getCoverageThresholds:f,getToolRegistry:p,compactionLock:m,compactionSpill:h,clock:g}=e,ee=qa({model:t,getModel:n,providerRegistry:i,getWireSnapshot:e=>zt.get(e),onUsage:(e,t)=>za.info({sessionId:t?.sessionId,inputTokens:e.inputTokens,outputTokens:e.outputTokens,cacheReadTokens:e.cacheReadTokens,cacheWriteTokens:e.cacheWriteTokens},`[RFC-344] compaction summarize request cost`)}),_=[...wt].filter(e=>e.writable).sort((e,t)=>Xa(e.path)-Xa(t.path)),te=It(o??process.cwd()),ne=s()?[{path:`~/.claude/CLAUDE.md`,writable:!1},...It(o??process.cwd(),{fileName:`CLAUDE.md`})]:[],re=[..._,...ne,...te],ie=r&&a?[...re,a.asSource()]:void 0;return Nt({entryMtimes:r&&a?Za(a,o??process.cwd()):void 0,clock:g,summarize:ee,compaction:{prefixReuse:process.env.OTTO_RFC387_PREFIX_REUSE!==`0`},prune:{regenerableToolNames:p?()=>p().listRegenerableNames():void 0},model:t?{contextWindow:t.contextWindow,maxOutput:t.maxOutputTokens}:void 0,getContextWindow:()=>(n?.()??t)?.contextWindow,maxContentBytes:Rn,getMaxContentBytes:u,getRealInputTokens:d,getCoverageThresholds:f,getEstimatedBytes:l,memoryStore:r,sources:ie,archiveStorage:new kt,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)},compactionLock:m,compactionSpill:h})}function $a(e){let{options:t,workspaceDir:n,providerRegistry:r,defaultModel:i,resolveEffectiveModel:a,repoRef:o,getWorkspaceRef:s}=e,l=t.storage?.host?{host:Nn({baseDir:t.storage.host.dir,namespaces:t.storage.host.namespaces}),token:t.storage.host.token}:null,u=Ha(t.storage,n,t.userIdentity,s,e.onMemoryConflict),d=u?new Ct({store:u}):null,f=t.memory??Qa({model:i,getModel:a,storage:t.storage,memoryStore:u,providerRegistry:r,autoMemory:d,workspaceDir:n,clock:t.clock,getLoadSessionEntries:()=>o.current?async e=>(await o.current.loadEntries(e)).map(e=>({type:e.type,seq:e.seq,data:e.data})):void 0,compactionLock:e.compactionLock,compactionSpill:e.compactionSpill}),p=t.storage?.session,m=Xt({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??Ra}:void 0,ephemeral:c()},{traceStore:t.traceStore,checkpointStore:t.checkpointStore}),{store:h,live:g}=In(m.traceStore);return{storageHost:l,autoMemory:d,memory:f,traceStore:h,traceLive:g,checkpointStore:m.checkpointStore,clock:t.clock,memoryStore:u}}const eo={delegation:`task_delegate`,"task-observability":`task_inspect`,"file-state-refresh":`capture_file_state`},to=new Set(Object.keys(eo));function no(e){let t=new Set;for(let[n,r]of Object.entries(eo))e.has(r)&&t.add(n);return t}function ro(e){let{skillProvider:t,workspaceDir:n,activePlugins:r,resolveEffectiveModel:i,providerRegistry:a,prompt:o,memoryStore:l,memoryAutoExtractConfig:u,evolutionSignals:d}=e,f=s()&&(e.compatProducts?.trustVerdict.gated??!0),p=t?null:Vn({workspaceDir:n,library:{...f?{projectDirs:[`.otto/skills`]}:{},pluginDirs:r().filter(e=>e.manifest.contributes?.skills!==!1).filter(e=>!O(e).gated).map(e=>({id:e.id,dir:C(e.dir,`skills`)}))},evolutionSignals:d}),m=new Et,h=c(),g=new At({path:`${n}/.otto/lessons.json`,...l?{store:l,storePath:`./.otto/lessons.json`}:{},ephemeral:h});return{skillRegistry:p,fileStateManager:m,learningStore:g,localLearningStore:new At({path:`${n}/.otto/local/lessons.json`,ephemeral:h}),memoryAutoExtractor:Mt({llm:qa({getModel:i,providerRegistry:a}),store:g,config:u??{enabled:!0},readRelevantHits:async()=>(await g.list()).reduce((e,t)=>Math.max(e,t.relevantHitCount??0),0)}),completeText:qa({getModel:i,providerRegistry:a}),promptManager:new Un({provider:qn(o??{type:`local`,baseDir:Hn}),knownCapabilities:to})}}function io(e,t){return{hooks:Jr({workspaceDir:e}),mcpServers:ci(e),fileCommands:Qr(e,t),trustVerdict:ei(e)}}var ao=class{currentPermissionMode=void 0;constructor(e){this.deps=e}sync(e){let t=Ne(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(je(n,t)),this.currentPermissionMode=n}syncDisabledToolsPolicy(e){e&&e.length>0?this.registry.register(Ee(e)):this.registry.unregister(`setting::disabled-tools`)}syncEgressPolicy(e){e&&e.length>0?this.registry.register(De(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.registerWithSource(we({...t,name:`user::${t.name}`}),`user`)}},oo=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&&!He()?(this.logger.warn(`Sandbox pinned but no platform sandbox available (install bwrap on Linux); running WITHOUT sandbox`),this.strategy=null):this.strategy=e.enabled?ze({network:e.network,writablePaths:e.writablePaths,denyReadPaths:e.protectCredentials?Ve():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&&!He()?(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?ze({network:e.network===`deny`?`deny`:`allow`,writablePaths:this.configuredWritablePaths,denyReadPaths:e.protectCredentials?Ve():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 so(e){return typeof e==`string`&&(e.startsWith(`./`)||e.startsWith(`../`)||e.startsWith(`.\\`))}function co(e,t){let n={...e};return so(n.command)&&!ct(n.command)&&(n.command=w(t,n.command)),Array.isArray(n.args)&&(n.args=n.args.map(e=>so(e)?w(t,e):e)),n}function lo(e){let t=e.plugins??gr({cwd:e.workspaceDir,homedir:e.homedir,disabled:e.disabled}),n={};for(let e of t){if(e.manifest.contributes?.mcp===!1)continue;let t=O(e);if(t.gated||!(e.manifest.capabilities?.includes(`mcp.server`)??!1)||t.pendingCapabilities.includes(`mcp.server`))continue;let r=pi(e.dir);for(let[t,i]of Object.entries(r))n[t]={...co(i,e.dir),_pluginId:e.id}}return n}const uo=(e,t,n)=>{let r=E.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 fo(e){return e.code===`MCP_UNAUTHORIZED`?`MCP server "${e.name}" requires authentication. Run 'otto mcp login ${e.name}' to authenticate.`:null}var po=class{_manager=null;get manager(){return this._manager}getMcpClient(e){return this._manager?.getClient(e)}constructor(e,t,n,r,i,a){this.settings=e,this.toolRegistry=t,this.logger=n,this.workspaceDir=r,this.getResilienceConfig=i,this.compatProducts=a}resolveServerLayers(){return{otto:this.settings.get(`mcp_servers`)??{},claude:this.compatProducts?.mcpServers??{},plugin:this.workspaceDir?lo({workspaceDir:this.workspaceDir,homedir:at(),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 di({skipOnError:!0,processSpawnFactory:uo,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=fo(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)}},mo=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)}},ho=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})}},go=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]})}},_o=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=O(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}}))}},vo=class{providers;deps;constructor(e){this.deps=e,this.providers=[new mo(e.mcp),...e.skills?[new ho(e.settings,e.skills)]:[],new go(e.settings,e.getAgentProfiles),...e.getPlugins?[new _o(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)}},yo=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}},bo=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 xo=T(`@x-otto/coding:sigil-expand`),So=/\[@([a-z][\w.-]*):((?:\\\]|[^\]])+)\]/g,Co=/\[@([a-z][\w.-]*)\]/g,wo=/@([\w./-]+):(\d+)(?:-(\d+))?/g,To=/@def:([A-Za-z_]\w*)/g;function Eo(e,t){let n=new Set,r=[];for(let i of[So,Co]){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,`]`)})}}wo.lastIndex=0;for(let i of e.matchAll(wo)){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)}))}To.lastIndex=0;for(let i of e.matchAll(To)){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 Do(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 Oo(e,t){return e.length<=t?e:`${e.slice(0,t)}\n[...truncated ${e.length-t} chars...]`}async function ko(e,t,n,r){let i=Eo(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 xo.debug({chip:e.raw},`uiHostOnly resolver skipped in non-uiHost context`),null;let c=i.timeoutMs??1e4,l=await Do(Promise.resolve().then(()=>i.resolve(e.param,s)),c);return l===``?null:[e.raw,Oo(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`){xo.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 Ao=e(import.meta.url);function jo(e,t){let n=t.entries(e);if(!n?.length)return[];let r=O(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=C(e.dir,t.entryPath(r));if(!v(n)){t.logger.warn({pluginId:e.id,...t.idLogFields(r),modulePath:n},`${t.noun} entry not found, skipped`);continue}try{delete Ao.cache[n];let a=Ao(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 Mo(e,t,n){if(!n)return e.flatMap(e=>jo(e,t));let r=new Map,i=[];for(let a of e)for(let e of jo(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 No=T(`@x-otto/coding:plugin-a2ui-renderer-loader`),Po={capability:`a2ui.renderer`,axis:`a2uiRenderers`,noun:`a2ui renderer`,pendingNote:`RFC-210 D5`,logger:No,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 Fo(e){return Mo(e,Po)}function Io(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 Lo=2e3;async function Ro(e,t){for(let n of e)if(Io(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 ${Lo}ms`)),Lo))]);if(Array.isArray(e)&&e.length>0)return e}catch(e){No.warn({a2uiRendererId:n.id,err:String(e)},`toPayload failed, trying next candidate (fail-soft)`)}return null}const zo={file_read:[`read`],file_write:[`write`],file_edit:[`edit`],shell:[`bash`],search:[`find`,`grep`]};function Bo(e){if(e===void 0)return;if(e.length===0)return[];let t=new Set;for(let n of e){let e=zo[n];if(e&&e.length>0){for(let n of e)t.add(n);continue}t.add(n)}return[...t]}function Vo(){return process.env.OTTO_SUBAGENT_MODEL_POLICY===`off`}var Ho=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`),u=c?.default??l,f=(u===void 0?void 0:i.tryResolve(u))??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,capabilityFacts:_(e)};let n=await this.checkUsable(e);if(n.usable)return{model:e,decidedBy:t,rejected:p,capabilityFacts:_(e)};n.reason&&p.push({spec:e.id,reason:n.reason})}if(a.length===0&&!u&&!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?d[n]:void 0),h=await this.pickUsableFallback(i,m);return{model:h,decidedBy:`fallback`,rejected:p,capabilityFacts:_(h)}}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=fe(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 ae({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(Vo())return[];let o=d[e];if(!o||!t)return[];for(let e of this.slotCandidates(o,t,n))r.push(e);return r.length>0?r:ee(o,t,n)}};function Uo(e,t){let n=new Set(t);return e.filter(e=>n.has(e.name))}function Wo(e,t,n,r,i){let a;return a=t||(n?Uo(e(),n):e()),r?.length&&(a=a.filter(e=>!r.includes(e.name))),i||(a=a.filter(e=>!Re.has(e.name))),a}function Go(e,t,n,r){let i=n?[...t.disallowedToolNames??[],...r]:t.disallowedToolNames;return Wo(e,void 0,t.toolNames,i,t.allowSubagents)}const Ko=[`edit`,`write`,`lsp_rename`,`bash`];function qo(e,t,n,r){let i=Jn([...t,...Ti],n),a=no(new Set(r.map(e=>e.name)));return()=>e.assemblePreset({preset:`subagent`,agentName:n,profile:i,promptMode:i?.promptMode},a)}var Jo=class{modelResolver;constructor(e){this.deps=e,this.modelResolver=new Ho(e)}readAgentSources(e,t){let n=e?this.deps.settings.get(`agents`)?.[e]:void 0,r=t===`subagent`&&e?Jn([...this.deps.getDeclarativeAgentProfiles(),...Ti],e):void 0;return{slot:n?.default_workflow_slot,profileTier:r?.preferredModelTier,toolNames:n?.tools??Bo(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 Go(this.deps.getTools,i,n,Ko)}resolveTools(e,t,n,r){return Wo(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??h[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=ee(`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??[],...Ko]:n.disallowedToolNames,u=this.resolveTools(e.tools,n.toolNames,l,n.allowSubagents);s.supportsTools===!1&&(u=[]);let d=no(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}),p=await f(),m=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,g=e.thinkingLevel??(r?void 0:this.resolvePersistedThinkingLevel())??`medium`;return{id:e.id,model:s,titleModel:c,modelResolution:o,agentName:e.agentName,systemPrompt:p??``,systemTail:m?[m]:void 0,tools:u,thinkingLevel:g,maxToolTurns:e.maxToolTurns??n.maxToolTurns??this.deps.maxToolTurns,maxToolTurnExtensions:e.maxToolTurnExtensions??n.maxToolTurnExtensions??this.deps.maxToolTurnExtensions??un(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=En(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??Yo(this.deps.getResilienceConfig?.().networkDisconnect),lifecycleAsyncTimeoutMs:Xo(process.env.OTTO_LIFECYCLE_ASYNC_TIMEOUT_MS),describeImages:this.deps.describeImages}}};function Yo(e){if(e)return{maxRetries:e.maxRetries,initialDelayMs:e.intervalMs,backoffFactor:1,maxDelayMs:e.intervalMs}}function Xo(e){if(!e)return;let t=Number(e);return Number.isFinite(t)&&t>0?t:void 0}const Zo=Ge.O_NOFOLLOW??0;function Qo(e,t){let n=Ye(e,Ge.O_WRONLY|Ge.O_APPEND|Ge.O_CREAT|Zo,384);try{it(n,t.endsWith(`
3
5
  `)?t:t+`
4
- `)}finally{Rr(n)}}function fo(e,t=20){let n;try{return n=Hr(e,zr.O_RDONLY|lo),O(n,`utf-8`).replace(/\n+$/,``).split(`
6
+ `)}finally{We(n)}}function $o(e,t=20){let n;try{return n=Ye(e,Ge.O_RDONLY|Zo),b(n,`utf-8`).replace(/\n+$/,``).split(`
5
7
  `).slice(-t).join(`
6
- `)}catch{return``}finally{n!==void 0&&Rr(n)}}function po(e){return e.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
7
- `)}function mo(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 fi({stream:e.stream,logger:e.logger,agentName:e.runId,maxToolTurns:e.maxToolTurns,toolHookExecutor:Mt({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=>{Bt.setAwaitingApproval(e.runId,`${t}: ${i}`),r=t=>{Bt.clearAwaitingApproval(e.runId),n(t)};try{uo(e.outputPath,`⏳ 需要你确认「${t}」:${i}\n 进 Delegates 面板按 o,回复 yes 允许 / no 拒绝。`)}catch{}a(i)}):Promise.resolve(!1)}});i.on(`turn.end`,({message:t})=>{let n=po(t);if(n)try{uo(e.outputPath,n)}catch{}});let a=()=>{if(r){let e=r;r=void 0,e(!1)}i.abort()},o=Ct(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:po(e),messages:n.messages,tokenUsage:{input:e.usage.inputTokens,output:e.usage.outputTokens,cacheRead:e.usage.cacheReadTokens},durationMs:Date.now()-t})).finally(()=>{o(),Bt.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 ho=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=Nt(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 Jt(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=tn(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 (${_o(s)})`,outputPath:i,worktree:{path:r.path,branch:r.branch}});return}let c=go(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=en(t.diff??``),r=$t(t.diff??``).length>0,i=St(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=Ut(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=Qt(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 go(e){let t=e?.text;return typeof t==`string`?t:``}function _o(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
+ `)}catch{return``}finally{n!==void 0&&We(n)}}function es(e){return e.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
9
+ `)}function ts(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 Rt({stream:e.stream,logger:e.logger,agentName:e.runId,maxToolTurns:e.maxToolTurns,toolHookExecutor:on({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=>{gn.setAwaitingApproval(e.runId,`${t}: ${i}`),r=t=>{gn.clearAwaitingApproval(e.runId),n(t)};try{Qo(e.outputPath,`⏳ 需要你确认「${t}」:${i}\n 进 Delegates 面板按 o,回复 yes 允许 / no 拒绝。`)}catch{}a(i)}):Promise.resolve(!1)}});i.on(`turn.end`,({message:t})=>{let n=es(t);if(n)try{Qo(e.outputPath,n)}catch{}});let a=()=>{if(r){let e=r;r=void 0,e(!1)}i.abort()},o=Yt(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:es(e),messages:n.messages,tokenUsage:{input:e.usage.inputTokens,output:e.usage.outputTokens,cacheRead:e.usage.cacheReadTokens},durationMs:Date.now()-t})).finally(()=>{o(),gn.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 ns=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=sn(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`}),...e.model?{model:e.model}:{}})}catch(e){throw wn(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=jn(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 (${as(s)})`,outputPath:i,worktree:{path:r.path,branch:r.branch}});return}let c=rs(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,t={}){let n=this.deps.registry.get(e);if(!n)return{applied:!1,status:`error`,message:`job ${e} not found`,conflictPaths:[]};if(n.status!==`ready`)return{applied:!1,status:`error`,message:`job ${e} is ${n.status}, not ready`,conflictPaths:[]};let r=n.diff??``,i=An(r),a=kn(r),{added:o,removed:s}=is(r),c=!Qt(this.deps.repoRoot,r),l=cn({forbiddenZone:i,capabilityTouched:a,diffStat:{added:o,removed:s},conflict:c,origin:t.origin??`user`},{level:0});if(l.action===`forbid`)return{applied:!1,status:`error`,message:`apply forbidden by governance policy: ${l.reasons.join(`; `)}`,conflictPaths:[],forbiddenZone:i,capabilityTouched:a.length>0};let u=Jt(this.deps.repoRoot,r);if(u.applied)return r.trim()&&(this.appliedDiffs.set(e,r),this.deps.appliedDiffStore?.save(e,r)),this.deps.registry.update(e,{status:`applied`}),{applied:!0,status:`success`,message:`applied cleanly`,conflictPaths:[],forbiddenZone:i,capabilityTouched:a.length>0};let d=yn(this.deps.repoRoot,n.worktree.base);return{applied:!1,status:u.conflictPaths.length?`partial`:`error`,message:u.conflictPaths.length?`conflicts in ${u.conflictPaths.length} file(s); resolve or cancel${d?` (main repo has moved since this job started)`:``}`:`apply failed`,conflictPaths:u.conflictPaths,repoDrifted:d}}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=On(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 rs(e){let t=e?.text;return typeof t==`string`?t:``}function is(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
10
  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 vo=/^[a-zA-Z0-9_-]+$/;function yo(e){return{save(t,n){if(!vo.test(t))throw Error(`Invalid jobId for applied diff store: ${t}`);D(e,{recursive:!0}),k(b(e,`${t}.patch`),n,`utf-8`)},load(t){let n=b(e,`${t}.patch`);if(E(n))return O(n,`utf-8`)},delete(t){let n=b(e,`${t}.patch`);E(n)&&Xr(n)},loadAll(){return E(e)?Ur(e).filter(e=>He(e)===`.patch`).map(t=>({jobId:t.slice(0,-6),diff:O(b(e,t),`utf-8`)})):[]}}}const bo=[`delegate_job`];function xo(e){return e.filter(e=>!bo.includes(e.name))}function So(){return`job_${di().replace(/-/g,``).slice(0,8)}`}function Co(e){let t=e.outputDir??b(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 ho({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?yo(e.appliedDiffDir):void 0,spawnRun:({runId:t,prompt:n,outputPath:r,workspaceDir:i,onAwaitingInput:a})=>mo({runId:t,prompt:n,outputPath:r,model:e.getModel(),systemPrompt:e.systemPrompt,tools:[...xo(e.buildTools(i)),...e.mcpTools?.()??[]],maxToolTurns:e.maxToolTurns,stream:e.stream,logger:e.logger,hookRegistry:e.hookRegistry,onAwaitingInput:a}),buildOutputPath:e=>(D(t,{recursive:!0}),b(t,`agent-job-${e}.log`)),newJobId:e.newJobId??So})}function wo(e){return Co({repoRoot:e.workspaceDir,registry:Rt,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:b(n,`jobs`,`applied`)})}function To(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 Eo(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 Do(e){let t=Error(e);return t.name=`AbortError`,t}function Oo(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=Ct(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 Do(`Task cancelled before the session started`);let e=n.agentName?`<agent-guardrails>\n${gn}\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(Do(`Task cancelled`))})})]);let a=s.session.messages(),o=To(a),c=Eo(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{Bt.setMessages(c,s.session.messages()),l(),Bt.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 ko(e){let t=new gi({focusTracking:process.env.OTTO_TUI_FOCUS===`1`}),n=new hi({getConfig:e.getConfig,getCwd:e.getCwd,onInteraction:()=>t.recordInteraction(),isFollowUpPending:e.isFollowUpPending,gate:new vi({getCondition:()=>e.getConfig()?.condition,getIdleThresholdMs:()=>e.getConfig()?.idle_threshold_ms,state:t})});return n.registerChannel(new _i({getConfig:e.getConfig})),n.registerChannel(new pi(`hook`,()=>!0,t=>e.emitHookNotification({sessionId:t.sessionId,message:t.message,title:t.title,notification_type:t.type}))),n.registerChannel(new mi({getConfig:e.getConfig,isTrusted:()=>Sr(e.getCwd())})),{dispatcher:n,presenceTracker:t}}function Ao(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 jo=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=Ao(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 Mo(e){return e.modelRegistry.getAll()}function No(e,t){return e.modelRegistry.resolve(t)}function Po(e){return e.providerRegistry.list()}function Fo(e,t){e.hookRegistry.register(t)}function Io(e,t){return e.hookRegistry.unregister(t)}async function Lo(e){return e.modelCatalogManager.hydrate()}function Ro(e,t){return e.codingSessionPool.getSessionAvailableModels(t)}function zo(e,t,n){e.codingSessionPool.setSessionAvailableModels(t,n)}async function Bo(e){return e.modelCatalogManager.refresh()}async function Vo(e,t){let n=new Set(t?e.codingSessionPool.getSessionAvailableModels(t):[]),r=ne(e.authStore);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 Ho(e,t){e.notificationDispatcher.registerChannel(t)}function Uo(e,t){e.notificationDispatcher.registerChannel(new pi(`inapp`,()=>!0,e=>t(e.title??`otto`,e.message,e.type)))}function Wo(e){e.presenceTracker.recordInteraction()}function Go(e,t){e.presenceTracker.setFocus(t)}async function Ko(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 qo(e){return e.settings.get(`permission_mode`)??`auto`}async function Jo(e,t){let n=qo(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 Yo(e,t){return e.permissionRegistry.getSessionAlwaysAllow(t)}async function Xo(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 Zo(e,t){t&&(e.permissionRegistry.clearSessionAlwaysAllow(t),e.codingSessionPool.setSessionPermissionAllow(t,[]),e.logger.info({sessionId:t},`Session always-allow list cleared`))}async function Qo(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 $o(e,t){return e.codingSessionPool.getSession(t)}async function es(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 ts(e){return e.codingSessionPool.active}function ns(e,t){return e.codingSessionPool.listSessions(t)}async function rs(e,t){let n=ns(e,t),r;try{r=t?.workspaceId===void 0?e.workspaceRef?.key:Ci(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 is(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 as(e,t){let n=await e.codingSessionPool.archiveSession(t);return n&&e.logger.info({sessionId:t},`Session archived`),n}async function os(e,t,n){let r=await e.codingSessionPool.forkSession(t,n);return r&&e.notificationDispatcher.attach(r),r}var ss=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 cs=S(`@x-otto/coding:plugin-panel-manager`);function ls(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=T(e);if(!r.gated){if(!e.manifest.capabilities?.includes(`tui.renderer`)){cs.warn({pluginId:e.id},`plugin declares contributes.panels but not capabilities:["tui.renderer"], skipped (fail-closed)`);continue}if(r.pendingCapabilities.includes(`tui.renderer`)){cs.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=b(e.dir,r.entry);if(!E(t)){cs.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 us(e){let t=[];for(let n of e){if(T(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 ds(e){let t=[];for(let n of e){if(T(n).gated)continue;let e=n.manifest.contributes;if(!e?.menus?.length)continue;let r=Un(e.contextKeys);t.push(...nr(Mn.menuItem,e.menus,e.actions,r))}return t}const fs={capability:`tui.renderer`,axis:`renderers`,noun:`renderer`,pendingNote:`RFC-140 D3`,logger:S(`@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 ps(e){return Ga(e,fs)}const ms=S(`@x-otto/coding:plugin-a2ui-component-loader`),hs=new Set([`Text`,`Card`,`List`,`Progress`,`Chip`,`Button`]),gs={capability:`a2ui.component`,axis:`a2uiComponents`,noun:`a2ui component`,pendingNote:`RFC-140 D3 pattern`,logger:ms,entries:e=>e.manifest.contributes?.a2uiComponents,entryPath:e=>e.entry,exportName:e=>e.export,idLogFields:e=>({type:e.type}),logTypeofOnNotFunction:!1,preCheck:(e,t)=>hs.has(t.type)?(ms.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 _s(e){return Ga(e,gs,{key:e=>e.type,onConflict:(e,t)=>{ms.warn({pluginId:e.pluginId,type:e.type,existingOwner:t},`a2ui component type already registered by another plugin, rejected (first-registered wins)`)}})}const vs={capability:`tui.renderer`,axis:`statusWidgets`,noun:`status widget`,pendingNote:`RFC-140 D3 pattern`,logger:S(`@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 ys(e){return Ga(e,vs)}const bs={capability:`tui.renderer`,axis:`fileViewers`,noun:`file viewer`,pendingNote:`RFC-140 D3 pattern`,logger:S(`@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 xs(e){return Ga(e,bs)}var Ss=class{constructor(e){this.deps=e}listFileCommands(){return[...hr(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 ls({workspaceDir:this.deps.getWorkspaceDir(),homedir:ze(),disabledPlugins:this.deps.settings.get(`disabled_plugins`),plugins:this.deps.getActivePlugins()})}getPluginStatusItems(){return us(this.deps.getActivePlugins())}getGlobalMenuItems(){return ds(this.deps.getActivePlugins())}getPluginRenderers(){return ps(this.deps.getActivePlugins())}getPluginA2uiComponents(){return _s(this.deps.getActivePlugins())}getPluginStatusWidgets(){return ys(this.deps.getActivePlugins())}getPluginFileViewers(){return xs(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 A=S(`@x-otto/coding:plugin-hooks`),Cs=4096;function ws(e,t){let n=Ye();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 Ts(e){let t=Xe(e);return t.safe?null:{success:!1,hook:`pre-check`,command:e,error:`Dangerous command blocked: ${t.reason}`}}function Es(e,t){let n=!1,r,i;if(e?.length){let t=typeof e==`string`?e:e.toString(`utf-8`);r=t.slice(0,Cs),n=t.length>Cs}if(t?.length){let e=typeof t==`string`?t:t.toString(`utf-8`);i=e.slice(0,Cs),n||=e.length>Cs}return{stdout:r,stderr:i,truncated:n}}async function Ds(e,t){return Ts(t)||(A.info({pluginId:e.pluginId,command:t},`Executing postinstall hook`),new Promise(n=>{let r=Ti(t,{cwd:e.pluginDir,env:ws(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}=Es(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||A.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 Os(e,t,n,r,i){let a=Ts(t);if(a){A.warn({pluginId:e.pluginId,command:t},`Setup hook blocked by safety check`),n?.(a);return}if(A.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:ws(e),signal:i}),o=setTimeout(()=>{A.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
+ `))r.startsWith(`+`)&&!r.startsWith(`+++`)?t++:r.startsWith(`-`)&&!r.startsWith(`---`)&&n++}return{added:t,removed:n,binaryFiles:r}}function as(e){let{added:t,removed:n,binaryFiles:r}=is(e);return`+${t}/-${n}${r>0?`, ${r} binary file${r===1?``:`s`}`:``}`}const os=/^[a-zA-Z0-9_-]+$/;function ss(e){return{save(t,n){if(!os.test(t))throw Error(`Invalid jobId for applied diff store: ${t}`);y(e,{recursive:!0}),x(C(e,`${t}.patch`),n,`utf-8`)},load(t){let n=C(e,`${t}.patch`);if(v(n))return b(n,`utf-8`)},delete(t){let n=C(e,`${t}.patch`);v(n)&&rt(n)},loadAll(){return v(e)?Xe(e).filter(e=>st(e)===`.patch`).map(t=>({jobId:t.slice(0,-6),diff:b(C(e,t),`utf-8`)})):[]}}}const cs=[`delegate_job`];function ls(e){return e.filter(e=>!cs.includes(e.name))}function us(){return`job_${Ii().replace(/-/g,``).slice(0,8)}`}function ds(e){let t=e.outputDir??C(ot(),`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 ns({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?ss(e.appliedDiffDir):void 0,spawnRun:({runId:t,prompt:n,outputPath:r,workspaceDir:i,onAwaitingInput:a,model:o})=>{let s=o?ms(o,e):void 0;return ts({runId:t,prompt:n,outputPath:r,model:s?.model??e.getModel(),thinkingLevel:s?.thinkingLevel,systemPrompt:e.systemPrompt,tools:[...ls(e.buildTools(i)),...e.mcpTools?.()??[]],maxToolTurns:e.maxToolTurns,stream:e.stream,logger:e.logger,hookRegistry:e.hookRegistry,onAwaitingInput:a})},buildOutputPath:e=>(y(t,{recursive:!0}),C(t,`agent-job-${e}.log`)),newJobId:e.newJobId??us})}const fs=[`low`,`medium`,`high`,`xhigh`,`max`];function ps(e){return fs.includes(e)}function ms(e,t){if(!t.findModel)throw Error(`per-job model is not wired (findModel not injected)`);let n=t.findModel(e.id);if(!n)throw Error(`Model "${e.id}" not found for job (check /model list)`);let r;if(e.thinkingLevel!==void 0){if(!ps(e.thinkingLevel))throw Error(`Invalid thinking level "${e.thinkingLevel}" (expected low|medium|high|xhigh|max)`);r=e.thinkingLevel}return{model:n,thinkingLevel:r}}function hs(e){return ds({repoRoot:e.workspaceDir,registry:mn,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!==m);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:c()?void 0:C(r,`jobs`,`applied`)})}function gs(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(`
12
+ `).trim();if(r.length>0)return r}return``}function _s(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 vs(e){let t=Error(e);return t.name=`AbortError`,t}function ys(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,c=n.sessionMode===`sticky`&&n.sessionId?e.getSession(n.sessionId):void 0;if(c)s=c;else{let t={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,parentTaskId:n.parentTaskId,readOnly:n.readOnly};s=await e.createSession(n.sessionMode===`sticky`&&n.sessionId?{...t,id:n.sessionId}:{...t,transient:!0})}let l=s.id,u=Yt(s.coreAgent,{id:l,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 vs(`Task cancelled before the session started`);let e=n.agentName?`<agent-guardrails>\n${Wn}\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(vs(`Task cancelled`))})})]);let a=s.session.messages(),o=gs(a),c=_s(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{gn.setMessages(l,s.session.messages()),u(),gn.markEnded(l),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 bs(e){let t=new Bi({focusTracking:process.env.OTTO_TUI_FOCUS===`1`}),n=new zi({getConfig:e.getConfig,getCwd:e.getCwd,onInteraction:()=>t.recordInteraction(),isFollowUpPending:e.isFollowUpPending,gate:new Hi({getCondition:()=>e.getConfig()?.condition,getIdleThresholdMs:()=>e.getConfig()?.idle_threshold_ms,state:t})});return n.registerChannel(new Vi({getConfig:e.getConfig})),n.registerChannel(new Li(`hook`,()=>!0,t=>e.emitHookNotification({sessionId:t.sessionId,message:t.message,title:t.title,notification_type:t.type}))),n.registerChannel(new Ri({getConfig:e.getConfig,isTrusted:()=>ki(e.getCwd())})),{dispatcher:n,presenceTracker:t}}function xs(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 Ss=class{catalog;derivedModelIds=new Map;constructor(e,t,n){this.modelRegistry=e,this.authStore=t,this.catalog=n??new f}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=de(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=he(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=xs(await le(c),c.modelIdExclude),n=de(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 Cs(e){return e.modelRegistry.getAll()}function ws(e,t){return e.modelRegistry.resolve(t)}function Ts(e){return e.providerRegistry.list()}function Es(e,t){e.hookRegistry.register(t)}function Ds(e,t){return e.hookRegistry.unregister(t)}async function Os(e){return e.modelCatalogManager.hydrate()}function ks(e,t){return e.codingSessionPool.getSessionAvailableModels(t)}function As(e,t,n){e.codingSessionPool.setSessionAvailableModels(t,n)}async function js(e){return e.modelCatalogManager.refresh()}async function Ms(e,t){let n=new Set(t?e.codingSessionPool.getSessionAvailableModels(t):[]),r=oe(e.authStore,`delegation`);return Promise.all(e.modelRegistry.getAll().filter(e=>e.id!==m).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}:{}}}))}var Ns=class{constructor(e){this.host=e}get modelRegistry(){return this.host.modelRegistry}get authStore(){return this.host.authStore}getAllModels(){return Cs(this.host)}resolveModel(e){return ws(this.host,e)}listProviders(){return Ts(this.host)}hydrateModelCache(){return Os(this.host)}getSessionAvailableModels(e){return ks(this.host,e)}setSessionAvailableModels(e,t){As(this.host,e,t)}refreshModels(){return js(this.host)}buildModelCatalog(e){return Ms(this.host,e)}};function Ps(e,t){e.notificationDispatcher.registerChannel(t)}function Fs(e,t){e.notificationDispatcher.registerChannel(new Li(`inapp`,()=>!0,e=>t(e.title??`otto`,e.message,e.type)))}function Is(e){e.presenceTracker.recordInteraction()}function Ls(e,t){e.presenceTracker.setFocus(t)}var Rs=class{constructor(e){this.host=e}registerNotificationChannel(e){Ps(this.host,e)}registerInAppNotificationChannel(e){Fs(this.host,e)}notifyUserInteraction(){Is(this.host)}setTerminalFocus(e){Ls(this.host,e)}setFollowUpPendingProbe(e){this.host.setFollowUpPendingProbe?.(e)}};async function zs(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 Bs(e){return e.settings.get(`permission_mode`)??`auto`}async function Vs(e,t){let n=Bs(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 Hs(e,t){return e.permissionRegistry.getSessionAlwaysAllow(t)}async function Us(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 Ws(e,t){t&&(e.permissionRegistry.clearSessionAlwaysAllow(t),e.codingSessionPool.setSessionPermissionAllow(t,[]),e.logger.info({sessionId:t},`Session always-allow list cleared`))}var Gs=class{constructor(e){this.host=e}allowToolAlways(e,t){return zs(this.host,e,t)}disallowToolAlways(e){return Us(this.host,e)}setPermissionMode(e){return Vs(this.host,e)}getPermissionMode(){return Bs(this.host)}getSessionAlwaysAllow(e){return Hs(this.host,e)}clearSessionAlwaysAllow(e){Ws(this.host,e)}bashAlwaysAllowPrefix(e){return Ce(e)}isWellFormedAllowEntry(e){return Ie(e)}get activeSandbox(){return this.host.sandbox?.activeName??null}approveSandboxBypass(e){this.host.sandbox?.approveBypass(e)}getRecentPermissionDecisions(e,t=8){let n=this.host.auditLog;return n?n.getEntries({sessionId:e}).slice(-t).reverse().map(e=>({timestamp:e.timestamp,toolName:e.toolName,...e.filePath===void 0?{}:{filePath:e.filePath},effect:e.decision.effect,policyName:e.decision.policyName})):[]}recordAutoPermissionDecision(e){this.host.auditLog?.recordAutoDecision(e)}};async function Ks(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 qs(e,t){return e.codingSessionPool.getSession(t)}async function Js(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 Ys(e){return e.codingSessionPool.active}function Xs(e,t){return e.codingSessionPool.listSessions(t)}async function Zs(e,t){let n=Xs(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:qi(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 Qs(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 $s(e,t){let n=await e.codingSessionPool.archiveSession(t);return n&&e.logger.info({sessionId:t},`Session archived`),n}async function ec(e,t,n){let r=await e.codingSessionPool.forkSession(t,n);return r&&e.notificationDispatcher.attach(r),r}async function tc(e,t,n){let r=n.current;if(!r)throw Error(`导出归档仅支持关系化 SQLite 后端(sessions.db)。当前后端不支持。`);let i=await bi(e,r);if(!i)throw Error(`会话 ${e.slice(0,8)} 不存在或无法加载`);let a=JSON.stringify(i,null,2),o=Fi(`sha256`).update(a,`utf-8`).digest(`hex`);await Yi(S(t),{recursive:!0}),await Qi(t,a,`utf-8`);let s=await Zi(t,`utf-8`),c=Fi(`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}}var nc=class{constructor(e){this.host=e}get sessionManager(){return this.host.codingSessionPool}createSession(e={}){return Ks(this.host,e)}getSession(e){return qs(this.host,e)}getActiveSession(){return Ys(this.host)}listSessions(e){return Xs(this.host,e)}listAllSessions(e){return Zs(this.host,e)}removeSession(e){return Qs(this.host,e)}forkSession(e,t){return ec(this.host,e,t)}shareSession(e,t){return Js(this.host,e,t)}archiveSession(e){return $s(this.host,e)}exportSessionArchive(e,t){return tc(e,t,this.host.sessionRepoRef??{})}getResidencyConfig(){return this.host.getResidencyConfig?.()}sweepOrphanTraceFiles(){return this.host.sweepOrphanTraceFiles?.()??Promise.resolve()}},rc=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.applyTools(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 ic=T(`@x-otto/coding:plugin-panel-manager`);function ac(e){let t=e.plugins??gr({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=O(e);if(!r.gated){if(!e.manifest.capabilities?.includes(`tui.renderer`)){ic.warn({pluginId:e.id},`plugin declares contributes.panels but not capabilities:["tui.renderer"], skipped (fail-closed)`);continue}if(r.pendingCapabilities.includes(`tui.renderer`)){ic.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=C(e.dir,r.entry);if(!v(t)){ic.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 oc(e){let t=[];for(let n of e){if(O(n).gated)continue;let e=n.manifest.contributes?.statusItems;if(!e?.length)continue;let r=vr(n.manifest.contributes?.contextKeys);for(let i of e){if((i.point??sr.statuslineItem)!==sr.statuslineItem||!br(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 sc(e){let t=[];for(let n of e){if(O(n).gated)continue;let e=n.manifest.contributes;if(!e?.menus?.length)continue;let r=vr(e.contextKeys);t.push(...Lr(sr.menuItem,e.menus,e.actions,r))}return t}const cc={capability:`tui.renderer`,axis:`renderers`,noun:`renderer`,pendingNote:`RFC-140 D3`,logger:T(`@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 lc(e){return Mo(e,cc)}const uc=T(`@x-otto/coding:plugin-a2ui-component-loader`),dc=new Set([`Text`,`Card`,`List`,`Progress`,`Chip`,`Button`]),fc={capability:`a2ui.component`,axis:`a2uiComponents`,noun:`a2ui component`,pendingNote:`RFC-140 D3 pattern`,logger:uc,entries:e=>e.manifest.contributes?.a2uiComponents,entryPath:e=>e.entry,exportName:e=>e.export,idLogFields:e=>({type:e.type}),logTypeofOnNotFunction:!1,preCheck:(e,t)=>dc.has(t.type)?(uc.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 pc(e){return Mo(e,fc,{key:e=>e.type,onConflict:(e,t)=>{uc.warn({pluginId:e.pluginId,type:e.type,existingOwner:t},`a2ui component type already registered by another plugin, rejected (first-registered wins)`)}})}const mc={capability:`tui.renderer`,axis:`statusWidgets`,noun:`status widget`,pendingNote:`RFC-140 D3 pattern`,logger:T(`@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 hc(e){return Mo(e,mc)}const gc={capability:`tui.renderer`,axis:`fileViewers`,noun:`file viewer`,pendingNote:`RFC-140 D3 pattern`,logger:T(`@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 _c(e){return Mo(e,gc)}var vc=class{constructor(e){this.deps=e}listFileCommands(){return[...this.deps.compatProducts?.fileCommands??[],...this.deps.pluginModuleManager.commands]}computedPluginCommands(){return this.deps.pluginModuleManager.commands}pluginCliCommands(){return this.deps.pluginModuleManager.cliCommands}pluginSlashCommands(){return this.deps.pluginModuleManager.slashCommands}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 ac({workspaceDir:this.deps.getWorkspaceDir(),homedir:at(),disabledPlugins:this.deps.settings.get(`disabled_plugins`),plugins:this.deps.getActivePlugins()})}getPluginStatusItems(){return oc(this.deps.getActivePlugins())}getGlobalMenuItems(){return sc(this.deps.getActivePlugins())}getPluginRenderers(){return lc(this.deps.getActivePlugins())}getPluginA2uiComponents(){return pc(this.deps.getActivePlugins())}getPluginStatusWidgets(){return hc(this.deps.getActivePlugins())}getPluginFileViewers(){return _c(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=T(`@x-otto/coding:plugin-hooks`),yc=4096;function bc(e,t){let n=mt();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 xc(e){let t=ht(e);return t.safe?null:{success:!1,hook:`pre-check`,command:e,error:`Dangerous command blocked: ${t.reason}`}}function Sc(e,t){let n=!1,r,i;if(e?.length){let t=typeof e==`string`?e:e.toString(`utf-8`);r=t.slice(0,yc),n=t.length>yc}if(t?.length){let e=typeof t==`string`?t:t.toString(`utf-8`);i=e.slice(0,yc),n||=e.length>yc}return{stdout:r,stderr:i,truncated:n}}async function Cc(e,t){return xc(t)||(j.info({pluginId:e.pluginId,command:t},`Executing postinstall hook`),new Promise(n=>{let r=$i(t,{cwd:e.pluginDir,env:bc(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}=Sc(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 wc(e,t,n,r,i){let a=xc(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:bc(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
13
  `}),a.onStderrLine(e=>{c+=e+`
12
- `}),a.onExit(r=>{clearTimeout(o);let{stdout:i,stderr:a,truncated:l}=Es(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?A.info({pluginId:e.pluginId},`Setup hook succeeded`):A.error({pluginId:e.pluginId,exitCode:r.code,signal:r.signal,stderr:a?.slice(0,512)},`Setup hook failed`),n?.(u)}),a.onError(r=>{A.error({pluginId:e.pluginId,err:r},`Setup hook spawn error`),n?.({success:!1,hook:`setup`,command:t,error:r.message})});return}let o=Ti(t,{cwd:e.pluginDir,env:ws(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}=Es(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?A.info({pluginId:e.pluginId},`Setup hook succeeded`):A.error({pluginId:e.pluginId,exitCode:r,signal:i,stderr:o?.slice(0,512)},`Setup hook failed`),n?.(u)}),o.on(`error`,r=>{A.error({pluginId:e.pluginId,err:r},`Setup hook spawn error`),n?.({success:!1,hook:`setup`,command:t,error:r.message})})}const ks=S(`@x-otto/coding:plugin-lifecycle`),As=`plugin_lifecycle`,js=new Set;async function Ms(e,t,n){let r=t.get(As)?.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(T(r).gated){ks.info({pluginId:r.id},`Setup hook deferred: plugin not yet trusted`);continue}js.has(r.id)||(js.add(r.id),Os({pluginDir:r.dir,pluginId:r.id,workspaceDir:n},s,e=>{js.delete(r.id),i.set(r.id,a),Ns(t,i)},Ht))}}o&&await Ns(t,i)}async function Ns(e,t){let n=[...t].map(([e,t])=>({id:e,version:t}));await e.persist({[As]:{setupDone:n}})}function Ps(e,t){let n;try{n=Gr(t)}catch{return!1}let r;try{r=Gr(e)}catch{r=e}return r===n||r.startsWith(n+Ge)}const j=S(`@x-otto/coding:plugin-i18n-loader`),Fs=/^([a-zA-Z0-9_-]+)\.json$/;function Is(e){return Buffer.byteLength(e,`utf8`)<=En?e:`${Buffer.from(e,`utf8`).subarray(0,En).toString(`utf8`)}…`}function Ls(e,t,n){let r=new Map,i=x(t,n);if(!Ps(i,t))return j.warn({pluginId:e,i18nDir:n},`i18nDir resolves outside plugin dir, skipped`),r;let a;try{a=Ur(i)}catch{return r}let o=a.filter(e=>Fs.test(e)).sort();o.length>Tn&&(j.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=Fs.exec(n)?.[1];if(!a)continue;let o=x(i,n);if(!Ps(o,t)){j.warn({pluginId:e,filename:n},`i18nDir locale file resolves outside plugin dir, skipped`);continue}let s;try{s=O(o,`utf8`)}catch(t){j.warn({pluginId:e,filename:n,err:String(t)},`i18nDir locale file read failed, skipped`);continue}if(Buffer.byteLength(s,`utf8`)>wn){j.warn({pluginId:e,filename:n,limit:wn},`i18nDir locale file exceeds byte limit, skipped`);continue}let c;try{c=JSON.parse(s)}catch(t){j.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)){j.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 Rs(e){let t=[];for(let n of e){if(T(n).gated)continue;let e=n.manifest.contributes?.i18nDir,r=n.manifest.contributes?.i18n;if(!e&&!r?.length)continue;let i=e?Ls(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&&j.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&&(j.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]=Is(t);t.push({pluginId:n.id,id:e,translations:a})}}return t}const zs=S(`@x-otto/coding:declarative-agents`);function Bs(e){return{...e,defaultTools:e.defaultTools?.length?Tr(e.defaultTools):e.defaultTools,disallowedTools:e.disallowedTools?.length?Tr(e.disallowedTools):e.disallowedTools}}function Vs(e,t){let n=tt(e);if(!n)return zs.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 zs.warn({sourcePath:t},`Agent definition requires name/description/body, skipped`),null;let s=$e(r.get(`tools`)),c=Number.parseInt(r.get(`maxtoolturns`)??``,10),l=Number.parseInt(r.get(`maxtoolturnextensions`)??``,10),u=r.get(`prompt-mode`),d=$e(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:$e(r.get(`tasktypes`))??[o],capabilities:$e(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 Hs(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=>!T(e).gated).map(e=>({dir:r(e.dir,`agents`),claude:!1})),c=o(),l=c&&!_r(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 Us(e))d.set(n.name,t?Bs(n):n);let f=[...d.values()];return f.length>0&&zs.info(`Loaded %d declarative agent(s): %s`,f.length,f.map(e=>e.name).join(`, `)),f}async function Us(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=Vs(await t(i,`utf-8`),i);e&&a.push(e)}catch(e){zs.warn({sourcePath:i,err:e},`Failed to read agent definition, skipped`)}}return a}const Ws=S(`@x-otto/coding:declarative-teams`),Gs=new Set([`handoff`,`sequential`,`parallel`,`hierarchical`,`router`]);function Ks(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 qs(e,t){let n=tt(e);if(!n)return Ws.warn({sourcePath:t},`Team definition missing frontmatter, skipped`),null;let{fields:r}=n,i=r.get(`name`),a=r.get(`pattern`),o=$e(r.get(`agents`));if(!i||!a||!Gs.has(a)||!o||o.length===0)return Ws.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:$e(r.get(`pipeline`)),supervisorId:r.get(`supervisor`),entryAgentId:r.get(`entry`),routerStrategy:r.get(`router`),rules:Ks(r.get(`rules`)),maxHandoffDepth:Number.isInteger(s)?s:void 0}}async function Js(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 Ys(e))o.set(t.name,t);let s=[...o.values()];return s.length>0&&Ws.info(`Loaded %d declarative team(s): %s`,s.length,s.map(e=>e.name).join(`, `)),s}async function Ys(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=qs(await t(i,`utf-8`),i);e&&a.push(e)}catch(e){Ws.warn({sourcePath:i,err:e},`Failed to read team definition, skipped`)}}return a}var Xs=class{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(){await this.settings.load(),Ms(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=>!T(e).gated).map(e=>({id:e.id,dir:b(e.dir,`skills`)}))),await this.skills.discover());let e=Rs(this.activePlugins());this.i18n.register(e);let t=(await this.modelCatalog.refresh().catch(()=>[])).reduce((e,t)=>e+(t.added??0),0),n=await Hs(this.workspaceDir,{plugins:this.activePlugins()}),r=await Js(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 Zs=S(`@x-otto/coding:panel-backend-controller`);var Qs=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=T(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&&Zs.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 $s=S(`@x-otto/coding:plugin-log-writer`);function ec(){return x(n,`plugin-logs`)}function tc(e){return Sn.test(e)?b(ec(),`${e}.jsonl`):($s.warn({pluginId:e},`plugin id failed kebab-case validation, skipping log path resolution`),null)}function nc(e){let t;try{t=Jr(e).size}catch{return}if(!(t<=5242880))try{let t=O(e,`utf8`),n=Math.floor(t.length/2),r=t.indexOf(`
13
- `,n);k(e,r>=0?t.slice(r+1):t.slice(n))}catch(t){$s.warn({path:e,err:String(t)},`plugin log truncation failed (fail-soft)`)}}function rc(e,t,n){if(!s())try{let r=tc(e);if(!r)return;let i=ec();E(i)||D(i,{recursive:!0}),nc(r),Lr(r,`${JSON.stringify({ts:Date.now(),level:t,pluginId:e,msg:n})}\n`)}catch(t){$s.warn({pluginId:e,err:String(t)},`plugin log append failed (fail-soft)`)}}const ic=S(`@x-otto/coding:plugin-tool-wiring`);function M(e,t){return`plugin:${e}:${t}`}function ac(e){let t=e.split(`:`);return t.length<3||t[0]!==`plugin`?null:t[1]||null}function oc(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 N={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 sc(e,t){let n=[];if(t.preToolUse){let r=t.preToolUse;n.push(y({name:M(e,`preToolUse`),timing:N.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:M(e,`postToolUse`),timing:N.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:M(e,`userPromptSubmit`),timing:N.userPromptSubmit,handle:async e=>{await r({prompt:oc(e.message)})}}))}if(t.sessionStart){let r=t.sessionStart;n.push(y({name:M(e,`sessionStart`),timing:N.sessionStart,handle:async()=>{await r()}}))}if(t.stop){let r=t.stop;n.push(y({name:M(e,`stop`),timing:N.stop,handle:async()=>{await r()}}))}if(t.sessionRestored){let r=t.sessionRestored;n.push(y({name:M(e,`sessionRestored`),timing:N.sessionRestored,handle:async e=>{await r({sessionId:e.sessionId})}}))}if(t.sessionDeleted){let r=t.sessionDeleted;n.push(y({name:M(e,`sessionDeleted`),timing:N.sessionDeleted,handle:async e=>{await r({sessionId:e.sessionId})}}))}if(t.sessionIdle){let r=t.sessionIdle;n.push(y({name:M(e,`sessionIdle`),timing:N.sessionIdle,handle:async e=>{await r({sessionId:e.sessionId})}}))}if(t.sessionError){let r=t.sessionError;n.push(y({name:M(e,`sessionError`),timing:N.sessionError,handle:async e=>{await r({sessionId:e.sessionId,error:e.error})}}))}if(t.streamStart){let r=t.streamStart;n.push(y({name:M(e,`streamStart`),timing:N.streamStart,handle:async e=>{await r({sessionId:e.sessionId,model:e.model})}}))}if(t.compactionPending){let r=t.compactionPending;n.push(y({name:M(e,`compactionPending`),timing:N.compactionPending,handle:async e=>{await r({sessionId:e.sessionId,messageCount:e.messageCount})}}))}if(t.compactionOccurred){let r=t.compactionOccurred;n.push(y({name:M(e,`compactionOccurred`),timing:N.compactionOccurred,handle:async e=>{await r({sessionId:e.sessionId,retainedCount:e.retainedCount})}}))}if(t.taskCreated){let r=t.taskCreated;n.push(y({name:M(e,`taskCreated`),timing:N.taskCreated,handle:async e=>{await r({taskId:e.task.id})}}))}if(t.taskStarted){let r=t.taskStarted;n.push(y({name:M(e,`taskStarted`),timing:N.taskStarted,handle:async e=>{await r({taskId:e.task.id,agent:e.agent})}}))}if(t.taskCompleted){let r=t.taskCompleted;n.push(y({name:M(e,`taskCompleted`),timing:N.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:M(e,`taskFailed`),timing:N.taskFailed,handle:async e=>{await r({taskId:e.task.id,error:e.error.message})}}))}return n}function cc(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 lc(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 uc(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 dc(e,t){return t instanceof Ke?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 qe(t instanceof Error?t.message:String(t),{code:`PROVIDER_PLUGIN_ERROR`,cause:t instanceof Error?t:void 0,pluginSource:e})}function fc(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:dc(e,o.error)}:yield o}catch(t){throw dc(e,t)}}}}}function pc(e,t){try{return t()}catch(t){let n=String(t);return ic.warn({pluginId:e,err:n},`plugin oauthProviderFactory threw, skipped`),rc(e,`warn`,`oauthProviderFactory threw, skipped: ${n}`),null}}function mc(e){return e&&typeof e==`object`&&Array.isArray(e.content)?e:{content:[{type:`text`,text:typeof e==`string`?e:JSON.stringify(e??null)}]}}function hc(e,t,n){let r=t;if(!r||typeof r!=`object`)return ic.warn({pluginId:e},`plugin tool entry is not an object, skipped`),null;if(typeof r.name!=`string`||!r.name)return ic.warn({pluginId:e},`plugin tool missing valid name, skipped`),null;if(typeof r.execute!=`function`)return ic.warn({pluginId:e,tool:r.name},`plugin tool missing execute function, skipped`),null;if(!r.parameters||typeof r.parameters.safeParse!=`function`)return ic.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=mc(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 gc(e,t){let n=[],r=async(t,n)=>{try{await t.onEvent(n)}catch(n){ic.warn({pluginId:e,monitorId:t.id,err:String(n)},`plugin monitor onEvent threw, isolated`)}};for(let i of t)n.push(y({name:M(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:M(e,`monitor:${i.id}:compaction.after`),timing:`compaction.after`,handle:async e=>{await r(i,{type:`compaction.occurred`,sessionId:e.sessionId,tokensSaved:0})}})),n.push(y({name:M(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 _c(e){return{...e}}var vc=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?_c(t):{pluginId:e,hookTimeouts:0,toolTimeouts:0}}all(){return[...this.stats.values()].map(_c)}clear(){this.stats.clear()}};function yc(e){return new vc(e)}const bc=3600*1e3;function xc(){return{authorizedSessionIds:new Set,readCountThisEpoch:0,llmCountThisEpoch:0,llmCallTimes:[],notifyTimes:[]}}var Sc=class{states=new Map;constructor(e=()=>Date.now()){this.now=e}stateOf(e){let t=this.states.get(e);return t||(t=xc(),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()-bc;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()-bc;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 Cc(e){return e.kind===`session`?0:1}var wc=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)=>Cc(e.request.origin)-Cc(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(Tc(n.request.question)))}}shutdown(){let e=this.queue.splice(0,this.queue.length);this.inFlightId=null;for(let t of e)t.resolve(Tc(t.request.question))}};function Tc(e){return{answer:``,acceptedRecommendation:!1,resolvedBy:`human`}}const P={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 Ec(){return`const { parentPort, workerData } = require('worker_threads')
14
+ `}),a.onExit(r=>{clearTimeout(o);let{stdout:i,stderr:a,truncated:l}=Sc(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=$i(t,{cwd:e.pluginDir,env:bc(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}=Sc(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 Tc=T(`@x-otto/coding:plugin-lifecycle`),Ec=`plugin_lifecycle`,Dc=new Set;async function Oc(e,t,n){let r=t.get(Ec)?.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(O(r).gated){Tc.info({pluginId:r.id},`Setup hook deferred: plugin not yet trusted`);continue}Dc.has(r.id)||(Dc.add(r.id),wc({pluginDir:r.dir,pluginId:r.id,workspaceDir:n},s,e=>{Dc.delete(r.id),i.set(r.id,a),kc(t,i)},E))}}o&&await kc(t,i)}async function kc(e,t){let n=[...t].map(([e,t])=>({id:e,version:t}));await e.persist({[Ec]:{setupDone:n}})}function Ac(e,t){let n;try{n=Qe(t)}catch{return!1}let r;try{r=Qe(e)}catch{r=e}return r===n||r.startsWith(n+ut)}const jc=T(`@x-otto/coding:plugin-i18n-loader`),Mc=/^([a-zA-Z0-9_-]+)\.json$/;function Nc(e){return Buffer.byteLength(e,`utf8`)<=tr?e:`${Buffer.from(e,`utf8`).subarray(0,tr).toString(`utf8`)}…`}function Pc(e,t,n){let r=new Map,i=w(t,n);if(!Ac(i,t))return jc.warn({pluginId:e,i18nDir:n},`i18nDir resolves outside plugin dir, skipped`),r;let a;try{a=Xe(i)}catch{return r}let o=a.filter(e=>Mc.test(e)).sort();o.length>er&&(jc.warn({pluginId:e,i18nDir:n,declared:o.length,limit:er},`plugin i18nDir declares more locale files than the per-plugin limit, truncated`),o=o.slice(0,er));for(let n of o){let a=Mc.exec(n)?.[1];if(!a)continue;let o=w(i,n);if(!Ac(o,t)){jc.warn({pluginId:e,filename:n},`i18nDir locale file resolves outside plugin dir, skipped`);continue}let s;try{s=b(o,`utf8`)}catch(t){jc.warn({pluginId:e,filename:n,err:String(t)},`i18nDir locale file read failed, skipped`);continue}if(Buffer.byteLength(s,`utf8`)>$n){jc.warn({pluginId:e,filename:n,limit:$n},`i18nDir locale file exceeds byte limit, skipped`);continue}let c;try{c=JSON.parse(s)}catch(t){jc.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)){jc.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 Fc(e){let t=[];for(let n of e){if(O(n).gated)continue;let e=n.manifest.contributes?.i18nDir,r=n.manifest.contributes?.i18n;if(!e&&!r?.length)continue;let i=e?Pc(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&&jc.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>Qn&&(jc.warn({pluginId:n.id,declared:a.length,limit:Qn},`plugin declares more i18n entries than the per-plugin limit, truncated`),a=a.slice(0,Qn));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]=Nc(t);t.push({pluginId:n.id,id:e,translations:a})}}return t}const Ic=T(`@x-otto/coding:declarative-agents`);function Lc(e){return{...e,defaultTools:e.defaultTools?.length?_t(e.defaultTools):e.defaultTools,disallowedTools:e.disallowedTools?.length?_t(e.disallowedTools):e.disallowedTools}}function Rc(e,t){let n=xt(e);if(!n)return Ic.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 Ic.warn({sourcePath:t},`Agent definition requires name/description/body, skipped`),null;let s=yt(r.get(`tools`)),c=Number.parseInt(r.get(`maxtoolturns`)??``,10),l=Number.parseInt(r.get(`maxtoolturnextensions`)??``,10),u=r.get(`prompt-mode`),d=yt(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:yt(r.get(`tasktypes`))??[o],capabilities:yt(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 zc(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`),o=(t?.plugins??gr({cwd:e,homedir:n()})).filter(e=>e.manifest.contributes?.agents!==!1).filter(e=>!O(e).gated).map(e=>({dir:r(e.dir,`agents`),claude:!1})),c=s(),l=c&&(t?.claudeProjectAgentsAllowed??!1),u=[...o,...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 Bc(e))d.set(n.name,t?Lc(n):n);let f=[...d.values()];return f.length>0&&Ic.info(`Loaded %d declarative agent(s): %s`,f.length,f.map(e=>e.name).join(`, `)),f}async function Bc(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=Rc(await t(i,`utf-8`),i);e&&a.push(e)}catch(e){Ic.warn({sourcePath:i,err:e},`Failed to read agent definition, skipped`)}}return a}const Vc=T(`@x-otto/coding:declarative-teams`),Hc=new Set([`handoff`,`sequential`,`parallel`,`hierarchical`,`router`]);function Uc(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 Wc(e,t){let n=xt(e);if(!n)return Vc.warn({sourcePath:t},`Team definition missing frontmatter, skipped`),null;let{fields:r}=n,i=r.get(`name`),a=r.get(`pattern`),o=yt(r.get(`agents`));if(!i||!a||!Hc.has(a)||!o||o.length===0)return Vc.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:yt(r.get(`pipeline`)),supervisorId:r.get(`supervisor`),entryAgentId:r.get(`entry`),routerStrategy:r.get(`router`),rules:Uc(r.get(`rules`)),maxHandoffDepth:Number.isInteger(s)?s:void 0}}async function Gc(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 Kc(e))o.set(t.name,t);let s=[...o.values()];return s.length>0&&Vc.info(`Loaded %d declarative team(s): %s`,s.length,s.map(e=>e.name).join(`, `)),s}async function Kc(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=Wc(await t(i,`utf-8`),i);e&&a.push(e)}catch(e){Vc.warn({sourcePath:i,err:e},`Failed to read team definition, skipped`)}}return a}var qc=class{reloadQueue=Promise.resolve();constructor(e,t,n,r,i,a,o,s,c,l,u){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,this.getCompatTrustGated=u}async reload(){let e=this.reloadQueue.then(()=>this.reloadSerial());return this.reloadQueue=e.catch(()=>void 0),e}async reloadSerial(){await this.settings.load(),Oc(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=>!O(e).gated).map(e=>({id:e.id,dir:C(e.dir,`skills`)}))),await this.skills.discover());let e=Fc(this.activePlugins());this.i18n.register(e);let t=(await this.modelCatalog.refresh().catch(()=>[])).reduce((e,t)=>e+(t.added??0),0),n=await zc(this.workspaceDir,{plugins:this.activePlugins(),claudeProjectAgentsAllowed:this.getCompatTrustGated?!this.getCompatTrustGated():void 0}),r=await Gc(this.workspaceDir),i=[],a=[];try{a=await this.pluginModules.reload(new Set(n.map(e=>e.name)))}catch(e){i.push({path:`pluginModules`,error:e instanceof Error?e.message:String(e)})}n.push(...a);let o={pendingCapabilityPluginIds:[]};try{o=await this.pluginProviders.reload()}catch(e){i.push({path:`pluginProviders`,error:e instanceof Error?e.message:String(e)})}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:o.pendingCapabilityPluginIds,i18nEntries:e.length,...i.length>0?{reloadFailures:i}:{}}}};const Jc=T(`@x-otto/coding:panel-backend-controller`);var Yc=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=O(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&&Jc.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 Xc=T(`@x-otto/coding:plugin-log-writer`);function Zc(){return w(r,`plugin-logs`)}function Qc(e){return Zn.test(e)?C(Zc(),`${e}.jsonl`):(Xc.warn({pluginId:e},`plugin id failed kebab-case validation, skipping log path resolution`),null)}function $c(e){let t;try{t=tt(e).size}catch{return}if(!(t<=5242880))try{let t=b(e,`utf8`),n=Math.floor(t.length/2),r=t.indexOf(`
15
+ `,n);x(e,r>=0?t.slice(r+1):t.slice(n))}catch(t){Xc.warn({path:e,err:String(t)},`plugin log truncation failed (fail-soft)`)}}function el(e,t,n){if(!c())try{let r=Qc(e);if(!r)return;let i=Zc();v(i)||y(i,{recursive:!0}),$c(r),Ue(r,`${JSON.stringify({ts:Date.now(),level:t,pluginId:e,msg:n})}\n`)}catch(t){Xc.warn({pluginId:e,err:String(t)},`plugin log append failed (fail-soft)`)}}const tl=T(`@x-otto/coding:plugin-tool-wiring`);function M(e,t){return`plugin:${e}:${t}`}function nl(e){let t=e.split(`:`);return t.length<3||t[0]!==`plugin`?null:t[1]||null}function rl(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 N={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`,taskCancelled:`task.cancelled`,onNotification:`notification`};function il(e,t){let n=[];if(t.preToolUse){let r=t.preToolUse;n.push(k({name:M(e,`preToolUse`),timing:N.preToolUse,handle:async(t,n)=>{let i=await r({toolName:t.toolName,input:t.args,paths:t.paths,readonly:t.readonly,sessionId:t.sessionId});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(k({name:M(e,`postToolUse`),timing:N.postToolUse,handle:async e=>{await r({toolName:e.toolName,input:e.args,result:e.result,readonly:e.readonly,sessionId:e.sessionId})}}))}if(t.userPromptSubmit){let r=t.userPromptSubmit;n.push(k({name:M(e,`userPromptSubmit`),timing:N.userPromptSubmit,handle:async e=>{await r({prompt:rl(e.message)})}}))}if(t.sessionStart){let r=t.sessionStart;n.push(k({name:M(e,`sessionStart`),timing:N.sessionStart,handle:async()=>{await r()}}))}if(t.stop){let r=t.stop;n.push(k({name:M(e,`stop`),timing:N.stop,handle:async()=>{await r()}}))}if(t.sessionRestored){let r=t.sessionRestored;n.push(k({name:M(e,`sessionRestored`),timing:N.sessionRestored,handle:async e=>{await r({sessionId:e.sessionId})}}))}if(t.sessionDeleted){let r=t.sessionDeleted;n.push(k({name:M(e,`sessionDeleted`),timing:N.sessionDeleted,handle:async e=>{await r({sessionId:e.sessionId})}}))}if(t.sessionIdle){let r=t.sessionIdle;n.push(k({name:M(e,`sessionIdle`),timing:N.sessionIdle,handle:async e=>{await r({sessionId:e.sessionId})}}))}if(t.sessionError){let r=t.sessionError;n.push(k({name:M(e,`sessionError`),timing:N.sessionError,handle:async e=>{await r({sessionId:e.sessionId,error:e.error})}}))}if(t.streamStart){let r=t.streamStart;n.push(k({name:M(e,`streamStart`),timing:N.streamStart,handle:async e=>{await r({sessionId:e.sessionId,model:e.model})}}))}if(t.compactionPending){let r=t.compactionPending;n.push(k({name:M(e,`compactionPending`),timing:N.compactionPending,handle:async e=>{await r({sessionId:e.sessionId,messageCount:e.messageCount})}}))}if(t.compactionOccurred){let r=t.compactionOccurred;n.push(k({name:M(e,`compactionOccurred`),timing:N.compactionOccurred,handle:async e=>{await r({sessionId:e.sessionId,retainedCount:e.retainedCount})}}))}if(t.taskCreated){let r=t.taskCreated;n.push(k({name:M(e,`taskCreated`),timing:N.taskCreated,handle:async e=>{await r({taskId:e.task.id})}}))}if(t.taskStarted){let r=t.taskStarted;n.push(k({name:M(e,`taskStarted`),timing:N.taskStarted,handle:async e=>{await r({taskId:e.task.id,agent:e.agent})}}))}if(t.onNotification){let r=t.onNotification;n.push(k({name:M(e,`onNotification`),timing:N.onNotification,handle:async e=>{await r({sessionId:e.sessionId,message:e.message,title:e.title,notification_type:e.notification_type})}}))}if(t.taskCompleted){let r=t.taskCompleted;n.push(k({name:M(e,`taskCompleted`),timing:N.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(k({name:M(e,`taskFailed`),timing:N.taskFailed,handle:async e=>{await r({taskId:e.task.id,error:e.error.message})}}))}if(t.taskCancelled){let r=t.taskCancelled;n.push(k({name:M(e,`taskCancelled`),timing:N.taskCancelled,handle:async e=>{await r({taskId:e.taskId})}}))}if(t.waterfall)for(let r of Object.keys(t.waterfall)){if(!na(r)){tl.warn({pluginId:e,timing:r},`plugin waterfall timing not in whitelist, rejected (fail-closed)`),el(e,`warn`,`waterfall timing "${r}" not in whitelist, rejected (fail-closed)`);continue}let i=t.waterfall[r];i&&n.push(k({name:M(e,`waterfall:${r}`),timing:r,handle:async(t,n)=>r===`system.prompt.transform`?al(e,i,t,n):ol(e,r,i,t,n)}))}return n}async function al(e,t,n,r){let i=r.systemTail?[...r.systemTail]:[],a=r.systemPrompt,o=await t(n,r),s=!1,c=!1,l=!1;r.systemPrompt!==a&&(s=!0,r.systemPrompt=a);let u=Array.isArray(r.systemTail)?r.systemTail:void 0;if(u===void 0)i.length>0&&(c=!0,r.systemTail=[...i]);else if(!i.every((e,t)=>u[t]===e))c=!0,r.systemTail=[...i];else{let e=u.slice(i.length),t=[...i],n=4096;for(let r of e){if(n<=0){l=!0;break}let e=cl(r,n);if(e.truncated){l=!0,t.push(`${e.content}${ll}`);break}t.push(e.content),n-=Buffer.byteLength(e.content,`utf8`)}r.systemTail=t}if(s||c||l||ul(i,r.systemTail)){let t=(r.systemTail?.length??0)-i.length,a=[s?`systemPrompt-write-rejected`:null,c?`systemTail-destructive-rejected`:null,t>0?`systemTail:+${t}el`:null,l?`systemTail-truncated`:null].filter(e=>e!==null).join(`, `);sl(e,`system.prompt.transform`,n.sessionId,a)}return o}async function ol(e,t,n,r,i){let a=dl(i),o=await n(r,i),s=fl(t,a,i);return s&&sl(e,t,(typeof r==`object`&&r&&`sessionId`in r?String(r.sessionId??``):void 0)||void 0,s),o}function sl(e,t,n,r){let i=r.length>400?`${r.slice(0,400)}…`:r;tl.info({pluginId:e,timing:t,...n?{sessionId:n}:{}},`plugin waterfall rewrite: ${i}`)}function cl(e,t){let n=Buffer.from(e,`utf8`);if(n.length<=t)return{content:e,truncated:!1};let r=Math.max(0,t);for(;r>0&&r<n.length;){let e=n[r];if(e===void 0||(e&192)!=128)break;r--}return{content:n.subarray(0,r).toString(`utf8`).trimEnd(),truncated:!0}}const ll=`
16
+ [context truncated: budget exceeded]`;function ul(e,t){return t===void 0?e.length>0:e.length!==t.length||e.some((e,n)=>e!==t[n])}function dl(e){if(typeof e!=`object`||!e)return{};let t={};for(let n of Object.keys(e))t[n]=e[n];return t}function fl(e,t,n){if(typeof n!=`object`||!n)return;let r=n,i=Object.keys(r).filter(e=>r[e]!==t[e]);if(i.length!==0)return e===`chat.params`?`fields:[${i.join(`, `)}]`:`messages:${Array.isArray(t.messages)?t.messages.length:`n/a`}→${Array.isArray(r.messages)?r.messages.length:`n/a`}`}function pl(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 ml(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 hl(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 gl(e,t){return t instanceof dt?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 ft(t instanceof Error?t.message:String(t),{code:`PROVIDER_PLUGIN_ERROR`,cause:t instanceof Error?t:void 0,pluginSource:e})}function _l(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:gl(e,o.error)}:yield o}catch(t){throw gl(e,t)}}}}}function vl(e,t){try{return t()}catch(t){let n=String(t);return tl.warn({pluginId:e,err:n},`plugin oauthProviderFactory threw, skipped`),el(e,`warn`,`oauthProviderFactory threw, skipped: ${n}`),null}}function yl(e){return e&&typeof e==`object`&&Array.isArray(e.content)?e:{content:[{type:`text`,text:typeof e==`string`?e:JSON.stringify(e??null)}]}}function bl(e,t,n){let r=t;if(!r||typeof r!=`object`)return tl.warn({pluginId:e},`plugin tool entry is not an object, skipped`),null;if(typeof r.name!=`string`||!r.name)return tl.warn({pluginId:e},`plugin tool missing valid name, skipped`),null;if(typeof r.execute!=`function`)return tl.warn({pluginId:e,tool:r.name},`plugin tool missing execute function, skipped`),null;if(!r.parameters||typeof r.parameters.safeParse!=`function`)return tl.warn({pluginId:e,tool:r.name},`plugin tool missing valid parameters.safeParse, skipped`),null;typeof r.parameters.toJSONSchema!=`function`&&tl.warn({pluginId:e,tool:r.name},`plugin tool parameters missing toJSONSchema — model-side schema will be empty {}`);let i=r.name,a=r.description??``,o=r.parameters,s=r.execute,c=r.resolvePath?e=>r.resolvePath(e,n?.workspaceDir??``):void 0;return{name:i,description:a,parameters:o,...r.exposure!==void 0&&{exposure:r.exposure},...r.pathParams!==void 0&&{pathParams:r.pathParams},...r.readonly!==void 0&&{readonly:r.readonly},...r.regenerableOutput!==void 0&&{regenerableOutput:r.regenerableOutput},...c&&{resolvePath:c},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=yl(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 xl(e,t){let n=[],r=async(t,n)=>{try{await t.onEvent(n)}catch(n){tl.warn({pluginId:e,monitorId:t.id,err:String(n)},`plugin monitor onEvent threw, isolated`)}};for(let i of t)n.push(k({name:M(e,`monitor:${i.id}:stream.end`),timing:`stream.end`,handle:async e=>{e.tokenUsage&&await r(i,{type:`turn.completed`,sessionId:e.sessionId,tokenUsage:{input:e.tokenUsage.input,output:e.tokenUsage.output}})}})),n.push(k({name:M(e,`monitor:${i.id}:compaction.after`),timing:`compaction.after`,handle:async e=>{await r(i,{type:`compaction.occurred`,sessionId:e.sessionId})}})),n.push(k({name:M(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 Sl(e){return{...e}}var Cl=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?Sl(t):{pluginId:e,hookTimeouts:0,toolTimeouts:0}}all(){return[...this.stats.values()].map(Sl)}clear(){this.stats.clear()}};function wl(e){return new Cl(e)}const Tl=3600*1e3;function El(){return{authorizedSessionIds:new Set,readCountThisEpoch:0,llmCountThisEpoch:0,llmCallTimes:[],notifyTimes:[]}}var Dl=class{states=new Map;constructor(e=()=>Date.now()){this.now=e}stateOf(e){let t=this.states.get(e);return t||(t=El(),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()-Tl;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()-Tl;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 Ol(e){return e.kind===`session`?0:1}var kl=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)=>Ol(e.request.origin)-Ol(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(Al(n.request.question)))}}shutdown(){let e=this.queue.splice(0,this.queue.length);this.inFlightId=null;for(let t of e)t.resolve(Al(t.request.question))}};function Al(e){return{answer:``,acceptedRecommendation:!1,resolvedBy:`human`}}const P={start:`service.start`,started:`service.started`,stop:`service.stop`,stopped:`service.stopped`,hostCall:`service.hostCall`,hostResult:`service.hostResult`,crashed:`service.crashed`,notify:`service.notify`,eventPush:`service.eventPush`};function jl(){return`const { parentPort, workerData } = require('worker_threads')
14
17
  const __send = (m) => parentPort.postMessage(m)
15
18
 
16
19
  // RFC-303 M5:worker 侧 scoped storage 实现(无第三方依赖,直接文件读写)。
@@ -54,6 +57,9 @@ const hostCalls = new Map()
54
57
  // RFC-318 D9:service 注册的通知处理器(单 handler,后注册覆盖先注册——多播由 service
55
58
  // 自己分发,宿主不承担订阅者生命周期)。
56
59
  let notifyHandler = null
60
+ // RFC-427 M4 T427-09(service 补全):本地事件订阅表(type → handler[])——
61
+ // subscribeEvent stub 写、eventPush 分支读(宿主已做通配匹配,本端按精确 type 查)。
62
+ const serviceLocalSubs = new Map()
57
63
 
58
64
  /** 反向 RPC:把 host 能力调用送回宿主执行。宿主按连接身份鉴定,不信任本侧声明的身份。 */
59
65
  function callHost(method, params) {
@@ -117,6 +123,16 @@ parentPort.on('message', async (msg) => {
117
123
 
118
124
  if (msg.type === '${P.start}') {
119
125
  try {
126
+ // RFC-365 R3:host-slot 注入槽——service worker 是第三条加载路径,同样是独立 realm
127
+ // 且 entry 落在 tmpdir。与隔离端 entry 同一处理(宿主运行机解析绝对路径 → 消息下发
128
+ // → 这里 require 装槽),必须在 require(compiledPath) 之前。
129
+ if (msg.hostExternals) {
130
+ const __slot = (globalThis.__ottoPluginHostExternals = globalThis.__ottoPluginHostExternals || {})
131
+ for (const __name of Object.keys(msg.hostExternals)) {
132
+ if (__slot[__name] !== undefined) continue
133
+ try { __slot[__name] = require(msg.hostExternals[__name]) } catch (e) { /* 交由产物侧抛可诊断错误 */ }
134
+ }
135
+ }
120
136
  const mod = require(msg.compiledPath)
121
137
  const factory = mod && (mod.default || mod)
122
138
  if (typeof factory !== 'function') {
@@ -125,7 +141,30 @@ parentPort.on('message', async (msg) => {
125
141
  }
126
142
  // 工厂期 ctx:service 场景下不注入 host(host 只进 service ctx),保持与既有
127
143
  // 隔离路径一致的纯数据 ctx。
128
- const instance = await factory(msg.factoryCtx)
144
+ // RFC-427 M4 T427-12:emitEvent stub——宿主下发纯数据标记(msg.factoryCtx.emitEvent
145
+ // === true),此处构造经 callHost 回宿主的代理(postMessage 不能传函数)。
146
+ const factoryCtx = { ...(msg.factoryCtx || {}) }
147
+ if (msg.factoryCtx && msg.factoryCtx.emitEvent === true) {
148
+ factoryCtx.emitEvent = (type, payload) => {
149
+ void callHost('emitEvent', { type, payload })
150
+ }
151
+ }
152
+ // RFC-427 M4 T427-09(service 补全):subscribeEvent stub——本地订阅表 + 经
153
+ // callHost 注册远端(宿主 dispatcher),eventPush 分支按精确 type 查本地表调 handler。
154
+ if (msg.factoryCtx && msg.factoryCtx.subscribeEvent === true) {
155
+ factoryCtx.subscribeEvent = (type, handler) => {
156
+ const list = serviceLocalSubs.get(type) || []
157
+ list.push(handler)
158
+ serviceLocalSubs.set(type, list)
159
+ void callHost('subscribeEvent', { type })
160
+ return () => {
161
+ const arr = serviceLocalSubs.get(type) || []
162
+ serviceLocalSubs.set(type, arr.filter((h) => h !== handler))
163
+ if (arr.length === 0) void callHost('unsubscribeEvent', { type })
164
+ }
165
+ }
166
+ }
167
+ const instance = await factory(factoryCtx)
129
168
  const services = Array.isArray(instance && instance.services) ? instance.services : []
130
169
  const svc = services.find((s) => s && s.id === msg.serviceId)
131
170
  if (!svc || typeof svc.start !== 'function') {
@@ -173,6 +212,15 @@ parentPort.on('message', async (msg) => {
173
212
  return
174
213
  }
175
214
 
215
+ if (msg.type === '${P.eventPush}') {
216
+ const list = serviceLocalSubs.get(msg.eventType) || []
217
+ for (const h of list) {
218
+ try { h(msg.payload, { pluginId: msg.sourcePluginId }) }
219
+ catch (e) { __send({ type: '${P.crashed}', error: (e && e.message) || String(e) }) }
220
+ }
221
+ return
222
+ }
223
+
176
224
  if (msg.type === '${P.stop}') {
177
225
  try {
178
226
  if (serviceInstance && typeof serviceInstance.stop === 'function') await serviceInstance.stop()
@@ -183,8 +231,8 @@ parentPort.on('message', async (msg) => {
183
231
  return
184
232
  }
185
233
  })
186
- `}const F=S(`@x-otto/coding:plugin-service-pool`),Dc=5e3;function Oc(e){return[`--experimental-permission`,`--allow-fs-read=*`,...e?[`--allow-fs-write=${e}`]:[]]}`${Be()}`;let kc=null,Ac=null;function jc(){return Ac||(kc||=Vr(b(Be(),`otto-plugin-service-`)),Ac=b(kc,`service-entry.cjs`),k(Ac,Ec()),Ac)}function Mc(e,t){return`${e}:${t}`}var Nc=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(Mc(e,t))?.status}restartsOf(e,t){return this.services.get(Mc(e,t))?.restarts??0}notify(e,t,n){let r=this.services.get(Mc(e,t));if(!r||r.status!==`running`)return!1;try{return r.worker.postMessage({type:P.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=Mc(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 ji(jc(),{execArgv:[...Oc(t.storageDir)]})}catch(t){F.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=>{F.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:P.start,compiledPath:t.compiledPath,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===P.started){n.error?(t.status=`failed`,F.warn({key:e,err:n.error},`plugin service failed to start`),r({error:n.error}),this.scheduleRestart(e,t)):(t.status=`running`,F.info({key:e},`plugin service started`),r({}));return}if(n.type===P.crashed){F.warn({key:e,err:n.error},`plugin service crashed at runtime`),t.status=`failed`,this.scheduleRestart(e,t);return}if(n.type===P.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??``;F[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:P.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}F.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){F.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);F.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=Mc(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===P.stopped&&(r.worker.off(`message`,t),e(!0))};r.worker.on(`message`,t);try{r.worker.postMessage({type:P.stop})}catch{e(!1)}}),a=new Promise(e=>{setTimeout(()=>e(!1),Dc).unref?.()});await Promise.race([i,a])||F.warn({key:n,timeoutMs:Dc},`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(kc){try{qr(kc,{recursive:!0,force:!0})}catch{}kc=null,Ac=null}}};let Pc=null;function Fc(){return Pc||=new Nc,Pc}async function Ic(){await Pc?.dispose(),Pc=null}const Lc=[/\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 Rc(e){let t=e;for(let e of Lc)t=t.replace(e,`***`);return t}function zc(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(`
187
- `)}function Bc(e){if(e.role===`user`)return e.internal?null:{role:`user`,text:Rc(zc(e.content))};if(e.role===`assistant`){let t=e.content.filter(e=>e.type===`tool_call`)[0]?.name,n={role:`assistant`,text:Rc(zc(e.content))};return t&&(n.toolName=t),n}return e.role===`tool_result`?e.internal?null:{role:`tool_result`,text:Rc(zc(e.content)),toolName:e.toolName}:null}function Vc(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=Bc(e);t&&o.push(t)}return{messages:o,nextIndex:e.length}}const I=S(`@x-otto/coding:plugin-module-loader`),Hc=e(import.meta.url),Uc=[`plugin.ts`,`plugin.tsx`];function Wc(e){for(let t of Uc){let n=b(e,t);if(E(n))return n}return null}const Gc={name:`otto-plugin-sdk-shim`,setup(e){e.onResolve({filter:/^@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 Kc(){let e={};try{let t=Ve(Mi(import.meta.resolve(`@x-otto/shared`))),n=Hc.resolve(`pino`,{paths:[t]});e.pino=n,e[`thread-stream`]=Hc.resolve(`thread-stream`,{paths:[Ve(n)]}),e[`jsonc-parser`]=Hc.resolve(`jsonc-parser`,{paths:[t]})}catch(e){I.warn({err:String(e)},`failed to pre-resolve pino/thread-stream/jsonc-parser absolute paths, falling back to bare-specifier external (pre-fix behavior)`)}return e}function qc(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 Jc(e){let t=Wc(e);if(!t)return null;let n=b(e,`plugin-dist`);D(n,{recursive:!0});let r=b(n,`plugin.cjs`),i=Kc(),a=[`react`,`ink`,`jsonc-parser`,`pino`,`thread-stream`].filter(e=>!(e in i)),{build:o}=Hc(`esbuild`);return await o({entryPoints:[t],outfile:r,bundle:!0,format:`cjs`,platform:`node`,external:a,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:[Gc,qc(i)]}),$c(n,e),r}const Yc=[`.ts`,`.tsx`,`.js`,`.jsx`,`.mjs`,`.cjs`,`.json`];function Xc(e){let t=[],n=r=>{let i;try{i=Ur(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=b(r,i);if(a.isDirectory())n(o);else if(a.isFile()){let n=i.lastIndexOf(`.`),r=n>=0?i.slice(n):``;Yc.includes(r)&&t.push(We(e,o))}}};return n(e),t.sort()}function Zc(e){let t=Xc(e),n=ui(`sha256`);for(let r of t){let t=r.split(Ge).join(`/`);n.update(t),n.update(`\0`);try{n.update(O(b(e,r)))}catch(e){n.update(`<unreadable:${e instanceof Error?e.message:String(e)}>`)}n.update(`\0`)}return n.digest(`hex`)}function Qc(e){return{apiVersion:On,compilerVersion:r,sourceHash:Zc(e)}}function $c(e,t){try{let n=b(e,`meta.json`),r=b(e,`.meta.json.tmp-${process.pid}`);k(r,JSON.stringify(Qc(t))),Kr(r,n)}catch(e){I.warn(`Failed to write plugin artifact meta: %s`,e instanceof Error?e.message:String(e))}}function el(e){try{let t=O(b(e,`plugin-dist`,`meta.json`),`utf8`),n=JSON.parse(t),r=Qc(e);return n.apiVersion===r.apiVersion&&n.compilerVersion===r.compilerVersion&&n.sourceHash===r.sourceHash}catch{return!1}}function tl(e){let t=b(e,`plugin-dist`,`plugin.cjs`);return E(t)?el(e)?t:(I.info(`Plugin artifact at %s is stale (meta mismatch/missing) — recompiling`,t),null):null}async function nl(e,t,n){if(!Wc(e.dir))return null;if((e.scope===`project`||e.scope===`repository`)&&!Xn(e.dir))return I.warn({pluginId:e.id},`project/repository plugin not trusted, skipping code module (fail-closed)`),null;let r=T(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=tl(e.dir);if(i)I.info({pluginId:e.id,outfile:i},`using prebuilt plugin module (RFC-150 D5, skip compile)`);else try{i=await Jc(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(!i)return null;let a;try{delete Hc.cache[i];let e=Hc(i);a=e?.default??e}catch(t){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 a!=`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 a(t);return{pluginId:e.id,module:n,compiledPath:i}}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 L={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 rl(e){return`${e===`worker`?`const { parentPort } = require('worker_threads')
234
+ `}const Ml=e(import.meta.url);let Nl=!1,Pl=()=>Ml(`esbuild`);function Fl(){return Pl()}function Il(){Nl=!0}function Ll(){if(Nl)try{Pl().stop?.()}catch{}}function Rl(e=process){e.once(`exit`,()=>Ll())}const zl=[`SIGINT`,`SIGTERM`,`SIGHUP`];function Bl(e=process){for(let t of zl){let n=()=>{e.listenerCount(t)>1||(Ll(),e.removeListener(t,n),e.kill?.(e.pid??process.pid,t))};e.on(t,n)}}function Vl(e,t,n){let r,i=!1,a=new Promise((e,n)=>{r=setTimeout(()=>{i=!0,n(Error(`esbuild build timed out after ${t}ms`))},t)});return Promise.race([e,a]).finally(()=>clearTimeout(r)).catch(e=>{throw i&&n(),e})}const F=T(`@x-otto/coding:plugin-module-loader`),I=e(import.meta.url),Hl=[`plugin.ts`,`plugin.tsx`];function Ul(e){for(let t of Hl){let n=C(e,t);if(v(n))return n}return null}const Wl={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 Gl(){let e={};try{let t=import.meta.resolve(`@x-otto/shared`),n=S(ia(t)),r=I.resolve(`pino`,{paths:[n]});e.pino=r,e[`thread-stream`]=I.resolve(`thread-stream`,{paths:[S(r)]}),e[`jsonc-parser`]=I.resolve(`jsonc-parser`,{paths:[n]}),e[`@x-otto/shared`]=t.startsWith(`file://`)?ia(t):t;let i=import.meta.resolve(`@x-otto/provider`);e[`@x-otto/provider`]=i.startsWith(`file://`)?ia(i):i;let a=import.meta.resolve(`@x-otto/interchange`);e[`@x-otto/interchange`]=a.startsWith(`file://`)?ia(a):a;let o=import.meta.resolve(`@x-otto/env`);e[`@x-otto/env`]=o.startsWith(`file://`)?ia(o):o}catch(e){F.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 Kl=[`pino`,`thread-stream`,`jsonc-parser`,`undici`],ql=`otto-host-external`,Jl=`__ottoPluginHostExternals`;function Yl(){let e=RegExp(`^(${Kl.join(`|`)})$`);return{name:`otto-plugin-host-slot`,setup(t){t.onResolve({filter:e},e=>({path:e.path,namespace:ql})),t.onLoad({filter:/.*/,namespace:ql},e=>({contents:`const __slot = globalThis[${JSON.stringify(Jl)}]\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 Xl(){let e={};try{let t=S(ia(import.meta.resolve(`@x-otto/shared`))),n=I.resolve(`pino`,{paths:[t]});e.pino=n,e[`thread-stream`]=I.resolve(`thread-stream`,{paths:[S(n)]}),e[`jsonc-parser`]=I.resolve(`jsonc-parser`,{paths:[t]}),e.undici=I.resolve(`undici`,{paths:[t]})}catch(e){F.warn({err:String(e)},`failed to resolve host external paths (pino/thread-stream/jsonc-parser/undici) — plugins compiled in portable mode will fail to load`)}return e}function Zl(){let e=globalThis,t=e[Jl]??={};for(let[e,n]of Object.entries(Xl()))if(t[e]===void 0)try{t[e]=I(n)}catch(t){F.warn({module:e,path:n,err:String(t)},`failed to load host external into injection slot`)}}function Ql(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 $l(e,t){let n=Ul(e);if(!n)return null;let r=C(e,`plugin-dist`);y(r,{recursive:!0});let i=C(r,`plugin.cjs`),a=t?.portable?{}:Gl(),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}=Fl();return Il(),await Vl(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:[Wl,...t?.portable?[Yl()]:[Ql(a)]]}),t?.timeoutMs??12e4,()=>Ll()),au(r,e),i}const eu=[`.ts`,`.tsx`,`.js`,`.jsx`,`.mjs`,`.cjs`,`.json`];function tu(e){let t=[],n=r=>{let i;try{i=Xe(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=C(r,i);if(a.isDirectory())n(o);else if(a.isFile()){let n=i.lastIndexOf(`.`),r=n>=0?i.slice(n):``;eu.includes(r)&&t.push(lt(e,o))}}};return n(e),t.sort()}function nu(e){let t=tu(e),n=Fi(`sha256`);for(let r of t){let t=r.split(ut).join(`/`);n.update(t),n.update(`\0`);try{n.update(b(C(e,r)))}catch(e){n.update(`<unreadable:${e instanceof Error?e.message:String(e)}>`)}n.update(`\0`)}return n.digest(`hex`)}function ru(e){return{apiVersion:rr,compilerVersion:i,sourceHash:nu(e)}}function iu(e,t=e){let n=C(e,`plugin-dist`,`meta.json`);if(v(n))try{let e=JSON.parse(b(n,`utf8`));e.sourceHash=nu(t),x(n,JSON.stringify(e))}catch(t){F.warn({pluginDir:e,err:String(t)},`failed to rewrite artifact sourceHash`)}}function au(e,t){try{let n=C(e,`meta.json`),r=C(e,`.meta.json.tmp-${process.pid}`);x(r,JSON.stringify(ru(t))),$e(r,n)}catch(e){F.warn(`Failed to write plugin artifact meta: %s`,e instanceof Error?e.message:String(e))}}function ou(e){try{let t=b(C(e,`plugin-dist`,`meta.json`),`utf8`),n=JSON.parse(t),r=ru(e);return n.apiVersion===r.apiVersion&&n.compilerVersion===r.compilerVersion&&n.sourceHash===r.sourceHash}catch{return!1}}function su(e){let t=C(e,`plugin-dist`,`plugin.cjs`);return v(t)?ou(e)?t:(F.info(`Plugin artifact at %s is stale (meta mismatch/missing) — recompiling`,t),null):null}async function cu(e,t,n){if(!Ul(e.dir))return null;if((e.scope===`project`||e.scope===`repository`)&&!Or(e.dir))return F.warn({pluginId:e.id},`project/repository plugin not trusted, skipping code module (fail-closed)`),n?.(e.id,`project/repository plugin not trusted, skipping code module (fail-closed)`,`not-trusted`),null;let r=O(e);if(r.pendingCapabilities.length>0)return F.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)`),n?.(e.id,`declares high-risk capabilities not yet granted: ${r.pendingCapabilities.join(`, `)}`,`capability-not-granted`),null;let i=!1,a=su(e.dir);if(a)i=!0,F.info({pluginId:e.id,outfile:a},`using prebuilt plugin module (RFC-150 D5, skip compile)`);else try{a=await $l(e.dir)}catch(t){let r=String(t);return F.warn({pluginId:e.id,err:r},`plugin.ts compile failed`),n?.(e.id,`compile failed: ${r}`,`module-error`),null}if(!a)return null;Zl();let o;try{delete I.cache[a];let e=I(a);o=e?.default??e}catch(t){if(i){F.warn({pluginId:e.id,outfile:a,err:String(t)},`prebuilt plugin module failed to load — recompiling for this machine`);try{let t=await $l(e.dir);if(!t)throw Error(`recompile produced no artifact`);a=t,delete I.cache[a];let n=I(a);o=n?.default??n}catch(t){let r=String(t);return F.warn({pluginId:e.id,err:r},`plugin.ts load failed (after recompile retry)`),n?.(e.id,`load failed: ${r}`,`module-error`),null}}else{let r=String(t);return F.warn({pluginId:e.id,err:r},`plugin.ts load failed`),n?.(e.id,`load failed: ${r}`,`module-error`),null}}if(typeof o!=`function`)return F.warn({pluginId:e.id},`plugin.ts default export is not a factory function`),n?.(e.id,`default export is not a factory function`,`module-error`),null;try{let n=await o(t);return{pluginId:e.id,module:n,compiledPath:a??void 0}}catch(t){let r=String(t);return F.warn({pluginId:e.id,err:r},`plugin factory threw`),n?.(e.id,`factory threw: ${r}`,`module-error`),null}}const L=T(`@x-otto/coding:plugin-service-pool`),lu=5e3;function uu(e){return[`--experimental-permission`,`--allow-fs-read=*`,...e?[`--allow-fs-write=${e}`]:[]]}`${ot()}`;let du=null,fu=null;function pu(){return fu||(du||=Je(C(ot(),`otto-plugin-service-`)),fu=C(du,`service-entry.cjs`),x(fu,jl()),fu)}function mu(e,t){return`${e}:${t}`}var hu=class{services=new Map;eventDispatcher;setEventDispatcher(e){this.eventDispatcher=e}get runningKeys(){return[...this.services.entries()].filter(([,e])=>e.status===`running`).map(([e])=>e)}statusOf(e,t){return this.services.get(mu(e,t))?.status}restartsOf(e,t){return this.services.get(mu(e,t))?.restarts??0}notify(e,t,n){let r=this.services.get(mu(e,t));if(!r||r.status!==`running`)return!1;try{return r.worker.postMessage({type:P.notify,notification:n}),!0}catch{return!1}}pushEvent(e,t){for(let n of this.runningServiceIds(e)){let r=this.services.get(mu(e,n));if(r)try{r.worker.postMessage({type:P.eventPush,eventType:t.type,payload:t.payload,sourcePluginId:t.sourcePluginId})}catch{}}}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=mu(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 ra(pu(),{execArgv:[...uu(t.storageDir)]})}catch(t){L.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=>{L.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:P.start,compiledPath:t.compiledPath,hostExternals:Xl(),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===P.started){n.error?(t.status=`failed`,L.warn({key:e,err:n.error},`plugin service failed to start`),r({error:n.error}),this.scheduleRestart(e,t)):(t.status=`running`,L.info({key:e},`plugin service started`),r({}));return}if(n.type===P.crashed){L.warn({key:e,err:n.error},`plugin service crashed at runtime`),t.status=`failed`,this.scheduleRestart(e,t);return}if(n.type===P.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??``;L[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:P.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===`emitEvent`){if(!this.eventDispatcher){o(void 0,`event dispatcher not available (service events capability not wired)`);return}let e=a,n=String(e?.type??``),r=e?.payload??{};this.eventDispatcher.emit(t.input.pluginId,n,r),o(void 0);return}if(i===`subscribeEvent`){if(!this.eventDispatcher){o(void 0,`event dispatcher not available (service events capability not wired)`);return}let e=String(a?.type??``),n=t.input.pluginId;this.eventDispatcher.subscribe(n,e,()=>{},(e,t,r)=>{this.pushEvent(n,{type:e,payload:t,sourcePluginId:r.pluginId})}),o(void 0);return}if(i===`unsubscribeEvent`){if(!this.eventDispatcher){o(void 0,`event dispatcher not available (service events capability not wired)`);return}this.eventDispatcher.unregisterPluginSubscriptions(t.input.pluginId),o(void 0);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}L.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){L.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);L.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=mu(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===P.stopped&&(r.worker.off(`message`,t),e(!0))};r.worker.on(`message`,t);try{r.worker.postMessage({type:P.stop})}catch{e(!1)}}),a=new Promise(e=>{setTimeout(()=>e(!1),lu).unref?.()});await Promise.race([i,a])||L.warn({key:n,timeoutMs:lu},`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(du){try{et(du,{recursive:!0,force:!0})}catch{}du=null,fu=null}}};let gu=null;function _u(){return gu||=new hu,gu}async function vu(){await gu?.dispose(),gu=null}const yu=[/\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 bu(e){let t=e;for(let e of yu)t=t.replace(e,`***`);return t}function xu(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(`
235
+ `)}function Su(e){if(e.role===`user`)return e.internal?null:{role:`user`,text:bu(xu(e.content))};if(e.role===`assistant`){let t=e.content.filter(e=>e.type===`tool_call`)[0]?.name,n={role:`assistant`,text:bu(xu(e.content))};return t&&(n.toolName=t),n}return e.role===`tool_result`?e.internal?null:{role:`tool_result`,text:bu(xu(e.content)),toolName:e.toolName}:null}function Cu(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=Su(e);t&&o.push(t)}return{messages:o,nextIndex:e.length}}const R={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`,eventPush:`event.push`};function wu(e){return`${e===`worker`?`const { parentPort } = require('worker_threads')
188
236
  const __send = (m) => parentPort.postMessage(m)
189
237
  const __onMessage = (fn) => parentPort.on('message', fn)`:`const __send = (m) => process.send(m)
190
238
  const __onMessage = (fn) => process.on('message', fn)`}\n${`// RFC-303 M4:工具执行上下文——host/logger 经反向 RPC 代理回宿主
@@ -200,7 +248,7 @@ function makeHostStub(methods) {
200
248
  return (...args) => new Promise((resolve, reject) => {
201
249
  const id = 'host-' + (++hostCallSeq)
202
250
  hostCallPending.set(id, { resolve, reject })
203
- __send({ type: '${L.hostCall}', id, method, args })
251
+ __send({ type: '${R.hostCall}', id, method, args })
204
252
  })
205
253
  },
206
254
  })
@@ -210,16 +258,30 @@ const toolExecutors = new Map()
210
258
  const sigilResolverExecutors = new Map()
211
259
  const cancelledToolIds = new Set()
212
260
  let pluginId = ''
261
+ // RFC-427 M4 D-M4-2:本地事件订阅表(type → handler[])——subscribeEvent stub 写、
262
+ // eventPush 分支读(宿主已做通配匹配,本端只按精确 type 查)。
263
+ const localSubs = new Map()
213
264
  let pluginInstance = null
214
265
 
215
266
  __onMessage(async (msg) => {
216
- if (msg.type === '${L.load}') {
267
+ if (msg.type === '${R.load}') {
217
268
  pluginId = msg.pluginId
218
269
  try {
270
+ // RFC-365 R3:host-slot 注入槽——隔离端是独立 realm(worker_threads / child_process
271
+ // 都不共享宿主 globalThis),且本 entry 落在 tmpdir、自身解析不到 pino 等包。宿主在
272
+ // 运行机上解析出绝对路径经 load 消息下发,这里 require 后装进槽,供产物内的虚拟模块
273
+ // 读取。必须在 require(compiledPath) **之前**完成,否则产物首行即抛"未注入"。
274
+ if (msg.hostExternals) {
275
+ const __slot = (globalThis.__ottoPluginHostExternals = globalThis.__ottoPluginHostExternals || {})
276
+ for (const __name of Object.keys(msg.hostExternals)) {
277
+ if (__slot[__name] !== undefined) continue
278
+ try { __slot[__name] = require(msg.hostExternals[__name]) } catch (e) { /* 单个 external 失败留给产物侧抛可诊断错误 */ }
279
+ }
280
+ }
219
281
  const mod = require(msg.compiledPath)
220
282
  const factory = mod?.default ?? mod
221
283
  if (typeof factory !== 'function') {
222
- __send({ type: '${L.loaded}', pluginId, module: { tools: [], hookEvents: [], hasOnActivate: false, hasOnDeactivate: false } })
284
+ __send({ type: '${R.loaded}', pluginId, module: { tools: [], hookEvents: [], hasOnActivate: false, hasOnDeactivate: false } })
223
285
  return
224
286
  }
225
287
  // RFC-303 M4:host stub(工具 ctx 与 factory ctx 共用;白名单方法名随 load 下发)。
@@ -232,6 +294,29 @@ __onMessage(async (msg) => {
232
294
  if (msg.ctx && msg.ctx.listActivePlugins === true) {
233
295
  factoryCtx.listActivePlugins = () => hostStub.listActivePlugins()
234
296
  }
297
+ // RFC-427 M4 D-M4-1:emitEvent 经 hostCall 通道回宿主(postMessage 不能传函数,
298
+ // 宿主下发纯数据标记,此处构造 stub——同 listActivePlugins 模式)。
299
+ if (msg.ctx && msg.ctx.emitEvent === true) {
300
+ factoryCtx.emitEvent = (type, payload) => hostStub.emitEvent(type, payload)
301
+ }
302
+ // RFC-427 M4 D-M4-2:subscribeEvent——本地订阅表(eventPush 分支按精确 type 查)
303
+ // + 经 hostCall 注册到宿主 dispatcher(宿主 emit 时经池 pushEvent 推回本隔离端)。
304
+ // disposer:本地删 handler + 经 hostCall 反注册。fire-and-forget(hostCall 是 async,
305
+ // 注册/反注册不 await——订阅的最终生效由宿主 dispatcher 的注册确认保证,失败静默)。
306
+ // localSubs 用模板顶层声明(eventPush 分支同读——局部遮蔽会导致两 Map 分离、推送永不命中)。
307
+ if (msg.ctx && msg.ctx.subscribeEvent === true) {
308
+ factoryCtx.subscribeEvent = (type, handler) => {
309
+ const list = localSubs.get(type) || []
310
+ list.push(handler)
311
+ localSubs.set(type, list)
312
+ void hostStub.subscribeEvent(type)
313
+ return () => {
314
+ const arr = localSubs.get(type) || []
315
+ localSubs.set(type, arr.filter((h) => h !== handler))
316
+ if (arr.length === 0) void hostStub.unsubscribeEvent(type)
317
+ }
318
+ }
319
+ }
235
320
  const instance = factory(factoryCtx)
236
321
  pluginInstance = instance
237
322
  const tools = (instance.tools ?? []).filter((t) => t.name && typeof t.execute === 'function')
@@ -268,7 +353,7 @@ __onMessage(async (msg) => {
268
353
  host: hostMethods.some((m) => m !== 'listActivePlugins') ? hostStub : undefined,
269
354
  }
270
355
  __send({
271
- type: '${L.loaded}', pluginId,
356
+ type: '${R.loaded}', pluginId,
272
357
  module: {
273
358
  contributions: instance.contributions,
274
359
  tools: tools.map((t) => ({
@@ -284,39 +369,39 @@ __onMessage(async (msg) => {
284
369
  },
285
370
  })
286
371
  } catch (err) {
287
- __send({ type: '${L.error}', pluginId, error: err?.message ?? String(err) })
372
+ __send({ type: '${R.error}', pluginId, error: err?.message ?? String(err) })
288
373
  }
289
374
  return
290
375
  }
291
- if (msg.type === '${L.toolExecute}') {
376
+ if (msg.type === '${R.toolExecute}') {
292
377
  const exec = toolExecutors.get(msg.name)
293
- if (!exec) { __send({ type: '${L.toolResult}', id: msg.id, error: "tool not found" }); return }
378
+ if (!exec) { __send({ type: '${R.toolResult}', id: msg.id, error: "tool not found" }); return }
294
379
  try {
295
380
  const r = await exec(msg.params, toolCtx)
296
381
  if (cancelledToolIds.delete(msg.id)) return
297
- __send({ type: '${L.toolResult}', id: msg.id, result: r })
382
+ __send({ type: '${R.toolResult}', id: msg.id, result: r })
298
383
  } catch (e) {
299
384
  if (cancelledToolIds.delete(msg.id)) return
300
- __send({ type: '${L.toolResult}', id: msg.id, error: e?.message ?? String(e) })
385
+ __send({ type: '${R.toolResult}', id: msg.id, error: e?.message ?? String(e) })
301
386
  }
302
387
  return
303
388
  }
304
- if (msg.type === '${L.toolCancel}') {
389
+ if (msg.type === '${R.toolCancel}') {
305
390
  cancelledToolIds.add(msg.id)
306
391
  return
307
392
  }
308
- if (msg.type === '${L.sigilResolve}') {
393
+ if (msg.type === '${R.sigilResolve}') {
309
394
  const fn = sigilResolverExecutors.get(msg.name)
310
- if (!fn) { __send({ type: '${L.sigilResult}', id: msg.id, error: "sigil resolver not found" }); return }
395
+ if (!fn) { __send({ type: '${R.sigilResult}', id: msg.id, error: "sigil resolver not found" }); return }
311
396
  try {
312
397
  const r = await fn(msg.param, msg.ctx)
313
- __send({ type: '${L.sigilResult}', id: msg.id, result: r })
398
+ __send({ type: '${R.sigilResult}', id: msg.id, result: r })
314
399
  } catch (e) {
315
- __send({ type: '${L.sigilResult}', id: msg.id, error: e?.message ?? String(e) })
400
+ __send({ type: '${R.sigilResult}', id: msg.id, error: e?.message ?? String(e) })
316
401
  }
317
402
  return
318
403
  }
319
- if (msg.type === '${L.hostResult}') {
404
+ if (msg.type === '${R.hostResult}') {
320
405
  const p = hostCallPending.get(msg.id)
321
406
  if (!p) return
322
407
  hostCallPending.delete(msg.id)
@@ -324,26 +409,38 @@ __onMessage(async (msg) => {
324
409
  else p.resolve(msg.result)
325
410
  return
326
411
  }
327
- if (msg.type === '${L.onActivate}') {
412
+ if (msg.type === '${R.eventPush}') {
413
+ // RFC-427 M4 D-M4-2:宿主推送插件事件(跨进程 subscribe 投递方向)——宿主 dispatcher
414
+ // 已做通配匹配 + 权限 + 校验(评审边界声明:匹配在宿主单点),本端只按**精确 type**
415
+ // 查本地订阅表调 handler。handler 异常吞掉 + 静默(隔离端无 logger,R2a 语义靠宿主
416
+ // 侧 transport 调用已 try/catch 兜底——这里再兜一层防 worker 崩溃)。
417
+ const list = localSubs.get(msg.eventType) || []
418
+ for (const h of list) {
419
+ try { h(msg.payload, { pluginId: msg.sourcePluginId }) }
420
+ catch (e) { /* swallow(handler 异常不传播,R2a) */ }
421
+ }
422
+ return
423
+ }
424
+ if (msg.type === '${R.onActivate}') {
328
425
  if (!pluginInstance || typeof pluginInstance.onActivate !== 'function') {
329
- __send({ type: '${L.activated}', id: msg.id })
426
+ __send({ type: '${R.activated}', id: msg.id })
330
427
  return
331
428
  }
332
- try { await pluginInstance.onActivate(); __send({ type: '${L.activated}', id: msg.id }) }
333
- catch (e) { __send({ type: '${L.activated}', id: msg.id, error: e?.message ?? String(e) }) }
429
+ try { await pluginInstance.onActivate(); __send({ type: '${R.activated}', id: msg.id }) }
430
+ catch (e) { __send({ type: '${R.activated}', id: msg.id, error: e?.message ?? String(e) }) }
334
431
  return
335
432
  }
336
- if (msg.type === '${L.onDeactivate}') {
433
+ if (msg.type === '${R.onDeactivate}') {
337
434
  if (!pluginInstance || typeof pluginInstance.onDeactivate !== 'function') {
338
- __send({ type: '${L.deactivated}', id: msg.id })
435
+ __send({ type: '${R.deactivated}', id: msg.id })
339
436
  return
340
437
  }
341
- try { await pluginInstance.onDeactivate(); __send({ type: '${L.deactivated}', id: msg.id }) }
342
- catch (e) { __send({ type: '${L.deactivated}', id: msg.id, error: e?.message ?? String(e) }) }
438
+ try { await pluginInstance.onDeactivate(); __send({ type: '${R.deactivated}', id: msg.id }) }
439
+ catch (e) { __send({ type: '${R.deactivated}', id: msg.id, error: e?.message ?? String(e) }) }
343
440
  return
344
441
  }
345
- if (msg.type === '${L.stop}') { toolExecutors.clear(); pluginInstance = null; process.exit(0) }
346
- })`}`}var il=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===L.loaded){let t=this.settlePending(`__load__`);t&&t.resolve(e.module);return}if(e.type===L.error){let t=this.settlePending(`__load__`);t&&t.reject(Error(e.error??this.adapter.loadFailedMessage?.()??`plugin isolated transport load failed`));return}if(e.type===L.toolResult){let t=this.settlePending(e.id);t&&t.resolve({result:e.result,error:e.error});return}if(e.type===L.sigilResult){let t=this.settlePending(e.id);t&&t.resolve({result:e.result,error:e.error});return}if(e.type===L.activated||e.type===L.deactivated){let t=this.settlePending(e.id);t&&t.resolve({error:e.error});return}if(e.type===L.hostCall){let t=this.boundPluginId,n=this.hostCallDispatcher,r=t=>{try{this.adapter.send({type:L.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:L.load,pluginId:e,compiledPath:t,ctx:n,...n.hostMethods?{hostMethods:n.hostMethods}:{}})})}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:L.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:L.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:L.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:L.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:L.onDeactivate,id:e})})}clearPending(){this.pending.clear()}};const al=S(`@x-otto/coding:plugin-worker-pool`);let ol=null,sl=null;function cl(){return sl||(ol||=Vr(b(Be(),`otto-plugin-worker-`)),sl=b(ol,`worker-entry.cjs`),k(sl,rl(`worker`)),sl)}var ll=class extends il{worker;constructor(){let e=new ji(cl());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)=>{al.warn({tool:e,timeoutMs:t},`plugin tool execution timed out`)},onErrorLog:e=>{al.warn({err:String(e)},`plugin worker error`)},onExitLog:e=>{al.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:L.stop}),await this.worker.terminate()}catch{}this.clearPending(),this.worker.unref()}},ul=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 ll;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(),ol){try{qr(ol,{recursive:!0,force:!0})}catch{}ol=null,sl=null}await Promise.all(e.map(e=>e.stop().catch(()=>{})))}get size(){return this.workers.size}};const dl=S(`@x-otto/coding:plugin-process-pool`);let fl=null,pl=null;function ml(){return pl||(fl||=Vr(b(Be(),`otto-plugin-process-`)),pl=b(fl,`process-entry.cjs`),k(pl,rl(`process`)),pl)}var hl=class extends il{child;sandboxToDispose;constructor(e){let t=ml(),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 dl.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=Ti(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)=>{dl.warn({tool:e,timeoutMs:t},`plugin tool execution timed out (isolated process)`)},onErrorLog:e=>{dl.warn({err:String(e)},`plugin process error`)},onExitLog:e=>{dl.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=>{dl.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:L.stop})}catch{}try{this.child.kill()}catch{}this.clearPending()}},gl=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 hl(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(),fl){try{qr(fl,{recursive:!0,force:!0})}catch{}fl=null,pl=null}await Promise.all(e.map(e=>e.stop().catch(()=>{})))}get size(){return this.processes.size}};const _l=S(`@x-otto/coding:plugin-module-loader-isolated`);let vl=null;function yl(){return vl||=new ul,vl}let bl=null;function xl(){return bl||=new gl,bl}async function Sl(){await Promise.all([vl?.dispose()??Promise.resolve(),bl?.dispose()??Promise.resolve()])}function Cl(e){return e===`project`||e===`repository`?xl():yl()}function wl(e){return!!e.manifest.capabilities?.includes(`tools`)}function Tl(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&&_l.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 El(e,t,n,r){if((e.scope===`project`||e.scope===`repository`)&&!Xn(e.dir))return _l.warn({pluginId:e.id},`project/repository plugin not trusted, skipping isolated code module (fail-closed)`),null;let i=T(e);if(i.pendingCapabilities.length>0)return _l.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??Cl(e.scope),o;try{o=await Jc(e.dir)}catch(t){let n=String(t);return _l.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});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 _l.warn({pluginId:e.id},t),r?.(e.id,t),null}return _l.info({pluginId:e.id},`plugin worker pool exhausted, falling back to in-process load`),nl(e,t,r)}return{pluginId:e.id,module:Tl(e.id,n,a),compiledPath:o}}catch(t){let n=String(t);return _l.warn({pluginId:e.id,err:n},`plugin.ts worker load failed`),r?.(e.id,`worker load failed: ${n}`),null}}function Dl(e,t){return e.includes(`onStartup`)?!0:e.some(e=>t.has(e))}var Ol=class{axisName=`hooks`;hookNamesByPlugin=new Map;constructor(e){this.hookRegistry=e}register(e){let t=e.loaded.module.hooks;if(t){let n=sc(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)}},kl=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=gc(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()]}},Al=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 jl=S(`@x-otto/coding:plugin-sigil-loader`);function Ml(e){return e.startsWith(`!`)||e.startsWith(`#`)}function Nl(e){let t=[];for(let n of e){let e=n.manifest.contributes?.sigilEntries;if(e?.length){if(T(n).gated){jl.warn({pluginId:n.id},`plugin gated (untrusted), sigilEntries skipped`);continue}for(let r of e){if(Ml(r.value)){jl.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 Pl(e){for(let t of e)t.manifest.contributes?.inputEntries&&jl.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 Fl(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}):jl.warn({pluginId:e,name:r},`sigilResolvers entry is neither function nor {resolve}, skipped`)}return n}function Il(e,t){return t.map(t=>async(n,r)=>(await t(n,r)).filter(e=>!Ml(e.value)).map(t=>({...t,source:e})))}function Ll(e,t){for(let n of e)n.resolverId&&!t(n.resolverId)&&jl.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 Rl=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=Fl(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 Il(e.plugin.id,n))t.push(this.pluginInput.registerProvider(`@`,r));this.sigilProviderUnsubsByPlugin.set(e.plugin.id,t)}if(this.sigilResolverRegistry){let t=this.sigilResolverRegistry;Ll(Nl([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)}},zl=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(...cc(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()}},Bl=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(...lc(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}},Vl=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 uc(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 R=S(`@x-otto/coding:plugin-provider-loader`);function Hl(e){let t=S(`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 z(e,t){return`${e}:${t}`}function Ul(e){return new Set([...(e.contributes?.providers??[]).filter(e=>e.preserveProviderId===!0&&e.oauthRef).map(e=>e.oauthRef),...e.codeProviderIds??[]])}function Wl(e,t){let n=Ul(t);return new Set((t.contributes?.oauth??[]).map(t=>n.has(t.id)?t.id:z(e,t.id)))}function Gl(e,t){return new Set((t.contributes?.providers??[]).filter(e=>e.catalogOnly!==!0&&e.baseUrl&&e.wireApi).map(t=>t.preserveProviderId===!0?t.id:z(e,t.id)))}function Kl(e,t,n){return new Set([...n.codeProviderIds??[],...(n.contributes?.providers??[]).filter(e=>e.preserveProviderId===!0).map(e=>e.id)]).has(t)?t:z(e,t)}function ql(e){return`code:${e}`}function Jl(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:[`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 Yl(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 Xl(e,t,n,r,i,a){return()=>{let o=r.get(a);if(!o)throw new qe(`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:Hl(a)})}}function Zl(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:z(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`}),R.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`?Fi({...t,id:s,name:c,tokenExchangeEncoding:t.tokenExchangeEncoding??`form`,assumesLoopbackAlways:t.assumesLoopbackAlways??!1,subscriptionScoped:t.subscriptionScoped??!1}):Pi({...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{R.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 Ql(e,t,n,r,i,a){let o=t.contributes?.providers;if(!o?.length)return;if(!t.capabilities?.includes(`provider`)){R.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`}),R.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`}),R.warn({pluginId:e,providerId:t.id},`plugin provider id collides with builtin, rejected (R3)`);continue}let o=t.preserveProviderId===!0,c=o?t.id:z(e,t.id),l=o?t.id:z(e,t.id);if(t.catalogOnly===!0){let a=l;if(t.oauthRef){let n=o?t.oauthRef:z(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)`}),R.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},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=>Jl(e,a,c,t.baseUrl??``,void 0,t.supportsTools,t.responseBodyPolicy)),i=n.modelRegistry.registerWithSource(r,e);for(let t of i)R.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:z(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)`}),R.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&&R.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?Yl(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},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&&R.warn({pluginId:e,providerId:t.id},`provider declares allowAuthHeaderOverride: custom headers may replace auth headers (RFC-270 D3)`);let h=Xl(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=>Jl(e,u,c,d,t.imageConstraints,t.supportsTools,t.responseBodyPolicy)),i=n.modelRegistry.registerWithSource(r,e);for(let t of i)R.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 $l(e,t,n,r,i){let a={registered:[],rejected:[]},o=n.authStore.oauth;return Zl(e,t,o,Ul(t),new Map((t.contributes?.providers??[]).filter(e=>e.oauthRef&&e.name).map(e=>[e.oauthRef,e.name])),a,r),Ql(e,t,n,o,a,i),a}async function eu(e,t,n,r,i){let a=n.authStore.oauth,o=Ul(t),s=t.contributes?.oauth;if(s?.length&&a)for(let t of s){let n=o.has(t.id)?t.id:z(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:z(e,t.id);pe(r),t.envKey&&!t.oauthRef&&n.authStore.unregisterEnvKey(r)}await n.providerRegistry.unregisterBySource(e,i),n.modelRegistry.unregisterBySource(e)}}var tu=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=pc(e.plugin.id,i);if(!t)continue;let a=n.has(r)?r:z(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)}},nu=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=Kl(e.plugin.id,i,e.plugin.manifest);if(!this.providerRegistry.registerPluginProvider(t,fc(e.plugin.id,a),ql(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:Yl(o,t,t)},ql(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=>Jl(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(ql(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)}},ru=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)}},iu=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=>hc(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 au=`[plugin]`;function ou(e,t,n){let r=n.name?.trim()||n.key;return`${au} ${e}:${t}:${n.key} — ${r}`}function su(e,t,n){let r=e.subscriber;return!r||r.kind!==`plugin-service`||r.pluginId!==t||r.serviceId!==n?!1:e.name.startsWith(au)}function cu(e,t,n){let r=`${au} ${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 lu(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(!su(e,r,i))continue;let t=cu(e,r,i);t!==void 0&&s.set(t,e)}for(let[e,c]of o){let o=ou(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 uu(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(au)&&t.remove(e.id)&&(r+=1)}return r}var du=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=lu({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&&lu({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=uu({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=lu({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 fu=/^[a-z0-9]+(?:-[a-z0-9]+)*$/,pu=b(n,`plugin-state`);function mu(e){let t=hu(e);try{return qr(t,{recursive:!0,force:!0}),{removed:!E(t),dir:t}}catch{return{removed:!1,dir:t}}}function hu(e){if(!fu.test(e))throw Error(`invalid pluginId for scoped storage: ${e} (must be kebab-case)`);return b(pu,e)}var gu=class{persistence;baseDir;pluginId;workspaceKey;constructor(e,t){if(this.pluginId=e,this.workspaceKey=t,!fu.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=cn({type:`memory`});return}let n=x(b(hu(e),t));D(n,{recursive:!0});let r=Gr(n),i=Gr(pu);if(r!==i&&!r.startsWith(i+`/`))throw Error(`scoped storage path escapes plugin-state root: ${r}`);this.baseDir=n,this.persistence=cn({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 _u(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 vu(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=bu(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 Vc(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 yu=new WeakMap;function bu(e){if(e.capabilityQuota)return e.capabilityQuota;let t=yu.get(e);return t||(t=new Sc,yu.set(e,t)),t}const xu=new Map([[`oauthProviderFactories`,`provider`],[`providerFactories`,`provider`],[`wireProtocols`,`wire-protocol`]]);function Su(e){let t=e.manifest.contributes;return!t||typeof t!=`object`?[]:Object.keys(t)}var Cu=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 Ol(e.hookRegistry),this.monitorsAxis=new kl(e.hookRegistry,e.logger),this.feedbackAxis=new Al(e.feedbackRegistry,e.logger),this.sigilAxis=new Rl(e.sigilResolverRegistry,e.pluginInput,e.logger),this.computedCommandsAxis=new zl,this.computedAgentsAxis=new Bl,this.computedSkillsAxis=new Vl(e.skillRegistry),this.oauthProviderAxis=new tu(e.authStore,e.logger),this.codeProviderAxis=new nu(e.providerRegistry,e.modelRegistry,e.logger),this.wireProtocolAxis=new ru(e.wireProtocolRegistry,e.logger),this.toolsAxis=new iu(e.toolRegistry,e.logger),this.servicesAxis=new du({pool:e.servicePool??Fc(),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=vu(n,T(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=vu(n,T(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 gu(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?T(t):void 0;for(let r of this.axisHandlers){let i=xu.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)}bu(this.deps).reset(e)}pluginSignature(e){let t=T(e),n=`${t.gated?`gated`:`ok`}:${[...t.pendingCapabilities].sort().join(`,`)}`,r=`nofile`;for(let t of[`plugin.ts`,`plugin.tsx`])try{let n=Jr(b(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(!Dl(rr(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),rc(e.id,`info`,t)},warn:t=>{this.deps.logger.warn({pluginId:e.id},t),rc(e.id,`warn`,t)},error:t=>{this.deps.logger.error({pluginId:e.id},t),rc(e.id,`error`,t)}},getWireProtocol:e=>this.deps.wireProtocolRegistry?.get(e),resolveProviderCredential:(()=>{let t=_u(e);return e=>t(e)?this.deps.providerRegistry?.resolveAccessKey(e)??Promise.resolve(null):Promise.resolve(null)})(),resolveProviderAuth:(()=>{let t=_u(e);return e=>t(e)?this.deps.providerRegistry?.resolveAuth(e)??Promise.resolve(null):Promise.resolve(null)})(),host:vu(e,T(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)??Su(e)}))},n=this.deps.useIsolatedLoading!==!1&&wl(e)?await El(e,t,void 0,this.deps.onPluginLoadError):await nl(e,t,this.deps.onPluginLoadError);if(!n)continue;let i=T(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?.()??yi;a=new gu(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:vu(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,Su(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=bu(this.deps);for(let t of this.deps.activePlugins())e.reset(t.id);this.firedEvents.clear()}};const wu=S(`@x-otto/coding:panel-compiler`),Tu=e(import.meta.url);function Eu(e){let t=b(e,`panels`);if(!E(t))return{compiled:[],errors:[],skipped:!0};let n;try{n=Ur(t).filter(e=>e.endsWith(`.tsx`))}catch{return{compiled:[],errors:[],skipped:!0}}if(n.length===0)return{compiled:[],errors:[],skipped:!0};let r=b(e,`panels-dist`);D(r,{recursive:!0});let i=Vr(b(Be(),`otto-panel-shims-`)),a=b(i,`react-shim.js`),o=b(i,`ink-shim.js`),s=b(i,`tui-shim.js`);k(a,`const R = globalThis.React
442
+ if (msg.type === '${R.stop}') { toolExecutors.clear(); pluginInstance = null; process.exit(0) }
443
+ })`}`}var Tu=class{pending=new Map;idCounter=0;boundPluginId=``;hostCallDispatcher=null;setHostCallDispatcher(e){this.hostCallDispatcher=e}pushEvent(e){try{this.adapter.send({type:R.eventPush,eventType:e.type,payload:e.payload,sourcePluginId:e.sourcePluginId})}catch{}}constructor(e){this.adapter=e,this.adapter.onMessage(e=>{if(e.type===R.loaded){let t=this.settlePending(`__load__`);t&&t.resolve(e.module);return}if(e.type===R.error){let t=this.settlePending(`__load__`);t&&t.reject(Error(e.error??this.adapter.loadFailedMessage?.()??`plugin isolated transport load failed`));return}if(e.type===R.toolResult){let t=this.settlePending(e.id);t&&t.resolve({result:e.result,error:e.error});return}if(e.type===R.sigilResult){let t=this.settlePending(e.id);t&&t.resolve({result:e.result,error:e.error});return}if(e.type===R.activated||e.type===R.deactivated){let t=this.settlePending(e.id);t&&t.resolve({error:e.error});return}if(e.type===R.hostCall){let t=this.boundPluginId,n=this.hostCallDispatcher,r=t=>{try{this.adapter.send({type:R.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:R.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:R.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:R.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:R.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:R.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:R.onDeactivate,id:e})})}clearPending(){this.pending.clear()}};const Eu=T(`@x-otto/coding:plugin-worker-pool`);let Du=null,Ou=null;function ku(){return Ou||(Du||=Je(C(ot(),`otto-plugin-worker-`)),Ou=C(Du,`worker-entry.cjs`),x(Ou,wu(`worker`)),Ou)}var Au=class extends Tu{worker;constructor(){let e=new ra(ku());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)=>{Eu.warn({tool:e,timeoutMs:t},`plugin tool execution timed out`)},onErrorLog:e=>{Eu.warn({err:String(e)},`plugin worker error`)},onExitLog:e=>{Eu.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:R.stop}),await this.worker.terminate()}catch{}this.clearPending(),this.worker.unref()}},ju=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 Au;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())}pushEvent(e,t){let n=this.workers.get(e);n&&n.pushEvent(t)}async dispose(){let e=[...this.workers.values()];if(this.workers.clear(),Du){try{et(Du,{recursive:!0,force:!0})}catch{}Du=null,Ou=null}await Promise.all(e.map(e=>e.stop().catch(()=>{})))}get size(){return this.workers.size}};const Mu=T(`@x-otto/coding:plugin-process-pool`);let Nu=null,Pu=null;function Fu(){return Pu||(Nu||=Je(C(ot(),`otto-plugin-process-`)),Pu=C(Nu,`process-entry.cjs`),x(Pu,wu(`process`)),Pu)}var Iu=class extends Tu{child;sandboxToDispose;constructor(e){let t=Fu(),n=process.execPath,r=[t],i=n,a=r,o;if(He()){let t=ze({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 Mu.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=$i(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)=>{Mu.warn({tool:e,timeoutMs:t},`plugin tool execution timed out (isolated process)`)},onErrorLog:e=>{Mu.warn({err:String(e)},`plugin process error`)},onExitLog:e=>{Mu.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=>{Mu.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:R.stop})}catch{}try{this.child.kill()}catch{}this.clearPending()}},Lu=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 Iu(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())}pushEvent(e,t){let n=this.processes.get(e);n&&n.pushEvent(t)}async dispose(){let e=[...this.processes.values()];if(this.processes.clear(),Nu){try{et(Nu,{recursive:!0,force:!0})}catch{}Nu=null,Pu=null}await Promise.all(e.map(e=>e.stop().catch(()=>{})))}get size(){return this.processes.size}};const z=T(`@x-otto/coding:plugin-module-loader-isolated`);let Ru=null;function zu(){return Ru||=new ju,Ru}let Bu=null;function Vu(){return Bu||=new Lu,Bu}async function Hu(){await Promise.all([Ru?.dispose()??Promise.resolve(),Bu?.dispose()??Promise.resolve()])}function Uu(e){return e===`project`||e===`repository`?Vu():zu()}function Wu(e){return!!e.manifest.capabilities?.includes(`tools`)}function Gu(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&&z.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 Ku(e,t,n,r){if((e.scope===`project`||e.scope===`repository`)&&!Or(e.dir))return z.warn({pluginId:e.id},`project/repository plugin not trusted, skipping isolated code module (fail-closed)`),r?.(e.id,`project/repository plugin not trusted, skipping isolated code module (fail-closed)`,`not-trusted`),null;let i=O(e);if(i.pendingCapabilities.length>0)return z.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)`),r?.(e.id,`declares high-risk capabilities not yet granted: ${i.pendingCapabilities.join(`, `)}`,`capability-not-granted`),null;let a=n??Uu(e.scope),o=su(e.dir);try{o?z.info({pluginId:e.id,compiledPath:o},`using prebuilt plugin module (isolated path, RFC-150 D5)`):o=await $l(e.dir)}catch(t){let n=String(t);return z.warn({pluginId:e.id,err:n},`plugin.ts compile failed (isolated path)`),r?.(e.id,`compile failed: ${n}`,`module-error`),null}if(!o)return null;let s=[...Object.keys(t.host??{}),`listActivePlugins`];if(typeof t.emitEvent==`function`&&s.push(`emitEvent`),typeof t.subscribeEvent==`function`&&s.push(`subscribeEvent`,`unsubscribeEvent`),t.host&&Object.keys(t.host).length>0||t.listActivePlugins||typeof t.emitEvent==`function`||typeof t.subscribeEvent==`function`){let e=t.host,n=t.pluginId,r=new Map;a.setHostCallDispatcher?.(async(i,o,s)=>{if(o===`listActivePlugins`)return t.listActivePlugins?t.listActivePlugins():[];if(o===`emitEvent`){if(typeof t.emitEvent!=`function`)throw Error(`emitEvent not available (plugin events capability not granted)`);let[e,n]=s;t.emitEvent(e,n);return}if(o===`subscribeEvent`){if(typeof t.subscribeEvent!=`function`)throw Error(`subscribeEvent not available (plugin events capability not granted)`);let[e]=s,i=(e,t,r)=>{a.pushEvent?.(n,{type:e,payload:t,sourcePluginId:r.pluginId})},o=t.subscribeEvent,c=o(e,()=>{},i);r.set(`${n}:${e}`,c);return}if(o===`unsubscribeEvent`){let[e]=s,t=r.get(`${n}:${e}`);t&&(r.delete(`${n}:${e}`),t());return}if(!e||typeof e[o]!=`function`)throw Error(`host method '${o}' not available (not declared or not granted)`);if(!(o in e))throw Error(`host method '${o}' not in whitelist`);let c=e[o];return c(...s)})}try{let n=await a.load(e.id,o,{pluginId:t.pluginId,pluginDir:t.pluginDir,workspaceDir:t.workspaceDir,hostMethods:s,listActivePlugins:!0,emitEvent:typeof t.emitEvent==`function`,subscribeEvent:typeof t.subscribeEvent==`function`,hostExternals:Xl()});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 z.warn({pluginId:e.id},t),r?.(e.id,t,`module-error`),null}return z.info({pluginId:e.id},`plugin worker pool exhausted, falling back to in-process load`),cu(e,t,r)}return n.hookEvents?.length&&z.warn({pluginId:e.id,hookEvents:n.hookEvents},`plugin declares code hooks but is loaded via the isolated path (tools capability) — code hooks are not proxied over RPC and will be inactive; split hooks into a separate plugin without tools to use the in-process path`),e.manifest.capabilities?.includes(`monitor`)&&z.warn({pluginId:e.id},`plugin declares capabilities:["monitor"] but is loaded via the isolated path (tools capability) — the monitor axis is not proxied over RPC and will be inactive (ecosystem failure signals will be missed); split the monitor into a separate plugin without tools to use the in-process path`),{pluginId:e.id,module:Gu(e.id,n,a),compiledPath:o}}catch(t){let n=String(t);return z.warn({pluginId:e.id,err:n},`plugin.ts worker load failed`),r?.(e.id,`worker load failed: ${n}`,`module-error`),null}}const qu=T(`@x-otto/coding:plugin-event-dispatcher`);var Ju=class{registrations=new Map;subscriptions=new Map;subscriptionSeq=0;emitRateWindow=new Map;constructor(e){this.isCapabilityGranted=e}registerPluginEvents(e,t){let n=new Map;for(let r of t){if(r.type.split(`.`)[0]!==e){qu.warn({pluginId:e,type:r.type},`event type namespace does not match pluginId, skipping registration (fail-closed)`);continue}n.set(r.type,Xu)}this.registrations.set(e,{schemas:n,pluginId:e})}unregisterPluginEvents(e){this.registrations.delete(e)}emit(e,t,n){let r=this.registrations.get(e);if(!r||!r.schemas.has(t)){qu.warn({sourcePluginId:e,type:t},`emit rejected: type not declared in this plugin manifest (fail-closed, R3)`);return}let i=r.schemas.get(t).safeParse(n);if(!i.success){qu.warn({sourcePluginId:e,type:t,error:i.error.message},`emit rejected: payload schema validation failed (fail-closed, R3)`);return}let a=Yu({...n});if(!this.checkEmitRate(e)){qu.warn({sourcePluginId:e,type:t},`emit rejected: rate limit exceeded (R1)`);return}let o=[],s=[],c=Date.now();for(let n of this.subscriptions.values())if(this.isCapabilityGranted(n.subscriberPluginId,`events`)&&this.typeMatches(n.typeFilter,t,n.isWildcard)){if(Date.now()-c>5e3){qu.warn({type:t,remainingSubscriptions:this.subscriptions.size-o.length},`emit: handler total execution timeout, dropping remaining subscriptions`);break}o.push(n.subscriberPluginId);try{n.transport?n.transport(t,a,{pluginId:e}):n.handler(a,{pluginId:e})}catch(e){let r=e instanceof Error?e.message:String(e);s.push(`${n.subscriberPluginId}: ${r}`),qu.warn({subscriberPluginId:n.subscriberPluginId,type:t,err:r},`event handler threw, isolating (R2a, swallowed + warn)`)}}qu.debug({source:e,type:t,payloadSize:JSON.stringify(n).length,deliveredTo:o,errors:s},`event dispatched (audit, R6)`)}subscribe(e,t,n,r){let i=0;for(let t of this.subscriptions.values())t.subscriberPluginId===e&&i++;if(i>=50)return qu.warn({subscriberPluginId:e,current:i,max:50},`subscribe rejected: max subscriptions exceeded (R1)`),()=>{};let a=t.endsWith(`.*`)||t===`*`;if(t===`*`)return qu.warn({subscriberPluginId:e},`subscribe rejected: wildcard "*" not implemented in M2 (R5 gate, runtime reject + warn)`),()=>{};let o=String(++this.subscriptionSeq);return this.subscriptions.set(o,{id:o,subscriberPluginId:e,typeFilter:t,handler:n,isWildcard:a,...r?{transport:r}:{}}),()=>{this.subscriptions.delete(o)}}unregisterPluginSubscriptions(e){let t=[];for(let[n,r]of this.subscriptions)r.subscriberPluginId===e&&t.push(n);for(let e of t)this.subscriptions.delete(e)}typeMatches(e,t,n){if(n){let n=e.slice(0,-2);return t.startsWith(n+`.`)}return e===t}checkEmitRate(e){let t=Date.now(),n=(this.emitRateWindow.get(e)??[]).filter(e=>t-e<6e4);return n.length>=100?!1:(n.push(t),this.emitRateWindow.set(e,n),!0)}};function Yu(e){if(typeof e!=`object`||!e)return e;if(Object.freeze(e),Array.isArray(e))for(let t of e)Yu(t);else for(let t of Object.keys(e)){let n=e[t];typeof n==`object`&&n&&!Object.isFrozen(n)&&Yu(n)}return e}const Xu={safeParse:e=>typeof e==`object`&&e&&!Array.isArray(e)?{success:!0,data:e}:{success:!1,error:{message:`payload must be a plain object`}}};function Zu(e,t){return e.includes(`onStartup`)?!0:e.some(e=>t.has(e))}var Qu=class{axisName=`hooks`;tokensByPlugin=new Map;hookNamesByPlugin=new Map;constructor(e){this.hookRegistry=e}register(e){let t=e.loaded.module.hooks;if(t){let n=il(e.plugin.id,t),r=this.hookRegistry.registerAll(n),i=this.tokensByPlugin.get(e.plugin.id)??[];this.tokensByPlugin.set(e.plugin.id,[...i,...r]);let a=this.hookNamesByPlugin.get(e.plugin.id)??[];a.push(...n.map(e=>e.name)),this.hookNamesByPlugin.set(e.plugin.id,a)}}unregister(e){let t=this.tokensByPlugin.get(e);if(t)for(let e of t)e.dispose();let n=this.hookNamesByPlugin.get(e);if(n)for(let e of n)this.hookRegistry.unregister(e);this.tokensByPlugin.delete(e),this.hookNamesByPlugin.delete(e)}unregisterAll(){for(let e of[...this.tokensByPlugin.keys(),...this.hookNamesByPlugin.keys()])this.unregister(e)}},$u=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=xl(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()]}},ed=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 td=T(`@x-otto/coding:plugin-sigil-loader`);function nd(e){return e.startsWith(`!`)||e.startsWith(`#`)}function rd(e){let t=[];for(let n of e){let e=n.manifest.contributes?.sigilEntries;if(e?.length){if(O(n).gated){td.warn({pluginId:n.id},`plugin gated (untrusted), sigilEntries skipped`);continue}for(let r of e){if(nd(r.value)){td.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 id(e){for(let t of e)t.manifest.contributes?.inputEntries&&td.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 ad(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}):td.warn({pluginId:e,name:r},`sigilResolvers entry is neither function nor {resolve}, skipped`)}return n}function od(e,t){return t.map(t=>async(n,r)=>(await t(n,r)).filter(e=>!nd(e.value)).map(t=>({...t,source:e})))}function sd(e,t){for(let n of e)n.resolverId&&!t(n.resolverId)&&td.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 cd=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=ad(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 od(e.plugin.id,n))t.push(this.pluginInput.registerProvider(`@`,r));this.sigilProviderUnsubsByPlugin.set(e.plugin.id,t)}if(this.sigilResolverRegistry){let t=this.sigilResolverRegistry;sd(rd([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)}},ld=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(...pl(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()}},ud=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(...ml(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}},dd=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 hl(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=T(`@x-otto/coding:plugin-provider-loader`);function fd(e){let t=T(`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 pd(e){return new Set([...(e.contributes?.providers??[]).filter(e=>e.preserveProviderId===!0&&e.oauthRef).map(e=>e.oauthRef),...e.codeProviderIds??[]])}function md(e,t){let n=pd(t);return new Set((t.contributes?.oauth??[]).map(t=>n.has(t.id)?t.id:V(e,t.id)))}function hd(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 gd(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 _d(e){return`code:${e}`}function vd(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 yd(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 bd(e,t,n,r,i,a){return()=>{let o=r.get(a);if(!o)throw new ft(`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:fd(a)})}}function xd(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(p.includes(t.id)||n.isReservedId(t.id)){a.rejected.push({id:t.id,reason:`oauth id collides with builtin reserved OAuth provider`,pluginId:e}),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`?sa({...t,id:s,name:c,tokenExchangeEncoding:t.tokenExchangeEncoding??`form`,assumesLoopbackAlways:t.assumesLoopbackAlways??!1,subscriptionScoped:t.subscriptionScoped??!1}):oa({...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)`,pluginId:e});continue}}else{B.warn({pluginId:e},`plugin declares contributes.oauth but not capabilities:["provider"], skipped (fail-closed)`);for(let t of s)a.rejected.push({id:t.id,reason:`capability "provider" not declared`,pluginId:e})}}function Sd(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 t of o)i.rejected.push({id:t.id,reason:`capability "provider" not declared`,pluginId:e});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`,pluginId:e}),B.warn({pluginId:e,providerId:t.id},`duplicate provider id in manifest, second entry rejected (review F5)`);continue}if(ue(t.id)){i.rejected.push({id:t.id,reason:`reserved builtin provider id`,pluginId:e}),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)`,pluginId:e}),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)`,pluginId:e});continue}if(!me({id:l,name:t.name,env:t.oauthRef?void 0:t.envKey,requiresIntranet:t.requiresIntranet===!0,probeUrl:t.baseUrl},e)){i.rejected.push({id:t.id,reason:`provider descriptor id already claimed`,pluginId:e}),t.envKey&&n.authStore.unregisterEnvKey(l);continue}if(t.models?.length){let r=t.models.map(e=>vd(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)`,pluginId:e}),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)`,pluginId:e});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`,pluginId:e});continue}let p=t.modelsEndpoint?yd(t.modelsEndpoint,l,c,t.baseUrl,t.headers):void 0,m=()=>{t.oauthRef&&r&&!s.has(u)&&r.unregister(u)};if(!me({id:l,name:t.name,env:t.oauthRef?void 0:t.envKey,buildModelsRequest:p,requiresIntranet:t.requiresIntranet===!0,probeUrl:t.baseUrl},e)){i.rejected.push({id:t.id,reason:`provider descriptor id already claimed by another plugin`,pluginId:e}),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=bd(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`,pluginId:e}),ve(l),t.envKey&&!t.oauthRef&&n.authStore.unregisterEnvKey(l),m();continue}if(t.models?.length){let r=t.models.map(e=>vd(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 Cd(e,t,n,r,i){let a={registered:[],rejected:[]},o=n.authStore.oauth;return xd(e,t,o,pd(t),new Map((t.contributes?.providers??[]).filter(e=>e.oauthRef&&e.name).map(e=>[e.oauthRef,e.name])),a,r),Sd(e,t,n,o,a,i),a}async function wd(e,t,n,r,i){let a=n.authStore.oauth,o=pd(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);ve(r),t.envKey&&!t.oauthRef&&n.authStore.unregisterEnvKey(r)}await n.providerRegistry.unregisterBySource(e,i),n.modelRegistry.unregisterBySource(e)}}var Td=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=vl(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)}},Ed=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=gd(e.plugin.id,i,e.plugin.manifest);if(!this.providerRegistry.registerPluginProvider(t,_l(e.plugin.id,a),_d(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(me({id:t,buildModelsRequest:yd(o,t,t)},_d(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=>vd(e,t,t,s.baseUrl,s.imageConstraints,s.supportsTools,s.responseBodyPolicy)),r=this.modelRegistry.registerWithSource(n,_d(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(_d(e)),this.providerSourcePluginIds.delete(e)),this.modelRegistry&&this.modelSourcePluginIds.has(e)&&(this.modelRegistry.unregisterBySource(_d(e)),this.modelSourcePluginIds.delete(e));let t=this.descriptorIdsByPlugin.get(e);if(t){for(let e of t)ve(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)}},Dd=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){pe(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)_e(e);this.cacheReportingApisByPlugin.delete(e)}}unregisterAll(){let e=new Set([...this.wireProtocolSourcePluginIds,...this.cacheReportingApisByPlugin.keys()]);for(let t of e)this.unregister(t)}},Od=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=>bl(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);for(let r of i){let i=t.find(e=>e.name===r.name);n.register(r,{preset:i?.preset??`full`,...i?.category&&{category:i.category},...i?.guideline&&{guideline:i.guideline},source:e.plugin.id})}i.length>0&&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 kd=`[plugin]`;function Ad(e,t,n){let r=n.name?.trim()||n.key;return`${kd} ${e}:${t}:${n.key} — ${r}`}function jd(e,t,n){let r=e.subscriber;return!r||r.kind!==`plugin-service`||r.pluginId!==t||r.serviceId!==n?!1:e.name.startsWith(kd)}function Md(e,t,n){let r=`${kd} ${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 Nd(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(!jd(e,r,i))continue;let t=Md(e,r,i);t!==void 0&&s.set(t,e)}for(let[e,c]of o){let o=Ad(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 Pd(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(kd)&&t.remove(e.id)&&(r+=1)}return r}var Fd=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,emitEvent:e.plugin.manifest.capabilities?.includes(`events`)===!0,subscribeEvent:e.plugin.manifest.capabilities?.includes(`events`)===!0},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=Nd({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&&Nd({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=Pd({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=Nd({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)`)}}},Id=class{axisName=`cliCommands`;commandsByPlugin=new Map;constructor(e){this.logger=e}register(e){let t=e.plugin.manifest.contributes?.cliCommands;if(!t?.length)return;if(!e.plugin.manifest.capabilities?.includes(`cli.command`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares contributes.cliCommands but not capabilities:["cli.command"], skipped (fail-closed)`);return}if(e.verdict.pendingCapabilities.includes(`cli.command`)){this.logger.warn({pluginId:e.plugin.id},`plugin capability "cli.command" declared but not yet granted, skipping cliCommands (fail-closed, RFC-124 C2)`);return}let n=e.loaded.module.cliCommands,r=[];for(let i of t){let t=n?.[i.name];if(typeof t!=`function`){this.logger.warn({pluginId:e.plugin.id,command:i.name},`contributes.cliCommands declares a command with no matching handler in PluginModule.cliCommands, skipped`);continue}r.push({pluginId:e.plugin.id,name:i.name,summary:i.summary,handler:t})}r.length>0&&this.commandsByPlugin.set(e.plugin.id,r)}unregister(e){this.commandsByPlugin.delete(e)}unregisterAll(){this.commandsByPlugin.clear()}getCliCommands(){return[...this.commandsByPlugin.values()].flat()}},Ld=class{axisName=`slashCommands`;commandsByPlugin=new Map;constructor(e){this.logger=e}register(e){let t=e.plugin.manifest.contributes?.slashCommands;if(!t?.length)return;if(!e.plugin.manifest.capabilities?.includes(`tui.command`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares contributes.slashCommands but not capabilities:["tui.command"], skipped (fail-closed)`);return}if(e.verdict.pendingCapabilities.includes(`tui.command`)){this.logger.warn({pluginId:e.plugin.id},`plugin capability "tui.command" declared but not yet granted, skipping slashCommands (fail-closed, RFC-440)`);return}let n=e.loaded.module.slashCommands,r=[];for(let i of t){let t=n?.[i.name];if(typeof t!=`function`){this.logger.warn({pluginId:e.plugin.id,command:i.name},`contributes.slashCommands declares a command with no matching handler in PluginModule.slashCommands, skipped`);continue}r.push({pluginId:e.plugin.id,name:i.name,description:i.description,...i.group?{group:i.group}:{},handler:t})}r.length>0&&this.commandsByPlugin.set(e.plugin.id,r)}unregister(e){this.commandsByPlugin.delete(e)}unregisterAll(){this.commandsByPlugin.clear()}getSlashCommands(){return[...this.commandsByPlugin.values()].flat()}},Rd=class{axisName=`events`;registeredPlugins=new Set;constructor(e,t){this.eventDispatcher=e,this.logger=t}register(e){if(!this.eventDispatcher)return;let t=e.plugin.manifest.contributes?.events;if(!(!t||t.length===0)){if(!e.plugin.manifest.capabilities?.includes(`events`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares contributes.events but not capabilities:["events"], skipped (fail-closed)`);return}this.eventDispatcher.registerPluginEvents(e.plugin.id,t),this.registeredPlugins.add(e.plugin.id)}}unregister(e){this.eventDispatcher&&this.registeredPlugins.has(e)&&(this.eventDispatcher.unregisterPluginEvents(e),this.eventDispatcher.unregisterPluginSubscriptions(e),this.registeredPlugins.delete(e))}unregisterAll(){if(this.eventDispatcher){for(let e of this.registeredPlugins)this.eventDispatcher.unregisterPluginEvents(e),this.eventDispatcher.unregisterPluginSubscriptions(e);this.registeredPlugins.clear()}}};const zd=T(`@x-otto/plugin:config-store`),Bd=/^[a-z0-9]+(?:-[a-z0-9]+)*$/;function Vd(){return C(process.env.OTTO_HOME||r,`plugin-state`)}function Hd(e,t){if(!Bd.test(e))throw Error(`invalid pluginId for config store: ${e} (must be kebab-case)`);if(typeof t!=`string`||t.length===0||t.includes(`/`)||t.includes(`\\`)||t.includes(`..`))throw Error(`invalid workspaceKey for config store: ${t}`);if(c())return{dir:`:memory:/plugin-state/${e}/${t}`,isMemory:!0};let n=w(C(Vd(),e,t));y(n,{recursive:!0});let r=Qe(n),i=Qe(Vd());if(r!==i&&!r.startsWith(i+`/`))throw Error(`config store path escapes plugin-state root: ${r}`);return{dir:r,isMemory:!1}}function Ud(e,t){let n=`${e}.${Ii()}.tmp`,r;try{r=Ye(n,`w`),x(r,t),Ke(r),We(r),r=void 0,$e(n,e)}finally{if(r!==void 0)try{We(r)}catch{}}}var Wd=class{dir;isMemory;configPath;memoryStore={};pluginId;workspaceKey;constructor(e,t){this.pluginId=e,this.workspaceKey=t;let{dir:n,isMemory:r}=Hd(e,t);this.dir=n,this.isMemory=r,this.configPath=C(n,`config.json`)}get(){if(this.isMemory)return{...this.memoryStore};if(!v(this.configPath))return{};try{let e=b(this.configPath,`utf-8`),t=JSON.parse(e);return t&&typeof t==`object`&&!Array.isArray(t)?t:{}}catch(e){return zd.warn({pluginId:this.pluginId,err:String(e)},`failed to read plugin config, using empty`),{}}}set(e){let t=JSON.stringify(e,null,2);if(this.isMemory){this.memoryStore={...e};return}v(this.dir)||y(this.dir,{recursive:!0}),Ud(this.configPath,t)}update(e){let t=this.get();this.set({...t,...e})}clear(){if(this.isMemory){this.memoryStore={};return}try{v(this.configPath)&&x(this.configPath,`{}`)}catch{}}};const Gd=/^[a-z0-9]+(?:-[a-z0-9]+)*$/,Kd=C(r,`plugin-state`);function qd(e){let t=Jd(e);try{return et(t,{recursive:!0,force:!0}),{removed:!v(t),dir:t}}catch{return{removed:!1,dir:t}}}function Jd(e){if(!Gd.test(e))throw Error(`invalid pluginId for scoped storage: ${e} (must be kebab-case)`);return C(Kd,e)}var Yd=class{persistence;baseDir;pluginId;workspaceKey;constructor(e,t){if(this.pluginId=e,this.workspaceKey=t,!Gd.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(c()){this.baseDir=`:memory:/plugin-state/${e}/${t}`,this.persistence=Ln({type:`memory`});return}let n=w(C(Jd(e),t));y(n,{recursive:!0});let r=Qe(n),i=Qe(Kd);if(r!==i&&!r.startsWith(i+`/`))throw Error(`scoped storage path escapes plugin-state root: ${r}`);this.baseDir=n,this.persistence=Ln({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 Xd(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 Zd(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=$d(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 Cu(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;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)`);let f=n.getSettingValue;return r.includes(`settings.read`)&&!t.pendingCapabilities.includes(`settings.read`)&&f?(i.getSettings=e=>f(e),a=!0):r.includes(`settings.read`)&&n.logger.warn({pluginId:e.id,pending:t.pendingCapabilities.includes(`settings.read`)},`plugin declares settings.read but it is not available (not yet granted, or host provides no settings source) — skipping (fail-closed, RFC-430 M1)`),a?i:void 0}const Qd=new WeakMap;function $d(e){if(e.capabilityQuota)return e.capabilityQuota;let t=Qd.get(e);return t||(t=new Dl,Qd.set(e,t)),t}const ef=new Map([[`oauthProviderFactories`,`provider`],[`providerFactories`,`provider`],[`wireProtocols`,`wire-protocol`]]);function tf(e){let t=e.manifest.contributes;return!t||typeof t!=`object`?[]:Object.keys(t)}var nf=class e{contributesSnapshot=new Map;static DEACTIVATE_TIMEOUT_MS=5e3;hooksAxis;monitorsAxis;feedbackAxis;sigilAxis;computedCommandsAxis;computedAgentsAxis;computedSkillsAxis;oauthProviderAxis;codeProviderAxis;wireProtocolAxis;toolsAxis;servicesAxis;cliCommandsAxis;slashCommandsAxis;eventsAxis;axisHandlers;firedEvents=new Set;deferredIds=new Set;dirtyPluginIds=new Set;loadedModules=new Map;constructor(e){this.deps=e,this.hooksAxis=new Qu(e.hookRegistry),this.monitorsAxis=new $u(e.hookRegistry,e.logger),this.feedbackAxis=new ed(e.feedbackRegistry,e.logger),this.sigilAxis=new cd(e.sigilResolverRegistry,e.pluginInput,e.logger),this.computedCommandsAxis=new ld,this.computedAgentsAxis=new ud,this.computedSkillsAxis=new dd(e.skillRegistry),this.oauthProviderAxis=new Td(e.authStore,e.logger),this.codeProviderAxis=new Ed(e.providerRegistry,e.modelRegistry,e.logger),this.wireProtocolAxis=new Dd(e.wireProtocolRegistry,e.logger),this.toolsAxis=new Od(e.toolRegistry,e.logger),this.servicesAxis=new Fd({pool:e.servicePool??_u(),logger:e.logger,workspaceDir:e.workspaceDir,getWorkspaceKey:()=>e.getWorkspaceKey?.()??Ui,bridgeFor:t=>{let n=e.activePlugins().find(e=>e.id===t);if(!n)return{};let r=Zd(n,O(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=Zd(n,O(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 Yd(e,t).baseDir,hasStorageCapability:t=>!!e.activePlugins().find(e=>e.id===t)?.manifest.capabilities?.includes(`storage`),...e.getSchedulePort?{getSchedulePort:e.getSchedulePort}:{}}),this.cliCommandsAxis=new Id(e.logger),this.slashCommandsAxis=new Ld(e.logger),this.eventsAxis=new Rd(e.eventDispatcher,e.logger),(e.servicePool??_u()).setEventDispatcher(e.eventDispatcher),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,this.cliCommandsAxis,this.slashCommandsAxis,this.eventsAxis]}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()}get cliCommands(){return this.cliCommandsAxis.getCliCommands()}get slashCommands(){return this.slashCommandsAxis.getSlashCommands()}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()}registerPluginPlaneEntries(e,t){let n=this.deps.planeRegistry;if(!n)return;let r=e.manifest.version;for(let t of n.revalidatePlugin(e.id,r))this.deps.logger.warn({pluginId:e.id,version:r,registeredVersion:t.registeredVersion,entryId:t.entry.id},`plugin plane entry stale after version change; whitelist re-evaluation required (R6')`);let i=zr(e.manifest),a=this.deps.getWorkspaceKey?.()??Ui,o={id:`plugin:${e.id}`,kind:`plugin`,value:{plane:i,capabilities:e.manifest.capabilities??[]},pluginId:e.id,pluginVersion:r};if(i===`host`){let e={...o,plane:`host`,scope:`process`};n.register(e)}else{let e={...o,plane:`preset`,scope:`workspace`};n.workspace(a).preset.register(e)}let s=t.module.hooks?.waterfall;if(s)for(let t of Object.keys(s))n.workspace(a).preset.register({id:`waterfall:${t}`,kind:`waterfall`,value:{timing:t},pluginId:e.id,pluginVersion:r,plane:`preset`,scope:`workspace`})}async unregisterPluginAxes(e,t,n){let r=[],i=t?O(t):void 0;for(let n of this.axisHandlers){let a=ef.get(n.axisName);if(!(a!==void 0&&t!==void 0&&i!==void 0&&t.manifest.capabilities?.some(e=>e===a)&&!i.gated&&!i.pendingCapabilities.includes(a)))try{await n.unregister(e)}catch(t){r.push(n.axisName),this.deps.logger.warn({pluginId:e,axis:n.axisName,err:t instanceof Error?t.message:String(t)},`plugin axis unregister failed (continuing with remaining axes; plugin marked dirty for full reload next round)`)}}this.deps.planeRegistry?.unregisterByPluginEverywhere(e),$d(this.deps).reset(e),r.length>0&&(this.dirtyPluginIds.add(e),n?.add(e),this.deps.logger.warn({pluginId:e,failedAxes:r},`plugin marked dirty due to axis unregister failures; next reload will force a full reinstall of this plugin`))}pluginSignature(e){let t=O(e),n=`${t.gated?`gated`:`ok`}:${[...t.pendingCapabilities].sort().join(`,`)}`,r=`nofile`;for(let t of[`plugin.ts`,`plugin.tsx`])try{let n=tt(C(e.dir,t));r=`${t}:${n.mtimeMs}:${n.size}`;break}catch{}return`${JSON.stringify(e.manifest)}|${n}|${r}`}async notifyConfigChange(e,t){let n=this.loadedModules.get(e);if(!n)return;let r=n.module.module.hooks?.onConfigChange;if(r)try{await r(t)}catch(t){this.deps.logger.warn({pluginId:e,err:String(t)},`plugin onConfigChange failed, swallowed (R5)`)}}async updatePluginConfig(e,t){new Wd(e,this.deps.getWorkspaceKey?.()??Ui).set(t),await this.notifyConfigChange(e,t)}getPluginConfig(e,t){return Ar(t,new Wd(e,this.deps.getWorkspaceKey?.()??Ui).get())}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||this.dirtyPluginIds.has(e))&&(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);let s=new Set;for(let e of a)await this.unregisterPluginAxes(e,void 0,s),this.loadedModules.delete(e);for(let e of o)await this.unregisterPluginAxes(e,n.get(e),s);this.computedAgentsAxis.setExistingAgentNames(e);let c=new Set;for(let e of this.deps.activePlugins()){if(!Zu(Rr(e.manifest),this.firedEvents)){c.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),el(e.id,`info`,t)},warn:t=>{this.deps.logger.warn({pluginId:e.id},t),el(e.id,`warn`,t)},error:t=>{this.deps.logger.error({pluginId:e.id},t),el(e.id,`error`,t)}},getWireProtocol:e=>this.deps.wireProtocolRegistry?.get(e),resolveProviderCredential:(()=>{let t=Xd(e);return e=>t(e)?this.deps.providerRegistry?.resolveAccessKey(e)??Promise.resolve(null):Promise.resolve(null)})(),resolveProviderAuth:(()=>{let t=Xd(e);return e=>t(e)?this.deps.providerRegistry?.resolveAuth(e)??Promise.resolve(null):Promise.resolve(null)})(),host:Zd(e,O(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)??tf(e)})),...e.manifest.contributes?.config?{config:Ar(e.manifest.contributes.config,new Wd(e.id,this.deps.getWorkspaceKey?.()??Ui).get())}:{},...this.deps.eventDispatcher&&(e.manifest.capabilities??[]).includes(`events`)?{emitEvent:(t,n)=>{this.deps.eventDispatcher.emit(e.id,t,{...n})},subscribeEvent:((t,n,r)=>this.deps.eventDispatcher.subscribe(e.id,t,n,r))}:{}},n=this.deps.useIsolatedLoading!==!1&&Wu(e)?await Ku(e,t,void 0,this.deps.onPluginLoadError):await cu(e,t,this.deps.onPluginLoadError);if(!n)continue;let i=O(e);if(i.gated){this.deps.logger.warn({pluginId:e.id},`project plugin not trusted, skipping code axes (fail-closed, RFC-124 C1)`),this.deps.onPluginLoadError?.(e.id,`project plugin not trusted, skipping code axes (fail-closed, RFC-124 C1)`,`not-trusted`);continue}let a;if(e.manifest.capabilities?.includes(`storage`))try{let t=this.deps.getWorkspaceKey?.()??Ui;a=new Yd(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 l={plugin:e,verdict:i,loaded:n,host:Zd(e,i,this.deps),workspaceDir:this.deps.workspaceDir,storage:a};for(let e of this.axisHandlers)await e.register(l);if(this.registerPluginPlaneEntries(e,n),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,tf(e)),this.loadedModules.set(e.id,{module:n,manifest:e.manifest,signature:r.get(e.id)??this.pluginSignature(e)}),s.has(e.id)||this.dirtyPluginIds.delete(e.id)}return this.deferredIds=c,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=$d(this.deps);for(let t of this.deps.activePlugins())e.reset(t.id);this.firedEvents.clear()}};const rf=T(`@x-otto/coding:panel-compiler`);function af(e){let t=C(e,`panels`);if(!v(t))return{compiled:[],errors:[],skipped:!0};let n;try{n=Xe(t).filter(e=>e.endsWith(`.tsx`))}catch{return{compiled:[],errors:[],skipped:!0}}if(n.length===0)return{compiled:[],errors:[],skipped:!0};let r=C(e,`panels-dist`);y(r,{recursive:!0});let i=Je(C(ot(),`otto-panel-shims-`)),a=C(i,`react-shim.js`),o=C(i,`ink-shim.js`),s=C(i,`tui-shim.js`);x(a,`const R = globalThis.React
347
444
  if (!R) throw new Error('otto panel: globalThis.React 未注入(TUI 须在加载面板前 import panel-globals)')
348
445
  export default R
349
446
  export const useState = R.useState, useEffect = R.useEffect, useCallback = R.useCallback,
@@ -351,13 +448,13 @@ export const useState = R.useState, useEffect = R.useEffect, useCallback = R.use
351
448
  useLayoutEffect = R.useLayoutEffect, createElement = R.createElement, Fragment = R.Fragment,
352
449
  memo = R.memo, forwardRef = R.forwardRef, createContext = R.createContext, Children = R.Children,
353
450
  cloneElement = R.cloneElement, isValidElement = R.isValidElement
354
- `),k(o,`const I = globalThis.__ottoPanelInk
451
+ `),x(o,`const I = globalThis.__ottoPanelInk
355
452
  if (!I) throw new Error('otto panel: globalThis.__ottoPanelInk 未注入(TUI 须在加载面板前 import panel-globals)')
356
453
  export const Box = I.Box, Text = I.Text, Newline = I.Newline, Spacer = I.Spacer, Static = I.Static,
357
454
  Transform = I.Transform, useApp = I.useApp, useInput = I.useInput, useStdin = I.useStdin,
358
455
  useStdout = I.useStdout, useStderr = I.useStderr, useFocus = I.useFocus,
359
456
  useFocusManager = I.useFocusManager, measureElement = I.measureElement, render = I.render
360
- `),k(s,`const T = globalThis.__ottoPanelTui
457
+ `),x(s,`const T = globalThis.__ottoPanelTui
361
458
  if (!T) throw new Error('otto panel: globalThis.__ottoPanelTui 未注入(TUI 须在加载面板前 import panel-globals)')
362
459
  export const Tabs = T.Tabs
363
460
  export const DataList = T.DataList
@@ -368,26 +465,34 @@ export const ScrollIndicatorBelow = T.ScrollIndicatorBelow
368
465
  export const Tabable = T.Tabable
369
466
  export const useTabable = T.useTabable
370
467
  export const TabScope = T.TabScope
371
- `);let c=[],l=[],{buildSync:u}=Tu(`esbuild`);for(let i of n){let n=i.replace(/\.tsx$/,`.mjs`);try{u({entryPoints:[b(t,i)],outfile:b(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(b(`panels-dist`,n))}catch(t){l.push({entry:i,message:t.message}),wu.warn({pluginDir:e,entry:i,err:String(t)},`panel compile failed`)}}return wu.info({pluginDir:e,compiled:c.length,errors:l.length},`compiled plugin panels`),{compiled:c,errors:l,skipped:!1}}const Du=S(`@x-otto/coding:plugin-install`);function Ou(e){let t=[];return(async()=>{try{let t=await Jc(e);t&&Du.info({pluginDir:e,outfile:t},`plugin code module compiled at install time`)}catch(n){let r=n instanceof Error?n.message:String(n);Du.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}=Eu(e);if(!r&&n.length>0)for(let r of n)Du.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);Du.warn({pluginDir:e,err:r},`plugin panel compilation crashed unexpectedly at install time`),t.push(`面板编译异常:${r}`)}})().then(()=>t)}function ku(e){try{return Br(e).isSymbolicLink()}catch{return!1}}function Au(e){let t=O(e,`utf8`),n=[],r=!1;for(let e of t.split(`
372
- `)){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 ju(e,t){let n=x(e,t.endsWith(`/*`)?t.slice(0,-2):t);if(!n.startsWith(e.endsWith(`/`)?e:e+`/`)&&n!==e)return[];if(!t.endsWith(`/*`))return E(n)?[n]:[];if(!E(n))return[];try{return Ur(n,{withFileTypes:!0}).filter(e=>e.isDirectory()).map(e=>b(n,e.name))}catch{return[]}}function Mu(e,t){let n=a(t);if(!n)return;let r=Au(b(n,`pnpm-workspace.yaml`));for(let t of r)for(let r of ju(n,t)){let t=b(r,`package.json`);if(!E(t))continue;try{if(JSON.parse(O(t,`utf8`)).name===e)return r}catch{}let n=b(r,w);if(E(n))try{if(Qn(O(n,`utf8`),n)?.id===e)return r}catch{}}}function Nu(t,n=process.cwd()){let r=[Ni(b(n,`__resolve__.js`)).href,import.meta.url];for(let n of r)try{return Ve(e(n).resolve(`${t}/package.json`))}catch{}return Mu(t,Ve(Mi(import.meta.url)))??Mu(t,n)}async function Pu(e){let t=Nu(e.pkg,e.cwd);if(!t)throw Error(`无法解析包 ${e.pkg}(未安装或不可从当前位置解析)。`);let r=b(t,w);if(!E(r))throw Error(`${e.pkg} 不是 otto 插件:缺 ${w}(RFC-044 自描述)。`);let i=Qn(O(r,`utf8`),r);if(!i)throw Error(`${e.pkg} 的 ${w} 非法(需合法 kebab-case id)。`);let a=e.ottoDir??n,o=b(a,`plugins`,i.id);D(b(a,`plugins`),{recursive:!0});let s=x(t);if(ku(o)){try{if(x(Wr(o))===s){let e=await Ou(t);return{id:i.id,packageDir:t,dir:o,created:!1,compileWarnings:e,version:i.version}}}catch{}Xr(o)}else if(E(o))if((E(b(o,w))?Qn(O(b(o,w),`utf8`),o):null)?.id===i.id)qr(o,{recursive:!0,force:!0});else throw Error(`目标已存在且非本插件,拒绝覆盖:${o}`);Yr(s,o);let c=await Ou(t);return{id:i.id,packageDir:t,dir:o,created:!0,compileWarnings:c,version:i.version}}async function Fu(e){let t=b(e,w);if(!E(t))throw Error(`${e} 不是 otto 插件:缺 ${w}`);let r=Qn(O(t,`utf8`),t);if(!r)throw Error(`${e} 的 ${w} 非法。`);let i=b(n,`plugins`,r.id);D(b(n,`plugins`),{recursive:!0});let a=x(e);if(ku(i)){try{if(x(Wr(i))===a){let t=await Ou(e);return{id:r.id,packageDir:e,dir:i,created:!1,compileWarnings:t,version:r.version}}}catch{}Xr(i)}else if(E(i))if((E(b(i,w))?Qn(O(b(i,w),`utf8`),i):null)?.id===r.id)qr(i,{recursive:!0,force:!0});else throw Error(`目标已存在且非本插件,拒绝覆盖:${i}`);Yr(a,i);let o=await Ou(e);return{id:r.id,packageDir:e,dir:i,created:!0,compileWarnings:o,version:r.version}}function Iu(e,t){return[...e.filter(e=>e.id!==t.id),t]}function Lu(e,t){return e.filter(e=>e.id!==t)}async function Ru(e,t,n=()=>Date.now()){let r=Iu(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 zu(e,t){let n={},r=!1,i=e.get(`installed_plugins`)??[];i.some(e=>e.id===t)&&(n.installed_plugins=Lu(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 Bu(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 Vu=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=ar(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 Pu({pkg:n});t&&await Ru(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 Hu(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 jo(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 Uu(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=_a(new Set(a.map(e=>e.name)));return{model:i,systemPrompt:``,tools:a,thinkingLevel:`medium`,maxToolTurns:t.maxToolTurns,promptRefresh:e?oo(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 ti({dbPath:n?`:memory:`:b(i.dir,`sessions.db`)});t.repoRef&&(t.repoRef.current=a);let o=n?ni():ri({lockDir:b(i.dir,`locks`)}),c=new $r({repo:a,workspaceKey:t.getWorkspaceKey??(()=>yi),maxLoadEntries:un,canStartHistory:e=>e.role!==`tool_result`,writeLease:o,stripInactiveReplacements:!0}),l=async e=>(await a.listSessions(e).catch(()=>[])).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 Et({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:an(),pasteStatePersistence:on()}:{panelStateDir:b(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`&&S(`@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=la(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 Et({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 Wu(e){return e.map(e=>({name:e.name,description:typeof e.description==`function`?e.description({projectRoot:``}):e.description,parameters:e.parameters}))}function Gu(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=bn(n.getDeclarativeAgentProfiles?.()??[],t),i=r?$a(r.defaultTools):void 0,a=ro(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 Ku(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(oi(o.context.from,o.context.allowedTargets,r))}return i}function qu(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=Gu(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=Ku(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 fi({stream:e.stream,logger:e.logger,agentName:t.agentId,maxToolTurns:t.maxToolTurns,toolHookExecutor:Mt({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=Ct(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(),Bt.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(`
373
- `),tokenUsage:{input:g.usage.inputTokens,output:g.usage.outputTokens,cacheRead:g.usage.cacheReadTokens},durationMs:Date.now()-n}}}function Ju(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??qu(t)}}function Yu(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=Yu(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=Ju(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 si(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=bn(o,c);if(!l){s.push({kind:`agent`,id:c,name:c,description:c,systemPrompt:_n(c),tools:Wu(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:Wu(t.resolveTools(void 0,$a(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 Xu(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=Yu(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 si(Ju(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 Zu=`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:
468
+ `);let c=[],l=[],{buildSync:u}=Fl();Il();for(let i of n){let n=i.replace(/\.tsx$/,`.mjs`);try{u({entryPoints:[C(t,i)],outfile:C(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(C(`panels-dist`,n))}catch(t){l.push({entry:i,message:t.message}),rf.warn({pluginDir:e,entry:i,err:String(t)},`panel compile failed`)}}return rf.info({pluginDir:e,compiled:c.length,errors:l.length},`compiled plugin panels`),{compiled:c,errors:l,skipped:!1}}const of=T(`@x-otto/coding:plugin-install`);function sf(e){let t=[];return(async()=>{try{let t=await $l(e);t&&of.info({pluginDir:e,outfile:t},`plugin code module compiled at install time`)}catch(n){let r=n instanceof Error?n.message:String(n);of.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}=af(e);if(!r&&n.length>0)for(let r of n)of.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);of.warn({pluginDir:e,err:r},`plugin panel compilation crashed unexpectedly at install time`),t.push(`面板编译异常:${r}`)}})().then(()=>t)}function cf(e){try{return qe(e).isSymbolicLink()}catch{return!1}}function lf(e){let t=b(e,`utf8`),n=[],r=!1;for(let e of t.split(`
469
+ `)){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 uf(e,t){let n=w(e,t.endsWith(`/*`)?t.slice(0,-2):t);if(!n.startsWith(e.endsWith(`/`)?e:e+`/`)&&n!==e)return[];if(!t.endsWith(`/*`))return v(n)?[n]:[];if(!v(n))return[];try{return Xe(n,{withFileTypes:!0}).filter(e=>e.isDirectory()).map(e=>C(n,e.name))}catch{return[]}}function df(e,t){let n=o(t);if(!n)return;let r=lf(C(n,`pnpm-workspace.yaml`));for(let t of r)for(let r of uf(n,t)){let t=C(r,`package.json`);if(!v(t))continue;try{if(JSON.parse(b(t,`utf8`)).name===e)return r}catch{}let n=C(r,D);if(v(n))try{if(Mr(b(n,`utf8`),n)?.id===e)return r}catch{}}}function ff(t,n=process.cwd()){let r=[aa(C(n,`__resolve__.js`)).href,import.meta.url];for(let n of r)try{return S(e(n).resolve(`${t}/package.json`))}catch{}return df(t,S(ia(import.meta.url)))??df(t,n)}async function pf(e){let t=ff(e.pkg,e.cwd);if(!t)throw Error(`无法解析包 ${e.pkg}(未安装或不可从当前位置解析)。`);let n=C(t,D);if(!v(n))throw Error(`${e.pkg} 不是 otto 插件:缺 ${D}(RFC-044 自描述)。`);let i=Mr(b(n,`utf8`),n);if(!i)throw Error(`${e.pkg} 的 ${D} 非法(需合法 kebab-case id)。`);let a=e.ottoDir??r,o=C(a,`plugins`,i.id);y(C(a,`plugins`),{recursive:!0});let s=w(t);if(cf(o)){try{if(w(Ze(o))===s){let e=await sf(t);return{id:i.id,packageDir:t,dir:o,created:!1,compileWarnings:e,version:i.version}}}catch{}rt(o)}else if(v(o))if((v(C(o,D))?Mr(b(C(o,D),`utf8`),o):null)?.id===i.id)et(o,{recursive:!0,force:!0});else throw Error(`目标已存在且非本插件,拒绝覆盖:${o}`);nt(s,o);let c=await sf(t);return{id:i.id,packageDir:t,dir:o,created:!0,compileWarnings:c,version:i.version}}async function mf(e){let t=C(e,D);if(!v(t))throw Error(`${e} 不是 otto 插件:缺 ${D}`);let n=Mr(b(t,`utf8`),t);if(!n)throw Error(`${e} 的 ${D} 非法。`);let i=C(r,`plugins`,n.id);y(C(r,`plugins`),{recursive:!0});let a=w(e);if(cf(i)){try{if(w(Ze(i))===a){let t=await sf(e);return{id:n.id,packageDir:e,dir:i,created:!1,compileWarnings:t,version:n.version}}}catch{}rt(i)}else if(v(i))if((v(C(i,D))?Mr(b(C(i,D),`utf8`),i):null)?.id===n.id)et(i,{recursive:!0,force:!0});else throw Error(`目标已存在且非本插件,拒绝覆盖:${i}`);nt(a,i);let o=await sf(e);return{id:n.id,packageDir:e,dir:i,created:!0,compileWarnings:o,version:n.version}}function hf(e,t){return[...e.filter(e=>e.id!==t.id),t]}function gf(e,t){return e.filter(e=>e.id!==t)}async function _f(e,t,n=()=>Date.now()){let r=hf(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},`global`)}async function vf(e,t){let n={},r=!1,i=e.get(`installed_plugins`)??[];i.some(e=>e.id===t)&&(n.installed_plugins=gf(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??[];if(o.some(e=>e.id===t)&&(n.plugin_lifecycle={setupDone:o.filter(e=>e.id!==t)},r=!0),r)if(`installed_plugins`in n){await e.persist({installed_plugins:n.installed_plugins},`global`);let{installed_plugins:t,...r}=n;Object.keys(r).length>0&&await e.persist(r)}else await e.persist(n)}function yf(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}async function bf(e,t,n,r){try{let i=await pf({pkg:r});t&&await _f(t,{id:i.id,source:`npm`,sourceSpec:r,version:i.version,scope:`global`}),e.info({pluginId:n,missingId:r},`missing plugin dependency auto-installed (RFC-163 D5), will be picked up on next discovery`)}catch(t){e.warn({pluginId:n,missingId:r,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)`)}}var xf=class{lastTopoSort;lastEngineIncompatible=new Map;warnedTopoIssues=new Set;warnedEngineIncompatible=new Set;resolve(e){let{compatible:t,incompatible:n}=xr(gr({cwd:e.workspaceDir,homedir:e.homedir??at(),disabled:e.disabledPlugins,bundledDirs:e.bundledDirs}));this.lastEngineIncompatible=n;let r=Vr(t);return this.lastTopoSort=r,r.ordered}async diagnose(e,t,n){for(let[t,r]of this.lastEngineIncompatible)this.warnedEngineIncompatible.has(t)||(e.warn({pluginId:t,requiredRange:r,hostApiVersion:rr},`plugin engines.otto not satisfied by host, skipping plugin (fail-closed, RFC-148 M0)`),n?.({pluginId:t,reason:`version-incompatible`,message:`engines.otto not satisfied (required: ${r}, host: ${rr})`}));this.warnedEngineIncompatible=new Set(this.lastEngineIncompatible.keys());let r=this.lastTopoSort;if(!r)return;let i=new Set([...r.cyclic.keys(),...r.missingDeps.keys()]);for(let[t,i]of r.cyclic)this.warnedTopoIssues.has(t)||(e.warn({pluginId:t,cyclePath:i},`plugin dependency cycle detected, skipping cyclic plugin (fail-closed, RFC-132 D5)`),n?.({pluginId:t,reason:`dependency-cycle`,message:`dependency cycle: ${i.join(` -> `)}`}));for(let[i,a]of r.missingDeps)if(!this.warnedTopoIssues.has(i)){e.warn({pluginId:i,missingDeps:a},`plugin dependencies missing, skipping plugin (fail-closed, RFC-132 D5)`),n?.({pluginId:i,reason:`dependency-missing`,message:`missing dependencies: ${a.join(`, `)}`});for(let n of a)await bf(e,t,i,n)}this.warnedTopoIssues=i}};function Sf(e,t){let{model:r,authStore:i,modelRegistry:a,providerRegistry:o}=e,s=i??re(),c=a??ie(),l=o??se({authStore:s,modelRegistry:c}),u=ce(),d=new Ss(c,s),f=e.modelId,p=r??(f?c.tryResolve(f):void 0);return{authStore:s,modelRegistry:c,providerRegistry:l,wireProtocolRegistry:u,modelCatalogManager:d,defaultModel:p,resolveEffectiveModel:()=>{if(p)return p;if(f){let e=c.tryResolve(f);if(e)return e}let e=t().get(`model`);return(e?c.tryResolve(e)??c.find(e):void 0)??c.getAll().find(e=>e.id!==m)},credentialBackendRegistry:ne(S(n))}}function Cf(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 wf(t)}function wf(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 Tf(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=no(new Set(a.map(e=>e.name)));return{model:i,systemPrompt:``,tools:a,thinkingLevel:`medium`,maxToolTurns:t.maxToolTurns,promptRefresh:e?qo(t.promptManager,t.getDeclarativeAgentProfiles(),e,a):()=>t.promptManager.assemblePreset({preset:`main`},o),workspaceDir:t.workspaceDir}},i=e.storage?.session;if(i&&`dir`in i){let n=c(),a=new _i({dbPath:n?`:memory:`:C(i.dir,`sessions.db`)});t.repoRef&&(t.repoRef.current=a);let o=n?vi():yi({lockDir:C(i.dir,`locks`)}),s=new hi({repo:a,workspaceKey:t.getWorkspaceKey??(()=>Ui),maxLoadEntries:zn,canStartHistory:e=>e.role!==`tool_result`,writeLease:o,stripInactiveReplacements:!0}),l=async e=>(await a.listSessions(e).catch(()=>[])).filter(e=>!Cf(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}));return $t({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,planeRegistry:t.planeRegistry,semanticReviewer:t.semanticReviewer,storage:{kind:`custom`,persistence:s,autoPersist:!0,...n?{panelStatePersistence:Pn(),pasteStatePersistence:Fn()}:{panelStateDir:C(i.dir,`panel-state`)},writeLeaseManager:{isLockedByOther:e=>o.peekLockedByOther(e),inspect:e=>o.inspect(e),forceRelease:e=>o.forceRelease(e)},coldSessionLister:{listColdSessions:l},onDispose:()=>{o.close(),a.close()}}})}let a=i&&`url`in i?(()=>{let n=Va(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;return $t({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,planeRegistry:t.planeRegistry,semanticReviewer:t.semanticReviewer})}function Ef(e){return e.map(e=>({name:e.name,description:typeof e.description==`function`?e.description({projectRoot:``}):e.description,parameters:e.parameters}))}function Df(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=Jn(n.getDeclarativeAgentProfiles?.()??[],t),i=r?Bo(r.defaultTools):void 0,a=Wo(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 Of(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(Ci(o.context.from,o.context.allowedTargets,r))}return i}function kf(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=Df(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=Of(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 Rt({stream:e.stream,logger:e.logger,agentName:t.agentId,maxToolTurns:t.maxToolTurns,toolHookExecutor:on({hookRegistry:e.hookRegistry,agentName:t.agentId,sessionId:u}),depth:d,parentTaskId:t.parentTaskId}),p=()=>f.abort();t.signal?.aborted?f.abort():t.signal?.addEventListener(`abort`,p,{once:!0});let m=`${u}:${t.agentId}`,h=Yt(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(),gn.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(`
470
+ `),tokenUsage:{input:g.usage.inputTokens,output:g.usage.outputTokens,cacheRead:g.usage.cacheReadTokens},durationMs:Date.now()-n}}}function Af(e,t){if(!t.defaultModel)throw Error(`buildSwarmConfig for team "${e.name}" failed: no default model configured.`);return{name:e.name,agents:e.agents,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,parentTaskId:t.parentTaskId,runAgentTurn:t.runAgentTurn??kf(t)}}function jf(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=jf(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=Af(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 wi(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=Jn(o,c);if(!l){s.push({kind:`agent`,id:c,name:c,description:c,systemPrompt:Gn(c),tools:Ef(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:Ef(t.resolveTools(void 0,Bo(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 Mf(e){return async(t,n,r,i,a)=>{let o=e.getDeclarativeTeams().find(e=>e.name===t);if(!o)return{success:!1,error:`Team not found: ${t}`};let s=e.defaultModel;if(!s)return{success:!1,error:`No model configured for team execution.`};if(o.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 c=jf(o,e,s,new Set([t]),0,i??0);if(c.agents.length===0)return{success:!1,error:`Team "${t}" has no resolvable member agents.`};try{let o=await wi(Af(c,{providerRegistry:e.providerRegistry,hookRegistry:e.hookRegistry,stream:e.stream,logger:e.logger,defaultModel:s,runId:`team:${t}`,depth:i,parentTaskId:a,runAgentTurn:e.runAgentTurn})).run(n,{signal:r});return{success:!0,output:o.output,pattern:o.pattern}}catch(e){return{success:!1,error:e instanceof Error?e.message:String(e)}}}}const Nf=`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:
374
471
  - Overall layout (columns/sections, relative position and proportions)
375
472
  - Color palette (primary/secondary colors as hex codes)
376
473
  - Text content and font-size hierarchy (headings vs body)
377
474
  - Interactive component inventory (buttons, inputs, nav items, etc.)
378
475
  - Key size ratios/dimensions
379
476
 
380
- If the image is not a UI/design screenshot, give a normal concise description instead. Do not speculate beyond what's visible.`;var Qu=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?`${Zu}\n\nContext: ${t.contextHint}`:Zu},{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 ui(`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 $u(e){let t=e?.slots?.vision;if(t)return Array.isArray(t)?t:[t]}function ed(e,t){globalThis[e]||Object.defineProperty(globalThis,e,{value:Object.freeze(t()),writable:!1,configurable:!1})}var td=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,ed(`__ottoPanelRuntime`,()=>({callMcpTool:(e,t,n)=>this.callMcpTool(e,t,n),usePluginData:nd(this)}))}};function nd(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 rd=new td;function id(e){rd.install(e)}const ad=`backend/`;function od(e){return e.startsWith(ad)?e:`${ad}${e}`}var sd=class{fns=null;get(){return this.fns}install(e){this.fns=e,ed(`__ottoPanelBackendRuntime`,()=>({usePanelBackend:ld(this)}))}};function cd(){return globalThis.__ottoCurrentPanelPluginId}function ld(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=cd(),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,od(e),t,i)},[n]),cancel:t.useCallback(e=>{!n||!r||r.cancel(n,e)},[n]),state:i,status:o}}}const ud=new sd;function dd(e){ud.install(e)}function fd(){let e=process.env.LC_ALL||process.env.LC_MESSAGES||process.env.LANG||``;return/zh/i.test(e)?`zh`:`en`}function pd(e){return!e||e===`auto`?fd():e}var md=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=T(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=Wl(e.id,e.manifest),r=Wl(e.id,t),i=new Set([...n].filter(e=>r.has(e)));i.size>0&&o.set(e.id,i);let a=Gl(e.id,e.manifest),c=Gl(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 eu(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=$l(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 eu(e,t,this.deps);this.previousSnapshot=[],this.loadedPluginIds=[]}};function hd(e,n){if(!e)return{devtools:null,logSubscription:null};let r=new t;return{devtools:r,logSubscription:Je(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 gd=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 _d=S(`@x-otto/coding:plugin-context-sources`),vd=64*1024;function yd(e,t,n){let r=x(t,n);if(!Ps(r,t)){_d.warn({pluginId:e,file:n},`contextSources.content.file resolves outside plugin dir, skipped`);return}try{let e=O(r,`utf8`);return Buffer.byteLength(e,`utf8`)>vd?`${e.slice(0,vd)}\n<!-- truncated -->`:e}catch(t){_d.warn({pluginId:e,file:n,err:String(t)},`contextSources.content.file read failed, skipped`);return}}function bd(e){let t=[];for(let n of e){if(T(n).gated)continue;let e=n.manifest.contributes?.contextSources;if(e?.length){if(!n.manifest.capabilities?.includes(`context`)){_d.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:yd(n.id,n.dir,r.content.file);if(e!=null)return`<!-- plugin:${n.id} -->\n${e}`}})}}return t}function xd(e){Gt(),Wt(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[C.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})}),C.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 Sd=2e4,Cd=(e,t)=>{let n=Ei(`git`,[...e],{cwd:t,timeout:1e4,encoding:`utf-8`,maxBuffer:4194304});return n.error||n.status!==0?null:n.stdout??``};function wd(e){return e.length<=Sd?e:`${e.slice(0,Sd)}\n[...truncated ${e.length-Sd} chars...]`}function Td(e,t,n,r){let i=x(e),a=Ue(t)?t:x(i,t);if(a!==i&&!a.startsWith(`${i}/`)||!E(a)||!Jr(a).isFile())return null;let o;try{o=O(a,`utf-8`)}catch{return null}if(o.includes(`\0`))return null;let s=o.split(`
381
- `),c=Math.max(1,n);if(c>s.length)return null;let l=Math.min(s.length,r>0?r:n);return wd(s.slice(c-1,l).join(`
382
- `))}function Ed(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(`
383
- `)[0]??``);if(!a)return null;let o=parseInt(a[2],10);return Td(e,a[1],o,o+r)}function Dd(e){let t=e?.gitRunner??Cd;return[{id:`file-range`,resolve:(e,t)=>{let n=/^([\w./\-]+):(\d+)(?:-(\d+))?$/.exec(e);if(!n)return``;let r=Td(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=Ed(n.workspaceDir,e,t);return r===null?``:`\n\n@def:${e}:\n\`\`\`\n${r}\n\`\`\`\n`}}]}function Od(e){return{sandbox:new ba(e.logger),memoryGovernor:new gt({logger:e.logger}),residencyGovernor:new vt,fleetMonitor:new ht({logger:e.logger}),permissionSync:new ya({logger:e.logger,getToolRegistry:e.getToolRegistry,getPermissionRegistry:e.getPermissionRegistry}),hookRegistry:e.hookRegistry??Te({preset:`default`,onHookTimeout:e.onHookTimeout})}}function kd(e){let t=hd(e.inspect,e.loggerName),n=t.devtools,r=t.logSubscription,i=new li({workspaceDir:e.workspaceDir,projectConfigPath:e.projectConfigPath,projectConfigTrusted:()=>Nr(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;et(r),Ze(r),e.getI18nRegistry().setLocale(pd(t.language))}),{devtools:n,logSubscription:r,settings:i}}function Ad(e){let t=new Qu({getModelRegistry:e.getModelRegistry,providerRegistry:e.providerRegistry,getVisionSlotCandidates:()=>$u(e.getSettings().get(`model_slots`)),isModelUsable:e.isModelUsable,logger:e.logger});return{visionDelegateService:t,sessionConfigResolver:new so({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 jd(e){let t=Uu(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:qu({hookRegistry:e.hookRegistry,stream:n.stream,logger:e.logger,defaultModel:e.defaultModel,getTools:e.getTools,getDeclarativeAgentProfiles:e.getDeclarativeAgentProfiles}),defaultModel:e.defaultModel}}function Md(e){let{runSession:t,abortTask:n}=Oo({logger:e.logger,getSession:e.getSession,createSession:e.createSession,removeSession:e.removeSession}),r=new ai({hookRegistry:e.hookRegistry,runSession:t,abortTask:n,runAgentTurn:e.swarmAgentRunner,workflowConfig:e.workflowConfig});return{orchestrator:r,runSession:t,runTeam:Xu({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:Ii()}}function Nd(e){id(e.callMcpTool);let t=new Qs({mcpController:e.mcpController,getActivePlugins:e.getActivePlugins});return dd({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 Pd(e){let t=new Cu({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 md({providerRegistry:e.providerRegistry,authStore:e.authStore,modelRegistry:e.modelRegistry,wireProtocolRegistry:e.wireProtocolRegistry,activePlugins:e.activePlugins,logger:e.logger});return e.i18nRegistry.register(Rs(e.activePlugins())),{pluginModuleManager:t,pluginProviderManager:n,capabilityReloader:new Xs(e.settings,e.mcpController,e.skillRegistryForReloader,t,n,e.toolRegistry,e.modelCatalogManager,e.workspaceDir,e.getActivePluginsForReloader,e.i18nRegistry)}}function Fd(e){return{toolsSyncCoordinator:new ss({sessionConfigResolver:e.sessionConfigResolver,getSession:e.getSession,listSessionIds:e.listSessionIds,logger:e.logger}),pluginContributionsFacade:new Ss({getWorkspaceDir:()=>e.workspaceDir,settings:e.settings,getActivePlugins:e.getActivePlugins,pluginModuleManager:e.pluginModuleManager,mcpController:e.mcpController})}}function Id(e){let t=new Set(e.hookRegistry.getRegistered().map(e=>e.name)),n=new gd(e.toolRegistry,e.hookRegistry),r=new Ea(e.settings,e.toolRegistry,e.logger,e.workspaceDir,e.getResilienceConfig);return{permissionRegistry:n.registry,auditLog:n.auditLog,mcpController:r,preExistingHooks:t}}function Ld(e){return new ja({settings:e.settings,mcp:e.mcpController,skills:e.skillRegistry,getAgentProfiles:()=>e.declarativeAgentProfiles,getPlugins:()=>Vn({cwd:e.workspaceDir,homedir:e.pluginHomedir,bundledDirs:e.pluginBundledDirs}),processRuntime:Ht,onPluginToggle:e.onPluginToggle})}function Rd(e){e.pluginInput.register(Pn()),e.pluginInput.registerProvider(`@`,In({cwd:e.workspaceDir})),e.sigilResolvers.register(Dd(),`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=Nl(e.activePlugins());t.length>0&&e.pluginInput.register(t),Pl(e.activePlugins());for(let t of bd(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:xd({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 Bd(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:Ui(e.getScheduleService),searchEcosystem:e.searchEcosystem}}function Vd(e){let{orchestrator:t,writeTodos:n,skillProvider:r,autoMemory:i,reloadMemory:a,archiveRecall:o}=e,s=e.processOwner,c=s?{register:e=>C.register({...e,owner:s}),get:e=>C.get(e),getForSession:(e,t)=>C.getForSession(e,t),listForSession:e=>C.listForSession(e),kill:e=>C.kill(e),updateDetectedService:(e,t)=>C.updateDetectedService(e,t)}:C;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 Hd(e,t){return y({name:`tool-guidance-injection`,timing:`system.prompt.transform`,priority:yt.toolGuidance.priority,handle:async(n,r)=>{let i=e.buildToolGuidance(t());i&&(r.systemPrompt=`${r.systemPrompt}\n\n${i}`)}})}const Ud=b(process.cwd(),`docs/rfc/RFC-284-core-pack/content.txt`),Wd=b(process.cwd(),`docs/rfc/RFC-284-governance-plan.json`);function Gd(){if(!E(Ud))return;let e=O(Ud,`utf8`).trim();return e.length>0?e:void 0}function Kd(){if(!E(Wd))return new Map;let e=JSON.parse(O(Wd,`utf8`));return new Map((e.decisions??[]).map(e=>[e.key,e]))}function qd(e){return new Set(e.toLowerCase().split(/[^\p{L}\p{N}._/-]+/u).filter(e=>e.length>=3))}function Jd(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 Yd(e,t){let n=qd(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=qd(`${e.trigger} ${e.insight}`);for(let e of n)a.has(e)&&(r+=1);return r}function Xd(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=Yd(e,n);if(a<=0)return;let o=`[${e.tags.join(`, `)}] ${e.trigger} → ${e.insight}`;return{lesson:e,score:a,text:o,tokens:Jd(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(`
384
- `),hitIds:i.map(e=>e.lesson.id)}}function Zd(e,t,n){let r=At({name:`lesson-injection`,priority:yt.lesson.priority,compute:async()=>{let r=Gd(),i=n?await n.list():[];if(r){let e=i.length>0?await t.loadRuntimeLessonsTemplate()??void 0:void 0;return[r,i.length>0?vn(i,e):``].filter(e=>e.length>0).join(`
477
+ If the image is not a UI/design screenshot, give a normal concise description instead. Do not speculate beyond what's visible.`;var Pf=class{cache=new Map;constructor(e){this.deps=e}describeImages=async(e,t)=>{let n=await this.resolveVisionModel();return n?Promise.all(e.map(e=>this.describeOne(n,e,t))):e.map(()=>null)};async resolveVisionModel(){let e=this.deps.getModelRegistry(),t=this.deps.getVisionSlotCandidates()??[];for(let n of t){let t=e.tryResolve(n);if(t&&await this.isUsable(t))return t}for(let t of e.getAll())if(t.strengths?.includes(`vision`)&&await this.isUsable(t))return t}async isUsable(e){try{return(await this.deps.isModelUsable(e)).usable}catch{return!1}}async describeOne(e,t,n){let r=this.hashImage(t.source),i=this.cache.get(r);if(i)return this.formatDescription(e,i.description);try{let i=await this.callVisionModel(e,t,n);return i?(this.rememberInCache(r,i),this.formatDescription(e,i)):null}catch(t){return this.deps.logger.debug({error:t,modelId:e.id},`vision delegate describe failed`),null}}async callVisionModel(e,t,n){let r=this.deps.providerRegistry.get(e.api),i={role:`user`,timestamp:Date.now(),content:[{type:`text`,text:t.contextHint?`${Nf}\n\nContext: ${t.contextHint}`:Nf},{type:`image`,mime:t.mime,source:t.source}]},a=new AbortController,o=setTimeout(()=>a.abort(),3e4),s=n?AbortSignal.any([n,a.signal]):a.signal;try{return(await te(e,r,{model:e,systemPrompt:``,messages:[i],maxTokens:800},{signal:s})).content.filter(e=>e.type===`text`).map(e=>e.text).join(``).trim()||void 0}finally{clearTimeout(o)}}formatDescription(e,t){return`[image seen by vision model ${e.id}]\n${t}`}hashImage(e){return Fi(`sha256`).update(e).digest(`hex`)}rememberInCache(e,t){if(this.cache.size>=100){let e=this.cache.keys().next().value;e!==void 0&&this.cache.delete(e)}this.cache.set(e,{description:t})}};function Ff(e){let t=e?.slots?.vision;if(t)return Array.isArray(t)?t:[t]}function If(e,t){globalThis[e]||Object.defineProperty(globalThis,e,{value:Object.freeze(t()),writable:!1,configurable:!1})}var Lf=class{_callMcpTool=null;get callMcpTool(){if(!this._callMcpTool)throw Error(`PanelRuntime not installed — call installPanelRuntime() during App startup`);return this._callMcpTool}install(e){this._callMcpTool=e,If(`__ottoPanelRuntime`,()=>({callMcpTool:(e,t,n)=>this.callMcpTool(e,t,n),usePluginData:Rf(this)}))}};function Rf(e){return function(t,n,r=5e3){let i=globalThis.React;if(!i||typeof i.useState!=`function`)throw Error(`usePluginData requires React runtime. Panel components must be rendered in a React (Ink) context.`);let[a,o]=i.useState(void 0),[s,c]=i.useState(!0),[l,u]=i.useState(void 0),d=i.useCallback(async()=>{c(!0);try{let r=await e.callMcpTool(t,n,{});if(r.isError){u(`MCP tool returned error`);return}let i=r.content?.find(e=>e.type===`text`);if(i?.text){try{o(JSON.parse(i.text))}catch{o(i.text)}u(void 0)}else o(void 0),u(`MCP tool returned no text content`)}catch(e){u(e instanceof Error?e.message:String(e))}finally{c(!1)}},[t,n]);return i.useEffect(()=>{d();let e=setInterval(()=>void d(),r);return()=>clearInterval(e)},[d,r]),{data:a,loading:s,error:l,callTool:i.useCallback(async(n,r)=>{try{return{success:!(await e.callMcpTool(t,n,r??{})).isError}}catch(e){return{success:!1,error:e instanceof Error?e.message:String(e)}}},[t])}}}const zf=new Lf;function Bf(e){zf.install(e)}const Vf=`backend/`;function Hf(e){return e.startsWith(Vf)?e:`${Vf}${e}`}var Uf=class{fns=null;get(){return this.fns}install(e){this.fns=e,If(`__ottoPanelBackendRuntime`,()=>({usePanelBackend:Gf(this)}))}};function Wf(){return globalThis.__ottoCurrentPanelPluginId}function Gf(e){return function(){let t=globalThis.React;if(!t||typeof t.useState!=`function`)throw Error(`usePanelBackend requires React runtime. Panel components must be rendered in a React (Ink) context.`);let n=Wf(),r=e.get(),[i,a]=t.useState(void 0),[o,s]=t.useState(n&&r?r.getStatus(n):`disabled`);return t.useEffect(()=>{if(!n||!r)return;s(r.getStatus(n));let e=r.subscribeState(n,e=>{a(e)}),t=r.onStatusChange(n,s);return()=>{e(),t()}},[n]),{call:t.useCallback(async(e,t,i)=>{if(!n||!r)throw Error(`usePanelBackend: no plugin context available (panel must be rendered inside a plugin detail view with backend runtime installed)`);return r.call(n,Hf(e),t,i)},[n]),cancel:t.useCallback(e=>{!n||!r||r.cancel(n,e)},[n]),state:i,status:o}}}const Kf=new Uf;function qf(e){Kf.install(e)}function Jf(){let e=process.env.LC_ALL||process.env.LC_MESSAGES||process.env.LANG||``;return/zh/i.test(e)?`zh`:`en`}function Yf(e){return!e||e===`auto`?Jf():e}var Xf=class{loadedPluginIds=[];previousSnapshot=[];constructor(e){this.deps=e}async reload(){let e=0,t=0,n=[],r=new Map;for(let e of this.deps.activePlugins()){let i=!!e.manifest.contributes?.oauth?.length,a=!!e.manifest.contributes?.providers?.length;if(!i&&!a)continue;let o=O(e);if(o.gated){this.deps.logger.warn({pluginId:e.id},`project plugin not trusted, skipping declarative providers (fail-closed, RFC-124 C1)`),t+=(e.manifest.contributes?.providers?.length??0)+(e.manifest.contributes?.oauth?.length??0);continue}if(o.pendingCapabilities.includes(`provider`)){this.deps.logger.warn({pluginId:e.id},`plugin capability "provider" declared but not yet granted, skipping declarative providers (fail-closed, RFC-124 C2)`),t+=(e.manifest.contributes?.providers?.length??0)+(e.manifest.contributes?.oauth?.length??0),n.push(e.id);continue}r.set(e.id,e.manifest)}let i=e=>JSON.stringify(e),a=[],o=new Map,s=new Map;for(let e of this.previousSnapshot){let t=r.get(e.id);if(t!==void 0&&i(t)!==i(e.manifest)){let n=md(e.id,e.manifest),r=md(e.id,t),i=new Set([...n].filter(e=>r.has(e)));i.size>0&&o.set(e.id,i);let a=hd(e.id,e.manifest),c=hd(e.id,t),l=new Set([...a].filter(e=>c.has(e)));l.size>0&&s.set(e.id,l)}}for(let e of this.previousSnapshot){let t=r.get(e.id);(t===void 0||i(t)!==i(e.manifest))&&await wd(e.id,e.manifest,this.deps,o.get(e.id),s.get(e.id))}let c=new Map(this.previousSnapshot.map(e=>[e.id,i(e.manifest)]));for(let[n,l]of r){if(c.get(n)===i(l)){a.push({id:n,manifest:l}),e+=l.contributes?.providers?.length??0;continue}let r=Cd(n,l,this.deps,o.get(n),s.get(n));e+=r.registered.length,t+=r.rejected.length;for(let e of r.rejected)this.deps.onProviderRejected?.(e);a.push({id:n,manifest:l})}return this.previousSnapshot=a,this.loadedPluginIds=a.map(e=>e.id),{registered:e,rejected:t,pendingCapabilityPluginIds:n}}get activePluginIds(){return this.loadedPluginIds}async cleanup(){for(let{id:e,manifest:t}of this.previousSnapshot)await wd(e,t,this.deps);this.previousSnapshot=[],this.loadedPluginIds=[]}};function Zf(e,n){if(!e)return{devtools:null,logSubscription:null};let r=new t;return{devtools:r,logSubscription:pt(e=>{if(typeof e==`object`&&e&&`name`in e&&`level`in e&&`msg`in e){let t=e;t.name===n&&r.sendLog(t)}})}}var Qf=class{registry;auditLog;constructor(e,t){let n=Ne(e.getAll());this.auditLog=new xe,this.registry=Me({toolSets:n}),t.register(Ae(this.registry,this.auditLog))}};const $f=T(`@x-otto/coding:plugin-context-sources`),ep=64*1024;function tp(e,t,n){let r=w(t,n);if(!Ac(r,t)){$f.warn({pluginId:e,file:n},`contextSources.content.file resolves outside plugin dir, skipped`);return}try{let e=b(r,`utf8`);return Buffer.byteLength(e,`utf8`)>ep?`${e.slice(0,ep)}\n<!-- truncated -->`:e}catch(t){$f.warn({pluginId:e,file:n,err:String(t)},`contextSources.content.file read failed, skipped`);return}}function np(e){let t=[];for(let n of e){if(O(n).gated)continue;let e=n.manifest.contributes?.contextSources;if(e?.length){if(!n.manifest.capabilities?.includes(`context`)){$f.warn({pluginId:n.id},`plugin declares contextSources but not capabilities:["context"], skipped (fail-closed)`);continue}for(let r of e)t.push({id:`${n.id}:${r.id}`,priority:r.priority,contribute:()=>{let e=typeof r.content==`string`?r.content:tp(n.id,n.dir,r.content.file);if(e!=null)return`<!-- plugin:${n.id} -->\n${e}`}})}}return t}function rp(e,t,n){let r=0;for(let i of t)try{e.register(i),r+=1}catch(e){n.warn({sourceId:i.id,err:e instanceof Error?e.message:String(e)},`plugin context source skipped: duplicate id (builtin or another plugin already registered it)`)}return r}function ip(e){xn(),bn(void 0,e.repoRoot);let t=(t,n)=>{e.hasSession(n.sessionId)&&e.emitHook(t,n).catch(n=>{e.logger.warn({err:n instanceof Error?n.message:String(n),timing:t},`Failed to emit process lifecycle hook`)})};return[E.onSpawn(n=>{e.logger.info({id:n.id,pid:n.pid,command:n.command,port:n.port},`Background process started`),t(`process.spawned`,{sessionId:n.config.sessionId,processId:n.id,pid:n.pid,command:n.command,port:n.port})}),E.onExit(n=>{e.logger.info({id:n.id,pid:n.pid,status:n.status},`Background process exited`),t(`process.exited`,{sessionId:n.config.sessionId,processId:n.id,pid:n.pid,command:n.command,status:n.status})})]}const ap=2e4,op=(e,t)=>{let n=ea(`git`,[...e],{cwd:t,timeout:1e4,encoding:`utf-8`,maxBuffer:4194304});return n.error||n.status!==0?null:n.stdout??``};function sp(e){return e.length<=ap?e:`${e.slice(0,ap)}\n[...truncated ${e.length-ap} chars...]`}function cp(e,t,n,r){let i=w(e),a=ct(t)?t:w(i,t);if(a!==i&&!a.startsWith(`${i}/`)||!v(a)||!tt(a).isFile())return null;let o;try{o=b(a,`utf-8`)}catch{return null}if(o.includes(`\0`))return null;let s=o.split(`
478
+ `),c=Math.max(1,n);if(c>s.length)return null;let l=Math.min(s.length,r>0?r:n);return sp(s.slice(c-1,l).join(`
479
+ `))}function lp(e,t,n,r=14){let i=n([`grep`,`-nE`,`(function|class|interface|type|enum|const|let|var|def|fn|struct|func)[[:space:]]+${t.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}`],e);if(i===null||!i.trim())return null;let a=/^(.+?):(\d+):/.exec(i.split(`
480
+ `)[0]??``);if(!a)return null;let o=parseInt(a[2],10);return cp(e,a[1],o,o+r)}function up(e){let t=e?.gitRunner??op;return[{id:`file-range`,resolve:(e,t)=>{let n=/^([\w./-]+):(\d+)(?:-(\d+))?$/.exec(e);if(!n)return``;let r=cp(t.workspaceDir,n[1],parseInt(n[2],10),n[3]?parseInt(n[3],10):0);if(r===null)return``;let i=n[1],a=i.includes(`.`)?i.split(`.`).pop()??``:``;return`\n\n${i}:${n[3]?`${n[2]}-${n[3]}`:n[2]}:\n\`\`\`${a}\n${r}\n\`\`\`\n`}},{id:`def`,resolve:(e,n)=>{let r=lp(n.workspaceDir,e,t);return r===null?``:`\n\n@def:${e}:\n\`\`\`\n${r}\n\`\`\`\n`}}]}function dp(e){return{sandbox:new oo(e.logger),memoryGovernor:new Ut({logger:e.logger}),residencyGovernor:new Gt,fleetMonitor:new Vt({logger:e.logger}),permissionSync:new ao({logger:e.logger,getToolRegistry:e.getToolRegistry,getPermissionRegistry:e.getPermissionRegistry}),hookRegistry:e.hookRegistry??ta({preset:`default`,onHookTimeout:e.onHookTimeout})}}function fp(e){let t=Zf(e.inspect,e.loggerName),n=t.devtools,r=t.logSubscription,i=new Ei({workspaceDir:e.workspaceDir,projectConfigPath:e.projectConfigPath,projectConfigTrusted:()=>Ni(e.workspaceDir,{interactive:e.interactive})});return i.on(`change`,t=>{e.onSettingsApplied(t),e.permissionSync.sync(t),e.sandbox.applySetting(e.sandbox.resolveConfig(t));let n=t.proxy,r=n?.enabled!==!1&&n?.url?n.url:void 0;bt(r),gt(r),e.getI18nRegistry().setLocale(Yf(t.language))}),{devtools:n,logSubscription:r,settings:i}}function pp(e){let t=new Pf({getModelRegistry:e.getModelRegistry,providerRegistry:e.providerRegistry,getVisionSlotCandidates:()=>Ff(e.getSettings().get(`model_slots`)),isModelUsable:e.isModelUsable,logger:e.logger});return{visionDelegateService:t,sessionConfigResolver:new Jo({settings:e.getSettings(),promptManager:e.promptManager,getModelRegistry:e.getModelRegistry,getTools:e.getTools,getDeclarativeAgentProfiles:e.getDeclarativeAgentProfiles,defaultModel:e.defaultModel,explicitModelSpec:e.explicitModelId,hasCredential:t=>e.providerRegistry.hasCredential(t),isModelUsable:e.isModelUsable,maxToolTurns:e.maxToolTurns,maxToolTurnExtensions:e.maxToolTurnExtensions,promptOutputTokenBudget:e.promptOutputTokenBudget,promptWallClockBudgetMs:e.promptWallClockBudgetMs,sessionCostBudgetUSD:e.sessionCostBudgetUSD,stallDetection:e.stallDetection,workspaceDir:e.workspaceDir,getWorkspaceId:()=>e.getWorkspaceRef()?.id??e.workspaceId,logger:e.logger,describeImages:t.describeImages,getResilienceConfig:e.getResilienceConfig})}}function mp(e){let t=Tf(e.options,{hookRegistry:e.hookRegistry,providerRegistry:e.providerRegistry,modelRegistry:e.getModelRegistry(),logger:e.logger,workspaceDir:e.workspaceDir,getTools:e.getTools,getDeclarativeAgentProfiles:e.getDeclarativeAgentProfiles,getWorkspaceKey:()=>e.getWorkspaceRef()?.key,repoRef:e.repoRef,maxToolTurns:e.maxToolTurns,promptManager:e.promptManager,memory:e.memory,traceStore:e.traceStore,checkpointStore:e.checkpointStore,clock:e.clock,devtools:e.devtools??void 0,residencyGovernor:e.residencyGovernor,getResidencyConfig:e.getResidencyConfig,planeRegistry:e.planeRegistry,semanticReviewer:e.semanticReviewer},e.resolveEffectiveModel),n=t.sessions;return{agentRuntime:t,codingSessionPool:n,swarmAgentRunner:kf({hookRegistry:e.hookRegistry,stream:n.stream,logger:e.logger,defaultModel:e.defaultModel,getTools:e.getTools,getDeclarativeAgentProfiles:e.getDeclarativeAgentProfiles}),defaultModel:e.defaultModel}}function hp(e){let{runSession:t,abortTask:n}=ys({logger:e.logger,getSession:e.getSession,createSession:e.createSession,removeSession:e.removeSession}),r=new Si({hookRegistry:e.hookRegistry,runSession:t,abortTask:n,runAgentTurn:e.swarmAgentRunner,workflowConfig:e.workflowConfig});return{orchestrator:r,runSession:t,runTeam:Mf({logger:e.logger,providerRegistry:e.providerRegistry,hookRegistry:e.hookRegistry,stream:e.stream,defaultModel:e.defaultModel,getDeclarativeTeams:e.getDeclarativeTeams,getDeclarativeAgentProfiles:e.getDeclarativeAgentProfiles,resolveTools:(t,n)=>e.sessionConfigResolver.resolveTools(t,n),runAgentTurn:e=>r.runAgentTurn(e)}),writeTodos:ca()}}function gp(e){Bf(e.callMcpTool);let t=new Yc({mcpController:e.mcpController,getActivePlugins:e.getActivePlugins});return qf({call:(e,n,r,i)=>t.call(e,n,r,i),cancel:(e,n)=>{t.cancel(e,n)},subscribeState:(e,n)=>t.subscribeState(e,n),getStatus:e=>t.getStatus(e),onStatusChange:(e,n)=>t.onStatusChange(e,n)}),{panelBackendController:t}}function _p(e){let t=new Ju((t,n)=>{let r=e.activePlugins().find(e=>e.id===t);return r?(r.manifest.capabilities??[]).includes(n):!1}),n=new nf({hookRegistry:e.hookRegistry,skillRegistry:e.skillRegistry,providerRegistry:e.providerRegistry,wireProtocolRegistry:e.wireProtocolRegistry,modelRegistry:e.modelRegistry,authStore:e.authStore,toolRegistry:e.toolRegistry,feedbackRegistry:e.feedbackRegistry,sigilResolverRegistry:e.sigilResolverRegistry,pluginInput:e.pluginInput,workspaceDir:e.workspaceDir,activePlugins:e.activePlugins,callMcpTool:e.callMcpTool,logger:e.logger,eventDispatcher:t,startPluginJob:e.startPluginJob,getSessionId:e.getPluginJobSessionId,getWorkspaceKey:e.getWorkspaceKey,getSessionMessages:e.getSessionMessages,completeText:e.completeText,capabilityQuota:e.capabilityQuota,askUser:e.askUser,onPluginLoadError:e.onPluginLoadError,...e.getSchedulePort?{getSchedulePort:e.getSchedulePort}:{},...e.getSettingValue?{getSettingValue:e.getSettingValue}:{},...e.notifyUser?{notifyUser:e.notifyUser}:{},...e.planeRegistry?{planeRegistry:e.planeRegistry}:{}}),r=new Xf({providerRegistry:e.providerRegistry,authStore:e.authStore,modelRegistry:e.modelRegistry,wireProtocolRegistry:e.wireProtocolRegistry,activePlugins:e.activePlugins,logger:e.logger,...e.onPluginLoadError?{onProviderRejected:t=>e.onPluginLoadError(t.pluginId,`provider entry "${t.id}" rejected: ${t.reason}`,`provider-rejected`)}:{}});return e.i18nRegistry.register(Fc(e.activePlugins())),{pluginModuleManager:n,pluginProviderManager:r,capabilityReloader:new qc(e.settings,e.mcpController,e.skillRegistryForReloader,n,r,e.toolRegistry,e.modelCatalogManager,e.workspaceDir,e.getActivePluginsForReloader,e.i18nRegistry,e.getCompatTrustGated)}}function vp(e){return{toolsSyncCoordinator:new rc({sessionConfigResolver:e.sessionConfigResolver,getSession:e.getSession,listSessionIds:e.listSessionIds,logger:e.logger}),pluginContributionsFacade:new vc({getWorkspaceDir:()=>e.workspaceDir,settings:e.settings,getActivePlugins:e.getActivePlugins,pluginModuleManager:e.pluginModuleManager,mcpController:e.mcpController,compatProducts:e.compatProducts})}}function yp(e){let t=new Set(e.hookRegistry.getRegistered().map(e=>e.name)),n=new Qf(e.toolRegistry,e.hookRegistry),r=new po(e.settings,e.toolRegistry,e.logger,e.workspaceDir,e.getResilienceConfig,e.compatProducts);return{permissionRegistry:n.registry,auditLog:n.auditLog,mcpController:r,preExistingHooks:t}}function bp(e){return new vo({settings:e.settings,mcp:e.mcpController,skills:e.skillRegistry,getAgentProfiles:()=>e.declarativeAgentProfiles,getPlugins:()=>gr({cwd:e.workspaceDir,homedir:e.pluginHomedir,bundledDirs:e.pluginBundledDirs}),processRuntime:E,onPluginToggle:e.onPluginToggle})}function xp(e){e.pluginInput.register(lr()),e.pluginInput.registerProvider(`@`,dr({cwd:e.workspaceDir})),e.sigilResolvers.register(up(),`builtin`),e.sigilResolvers.register([{id:`shortcut`,resolve:t=>{let n=(e.settings.get(`shortcuts`)??[]).find(e=>e.name===t);return n?n.text:``}}],`builtin`);let t=rd(e.activePlugins());t.length>0&&e.pluginInput.register(t),id(e.activePlugins());for(let t of np(e.activePlugins()))rp(e.agentRuntime.contextSources,[t],e.logger);return e.registerHooks(),{ownedHookNames:e.hookRegistry.getRegistered().map(e=>e.name).filter(t=>!e.preExistingHooks.has(t)),processRegistryUnsubs:ip({hasSession:t=>!!e.codingSessionPoolGet(t),emitHook:(t,n)=>e.hookRegistry.emit(t,n),logger:e.logger,repoRoot:e.workspaceDir})}}async function Sp(e,t,n){t()||(await e.load(),n(!0))}function Cp(e){for(let t of e)try{t.apply()}catch(e){throw Error(`deferred config step "${t.label}" failed: ${e.message}`,{cause:e})}}function wp(e){let t=typeof e==`function`?{getPermissionMode:e}:e;return async(e,n,r,i)=>{if(t.getPermissionMode()===`bypass`)return`allow`;if(t.isSemanticReviewEnabled?.()===!0&&t.createLlmReviewer){let a=t.resolveReviewModel?.();if(a)return await t.createLlmReviewer(a)(e,n,r,i)}return`abstain`}}function Tp(e,t,n,r){return{workspaceDir:t,processOwner:e.processOwnerId,orchestrator:e.orchestrator,writeTodos:e.writeTodos,skillProvider:n,enableLsp:r,sandbox:e.sandbox,autoMemory:e.autoMemory,reloadMemory:e.reloadMemory,archiveRecall:e.archiveRecall,runTeam:e.runTeam,runSession:e.runSession,fileStateManager:e.fileStateManager,learningStore:e.learningStore,localLearningStore:e.localLearningStore,sessions:e.sessions,listModels:e.listModels,startJob:e.startJob,schedule:ha(e.getScheduleService),searchEcosystem:e.searchEcosystem}}function Ep(e){let{orchestrator:t,writeTodos:n,skillProvider:r,autoMemory:i,reloadMemory:a,archiveRecall:o}=e,s=e.processOwner,c=s?{register:e=>{let t=E.registerChild({command:e.command,cwd:e.cwd,logPath:e.logPath,port:e.port,url:e.url,owner:{type:`app`,id:s},sessionId:e.sessionId,category:`shell`,label:e.command,lifecycle:`evictable`},e.child);return{id:t.id,sessionId:e.sessionId,pid:t.pid??-1,command:t.command,status:t.status===`running`?`running`:t.status===`exited`?`exited`:`killed`,logPath:t.logPath,port:t.port,url:t.url,startedAt:t.lastUsed}},get:e=>{let t=E.get(e);return t?{id:t.id,sessionId:t.config.sessionId??``,pid:t.pid??-1,command:t.command,status:t.status===`running`?`running`:t.status===`exited`?`exited`:`killed`,logPath:t.logPath,port:t.port,url:t.url,startedAt:t.lastUsed}:void 0},getForSession:(e,t)=>{let n=E.getForSession(e,t);return n?{id:n.id,sessionId:e,pid:n.pid??-1,command:n.command,status:n.status===`running`?`running`:n.status===`exited`?`exited`:`killed`,logPath:n.logPath,port:n.port,url:n.url,startedAt:n.lastUsed}:void 0},listForSession:e=>E.listForSession(e).map(t=>({id:t.id,sessionId:e,pid:t.pid??-1,command:t.command,status:t.status===`running`?`running`:t.status===`exited`?`exited`:`killed`,logPath:t.logPath,port:t.port,url:t.url,startedAt:t.lastUsed})),kill:e=>E.kill(e),updateDetectedService:(e,t)=>E.updateDetectedService(e,t)}:{register:e=>{let t=E.registerChild({command:e.command,cwd:e.cwd,logPath:e.logPath,port:e.port,url:e.url,owner:{type:`app`,id:`default`},sessionId:e.sessionId,category:`shell`,label:e.command,lifecycle:`evictable`},e.child);return{id:t.id,sessionId:e.sessionId,pid:t.pid??-1,command:t.command,status:t.status===`running`?`running`:t.status===`exited`?`exited`:`killed`,logPath:t.logPath,port:t.port,url:t.url,startedAt:t.lastUsed}},get:e=>{let t=E.get(e);return t?{id:t.id,sessionId:t.config.sessionId??``,pid:t.pid??-1,command:t.command,status:t.status===`running`?`running`:t.status===`exited`?`exited`:`killed`,logPath:t.logPath,port:t.port,url:t.url,startedAt:t.lastUsed}:void 0},getForSession:(e,t)=>{let n=E.getForSession(e,t);return n?{id:n.id,sessionId:e,pid:n.pid??-1,command:n.command,status:n.status===`running`?`running`:n.status===`exited`?`exited`:`killed`,logPath:n.logPath,port:n.port,url:n.url,startedAt:n.lastUsed}:void 0},listForSession:e=>E.listForSession(e).map(t=>({id:t.id,sessionId:e,pid:t.pid??-1,command:t.command,status:t.status===`running`?`running`:t.status===`exited`?`exited`:`killed`,logPath:t.logPath,port:t.port,url:t.url,startedAt:t.lastUsed})),kill:e=>E.kill(e),updateDetectedService:(e,t)=>E.updateDetectedService(e,t)};return{orchestration:{dispatchTask:t.dispatchTask,getTask:t.getTask,listTasks:t.listTasks,updateTask:t.updateTask,getBackgroundOutput:t.getBackgroundOutput,cancelBackground:t.cancelBackground,writeTodos:n,startJob:e.startJob},agents:{callAgent:t.callAgent},fork:{fork:async(t,n,r)=>({ok:!0,value:(await e.runSession({prompt:t,sessionMode:`ephemeral`,depth:n,signal:r})).text})},skills:r?{loadSkill:e=>r.load(e),executeSkill:(e,t)=>r.execute(e,t)}:void 0,memory:i?{recordMemory:async e=>{await i.record(e,e.scope),e.scope===`project-shared`&&a&&await a()},readMemory:e=>i.read(e),archive:o?{read:e=>o.readArchive(e),list:e=>o.listArchives(e)}:void 0}:void 0,team:{runTeam:e.runTeam},session:{manager:{list:async()=>e.sessions.list().map(e=>({id:e.id,title:e.id,messageCount:e.messageCount})),create:async()=>({id:(await e.sessions.create()).id}),remove:async t=>e.sessions.remove(t),compact:async t=>{let n=e.sessions.get(t);return n?(await n.compactNow(),!0):!1}}},features:{listModels:e.listModels,grill:(t,n)=>{let r=e.sessions.get(t);return r?r.requestGrill(n):Promise.resolve({answer:n.recommendation,acceptedRecommendation:!0,resolvedBy:`auto_recommendation`})},enableLsp:e.enableLsp,sandbox:e.sandbox,processRegistry:c,captureFileState:async t=>{let n=await e.fileStateManager.capture({workspaceDir:e.workspaceDir,recentFiles:t.recentFiles,planStatus:t.planStatus});return{success:!0,summary:e.fileStateManager.formatSnapshot(n),timestamp:n.timestamp}},learn:async t=>{let{lesson:n,deduped:r}=await(t.scope===`local`?e.localLearningStore??e.learningStore:e.learningStore).saveDeduped({tags:t.tags,trigger:t.trigger,insight:t.insight,sourceSessionId:t.sessionId});return{success:!0,lessonId:n.id,deduped:r}}},schedule:e.schedule?{create:e.schedule.create,list:e.schedule.list,delete:e.schedule.delete,run:e.schedule.run,cancel:e.schedule.cancel}:void 0,capabilityGap:e.searchEcosystem?{search:e.searchEcosystem,...e.capabilityGapRecorder?{recorder:e.capabilityGapRecorder}:{}}:void 0}}function Dp(e,t){return k({name:A.toolGuidance.name,timing:`system.prompt.transform`,priority:A.toolGuidance.priority,handle:async(n,r)=>{let i=e.buildToolGuidance(t());if(i){let e=_a(A.toolGuidance.name,i);r.systemPrompt=`${r.systemPrompt}\n\n${e}`}}})}function Op(e){let t=C(e,`docs/rfc/RFC-284-core-pack/content.txt`);if(!v(t))return;let n=b(t,`utf8`).trim();return n.length>0?n:void 0}function kp(e){let t=C(e,`docs/rfc/RFC-284-governance-plan.json`);if(!v(t))return new Map;let n=JSON.parse(b(t,`utf8`));return new Map((n.decisions??[]).map(e=>[e.key,e]))}function Ap(e){return new Set(e.toLowerCase().split(/[^\p{L}\p{N}._/-]+/u).filter(e=>e.length>=3))}function jp(e){let t=0;for(let n of e)/[\u3000-\u9fff\uff00-\uffef]/.test(n)&&t++;return Math.ceil(t+(e.length-t)/4)}function Mp(e,t){let n=Ap(t);if(n.size===0)return 0;let r=0,i=e.tags??[];for(let e of i)n.has(e.toLowerCase())&&(r+=3);let a=Ap(`${e.trigger} ${e.insight}`);for(let e of n)a.has(e)&&(r+=1);return r}function Np(e){return e.size>0?{mode:`governance`,decisions:e}:{mode:`safe-default`}}function Pp(e){return!!e.contentHash&&jt({tags:e.tags??[],trigger:e.trigger,insight:e.insight})===e.contentHash}function Fp(e){return!(!Pp(e)||e.supersededBy||(e.relevantHitCount??0)<1)}function Ip(e,t,n){if(!n)return;let r=Np(t),i=e.map(e=>{if(r.mode===`governance`){let t=`workspace:${e.id}`,n=r.decisions.get(t);if(!n||n.class!==`fact`||n.state!==`active`||n.supersededBy)return}else if(!Fp(e))return;let t=Mp(e,n);if(t<=0)return;let i=r.mode===`safe-default`&&e.class===`fact`?2:0,a=`[${e.tags.join(`, `)}] ${e.trigger} → ${e.insight}`;return{lesson:e,score:t,priority:t+i,text:a,tokens:jp(a)}}).filter(e=>!!e).sort((e,t)=>t.priority-e.priority||e.tokens-t.tokens||e.lesson.id.localeCompare(t.lesson.id)),a=[],o=0;for(let e of i)if(!(o+e.tokens>1024)&&(a.push(e),o+=e.tokens,a.length>=3))break;if(a.length!==0)return{text:[`### Relevant Lesson Hints`,`Query-specific volatile hints selected from RFC-284 fact lessons:`,...a.map((e,t)=>`${t+1}. workspace:${e.lesson.id} score=${e.score} ${e.text}`)].join(`
481
+ `),hitIds:a.map(e=>e.lesson.id),lessons:a.map(e=>e.lesson)}}function Lp(e){return[...e].sort((e,t)=>(t.relevantHitCount??0)-(e.relevantHitCount??0)||(t.createdAt??0)-(e.createdAt??0))}function Rp(e,t,n,r={},i){let a=r.workspaceDir??process.cwd(),o=dn({name:A.agentKnowledge.name,compute:async()=>{let r=Op(a),o=r?_a(A.agentKnowledge.name,r):void 0,s=n?await n.list():[],c;if(o){let e=s.length>0?await t.loadRuntimeLessonsTemplate()??void 0:void 0;c=[o,s.length>0?Kn(Lp(s),e):``].filter(e=>e.length>0).join(`
482
+
483
+ `)||void 0}else{let n=Lp([...await e.list(),...s]);n.length>0&&(c=Kn(n,await t.loadRuntimeLessonsTemplate()??void 0)||void 0)}let l;if(i){let e=i.getMemoryPrompt().trim();e&&(l=e.replace(/^<agent_memory>\s*/,``).replace(/\s*<\/agent_memory>\s*$/,``).trim()||void 0)}if(!l&&!c)return;let u=[`<agent_knowledge>`];return l&&(u.push(`<memory>`),u.push(l),u.push(`</memory>`)),c&&(u.push(`<lessons>`),u.push(c),u.push(`</lessons>`)),u.push(`</agent_knowledge>`),u.join(`
484
+ `)}}),s=k({name:`lesson-relevant-hints`,timing:`system.prompt.transform`,priority:A.agentKnowledge.priority+1,handle:async(t,n)=>{if(!t.userText)return;let i=r.governanceDecisions??kp(a),o=Ip(await e.list(),i,t.userText);o&&(await e.recordRelevantHits(o.hitIds),r.evolutionSignals?.appendRelevantHits(o.lessons),n.systemTail=[...n.systemTail??[],_a(A.lessonRelevantHints.name,o.text)])}});return[...o,s]}function zp(e){return dn({name:A.skillCatalog.name,compute:()=>{let t=e.buildCatalog();if(t)return`${t}\n\nUse the skill tool with a skill name to load its full instructions.`}})}const Bp={enabled:!1,minExecutions:3,minSuccessRate:.5,maxInternalized:3};function Vp(e,...t){let n=e.split(/[\\/]+/);return n.some((e,r)=>t.every((e,t)=>n[r+t]===e))}function Hp(e){return Vp(e.root,`.claude`,`skills`)||e.type===`plugin`?!1:e.type===`project`?Vp(e.root,`.otto`,`skills`):!0}function Up(e,t,n){if(!n.enabled||n.minExecutions<=0||n.maxInternalized<=0)return[];let r=new Map(t.map(e=>[e.name,e]));return e.filter(e=>Hp(e.source)).map(e=>{let t=r.get(e.definition.metadata.name);if(!t||t.executions<n.minExecutions)return;let i=t.successes/t.executions;if(!(i<n.minSuccessRate))return{skill:e,aggregate:t,successRate:i}}).filter(e=>!!e).sort((e,t)=>t.aggregate.executions-e.aggregate.executions||e.skill.definition.metadata.name.localeCompare(t.skill.definition.metadata.name)).slice(0,n.maxInternalized)}const Wp=`
485
+ [内化摘录被截断:正文尾部指令(如「每次结束时…」类)可能缺失,完整指令经 skill 工具按需取回]`;function Gp(e){let t=e.split(`
486
+ `),n=t.findIndex(e=>/^#+\s/.test(e));return(n>0?t.slice(0,n):t.slice(0,3)).join(`
487
+ `).trim()}function Kp(e,t){let n=Gp(e);if(n===``)return``;if(ya(n)<=t)return n;let r=n.split(/\n\s*\n/).map(e=>e.trim()).filter(e=>e.length>0),i=t-ya(Wp),a=[],o=0;for(let e of r){let t=ya(e);if(o+t>i)break;a.push(e),o+=t}if(a.length>0)return a.join(`
488
+
489
+ `)+Wp;let[s]=r;return s===void 0?``:va({id:`internalize`,content:s},t).content}function qp(e){return[k({name:A.internalize.name,timing:`system.prompt.transform`,priority:A.internalize.priority,handle:async(t,n)=>{let r=e.getConfig();if(!r.enabled)return;let i=Up(e.registry.getAvailable(),e.registry.getAllSkillUsage(),r);if(i.length===0)return;let a=i.map(e=>{let{name:t}=e.skill.definition.metadata;return{candidate:e,name:t,excerpt:Kp(e.skill.definition.body,A.internalize.budgetBytes)}}).filter(e=>e.excerpt!==``);if(a.length===0)return;let o=[`## Internalized Skills`,`高频 skill 的指令核心(内化自 skill usage 信号,RFC-383;完整指令经 skill 工具按需取回):`,...a.map(({name:e,excerpt:t})=>`### Internalized Skill: ${e}\n${t}`)].join(`
385
490
 
386
- `)||void 0}let a=[...await e.list(),...i];if(a.length!==0)return vn(a,await t.loadRuntimeLessonsTemplate()??void 0)||void 0}}),i=y({name:`lesson-relevant-hints`,timing:`system.prompt.transform`,priority:yt.lesson.priority+1,handle:async(t,n)=>{if(!t.userText)return;let r=Kd();if(r.size===0)return;let i=Xd(await e.list(),r,t.userText);i&&(await e.recordRelevantHits(i.hitIds),n.systemTail=[...n.systemTail??[],i.text])}});return[...r,i]}function Qd(e){return At({name:`skill-catalog-injection`,priority:yt.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 $d(e,t,n){let r=e.get(t.sessionId);if(!r||r.length===0)return;e.delete(t.sessionId);let i=r.join(`
387
- `),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 ef(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 tf(){let e=new Map;return[y({name:`background-process-exit-collector`,timing:`process.exited`,handle:t=>{let n=e.get(t.sessionId)??[];n.push(ef(t)),e.set(t.sessionId,n)}}),y({name:`background-process-exit-injector`,timing:`messages.transform`,priority:25,handle:(t,n)=>{$d(e,t,n)}}),y({name:`background-process-notification-cleanup`,timing:`session.deleted`,handle:t=>{e.delete(t.sessionId)}})]}function nf(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 rf(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 af(e){return e.role===`user`||e.role===`assistant`||e.role===`tool_result`}function of(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(af))}}),y({name:`memory-auto-extract-cleanup`,timing:`session.deleted`,handle:e=>{t.reset(e.sessionId)}})]}function sf(e){return At({name:yt.skillLoopGuidance.name,priority:yt.skillLoopGuidance.priority,compute:()=>e.isEnabled()?hn:void 0})}const cf=336*60*60*1e3;function lf(e){return typeof e!=`number`||!Number.isFinite(e)?cf:Math.max(864e5,Math.round(e*24*60*60*1e3))}function uf(e,t,n=cf){return e.filter(e=>e.dismissedAt===void 0||t-e.dismissedAt>=n)}function df(e){return new Date(e).toISOString().slice(0,10)}function ff(e){return`你重复做过同一类任务 ${e.size} 次,要把它的执行流程固化成一个可复用的 skill 吗?`}function pf(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}`,`时间跨度:${df(e.firstAt)} ~ ${df(e.lastAt)}`,``,`若同意,otto 会据这些会话的执行路径起草一份 SKILL.md 交你审阅——生成物仍需你显式 apply 才会生效。`,`完整候选数据可用 read 工具查看插件状态目录下的 candidates.json。`].join(`
388
- `)}function mf(){return`暂不生成。技能固化应由你在看到具体流程后主动决定;无人应答时默认跳过,稍后同类任务再出现会重新征询。`}function hf(){return[{label:`暂不生成`,rationale:`保持现状。同类任务再积累一段时间后会重新征询(两周冷却期内不再打扰)。`,recommended:!0},{label:`起草 SKILL.md 给我看`,rationale:`据这些会话的执行路径生成一份技能草稿,仍需你审阅 diff 并显式 apply 才会生效。`}]}Object.freeze({status:`aborted`});function B(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 gf=class extends Error{constructor(){super(`Encountered Promise during synchronous parse. Use .parseAsync() instead.`)}},_f=class extends Error{constructor(e){super(`Encountered unidirectional transform during encode: ${e}`),this.name=`ZodEncodeError`}};const vf={};function yf(e){return e&&Object.assign(vf,e),vf}function bf(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 xf(e,t){return typeof t==`bigint`?t.toString():t}function Sf(e){return{get value(){{let t=e();return Object.defineProperty(this,`value`,{value:t}),t}throw Error(`cached value already set`)}}}function Cf(e){return e==null}function wf(e){let t=e.startsWith(`^`)?1:0,n=e.endsWith(`$`)?e.length-1:e.length;return e.slice(t,n)}function Tf(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 Ef=Symbol(`evaluating`);function V(e,t,n){let r;Object.defineProperty(e,t,{get(){if(r!==Ef)return r===void 0&&(r=Ef,r=n()),r},set(n){Object.defineProperty(e,t,{value:n})},configurable:!0})}function Df(e,t,n){Object.defineProperty(e,t,{value:n,writable:!0,enumerable:!0,configurable:!0})}function H(...e){let t={};for(let n of e)Object.assign(t,Object.getOwnPropertyDescriptors(n));return Object.defineProperties({},t)}function Of(e){return JSON.stringify(e)}function kf(e){return e.toLowerCase().trim().replace(/[^\w\s-]/g,``).replace(/[\s_-]+/g,`-`).replace(/^-+|-+$/g,``)}const Af=`captureStackTrace`in Error?Error.captureStackTrace:(...e)=>{};function jf(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const Mf=Sf(()=>{if(typeof navigator<`u`&&navigator?.userAgent?.includes(`Cloudflare`))return!1;try{return Function(``),!0}catch{return!1}});function Nf(e){if(jf(e)===!1)return!1;let t=e.constructor;if(t===void 0||typeof t!=`function`)return!0;let n=t.prototype;return!(jf(n)===!1||Object.prototype.hasOwnProperty.call(n,`isPrototypeOf`)===!1)}function Pf(e){return Nf(e)?{...e}:Array.isArray(e)?[...e]:e}const Ff=new Set([`string`,`number`,`symbol`]);function If(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function U(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 Lf(e){return Object.keys(e).filter(t=>e[t]._zod.optin===`optional`&&e[t]._zod.optout===`optional`)}const Rf={safeint:[-(2**53-1),2**53-1],int32:[-2147483648,2147483647],uint32:[0,4294967295],float32:[-34028234663852886e22,34028234663852886e22],float64:[-Number.MAX_VALUE,Number.MAX_VALUE]};function zf(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 U(e,H(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 Df(this,`shape`,e),e},checks:[]}))}function Bf(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 U(e,H(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 Df(this,`shape`,r),r},checks:[]}))}function Vf(e,t){if(!Nf(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 U(e,H(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t};return Df(this,`shape`,n),n}}))}function Hf(e,t){if(!Nf(t))throw Error(`Invalid input to safeExtend: expected a plain object`);return U(e,H(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t};return Df(this,`shape`,n),n}}))}function Uf(e,t){return U(e,H(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t._zod.def.shape};return Df(this,`shape`,n),n},get catchall(){return t._zod.def.catchall},checks:[]}))}function Wf(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 U(t,H(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 Df(this,`shape`,i),i},checks:[]}))}function Gf(e,t,n){return U(t,H(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 Df(this,`shape`,i),i}}))}function Kf(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 qf(e,t){return t.map(t=>{var n;return(n=t).path??(n.path=[]),t.path.unshift(e),t})}function Jf(e){return typeof e==`string`?e:e?.message}function Yf(e,t,n){let r={...e,path:e.path??[]};return e.message||(r.message=Jf(e.inst?._zod.def?.error?.(e))??Jf(t?.error?.(e))??Jf(n.customError?.(e))??Jf(n.localeError?.(e))??`Invalid input`),delete r.inst,delete r.continue,t?.reportInput||delete r.input,r}function Xf(e){return Array.isArray(e)?`array`:typeof e==`string`?`string`:`unknown`}function Zf(...e){let[t,n,r]=e;return typeof t==`string`?{message:t,code:`custom`,input:n,inst:r}:{...t}}const Qf=(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,xf,2),Object.defineProperty(e,`toString`,{value:()=>e.message,enumerable:!1})},$f=B(`$ZodError`,Qf),ep=B(`$ZodError`,Qf,{Parent:Error});function tp(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 np(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 rp=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 gf;if(o.issues.length){let t=new(i?.Err??e)(o.issues.map(e=>Yf(e,a,yf())));throw Af(t,i?.callee),t}return o.value},ip=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=>Yf(e,a,yf())));throw Af(t,i?.callee),t}return o.value},ap=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 gf;return a.issues.length?{success:!1,error:new(e??$f)(a.issues.map(e=>Yf(e,i,yf())))}:{success:!0,data:a.value}},op=ap(ep),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=>Yf(e,i,yf())))}:{success:!0,data:a.value}},cp=sp(ep),lp=e=>(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return rp(e)(t,n,i)},up=e=>(t,n,r)=>rp(e)(t,n,r),dp=e=>async(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return ip(e)(t,n,i)},fp=e=>async(t,n,r)=>ip(e)(t,n,r),pp=e=>(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return ap(e)(t,n,i)},mp=e=>(t,n,r)=>ap(e)(t,n,r),hp=e=>async(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return sp(e)(t,n,i)},gp=e=>async(t,n,r)=>sp(e)(t,n,r),_p=/^[cC][^\s-]{8,}$/,vp=/^[0-9a-z]+$/,yp=/^[0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{26}$/,bp=/^[0-9a-vA-V]{20}$/,xp=/^[A-Za-z0-9]{27}$/,Sp=/^[a-zA-Z0-9_-]{21}$/,Cp=/^P(?:(\d+W)|(?!.*W)(?=\d|T\d)(\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+([.,]\d+)?S)?)?)$/,wp=/^([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})$/,Tp=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)$/,Ep=/^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$/;function Dp(){return RegExp(`^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$`,`u`)}const Op=/^(?:(?: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])$/,kp=/^(([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}|:))$/,Ap=/^((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])$/,jp=/^(([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])$/,Mp=/^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$/,Np=/^[A-Za-z0-9_-]*$/,Pp=/^\+[1-9]\d{6,14}$/,Fp=`(?:(?:\\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])))`,Ip=RegExp(`^${Fp}$`);function Lp(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 Rp(e){return RegExp(`^${Lp(e)}$`)}function zp(e){let t=Lp({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(`^${Fp}T(?:${r})$`)}const Bp=e=>{let t=e?`[\\s\\S]{${e?.minimum??0},${e?.maximum??``}}`:`[\\s\\S]*`;return RegExp(`^${t}$`)},Vp=/^-?\d+$/,Hp=/^-?\d+(?:\.\d+)?$/,Up=/^[^A-Z]*$/,Wp=/^[^a-z]*$/,G=B(`$ZodCheck`,(e,t)=>{var n;e._zod??={},e._zod.def=t,(n=e._zod).onattach??(n.onattach=[])}),Gp={number:`number`,bigint:`bigint`,object:`date`},Kp=B(`$ZodCheckLessThan`,(e,t)=>{G.init(e,t);let n=Gp[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})}}),qp=B(`$ZodCheckGreaterThan`,(e,t)=>{G.init(e,t);let n=Gp[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})}}),Jp=B(`$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):Tf(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})}}),Yp=B(`$ZodCheckNumberFormat`,(e,t)=>{G.init(e,t),t.format=t.format||`float64`;let n=t.format?.includes(`int`),r=n?`int`:`number`,[i,a]=Rf[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=Vp)}),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})}}),Xp=B(`$ZodCheckMaxLength`,(e,t)=>{var n;G.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!Cf(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=Xf(r);n.issues.push({origin:i,code:`too_big`,maximum:t.maximum,inclusive:!0,input:r,inst:e,continue:!t.abort})}}),Zp=B(`$ZodCheckMinLength`,(e,t)=>{var n;G.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!Cf(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=Xf(r);n.issues.push({origin:i,code:`too_small`,minimum:t.minimum,inclusive:!0,input:r,inst:e,continue:!t.abort})}}),Qp=B(`$ZodCheckLengthEquals`,(e,t)=>{var n;G.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!Cf(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=Xf(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})}}),$p=B(`$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=()=>{})}),em=B(`$ZodCheckRegex`,(e,t)=>{$p.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})}}),tm=B(`$ZodCheckLowerCase`,(e,t)=>{t.pattern??=Up,$p.init(e,t)}),nm=B(`$ZodCheckUpperCase`,(e,t)=>{t.pattern??=Wp,$p.init(e,t)}),rm=B(`$ZodCheckIncludes`,(e,t)=>{G.init(e,t);let n=If(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})}}),im=B(`$ZodCheckStartsWith`,(e,t)=>{G.init(e,t);let n=RegExp(`^${If(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})}}),am=B(`$ZodCheckEndsWith`,(e,t)=>{G.init(e,t);let n=RegExp(`.*${If(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})}}),om=B(`$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(`
491
+ `);n.systemTail=[...n.systemTail??[],_a(A.internalize.name,o)];for(let{candidate:n,excerpt:r}of a)e.evolutionSignals?.append({kind:`internalize`,key:n.skill.definition.metadata.name,value:1,sessionId:t.sessionId,detail:{injectedBytes:Buffer.byteLength(r,`utf8`)}})}})]}function Jp(e,t,n){let r=e.get(t.sessionId);if(!r||r.length===0)return;e.delete(t.sessionId);let i=r.join(`
492
+ `),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 Yp(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 Xp(){let e=new Map;return[k({name:`background-process-exit-collector`,timing:`process.exited`,handle:t=>{let n=e.get(t.sessionId)??[];n.push(Yp(t)),e.set(t.sessionId,n)}}),k({name:`background-process-exit-injector`,timing:`messages.transform`,priority:25,handle:(t,n)=>{Jp(e,t,n)}}),k({name:`background-process-notification-cleanup`,timing:`session.deleted`,handle:t=>{e.delete(t.sessionId)}})]}function Zp(e){return k({name:`background-process-session-kill`,timing:`session.deleted`,handle:t=>{let n=t.metadata.reason;n===`idle`||n===`evicted`||e(t.sessionId)}})}function Qp(e){return[k({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)}}),k({name:`session-permission-cleanup`,timing:`session.deleted`,handle:t=>{e.registry.clearSessionAlwaysAllow(t.sessionId)}})]}function $p(e){return e.role===`user`||e.role===`assistant`||e.role===`tool_result`}function em(e,t,n={}){let r=n.minMessages??6;return[k({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($p))}}),k({name:`memory-auto-extract-cleanup`,timing:`session.deleted`,handle:e=>{t.reset(e.sessionId)}})]}function tm(e,t){return dn({name:A.skillLoopGuidance.name,compute:async()=>{if(e.isEnabled())return await t.load(`skill-loop-guidance`)??void 0}})}const nm=336*60*60*1e3;function rm(e){return typeof e!=`number`||!Number.isFinite(e)?nm:Math.max(864e5,Math.round(e*24*60*60*1e3))}function im(e,t,n=nm){return e.filter(e=>e.dismissedAt===void 0||t-e.dismissedAt>=n)}function am(e){return new Date(e).toISOString().slice(0,10)}function om(e){return`你重复做过同一类任务 ${e.size} 次,要把它的执行流程固化成一个可复用的 skill 吗?`}function sm(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}`,`时间跨度:${am(e.firstAt)} ~ ${am(e.lastAt)}`,``,`若同意,otto 会据这些会话的执行路径起草一份 SKILL.md 交你审阅——生成物仍需你显式 apply 才会生效。`,`完整候选数据可用 read 工具查看插件状态目录下的 candidates.json。`].join(`
493
+ `)}function cm(){return`暂不生成。技能固化应由你在看到具体流程后主动决定;无人应答时默认跳过,稍后同类任务再出现会重新征询。`}function lm(){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 um=class extends Error{constructor(){super(`Encountered Promise during synchronous parse. Use .parseAsync() instead.`)}},dm=class extends Error{constructor(e){super(`Encountered unidirectional transform during encode: ${e}`),this.name=`ZodEncodeError`}};const fm={};function pm(e){return e&&Object.assign(fm,e),fm}function mm(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 hm(e,t){return typeof t==`bigint`?t.toString():t}function gm(e){return{get value(){{let t=e();return Object.defineProperty(this,`value`,{value:t}),t}throw Error(`cached value already set`)}}}function _m(e){return e==null}function vm(e){let t=e.startsWith(`^`)?1:0,n=e.endsWith(`$`)?e.length-1:e.length;return e.slice(t,n)}function ym(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 bm=Symbol(`evaluating`);function U(e,t,n){let r;Object.defineProperty(e,t,{get(){if(r!==bm)return r===void 0&&(r=bm,r=n()),r},set(n){Object.defineProperty(e,t,{value:n})},configurable:!0})}function xm(e,t,n){Object.defineProperty(e,t,{value:n,writable:!0,enumerable:!0,configurable:!0})}function Sm(...e){let t={};for(let n of e)Object.assign(t,Object.getOwnPropertyDescriptors(n));return Object.defineProperties({},t)}function Cm(e){return JSON.stringify(e)}function wm(e){return e.toLowerCase().trim().replace(/[^\w\s-]/g,``).replace(/[\s_-]+/g,`-`).replace(/^-+|-+$/g,``)}const Tm=`captureStackTrace`in Error?Error.captureStackTrace:(...e)=>{};function Em(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const Dm=gm(()=>{if(typeof navigator<`u`&&navigator?.userAgent?.includes(`Cloudflare`))return!1;try{return Function(``),!0}catch{return!1}});function Om(e){if(Em(e)===!1)return!1;let t=e.constructor;if(t===void 0||typeof t!=`function`)return!0;let n=t.prototype;return!(Em(n)===!1||Object.prototype.hasOwnProperty.call(n,`isPrototypeOf`)===!1)}function km(e){return Om(e)?{...e}:Array.isArray(e)?[...e]:e}const Am=new Set([`string`,`number`,`symbol`]);function jm(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function Mm(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 Nm(e){return Object.keys(e).filter(t=>e[t]._zod.optin===`optional`&&e[t]._zod.optout===`optional`)}const Pm={safeint:[-(2**53-1),2**53-1],int32:[-2147483648,2147483647],uint32:[0,4294967295],float32:[-34028234663852886e22,34028234663852886e22],float64:[-Number.MAX_VALUE,Number.MAX_VALUE]};function Fm(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 Mm(e,Sm(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 xm(this,`shape`,e),e},checks:[]}))}function Im(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 Mm(e,Sm(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 xm(this,`shape`,r),r},checks:[]}))}function Lm(e,t){if(!Om(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 Mm(e,Sm(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t};return xm(this,`shape`,n),n}}))}function Rm(e,t){if(!Om(t))throw Error(`Invalid input to safeExtend: expected a plain object`);return Mm(e,Sm(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t};return xm(this,`shape`,n),n}}))}function zm(e,t){return Mm(e,Sm(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t._zod.def.shape};return xm(this,`shape`,n),n},get catchall(){return t._zod.def.catchall},checks:[]}))}function Bm(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 Mm(t,Sm(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 xm(this,`shape`,i),i},checks:[]}))}function Vm(e,t,n){return Mm(t,Sm(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 xm(this,`shape`,i),i}}))}function Hm(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 Um(e,t){return t.map(t=>{var n;return(n=t).path??(n.path=[]),t.path.unshift(e),t})}function Wm(e){return typeof e==`string`?e:e?.message}function Gm(e,t,n){let r={...e,path:e.path??[]};return e.message||(r.message=Wm(e.inst?._zod.def?.error?.(e))??Wm(t?.error?.(e))??Wm(n.customError?.(e))??Wm(n.localeError?.(e))??`Invalid input`),delete r.inst,delete r.continue,t?.reportInput||delete r.input,r}function Km(e){return Array.isArray(e)?`array`:typeof e==`string`?`string`:`unknown`}function qm(...e){let[t,n,r]=e;return typeof t==`string`?{message:t,code:`custom`,input:n,inst:r}:{...t}}const Jm=(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,hm,2),Object.defineProperty(e,`toString`,{value:()=>e.message,enumerable:!1})},Ym=H(`$ZodError`,Jm),Xm=H(`$ZodError`,Jm,{Parent:Error});function Zm(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 Qm(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 $m=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 um;if(o.issues.length){let t=new(i?.Err??e)(o.issues.map(e=>Gm(e,a,pm())));throw Tm(t,i?.callee),t}return o.value},eh=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=>Gm(e,a,pm())));throw Tm(t,i?.callee),t}return o.value},th=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 um;return a.issues.length?{success:!1,error:new(e??Ym)(a.issues.map(e=>Gm(e,i,pm())))}:{success:!0,data:a.value}},nh=th(Xm),rh=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=>Gm(e,i,pm())))}:{success:!0,data:a.value}},ih=rh(Xm),ah=e=>(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return $m(e)(t,n,i)},oh=e=>(t,n,r)=>$m(e)(t,n,r),sh=e=>async(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return eh(e)(t,n,i)},ch=e=>async(t,n,r)=>eh(e)(t,n,r),lh=e=>(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return th(e)(t,n,i)},uh=e=>(t,n,r)=>th(e)(t,n,r),dh=e=>async(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return rh(e)(t,n,i)},fh=e=>async(t,n,r)=>rh(e)(t,n,r),ph=/^[cC][^\s-]{8,}$/,mh=/^[0-9a-z]+$/,hh=/^[0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{26}$/,gh=/^[0-9a-vA-V]{20}$/,_h=/^[A-Za-z0-9]{27}$/,vh=/^[a-zA-Z0-9_-]{21}$/,yh=/^P(?:(\d+W)|(?!.*W)(?=\d|T\d)(\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+([.,]\d+)?S)?)?)$/,bh=/^([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})$/,xh=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)$/,Sh=/^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$/;function Ch(){return RegExp(`^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$`,`u`)}const wh=/^(?:(?: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])$/,Th=/^(([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}|:))$/,Eh=/^((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])$/,Dh=/^(([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])$/,Oh=/^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$/,kh=/^[A-Za-z0-9_-]*$/,Ah=/^\+[1-9]\d{6,14}$/,jh=`(?:(?:\\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])))`,Mh=RegExp(`^${jh}$`);function Nh(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 Ph(e){return RegExp(`^${Nh(e)}$`)}function Fh(e){let t=Nh({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(`^${jh}T(?:${r})$`)}const Ih=e=>{let t=e?`[\\s\\S]{${e?.minimum??0},${e?.maximum??``}}`:`[\\s\\S]*`;return RegExp(`^${t}$`)},Lh=/^-?\d+$/,Rh=/^-?\d+(?:\.\d+)?$/,zh=/^[^A-Z]*$/,Bh=/^[^a-z]*$/,G=H(`$ZodCheck`,(e,t)=>{var n;e._zod??={},e._zod.def=t,(n=e._zod).onattach??(n.onattach=[])}),Vh={number:`number`,bigint:`bigint`,object:`date`},Hh=H(`$ZodCheckLessThan`,(e,t)=>{G.init(e,t);let n=Vh[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})}}),Uh=H(`$ZodCheckGreaterThan`,(e,t)=>{G.init(e,t);let n=Vh[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})}}),Wh=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):ym(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})}}),Gh=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]=Pm[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=Lh)}),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})}}),Kh=H(`$ZodCheckMaxLength`,(e,t)=>{var n;G.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!_m(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=Km(r);n.issues.push({origin:i,code:`too_big`,maximum:t.maximum,inclusive:!0,input:r,inst:e,continue:!t.abort})}}),qh=H(`$ZodCheckMinLength`,(e,t)=>{var n;G.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!_m(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=Km(r);n.issues.push({origin:i,code:`too_small`,minimum:t.minimum,inclusive:!0,input:r,inst:e,continue:!t.abort})}}),Jh=H(`$ZodCheckLengthEquals`,(e,t)=>{var n;G.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!_m(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=Km(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})}}),Yh=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=()=>{})}),Xh=H(`$ZodCheckRegex`,(e,t)=>{Yh.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})}}),Zh=H(`$ZodCheckLowerCase`,(e,t)=>{t.pattern??=zh,Yh.init(e,t)}),Qh=H(`$ZodCheckUpperCase`,(e,t)=>{t.pattern??=Bh,Yh.init(e,t)}),$h=H(`$ZodCheckIncludes`,(e,t)=>{G.init(e,t);let n=jm(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})}}),eg=H(`$ZodCheckStartsWith`,(e,t)=>{G.init(e,t);let n=RegExp(`^${jm(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})}}),tg=H(`$ZodCheckEndsWith`,(e,t)=>{G.init(e,t);let n=RegExp(`.*${jm(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})}}),ng=H(`$ZodCheckOverwrite`,(e,t)=>{G.init(e,t),e._zod.check=e=>{e.value=t.tx(e.value)}});var rg=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(`
389
494
  `).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(`
390
- `))}};const cm={major:4,minor:3,patch:6},K=B(`$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=Kf(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 gf;if(i||o instanceof Promise)i=(i??Promise.resolve()).then(async()=>{await o,e.issues.length!==t&&(r||=Kf(e,t))});else{if(e.issues.length===t)continue;r||=Kf(e,t)}}return i?i.then(()=>e):e},n=(n,i,a)=>{if(Kf(n))return n.aborted=!0,n;let o=t(i,r,a);if(o instanceof Promise){if(a.async===!1)throw new gf;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 gf;return o.then(e=>t(e,r,a))}return t(o,r,a)}}V(e,`~standard`,()=>({validate:t=>{try{let n=op(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}))}),lm=B(`$ZodString`,(e,t)=>{K.init(e,t),e._zod.pattern=[...e?._zod.bag?.patterns??[]].pop()??Bp(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=B(`$ZodStringFormat`,(e,t)=>{$p.init(e,t),lm.init(e,t)}),um=B(`$ZodGUID`,(e,t)=>{t.pattern??=wp,q.init(e,t)}),dm=B(`$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??=Tp(e)}else t.pattern??=Tp();q.init(e,t)}),fm=B(`$ZodEmail`,(e,t)=>{t.pattern??=Ep,q.init(e,t)}),pm=B(`$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})}}}),mm=B(`$ZodEmoji`,(e,t)=>{t.pattern??=Dp(),q.init(e,t)}),hm=B(`$ZodNanoID`,(e,t)=>{t.pattern??=Sp,q.init(e,t)}),gm=B(`$ZodCUID`,(e,t)=>{t.pattern??=_p,q.init(e,t)}),_m=B(`$ZodCUID2`,(e,t)=>{t.pattern??=vp,q.init(e,t)}),vm=B(`$ZodULID`,(e,t)=>{t.pattern??=yp,q.init(e,t)}),ym=B(`$ZodXID`,(e,t)=>{t.pattern??=bp,q.init(e,t)}),bm=B(`$ZodKSUID`,(e,t)=>{t.pattern??=xp,q.init(e,t)}),xm=B(`$ZodISODateTime`,(e,t)=>{t.pattern??=zp(t),q.init(e,t)}),Sm=B(`$ZodISODate`,(e,t)=>{t.pattern??=Ip,q.init(e,t)}),Cm=B(`$ZodISOTime`,(e,t)=>{t.pattern??=Rp(t),q.init(e,t)}),wm=B(`$ZodISODuration`,(e,t)=>{t.pattern??=Cp,q.init(e,t)}),Tm=B(`$ZodIPv4`,(e,t)=>{t.pattern??=Op,q.init(e,t),e._zod.bag.format=`ipv4`}),Em=B(`$ZodIPv6`,(e,t)=>{t.pattern??=kp,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})}}}),Dm=B(`$ZodCIDRv4`,(e,t)=>{t.pattern??=Ap,q.init(e,t)}),Om=B(`$ZodCIDRv6`,(e,t)=>{t.pattern??=jp,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 km(e){if(e===``)return!0;if(e.length%4!=0)return!1;try{return atob(e),!0}catch{return!1}}const Am=B(`$ZodBase64`,(e,t)=>{t.pattern??=Mp,q.init(e,t),e._zod.bag.contentEncoding=`base64`,e._zod.check=n=>{km(n.value)||n.issues.push({code:`invalid_format`,format:`base64`,input:n.value,inst:e,continue:!t.abort})}});function jm(e){if(!Np.test(e))return!1;let t=e.replace(/[-_]/g,e=>e===`-`?`+`:`/`);return km(t.padEnd(Math.ceil(t.length/4)*4,`=`))}const Mm=B(`$ZodBase64URL`,(e,t)=>{t.pattern??=Np,q.init(e,t),e._zod.bag.contentEncoding=`base64url`,e._zod.check=n=>{jm(n.value)||n.issues.push({code:`invalid_format`,format:`base64url`,input:n.value,inst:e,continue:!t.abort})}}),Nm=B(`$ZodE164`,(e,t)=>{t.pattern??=Pp,q.init(e,t)});function Pm(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 Fm=B(`$ZodJWT`,(e,t)=>{q.init(e,t),e._zod.check=n=>{Pm(n.value,t.alg)||n.issues.push({code:`invalid_format`,format:`jwt`,input:n.value,inst:e,continue:!t.abort})}}),Im=B(`$ZodNumber`,(e,t)=>{K.init(e,t),e._zod.pattern=e._zod.bag.pattern??Hp,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}}),Lm=B(`$ZodNumberFormat`,(e,t)=>{Yp.init(e,t),Im.init(e,t)}),Rm=B(`$ZodUnknown`,(e,t)=>{K.init(e,t),e._zod.parse=e=>e}),zm=B(`$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 Bm(e,t,n){e.issues.length&&t.issues.push(...qf(n,e.issues)),t.value[n]=e.value}const Vm=B(`$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=>Bm(t,n,e))):Bm(s,n,e)}return a.length?Promise.all(a).then(()=>n):n}});function Hm(e,t,n,r,i){if(e.issues.length){if(i&&!(n in r))return;t.issues.push(...qf(n,e.issues))}e.value===void 0?n in r&&(t.value[n]=void 0):t.value[n]=e.value}function Um(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=Lf(e.shape);return{...e,keys:t,keySet:new Set(t),numKeys:t.length,optionalKeys:new Set(n)}}function Wm(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=>Hm(e,n,i,t,u))):Hm(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 Gm=B(`$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=Sf(()=>Um(t));V(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=jf,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=>Hm(n,t,e,s,r))):Hm(i,t,e,s,r)}return i?Wm(c,s,t,o,n.value,e):c.length?Promise.all(c).then(()=>t):t}}),Km=B(`$ZodObjectJIT`,(e,t)=>{Gm.init(e,t);let n=e._zod.parse,r=Sf(()=>Um(t)),i=e=>{let t=new sm([`shape`,`payload`,`ctx`]),n=r.value,i=e=>{let t=Of(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=Of(r),s=e[r]?._zod?.optout===`optional`;t.write(`const ${n} = ${i(r)};`),s?t.write(`
495
+ `))}};const ig={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=ig;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=Hm(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 um;if(i||o instanceof Promise)i=(i??Promise.resolve()).then(async()=>{await o,e.issues.length!==t&&(r||=Hm(e,t))});else{if(e.issues.length===t)continue;r||=Hm(e,t)}}return i?i.then(()=>e):e},n=(n,i,a)=>{if(Hm(n))return n.aborted=!0,n;let o=t(i,r,a);if(o instanceof Promise){if(a.async===!1)throw new um;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 um;return o.then(e=>t(e,r,a))}return t(o,r,a)}}U(e,`~standard`,()=>({validate:t=>{try{let n=nh(e,t);return n.success?{value:n.data}:{issues:n.error?.issues}}catch{return ih(e,t).then(e=>e.success?{value:e.data}:{issues:e.error?.issues})}},vendor:`zod`,version:1}))}),ag=H(`$ZodString`,(e,t)=>{K.init(e,t),e._zod.pattern=[...e?._zod.bag?.patterns??[]].pop()??Ih(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)=>{Yh.init(e,t),ag.init(e,t)}),og=H(`$ZodGUID`,(e,t)=>{t.pattern??=bh,q.init(e,t)}),sg=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??=xh(e)}else t.pattern??=xh();q.init(e,t)}),cg=H(`$ZodEmail`,(e,t)=>{t.pattern??=Sh,q.init(e,t)}),lg=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})}}}),ug=H(`$ZodEmoji`,(e,t)=>{t.pattern??=Ch(),q.init(e,t)}),dg=H(`$ZodNanoID`,(e,t)=>{t.pattern??=vh,q.init(e,t)}),fg=H(`$ZodCUID`,(e,t)=>{t.pattern??=ph,q.init(e,t)}),pg=H(`$ZodCUID2`,(e,t)=>{t.pattern??=mh,q.init(e,t)}),mg=H(`$ZodULID`,(e,t)=>{t.pattern??=hh,q.init(e,t)}),hg=H(`$ZodXID`,(e,t)=>{t.pattern??=gh,q.init(e,t)}),gg=H(`$ZodKSUID`,(e,t)=>{t.pattern??=_h,q.init(e,t)}),_g=H(`$ZodISODateTime`,(e,t)=>{t.pattern??=Fh(t),q.init(e,t)}),vg=H(`$ZodISODate`,(e,t)=>{t.pattern??=Mh,q.init(e,t)}),yg=H(`$ZodISOTime`,(e,t)=>{t.pattern??=Ph(t),q.init(e,t)}),bg=H(`$ZodISODuration`,(e,t)=>{t.pattern??=yh,q.init(e,t)}),xg=H(`$ZodIPv4`,(e,t)=>{t.pattern??=wh,q.init(e,t),e._zod.bag.format=`ipv4`}),Sg=H(`$ZodIPv6`,(e,t)=>{t.pattern??=Th,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})}}}),Cg=H(`$ZodCIDRv4`,(e,t)=>{t.pattern??=Eh,q.init(e,t)}),wg=H(`$ZodCIDRv6`,(e,t)=>{t.pattern??=Dh,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 Tg(e){if(e===``)return!0;if(e.length%4!=0)return!1;try{return atob(e),!0}catch{return!1}}const Eg=H(`$ZodBase64`,(e,t)=>{t.pattern??=Oh,q.init(e,t),e._zod.bag.contentEncoding=`base64`,e._zod.check=n=>{Tg(n.value)||n.issues.push({code:`invalid_format`,format:`base64`,input:n.value,inst:e,continue:!t.abort})}});function Dg(e){if(!kh.test(e))return!1;let t=e.replace(/[-_]/g,e=>e===`-`?`+`:`/`);return Tg(t.padEnd(Math.ceil(t.length/4)*4,`=`))}const Og=H(`$ZodBase64URL`,(e,t)=>{t.pattern??=kh,q.init(e,t),e._zod.bag.contentEncoding=`base64url`,e._zod.check=n=>{Dg(n.value)||n.issues.push({code:`invalid_format`,format:`base64url`,input:n.value,inst:e,continue:!t.abort})}}),kg=H(`$ZodE164`,(e,t)=>{t.pattern??=Ah,q.init(e,t)});function Ag(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 jg=H(`$ZodJWT`,(e,t)=>{q.init(e,t),e._zod.check=n=>{Ag(n.value,t.alg)||n.issues.push({code:`invalid_format`,format:`jwt`,input:n.value,inst:e,continue:!t.abort})}}),Mg=H(`$ZodNumber`,(e,t)=>{K.init(e,t),e._zod.pattern=e._zod.bag.pattern??Rh,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}}),Ng=H(`$ZodNumberFormat`,(e,t)=>{Gh.init(e,t),Mg.init(e,t)}),Pg=H(`$ZodUnknown`,(e,t)=>{K.init(e,t),e._zod.parse=e=>e}),Fg=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 Ig(e,t,n){e.issues.length&&t.issues.push(...Um(n,e.issues)),t.value[n]=e.value}const Lg=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=>Ig(t,n,e))):Ig(s,n,e)}return a.length?Promise.all(a).then(()=>n):n}});function Rg(e,t,n,r,i){if(e.issues.length){if(i&&!(n in r))return;t.issues.push(...Um(n,e.issues))}e.value===void 0?n in r&&(t.value[n]=void 0):t.value[n]=e.value}function zg(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=Nm(e.shape);return{...e,keys:t,keySet:new Set(t),numKeys:t.length,optionalKeys:new Set(n)}}function Bg(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=>Rg(e,n,i,t,u))):Rg(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 Vg=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=gm(()=>zg(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=Em,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=>Rg(n,t,e,s,r))):Rg(i,t,e,s,r)}return i?Bg(c,s,t,o,n.value,e):c.length?Promise.all(c).then(()=>t):t}}),Hg=H(`$ZodObjectJIT`,(e,t)=>{Vg.init(e,t);let n=e._zod.parse,r=gm(()=>zg(t)),i=e=>{let t=new rg([`shape`,`payload`,`ctx`]),n=r.value,i=e=>{let t=Cm(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=Cm(r),s=e[r]?._zod?.optout===`optional`;t.write(`const ${n} = ${i(r)};`),s?t.write(`
391
496
  if (${n}.issues.length) {
392
497
  if (${o} in input) {
393
498
  payload.issues = payload.issues.concat(${n}.issues.map(iss => ({
@@ -421,13 +526,15 @@ If the image is not a UI/design screenshot, give a normal concise description in
421
526
  newResult[${o}] = ${n}.value;
422
527
  }
423
528
 
424
- `)}t.write(`payload.value = newResult;`),t.write(`return payload;`);let s=t.compile();return(t,n)=>s(e,t,n)},a,o=jf,s=!vf.jitless,c=s&&Mf.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?Wm([],p,d,f,u,e):d):n(d,f):(d.issues.push({expected:`object`,code:`invalid_type`,input:p,inst:e}),d)}});function qm(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=>!Kf(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=>Yf(e,r,yf())))}),t)}const Jm=B(`$ZodUnion`,(e,t)=>{K.init(e,t),V(e._zod,`optin`,()=>t.options.some(e=>e._zod.optin===`optional`)?`optional`:void 0),V(e._zod,`optout`,()=>t.options.some(e=>e._zod.optout===`optional`)?`optional`:void 0),V(e._zod,`values`,()=>{if(t.options.every(e=>e._zod.values))return new Set(t.options.flatMap(e=>Array.from(e._zod.values)))}),V(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=>wf(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=>qm(t,i,e,a)):qm(s,i,e,a)}}),Ym=B(`$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])=>Zm(e,t,n)):Zm(e,i,a)}});function Xm(e,t){if(e===t||e instanceof Date&&t instanceof Date&&+e==+t)return{valid:!0,data:e};if(Nf(e)&&Nf(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=Xm(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=Xm(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 Zm(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}),Kf(e))return e;let o=Xm(t.value,n.value);if(!o.valid)throw Error(`Unmergable intersection. Error path: ${JSON.stringify(o.mergeErrorPath)}`);return e.value=o.data,e}const Qm=B(`$ZodEnum`,(e,t)=>{K.init(e,t);let n=bf(t.entries),r=new Set(n);e._zod.values=r,e._zod.pattern=RegExp(`^(${n.filter(e=>Ff.has(typeof e)).map(e=>typeof e==`string`?If(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}}),$m=B(`$ZodTransform`,(e,t)=>{K.init(e,t),e._zod.parse=(n,r)=>{if(r.direction===`backward`)throw new _f(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 gf;return n.value=i,n}});function eh(e,t){return e.issues.length&&t===void 0?{issues:[],value:void 0}:e}const th=B(`$ZodOptional`,(e,t)=>{K.init(e,t),e._zod.optin=`optional`,e._zod.optout=`optional`,V(e._zod,`values`,()=>t.innerType._zod.values?new Set([...t.innerType._zod.values,void 0]):void 0),V(e._zod,`pattern`,()=>{let e=t.innerType._zod.pattern;return e?RegExp(`^(${wf(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=>eh(t,e.value)):eh(r,e.value)}return e.value===void 0?e:t.innerType._zod.run(e,n)}}),nh=B(`$ZodExactOptional`,(e,t)=>{th.init(e,t),V(e._zod,`values`,()=>t.innerType._zod.values),V(e._zod,`pattern`,()=>t.innerType._zod.pattern),e._zod.parse=(e,n)=>t.innerType._zod.run(e,n)}),rh=B(`$ZodNullable`,(e,t)=>{K.init(e,t),V(e._zod,`optin`,()=>t.innerType._zod.optin),V(e._zod,`optout`,()=>t.innerType._zod.optout),V(e._zod,`pattern`,()=>{let e=t.innerType._zod.pattern;return e?RegExp(`^(${wf(e.source)}|null)$`):void 0}),V(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)}),ih=B(`$ZodDefault`,(e,t)=>{K.init(e,t),e._zod.optin=`optional`,V(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=>ah(e,t)):ah(r,t)}});function ah(e,t){return e.value===void 0&&(e.value=t.defaultValue),e}const oh=B(`$ZodPrefault`,(e,t)=>{K.init(e,t),e._zod.optin=`optional`,V(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=B(`$ZodNonOptional`,(e,t)=>{K.init(e,t),V(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 lh=B(`$ZodCatch`,(e,t)=>{K.init(e,t),V(e._zod,`optin`,()=>t.innerType._zod.optin),V(e._zod,`optout`,()=>t.innerType._zod.optout),V(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=>Yf(e,n,yf()))},input:e.value}),e.issues=[]),e)):(e.value=r.value,r.issues.length&&(e.value=t.catchValue({...e,error:{issues:r.issues.map(e=>Yf(e,n,yf()))},input:e.value}),e.issues=[]),e)}}),uh=B(`$ZodPipe`,(e,t)=>{K.init(e,t),V(e._zod,`values`,()=>t.in._zod.values),V(e._zod,`optin`,()=>t.in._zod.optin),V(e._zod,`optout`,()=>t.out._zod.optout),V(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=>dh(e,t.in,n)):dh(r,t.in,n)}let r=t.in._zod.run(e,n);return r instanceof Promise?r.then(e=>dh(e,t.out,n)):dh(r,t.out,n)}});function dh(e,t,n){return e.issues.length?(e.aborted=!0,e):t._zod.run({value:e.value,issues:e.issues},n)}const fh=B(`$ZodReadonly`,(e,t)=>{K.init(e,t),V(e._zod,`propValues`,()=>t.innerType._zod.propValues),V(e._zod,`values`,()=>t.innerType._zod.values),V(e._zod,`optin`,()=>t.innerType?._zod?.optin),V(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(ph):ph(r)}});function ph(e){return e.value=Object.freeze(e.value),e}const mh=B(`$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=>hh(t,n,r,e));hh(i,n,r,e)}});function hh(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(Zf(e))}}var gh,_h=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 vh(){return new _h}(gh=globalThis).__zod_globalRegistry??(gh.__zod_globalRegistry=vh());const yh=globalThis.__zod_globalRegistry;function bh(e,t){return new e({type:`string`,...W(t)})}function xh(e,t){return new e({type:`string`,format:`email`,check:`string_format`,abort:!1,...W(t)})}function Sh(e,t){return new e({type:`string`,format:`guid`,check:`string_format`,abort:!1,...W(t)})}function Ch(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,...W(t)})}function wh(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,version:`v4`,...W(t)})}function Th(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,version:`v6`,...W(t)})}function Eh(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,version:`v7`,...W(t)})}function Dh(e,t){return new e({type:`string`,format:`url`,check:`string_format`,abort:!1,...W(t)})}function Oh(e,t){return new e({type:`string`,format:`emoji`,check:`string_format`,abort:!1,...W(t)})}function kh(e,t){return new e({type:`string`,format:`nanoid`,check:`string_format`,abort:!1,...W(t)})}function Ah(e,t){return new e({type:`string`,format:`cuid`,check:`string_format`,abort:!1,...W(t)})}function jh(e,t){return new e({type:`string`,format:`cuid2`,check:`string_format`,abort:!1,...W(t)})}function Mh(e,t){return new e({type:`string`,format:`ulid`,check:`string_format`,abort:!1,...W(t)})}function Nh(e,t){return new e({type:`string`,format:`xid`,check:`string_format`,abort:!1,...W(t)})}function Ph(e,t){return new e({type:`string`,format:`ksuid`,check:`string_format`,abort:!1,...W(t)})}function Fh(e,t){return new e({type:`string`,format:`ipv4`,check:`string_format`,abort:!1,...W(t)})}function Ih(e,t){return new e({type:`string`,format:`ipv6`,check:`string_format`,abort:!1,...W(t)})}function Lh(e,t){return new e({type:`string`,format:`cidrv4`,check:`string_format`,abort:!1,...W(t)})}function Rh(e,t){return new e({type:`string`,format:`cidrv6`,check:`string_format`,abort:!1,...W(t)})}function zh(e,t){return new e({type:`string`,format:`base64`,check:`string_format`,abort:!1,...W(t)})}function Bh(e,t){return new e({type:`string`,format:`base64url`,check:`string_format`,abort:!1,...W(t)})}function Vh(e,t){return new e({type:`string`,format:`e164`,check:`string_format`,abort:!1,...W(t)})}function Hh(e,t){return new e({type:`string`,format:`jwt`,check:`string_format`,abort:!1,...W(t)})}function Uh(e,t){return new e({type:`string`,format:`datetime`,check:`string_format`,offset:!1,local:!1,precision:null,...W(t)})}function Wh(e,t){return new e({type:`string`,format:`date`,check:`string_format`,...W(t)})}function Gh(e,t){return new e({type:`string`,format:`time`,check:`string_format`,precision:null,...W(t)})}function Kh(e,t){return new e({type:`string`,format:`duration`,check:`string_format`,...W(t)})}function qh(e,t){return new e({type:`number`,checks:[],...W(t)})}function Jh(e,t){return new e({type:`number`,check:`number_format`,abort:!1,format:`safeint`,...W(t)})}function Yh(e){return new e({type:`unknown`})}function Xh(e,t){return new e({type:`never`,...W(t)})}function Zh(e,t){return new Kp({check:`less_than`,...W(t),value:e,inclusive:!1})}function Qh(e,t){return new Kp({check:`less_than`,...W(t),value:e,inclusive:!0})}function $h(e,t){return new qp({check:`greater_than`,...W(t),value:e,inclusive:!1})}function eg(e,t){return new qp({check:`greater_than`,...W(t),value:e,inclusive:!0})}function tg(e,t){return new Jp({check:`multiple_of`,...W(t),value:e})}function ng(e,t){return new Xp({check:`max_length`,...W(t),maximum:e})}function rg(e,t){return new Zp({check:`min_length`,...W(t),minimum:e})}function ig(e,t){return new Qp({check:`length_equals`,...W(t),length:e})}function ag(e,t){return new em({check:`string_format`,format:`regex`,...W(t),pattern:e})}function og(e){return new tm({check:`string_format`,format:`lowercase`,...W(e)})}function sg(e){return new nm({check:`string_format`,format:`uppercase`,...W(e)})}function cg(e,t){return new rm({check:`string_format`,format:`includes`,...W(t),includes:e})}function lg(e,t){return new im({check:`string_format`,format:`starts_with`,...W(t),prefix:e})}function ug(e,t){return new am({check:`string_format`,format:`ends_with`,...W(t),suffix:e})}function dg(e){return new om({check:`overwrite`,tx:e})}function fg(e){return dg(t=>t.normalize(e))}function pg(){return dg(e=>e.trim())}function mg(){return dg(e=>e.toLowerCase())}function hg(){return dg(e=>e.toUpperCase())}function gg(){return dg(e=>kf(e))}function _g(e,t,n){return new e({type:`array`,element:t,...W(n)})}function vg(e,t,n){return new e({type:`custom`,check:`custom`,fn:t,...W(n)})}function yg(e){let t=bg(n=>(n.addIssue=e=>{if(typeof e==`string`)n.issues.push(Zf(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(Zf(r))}},e(n.value,n)));return t}function bg(e,t){let n=new G({check:`custom`,...W(t)});return n._zod.check=e,n}function xg(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??yh,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 Sg(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>
529
+ `)}t.write(`payload.value = newResult;`),t.write(`return payload;`);let s=t.compile();return(t,n)=>s(e,t,n)},a,o=Em,s=!fm.jitless,c=s&&Dm.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?Bg([],p,d,f,u,e):d):n(d,f):(d.issues.push({expected:`object`,code:`invalid_type`,input:p,inst:e}),d)}});function Ug(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=>!Hm(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=>Gm(e,r,pm())))}),t)}const Wg=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=>vm(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=>Ug(t,i,e,a)):Ug(s,i,e,a)}}),Gg=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])=>qg(e,t,n)):qg(e,i,a)}});function Kg(e,t){if(e===t||e instanceof Date&&t instanceof Date&&+e==+t)return{valid:!0,data:e};if(Om(e)&&Om(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=Kg(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=Kg(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 qg(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}),Hm(e))return e;let o=Kg(t.value,n.value);if(!o.valid)throw Error(`Unmergable intersection. Error path: ${JSON.stringify(o.mergeErrorPath)}`);return e.value=o.data,e}const Jg=H(`$ZodEnum`,(e,t)=>{K.init(e,t);let n=mm(t.entries),r=new Set(n);e._zod.values=r,e._zod.pattern=RegExp(`^(${n.filter(e=>Am.has(typeof e)).map(e=>typeof e==`string`?jm(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}}),Yg=H(`$ZodTransform`,(e,t)=>{K.init(e,t),e._zod.parse=(n,r)=>{if(r.direction===`backward`)throw new dm(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 um;return n.value=i,n}});function Xg(e,t){return e.issues.length&&t===void 0?{issues:[],value:void 0}:e}const Zg=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(`^(${vm(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=>Xg(t,e.value)):Xg(r,e.value)}return e.value===void 0?e:t.innerType._zod.run(e,n)}}),Qg=H(`$ZodExactOptional`,(e,t)=>{Zg.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)}),$g=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(`^(${vm(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)}),e_=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=>t_(e,t)):t_(r,t)}});function t_(e,t){return e.value===void 0&&(e.value=t.defaultValue),e}const n_=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))}),r_=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=>i_(t,e)):i_(i,e)}});function i_(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 a_=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=>Gm(e,n,pm()))},input:e.value}),e.issues=[]),e)):(e.value=r.value,r.issues.length&&(e.value=t.catchValue({...e,error:{issues:r.issues.map(e=>Gm(e,n,pm()))},input:e.value}),e.issues=[]),e)}}),o_=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=>s_(e,t.in,n)):s_(r,t.in,n)}let r=t.in._zod.run(e,n);return r instanceof Promise?r.then(e=>s_(e,t.out,n)):s_(r,t.out,n)}});function s_(e,t,n){return e.issues.length?(e.aborted=!0,e):t._zod.run({value:e.value,issues:e.issues},n)}const c_=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(l_):l_(r)}});function l_(e){return e.value=Object.freeze(e.value),e}const u_=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=>d_(t,n,r,e));d_(i,n,r,e)}});function d_(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(qm(e))}}var f_,p_=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 m_(){return new p_}(f_=globalThis).__zod_globalRegistry??(f_.__zod_globalRegistry=m_());const h_=globalThis.__zod_globalRegistry;function g_(e,t){return new e({type:`string`,...W(t)})}function __(e,t){return new e({type:`string`,format:`email`,check:`string_format`,abort:!1,...W(t)})}function v_(e,t){return new e({type:`string`,format:`guid`,check:`string_format`,abort:!1,...W(t)})}function y_(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,...W(t)})}function b_(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,version:`v4`,...W(t)})}function x_(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,version:`v6`,...W(t)})}function S_(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,version:`v7`,...W(t)})}function C_(e,t){return new e({type:`string`,format:`url`,check:`string_format`,abort:!1,...W(t)})}function w_(e,t){return new e({type:`string`,format:`emoji`,check:`string_format`,abort:!1,...W(t)})}function T_(e,t){return new e({type:`string`,format:`nanoid`,check:`string_format`,abort:!1,...W(t)})}function E_(e,t){return new e({type:`string`,format:`cuid`,check:`string_format`,abort:!1,...W(t)})}function D_(e,t){return new e({type:`string`,format:`cuid2`,check:`string_format`,abort:!1,...W(t)})}function O_(e,t){return new e({type:`string`,format:`ulid`,check:`string_format`,abort:!1,...W(t)})}function k_(e,t){return new e({type:`string`,format:`xid`,check:`string_format`,abort:!1,...W(t)})}function A_(e,t){return new e({type:`string`,format:`ksuid`,check:`string_format`,abort:!1,...W(t)})}function j_(e,t){return new e({type:`string`,format:`ipv4`,check:`string_format`,abort:!1,...W(t)})}function M_(e,t){return new e({type:`string`,format:`ipv6`,check:`string_format`,abort:!1,...W(t)})}function N_(e,t){return new e({type:`string`,format:`cidrv4`,check:`string_format`,abort:!1,...W(t)})}function P_(e,t){return new e({type:`string`,format:`cidrv6`,check:`string_format`,abort:!1,...W(t)})}function F_(e,t){return new e({type:`string`,format:`base64`,check:`string_format`,abort:!1,...W(t)})}function I_(e,t){return new e({type:`string`,format:`base64url`,check:`string_format`,abort:!1,...W(t)})}function L_(e,t){return new e({type:`string`,format:`e164`,check:`string_format`,abort:!1,...W(t)})}function R_(e,t){return new e({type:`string`,format:`jwt`,check:`string_format`,abort:!1,...W(t)})}function z_(e,t){return new e({type:`string`,format:`datetime`,check:`string_format`,offset:!1,local:!1,precision:null,...W(t)})}function B_(e,t){return new e({type:`string`,format:`date`,check:`string_format`,...W(t)})}function V_(e,t){return new e({type:`string`,format:`time`,check:`string_format`,precision:null,...W(t)})}function H_(e,t){return new e({type:`string`,format:`duration`,check:`string_format`,...W(t)})}function U_(e,t){return new e({type:`number`,checks:[],...W(t)})}function W_(e,t){return new e({type:`number`,check:`number_format`,abort:!1,format:`safeint`,...W(t)})}function G_(e){return new e({type:`unknown`})}function K_(e,t){return new e({type:`never`,...W(t)})}function q_(e,t){return new Hh({check:`less_than`,...W(t),value:e,inclusive:!1})}function J_(e,t){return new Hh({check:`less_than`,...W(t),value:e,inclusive:!0})}function Y_(e,t){return new Uh({check:`greater_than`,...W(t),value:e,inclusive:!1})}function X_(e,t){return new Uh({check:`greater_than`,...W(t),value:e,inclusive:!0})}function Z_(e,t){return new Wh({check:`multiple_of`,...W(t),value:e})}function Q_(e,t){return new Kh({check:`max_length`,...W(t),maximum:e})}function $_(e,t){return new qh({check:`min_length`,...W(t),minimum:e})}function ev(e,t){return new Jh({check:`length_equals`,...W(t),length:e})}function tv(e,t){return new Xh({check:`string_format`,format:`regex`,...W(t),pattern:e})}function nv(e){return new Zh({check:`string_format`,format:`lowercase`,...W(e)})}function rv(e){return new Qh({check:`string_format`,format:`uppercase`,...W(e)})}function iv(e,t){return new $h({check:`string_format`,format:`includes`,...W(t),includes:e})}function av(e,t){return new eg({check:`string_format`,format:`starts_with`,...W(t),prefix:e})}function ov(e,t){return new tg({check:`string_format`,format:`ends_with`,...W(t),suffix:e})}function sv(e){return new ng({check:`overwrite`,tx:e})}function cv(e){return sv(t=>t.normalize(e))}function lv(){return sv(e=>e.trim())}function uv(){return sv(e=>e.toLowerCase())}function dv(){return sv(e=>e.toUpperCase())}function fv(){return sv(e=>wm(e))}function pv(e,t,n){return new e({type:`array`,element:t,...W(n)})}function mv(e,t,n){return new e({type:`custom`,check:`custom`,fn:t,...W(n)})}function hv(e){let t=gv(n=>(n.addIssue=e=>{if(typeof e==`string`)n.issues.push(qm(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(qm(r))}},e(n.value,n)));return t}function gv(e,t){let n=new G({check:`custom`,...W(t)});return n._zod.check=e,n}function _v(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??h_,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 vv(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>
425
530
 
426
- 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 Cg(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:Tg(t,`input`,e.processors),output:Tg(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 wg=(e,t={})=>n=>{let r=xg({...n,processors:t});return J(e,r),Sg(r,e),Cg(r,e)},Tg=(e,t,n={})=>r=>{let{libraryOptions:i,target:a}=r??{},o=xg({...i??{},target:a,io:t,processors:n});return J(e,o),Sg(o,e),Cg(o,e)},Eg={guid:`uuid`,url:`uri`,datetime:`date-time`,json_string:`json-string`,regex:``},Dg=(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=Eg[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}))])}},Og=(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)},kg=(e,t,n,r)=>{n.not={}},Ag=(e,t,n,r)=>{let i=e._zod.def,a=bf(i.entries);a.every(e=>typeof e==`number`)&&(n.type=`number`),a.every(e=>typeof e==`string`)&&(n.type=`string`),n.enum=a},jg=(e,t,n,r)=>{if(t.unrepresentable===`throw`)throw Error(`Custom types cannot be represented in JSON Schema`)},Mg=(e,t,n,r)=>{if(t.unrepresentable===`throw`)throw Error(`Transforms cannot be represented in JSON Schema`)},Ng=(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`]})},Pg=(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)},Fg=(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},Ig=(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]]},Lg=(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`}]},Rg=(e,t,n,r)=>{let i=e._zod.def;J(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},zg=(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))},Bg=(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)))},Vg=(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},Hg=(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},Ug=(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},Wg=(e,t,n,r)=>{let i=e._zod.def;J(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},Gg=B(`ZodISODateTime`,(e,t)=>{xm.init(e,t),$.init(e,t)});function Kg(e){return Uh(Gg,e)}const qg=B(`ZodISODate`,(e,t)=>{Sm.init(e,t),$.init(e,t)});function Jg(e){return Wh(qg,e)}const Yg=B(`ZodISOTime`,(e,t)=>{Cm.init(e,t),$.init(e,t)});function Xg(e){return Gh(Yg,e)}const Zg=B(`ZodISODuration`,(e,t)=>{wm.init(e,t),$.init(e,t)});function Qg(e){return Kh(Zg,e)}const $g=(e,t)=>{$f.init(e,t),e.name=`ZodError`,Object.defineProperties(e,{format:{value:t=>np(e,t)},flatten:{value:t=>tp(e,t)},addIssue:{value:t=>{e.issues.push(t),e.message=JSON.stringify(e.issues,xf,2)}},addIssues:{value:t=>{e.issues.push(...t),e.message=JSON.stringify(e.issues,xf,2)}},isEmpty:{get(){return e.issues.length===0}}})};B(`ZodError`,$g);const X=B(`ZodError`,$g,{Parent:Error}),e_=rp(X),t_=ip(X),n_=ap(X),r_=sp(X),i_=lp(X),a_=up(X),o_=dp(X),s_=fp(X),c_=pp(X),l_=mp(X),u_=hp(X),d_=gp(X),Z=B(`ZodType`,(e,t)=>(K.init(e,t),Object.assign(e[`~standard`],{jsonSchema:{input:Tg(e,`input`),output:Tg(e,`output`)}}),e.toJSONSchema=wg(e,{}),e.def=t,e.type=t.type,Object.defineProperty(e,`_def`,{value:t}),e.check=(...n)=>e.clone(H(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)=>U(e,t,n),e.brand=()=>e,e.register=((t,n)=>(t.add(e,n),e)),e.parse=(t,n)=>e_(e,t,n,{callee:e.parse}),e.safeParse=(t,n)=>n_(e,t,n),e.parseAsync=async(t,n)=>t_(e,t,n,{callee:e.parseAsync}),e.safeParseAsync=async(t,n)=>r_(e,t,n),e.spa=e.safeParseAsync,e.encode=(t,n)=>i_(e,t,n),e.decode=(t,n)=>a_(e,t,n),e.encodeAsync=async(t,n)=>o_(e,t,n),e.decodeAsync=async(t,n)=>s_(e,t,n),e.safeEncode=(t,n)=>c_(e,t,n),e.safeDecode=(t,n)=>l_(e,t,n),e.safeEncodeAsync=async(t,n)=>u_(e,t,n),e.safeDecodeAsync=async(t,n)=>d_(e,t,n),e.refine=(t,n)=>e.check(vv(t,n)),e.superRefine=t=>e.check(yv(t)),e.overwrite=t=>e.check(dg(t)),e.optional=()=>ev(e),e.exactOptional=()=>nv(e),e.nullable=()=>iv(e),e.nullish=()=>ev(iv(e)),e.nonoptional=t=>uv(e,t),e.array=()=>H_(e),e.or=t=>K_([e,t]),e.and=t=>J_(e,t),e.transform=t=>mv(e,Q_(t)),e.default=t=>ov(e,t),e.prefault=t=>cv(e,t),e.catch=t=>fv(e,t),e.pipe=t=>mv(e,t),e.readonly=()=>gv(e),e.describe=t=>{let n=e.clone();return yh.add(n,{description:t}),n},Object.defineProperty(e,`description`,{get(){return yh.get(e)?.description},configurable:!0}),e.meta=(...t)=>{if(t.length===0)return yh.get(e);let n=e.clone();return yh.add(n,t[0]),n},e.isOptional=()=>e.safeParse(void 0).success,e.isNullable=()=>e.safeParse(null).success,e.apply=t=>t(e),e)),f_=B(`_ZodString`,(e,t)=>{lm.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Dg(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(ag(...t)),e.includes=(...t)=>e.check(cg(...t)),e.startsWith=(...t)=>e.check(lg(...t)),e.endsWith=(...t)=>e.check(ug(...t)),e.min=(...t)=>e.check(rg(...t)),e.max=(...t)=>e.check(ng(...t)),e.length=(...t)=>e.check(ig(...t)),e.nonempty=(...t)=>e.check(rg(1,...t)),e.lowercase=t=>e.check(og(t)),e.uppercase=t=>e.check(sg(t)),e.trim=()=>e.check(pg()),e.normalize=(...t)=>e.check(fg(...t)),e.toLowerCase=()=>e.check(mg()),e.toUpperCase=()=>e.check(hg()),e.slugify=()=>e.check(gg())}),p_=B(`ZodString`,(e,t)=>{lm.init(e,t),f_.init(e,t),e.email=t=>e.check(xh(m_,t)),e.url=t=>e.check(Dh(__,t)),e.jwt=t=>e.check(Hh(M_,t)),e.emoji=t=>e.check(Oh(v_,t)),e.guid=t=>e.check(Sh(h_,t)),e.uuid=t=>e.check(Ch(g_,t)),e.uuidv4=t=>e.check(wh(g_,t)),e.uuidv6=t=>e.check(Th(g_,t)),e.uuidv7=t=>e.check(Eh(g_,t)),e.nanoid=t=>e.check(kh(y_,t)),e.guid=t=>e.check(Sh(h_,t)),e.cuid=t=>e.check(Ah(b_,t)),e.cuid2=t=>e.check(jh(x_,t)),e.ulid=t=>e.check(Mh(S_,t)),e.base64=t=>e.check(zh(k_,t)),e.base64url=t=>e.check(Bh(A_,t)),e.xid=t=>e.check(Nh(C_,t)),e.ksuid=t=>e.check(Ph(w_,t)),e.ipv4=t=>e.check(Fh(T_,t)),e.ipv6=t=>e.check(Ih(E_,t)),e.cidrv4=t=>e.check(Lh(D_,t)),e.cidrv6=t=>e.check(Rh(O_,t)),e.e164=t=>e.check(Vh(j_,t)),e.datetime=t=>e.check(Kg(t)),e.date=t=>e.check(Jg(t)),e.time=t=>e.check(Xg(t)),e.duration=t=>e.check(Qg(t))});function Q(e){return bh(p_,e)}const $=B(`ZodStringFormat`,(e,t)=>{q.init(e,t),f_.init(e,t)}),m_=B(`ZodEmail`,(e,t)=>{fm.init(e,t),$.init(e,t)}),h_=B(`ZodGUID`,(e,t)=>{um.init(e,t),$.init(e,t)}),g_=B(`ZodUUID`,(e,t)=>{dm.init(e,t),$.init(e,t)}),__=B(`ZodURL`,(e,t)=>{pm.init(e,t),$.init(e,t)}),v_=B(`ZodEmoji`,(e,t)=>{mm.init(e,t),$.init(e,t)}),y_=B(`ZodNanoID`,(e,t)=>{hm.init(e,t),$.init(e,t)}),b_=B(`ZodCUID`,(e,t)=>{gm.init(e,t),$.init(e,t)}),x_=B(`ZodCUID2`,(e,t)=>{_m.init(e,t),$.init(e,t)}),S_=B(`ZodULID`,(e,t)=>{vm.init(e,t),$.init(e,t)}),C_=B(`ZodXID`,(e,t)=>{ym.init(e,t),$.init(e,t)}),w_=B(`ZodKSUID`,(e,t)=>{bm.init(e,t),$.init(e,t)}),T_=B(`ZodIPv4`,(e,t)=>{Tm.init(e,t),$.init(e,t)}),E_=B(`ZodIPv6`,(e,t)=>{Em.init(e,t),$.init(e,t)}),D_=B(`ZodCIDRv4`,(e,t)=>{Dm.init(e,t),$.init(e,t)}),O_=B(`ZodCIDRv6`,(e,t)=>{Om.init(e,t),$.init(e,t)}),k_=B(`ZodBase64`,(e,t)=>{Am.init(e,t),$.init(e,t)}),A_=B(`ZodBase64URL`,(e,t)=>{Mm.init(e,t),$.init(e,t)}),j_=B(`ZodE164`,(e,t)=>{Nm.init(e,t),$.init(e,t)}),M_=B(`ZodJWT`,(e,t)=>{Fm.init(e,t),$.init(e,t)}),N_=B(`ZodNumber`,(e,t)=>{Im.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Og(e,t,n,r),e.gt=(t,n)=>e.check($h(t,n)),e.gte=(t,n)=>e.check(eg(t,n)),e.min=(t,n)=>e.check(eg(t,n)),e.lt=(t,n)=>e.check(Zh(t,n)),e.lte=(t,n)=>e.check(Qh(t,n)),e.max=(t,n)=>e.check(Qh(t,n)),e.int=t=>e.check(I_(t)),e.safe=t=>e.check(I_(t)),e.positive=t=>e.check($h(0,t)),e.nonnegative=t=>e.check(eg(0,t)),e.negative=t=>e.check(Zh(0,t)),e.nonpositive=t=>e.check(Qh(0,t)),e.multipleOf=(t,n)=>e.check(tg(t,n)),e.step=(t,n)=>e.check(tg(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 P_(e){return qh(N_,e)}const F_=B(`ZodNumberFormat`,(e,t)=>{Lm.init(e,t),N_.init(e,t)});function I_(e){return Jh(F_,e)}const L_=B(`ZodUnknown`,(e,t)=>{Rm.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(e,t,n)=>void 0});function R_(){return Yh(L_)}const z_=B(`ZodNever`,(e,t)=>{zm.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>kg(e,t,n,r)});function B_(e){return Xh(z_,e)}const V_=B(`ZodArray`,(e,t)=>{Vm.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Ng(e,t,n,r),e.element=t.element,e.min=(t,n)=>e.check(rg(t,n)),e.nonempty=t=>e.check(rg(1,t)),e.max=(t,n)=>e.check(ng(t,n)),e.length=(t,n)=>e.check(ig(t,n)),e.unwrap=()=>e.element});function H_(e,t){return _g(V_,e,t)}const U_=B(`ZodObject`,(e,t)=>{Km.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Pg(e,t,n,r),V(e,`shape`,()=>t.shape),e.keyof=()=>X_(Object.keys(e._zod.def.shape)),e.catchall=t=>e.clone({...e._zod.def,catchall:t}),e.passthrough=()=>e.clone({...e._zod.def,catchall:R_()}),e.loose=()=>e.clone({...e._zod.def,catchall:R_()}),e.strict=()=>e.clone({...e._zod.def,catchall:B_()}),e.strip=()=>e.clone({...e._zod.def,catchall:void 0}),e.extend=t=>Vf(e,t),e.safeExtend=t=>Hf(e,t),e.merge=t=>Uf(e,t),e.pick=t=>zf(e,t),e.omit=t=>Bf(e,t),e.partial=(...t)=>Wf($_,e,t[0]),e.required=(...t)=>Gf(lv,e,t[0])});function W_(e,t){return new U_({type:`object`,shape:e??{},...W(t)})}const G_=B(`ZodUnion`,(e,t)=>{Jm.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Fg(e,t,n,r),e.options=t.options});function K_(e,t){return new G_({type:`union`,options:e,...W(t)})}const q_=B(`ZodIntersection`,(e,t)=>{Ym.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Ig(e,t,n,r)});function J_(e,t){return new q_({type:`intersection`,left:e,right:t})}const Y_=B(`ZodEnum`,(e,t)=>{Qm.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Ag(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 Y_({...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 Y_({...t,checks:[],...W(r),entries:i})}});function X_(e,t){return new Y_({type:`enum`,entries:Array.isArray(e)?Object.fromEntries(e.map(e=>[e,e])):e,...W(t)})}const Z_=B(`ZodTransform`,(e,t)=>{$m.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Mg(e,t,n,r),e._zod.parse=(n,r)=>{if(r.direction===`backward`)throw new _f(e.constructor.name);n.addIssue=r=>{if(typeof r==`string`)n.issues.push(Zf(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(Zf(t))}};let i=t.transform(n.value,n);return i instanceof Promise?i.then(e=>(n.value=e,n)):(n.value=i,n)}});function Q_(e){return new Z_({type:`transform`,transform:e})}const $_=B(`ZodOptional`,(e,t)=>{th.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Wg(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function ev(e){return new $_({type:`optional`,innerType:e})}const tv=B(`ZodExactOptional`,(e,t)=>{nh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Wg(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function nv(e){return new tv({type:`optional`,innerType:e})}const rv=B(`ZodNullable`,(e,t)=>{rh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Lg(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function iv(e){return new rv({type:`nullable`,innerType:e})}const av=B(`ZodDefault`,(e,t)=>{ih.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>zg(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeDefault=e.unwrap});function ov(e,t){return new av({type:`default`,innerType:e,get defaultValue(){return typeof t==`function`?t():Pf(t)}})}const sv=B(`ZodPrefault`,(e,t)=>{oh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Bg(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():Pf(t)}})}const lv=B(`ZodNonOptional`,(e,t)=>{sh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Rg(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function uv(e,t){return new lv({type:`nonoptional`,innerType:e,...W(t)})}const dv=B(`ZodCatch`,(e,t)=>{lh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Vg(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeCatch=e.unwrap});function fv(e,t){return new dv({type:`catch`,innerType:e,catchValue:typeof t==`function`?t:()=>t})}const pv=B(`ZodPipe`,(e,t)=>{uh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Hg(e,t,n,r),e.in=t.in,e.out=t.out});function mv(e,t){return new pv({type:`pipe`,in:e,out:t})}const hv=B(`ZodReadonly`,(e,t)=>{fh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Ug(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function gv(e){return new hv({type:`readonly`,innerType:e})}const _v=B(`ZodCustom`,(e,t)=>{mh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>jg(e,t,n,r)});function vv(e,t={}){return vg(_v,e,t)}function yv(e){return yg(e)}const bv=[`plugin-skill-inductor`],xv=W_({id:Q().min(1).max(64),taskSignature:Q().min(1).max(200),tags:H_(Q().max(32)).max(5),sessionIds:H_(Q().max(64)).max(50),size:P_().int().min(1).max(1e3),firstAt:P_().int().nonnegative(),lastAt:P_().int().nonnegative(),dismissedAt:P_().int().nonnegative().optional()});function Sv(e,t){if(typeof t!=`string`||t.length===0||t.includes(`/`)||t.includes(`\\`)||t.includes(`..`))throw Error(`invalid workspaceKey for candidate file: ${t}`);return b(hu(e),t,`candidates.json`)}function Cv(e){if(!bv.includes(e.pluginId))return[];let t;try{let n=Sv(e.pluginId,e.workspaceKey);if(!E(n))return[];t=O(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=xv.safeParse(e);t.success&&r.push(t.data)}return r}function wv(e){return(e.selectedOptionLabels??[]).includes(`起草 SKILL.md 给我看`)}async function Tv(e){let t;try{t=await e.requestGrill({header:`技能沉淀提议`,question:ff(e.brief),background:pf(e.brief),recommendation:mf(),options:hf(),askedBy:`skill-loop`})}catch(t){return e.logger?.warn(`skill-loop proposal failed: ${t instanceof Error?t.message:String(t)}`),`error`}return wv(t)?`accepted`:Ev(e)?`dismissed`:(e.logger?.warn(`skill-loop: failed to persist dismissal, candidate may resurface`),`error`)}function Ev(e){if(s())return!0;let t=Sv(e.pluginId,e.workspaceKey),n=`${t}.host.tmp`;try{let r=JSON.parse(O(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,k(n,JSON.stringify(r)),Kr(n,t),!0):!1}catch{try{Xr(n)}catch{}return!1}}const Dv=bv[0],Ov=yi;async function kv(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=uf(Cv({pluginId:Dv,workspaceKey:e.getWorkspaceKey()??yi}),n,lf(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 Tv({requestGrill:i,brief:a,pluginId:Dv,workspaceKey:e.getWorkspaceKey()??yi,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 Av(e){return[y({name:`skill-loop`,timing:`session.idle`,handle:async t=>{try{await kv(e,t.sessionId)}catch(t){e.logger.warn({err:String(t)},`skill-loop: unexpected failure`)}}})]}const jv=`[sandbox-escalation]`;function Mv(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=x(r.projectRoot,s),l=_e({writePaths:a.map(e=>x(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=`${jv} ${l.reason??`requires approval`}`)}}})}function Nv(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(`
427
- `)}\n</delegate-notification>`}function Pv(){let e=new Map,t=new Set;return{hooks:[y({name:`agent-job-notification-injector`,timing:`messages.transform`,priority:25,handle:(t,n)=>{$d(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(Nv(r)),e.set(n,i)}}}const Fv=W_({taskSignature:Q().min(1).max(200),outcome:X_([`success`,`partial`,`failure`]),at:P_().int().nonnegative(),steps:H_(W_({tool:Q().max(64)})).max(20)});function Iv(e,t){return b(hu(e),t,`episodes.json`)}function Lv(e,t){let n;try{let r=Iv(e,t);if(!E(r))return{total:0,success:0,recent:[]};n=O(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=Fv.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 Rv(e){let t=bv[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=Lv(t,e.workspaceKey),i=Cv({pluginId:t,workspaceKey:e.workspaceKey}),a=lf(e.cooldownDays),o=uf(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:zv({pending:o.length,success:r.success,minClusterSize:e.minClusterSize??3})}}function zv(e){return e.pending>0?null:e.success===0?`no-episodes`:e.success<e.minClusterSize?`not-enough-successes`:`no-cluster-yet`}const Bv=W_({tool:Q().min(1).max(64),intent:Q().max(160)}),Vv=W_({taskSignature:Q().min(1).max(200),steps:H_(Bv).max(20),outcome:X_([`success`,`partial`,`failure`]),sessionId:Q().max(64),at:P_().int().nonnegative()});function Hv(e){let t=e.limit??8,n;try{let t=b(hu(e.pluginId),e.workspaceKey,`episodes.json`);if(!E(t))return[];n=O(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=Vv.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 Uv(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(`
531
+ 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 yv(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:xv(t,`input`,e.processors),output:xv(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 bv=(e,t={})=>n=>{let r=_v({...n,processors:t});return J(e,r),vv(r,e),yv(r,e)},xv=(e,t,n={})=>r=>{let{libraryOptions:i,target:a}=r??{},o=_v({...i??{},target:a,io:t,processors:n});return J(e,o),vv(o,e),yv(o,e)},Sv={guid:`uuid`,url:`uri`,datetime:`date-time`,json_string:`json-string`,regex:``},Cv=(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=Sv[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}))])}},wv=(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)},Tv=(e,t,n,r)=>{n.not={}},Ev=(e,t,n,r)=>{let i=e._zod.def,a=mm(i.entries);a.every(e=>typeof e==`number`)&&(n.type=`number`),a.every(e=>typeof e==`string`)&&(n.type=`string`),n.enum=a},Dv=(e,t,n,r)=>{if(t.unrepresentable===`throw`)throw Error(`Custom types cannot be represented in JSON Schema`)},Ov=(e,t,n,r)=>{if(t.unrepresentable===`throw`)throw Error(`Transforms cannot be represented in JSON Schema`)},kv=(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`]})},Av=(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)},jv=(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},Mv=(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]]},Nv=(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`}]},Pv=(e,t,n,r)=>{let i=e._zod.def;J(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},Fv=(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))},Iv=(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)))},Lv=(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},Rv=(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},zv=(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},Bv=(e,t,n,r)=>{let i=e._zod.def;J(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},Vv=H(`ZodISODateTime`,(e,t)=>{_g.init(e,t),$.init(e,t)});function Hv(e){return z_(Vv,e)}const Uv=H(`ZodISODate`,(e,t)=>{vg.init(e,t),$.init(e,t)});function Wv(e){return B_(Uv,e)}const Gv=H(`ZodISOTime`,(e,t)=>{yg.init(e,t),$.init(e,t)});function Kv(e){return V_(Gv,e)}const qv=H(`ZodISODuration`,(e,t)=>{bg.init(e,t),$.init(e,t)});function Jv(e){return H_(qv,e)}const Yv=(e,t)=>{Ym.init(e,t),e.name=`ZodError`,Object.defineProperties(e,{format:{value:t=>Qm(e,t)},flatten:{value:t=>Zm(e,t)},addIssue:{value:t=>{e.issues.push(t),e.message=JSON.stringify(e.issues,hm,2)}},addIssues:{value:t=>{e.issues.push(...t),e.message=JSON.stringify(e.issues,hm,2)}},isEmpty:{get(){return e.issues.length===0}}})};H(`ZodError`,Yv);const X=H(`ZodError`,Yv,{Parent:Error}),Xv=$m(X),Zv=eh(X),Qv=th(X),$v=rh(X),ey=ah(X),ty=oh(X),ny=sh(X),ry=ch(X),iy=lh(X),ay=uh(X),oy=dh(X),sy=fh(X),Z=H(`ZodType`,(e,t)=>(K.init(e,t),Object.assign(e[`~standard`],{jsonSchema:{input:xv(e,`input`),output:xv(e,`output`)}}),e.toJSONSchema=bv(e,{}),e.def=t,e.type=t.type,Object.defineProperty(e,`_def`,{value:t}),e.check=(...n)=>e.clone(Sm(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)=>Mm(e,t,n),e.brand=()=>e,e.register=((t,n)=>(t.add(e,n),e)),e.parse=(t,n)=>Xv(e,t,n,{callee:e.parse}),e.safeParse=(t,n)=>Qv(e,t,n),e.parseAsync=async(t,n)=>Zv(e,t,n,{callee:e.parseAsync}),e.safeParseAsync=async(t,n)=>$v(e,t,n),e.spa=e.safeParseAsync,e.encode=(t,n)=>ey(e,t,n),e.decode=(t,n)=>ty(e,t,n),e.encodeAsync=async(t,n)=>ny(e,t,n),e.decodeAsync=async(t,n)=>ry(e,t,n),e.safeEncode=(t,n)=>iy(e,t,n),e.safeDecode=(t,n)=>ay(e,t,n),e.safeEncodeAsync=async(t,n)=>oy(e,t,n),e.safeDecodeAsync=async(t,n)=>sy(e,t,n),e.refine=(t,n)=>e.check(mb(t,n)),e.superRefine=t=>e.check(hb(t)),e.overwrite=t=>e.check(sv(t)),e.optional=()=>Xy(e),e.exactOptional=()=>Qy(e),e.nullable=()=>eb(e),e.nullish=()=>Xy(eb(e)),e.nonoptional=t=>ob(e,t),e.array=()=>Ry(e),e.or=t=>Hy([e,t]),e.and=t=>Wy(e,t),e.transform=t=>ub(e,Jy(t)),e.default=t=>nb(e,t),e.prefault=t=>ib(e,t),e.catch=t=>cb(e,t),e.pipe=t=>ub(e,t),e.readonly=()=>fb(e),e.describe=t=>{let n=e.clone();return h_.add(n,{description:t}),n},Object.defineProperty(e,`description`,{get(){return h_.get(e)?.description},configurable:!0}),e.meta=(...t)=>{if(t.length===0)return h_.get(e);let n=e.clone();return h_.add(n,t[0]),n},e.isOptional=()=>e.safeParse(void 0).success,e.isNullable=()=>e.safeParse(null).success,e.apply=t=>t(e),e)),cy=H(`_ZodString`,(e,t)=>{ag.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Cv(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(tv(...t)),e.includes=(...t)=>e.check(iv(...t)),e.startsWith=(...t)=>e.check(av(...t)),e.endsWith=(...t)=>e.check(ov(...t)),e.min=(...t)=>e.check($_(...t)),e.max=(...t)=>e.check(Q_(...t)),e.length=(...t)=>e.check(ev(...t)),e.nonempty=(...t)=>e.check($_(1,...t)),e.lowercase=t=>e.check(nv(t)),e.uppercase=t=>e.check(rv(t)),e.trim=()=>e.check(lv()),e.normalize=(...t)=>e.check(cv(...t)),e.toLowerCase=()=>e.check(uv()),e.toUpperCase=()=>e.check(dv()),e.slugify=()=>e.check(fv())}),ly=H(`ZodString`,(e,t)=>{ag.init(e,t),cy.init(e,t),e.email=t=>e.check(__(uy,t)),e.url=t=>e.check(C_(py,t)),e.jwt=t=>e.check(R_(Oy,t)),e.emoji=t=>e.check(w_(my,t)),e.guid=t=>e.check(v_(dy,t)),e.uuid=t=>e.check(y_(fy,t)),e.uuidv4=t=>e.check(b_(fy,t)),e.uuidv6=t=>e.check(x_(fy,t)),e.uuidv7=t=>e.check(S_(fy,t)),e.nanoid=t=>e.check(T_(hy,t)),e.guid=t=>e.check(v_(dy,t)),e.cuid=t=>e.check(E_(gy,t)),e.cuid2=t=>e.check(D_(_y,t)),e.ulid=t=>e.check(O_(vy,t)),e.base64=t=>e.check(F_(Ty,t)),e.base64url=t=>e.check(I_(Ey,t)),e.xid=t=>e.check(k_(yy,t)),e.ksuid=t=>e.check(A_(by,t)),e.ipv4=t=>e.check(j_(xy,t)),e.ipv6=t=>e.check(M_(Sy,t)),e.cidrv4=t=>e.check(N_(Cy,t)),e.cidrv6=t=>e.check(P_(wy,t)),e.e164=t=>e.check(L_(Dy,t)),e.datetime=t=>e.check(Hv(t)),e.date=t=>e.check(Wv(t)),e.time=t=>e.check(Kv(t)),e.duration=t=>e.check(Jv(t))});function Q(e){return g_(ly,e)}const $=H(`ZodStringFormat`,(e,t)=>{q.init(e,t),cy.init(e,t)}),uy=H(`ZodEmail`,(e,t)=>{cg.init(e,t),$.init(e,t)}),dy=H(`ZodGUID`,(e,t)=>{og.init(e,t),$.init(e,t)}),fy=H(`ZodUUID`,(e,t)=>{sg.init(e,t),$.init(e,t)}),py=H(`ZodURL`,(e,t)=>{lg.init(e,t),$.init(e,t)}),my=H(`ZodEmoji`,(e,t)=>{ug.init(e,t),$.init(e,t)}),hy=H(`ZodNanoID`,(e,t)=>{dg.init(e,t),$.init(e,t)}),gy=H(`ZodCUID`,(e,t)=>{fg.init(e,t),$.init(e,t)}),_y=H(`ZodCUID2`,(e,t)=>{pg.init(e,t),$.init(e,t)}),vy=H(`ZodULID`,(e,t)=>{mg.init(e,t),$.init(e,t)}),yy=H(`ZodXID`,(e,t)=>{hg.init(e,t),$.init(e,t)}),by=H(`ZodKSUID`,(e,t)=>{gg.init(e,t),$.init(e,t)}),xy=H(`ZodIPv4`,(e,t)=>{xg.init(e,t),$.init(e,t)}),Sy=H(`ZodIPv6`,(e,t)=>{Sg.init(e,t),$.init(e,t)}),Cy=H(`ZodCIDRv4`,(e,t)=>{Cg.init(e,t),$.init(e,t)}),wy=H(`ZodCIDRv6`,(e,t)=>{wg.init(e,t),$.init(e,t)}),Ty=H(`ZodBase64`,(e,t)=>{Eg.init(e,t),$.init(e,t)}),Ey=H(`ZodBase64URL`,(e,t)=>{Og.init(e,t),$.init(e,t)}),Dy=H(`ZodE164`,(e,t)=>{kg.init(e,t),$.init(e,t)}),Oy=H(`ZodJWT`,(e,t)=>{jg.init(e,t),$.init(e,t)}),ky=H(`ZodNumber`,(e,t)=>{Mg.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>wv(e,t,n,r),e.gt=(t,n)=>e.check(Y_(t,n)),e.gte=(t,n)=>e.check(X_(t,n)),e.min=(t,n)=>e.check(X_(t,n)),e.lt=(t,n)=>e.check(q_(t,n)),e.lte=(t,n)=>e.check(J_(t,n)),e.max=(t,n)=>e.check(J_(t,n)),e.int=t=>e.check(My(t)),e.safe=t=>e.check(My(t)),e.positive=t=>e.check(Y_(0,t)),e.nonnegative=t=>e.check(X_(0,t)),e.negative=t=>e.check(q_(0,t)),e.nonpositive=t=>e.check(J_(0,t)),e.multipleOf=(t,n)=>e.check(Z_(t,n)),e.step=(t,n)=>e.check(Z_(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 Ay(e){return U_(ky,e)}const jy=H(`ZodNumberFormat`,(e,t)=>{Ng.init(e,t),ky.init(e,t)});function My(e){return W_(jy,e)}const Ny=H(`ZodUnknown`,(e,t)=>{Pg.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(e,t,n)=>void 0});function Py(){return G_(Ny)}const Fy=H(`ZodNever`,(e,t)=>{Fg.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Tv(e,t,n,r)});function Iy(e){return K_(Fy,e)}const Ly=H(`ZodArray`,(e,t)=>{Lg.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>kv(e,t,n,r),e.element=t.element,e.min=(t,n)=>e.check($_(t,n)),e.nonempty=t=>e.check($_(1,t)),e.max=(t,n)=>e.check(Q_(t,n)),e.length=(t,n)=>e.check(ev(t,n)),e.unwrap=()=>e.element});function Ry(e,t){return pv(Ly,e,t)}const zy=H(`ZodObject`,(e,t)=>{Hg.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Av(e,t,n,r),U(e,`shape`,()=>t.shape),e.keyof=()=>Ky(Object.keys(e._zod.def.shape)),e.catchall=t=>e.clone({...e._zod.def,catchall:t}),e.passthrough=()=>e.clone({...e._zod.def,catchall:Py()}),e.loose=()=>e.clone({...e._zod.def,catchall:Py()}),e.strict=()=>e.clone({...e._zod.def,catchall:Iy()}),e.strip=()=>e.clone({...e._zod.def,catchall:void 0}),e.extend=t=>Lm(e,t),e.safeExtend=t=>Rm(e,t),e.merge=t=>zm(e,t),e.pick=t=>Fm(e,t),e.omit=t=>Im(e,t),e.partial=(...t)=>Bm(Yy,e,t[0]),e.required=(...t)=>Vm(ab,e,t[0])});function By(e,t){return new zy({type:`object`,shape:e??{},...W(t)})}const Vy=H(`ZodUnion`,(e,t)=>{Wg.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>jv(e,t,n,r),e.options=t.options});function Hy(e,t){return new Vy({type:`union`,options:e,...W(t)})}const Uy=H(`ZodIntersection`,(e,t)=>{Gg.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Mv(e,t,n,r)});function Wy(e,t){return new Uy({type:`intersection`,left:e,right:t})}const Gy=H(`ZodEnum`,(e,t)=>{Jg.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Ev(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 Gy({...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 Gy({...t,checks:[],...W(r),entries:i})}});function Ky(e,t){return new Gy({type:`enum`,entries:Array.isArray(e)?Object.fromEntries(e.map(e=>[e,e])):e,...W(t)})}const qy=H(`ZodTransform`,(e,t)=>{Yg.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Ov(e,t,n,r),e._zod.parse=(n,r)=>{if(r.direction===`backward`)throw new dm(e.constructor.name);n.addIssue=r=>{if(typeof r==`string`)n.issues.push(qm(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(qm(t))}};let i=t.transform(n.value,n);return i instanceof Promise?i.then(e=>(n.value=e,n)):(n.value=i,n)}});function Jy(e){return new qy({type:`transform`,transform:e})}const Yy=H(`ZodOptional`,(e,t)=>{Zg.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Bv(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Xy(e){return new Yy({type:`optional`,innerType:e})}const Zy=H(`ZodExactOptional`,(e,t)=>{Qg.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Bv(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Qy(e){return new Zy({type:`optional`,innerType:e})}const $y=H(`ZodNullable`,(e,t)=>{$g.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Nv(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function eb(e){return new $y({type:`nullable`,innerType:e})}const tb=H(`ZodDefault`,(e,t)=>{e_.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Fv(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeDefault=e.unwrap});function nb(e,t){return new tb({type:`default`,innerType:e,get defaultValue(){return typeof t==`function`?t():km(t)}})}const rb=H(`ZodPrefault`,(e,t)=>{n_.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Iv(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function ib(e,t){return new rb({type:`prefault`,innerType:e,get defaultValue(){return typeof t==`function`?t():km(t)}})}const ab=H(`ZodNonOptional`,(e,t)=>{r_.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Pv(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function ob(e,t){return new ab({type:`nonoptional`,innerType:e,...W(t)})}const sb=H(`ZodCatch`,(e,t)=>{a_.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Lv(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeCatch=e.unwrap});function cb(e,t){return new sb({type:`catch`,innerType:e,catchValue:typeof t==`function`?t:()=>t})}const lb=H(`ZodPipe`,(e,t)=>{o_.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Rv(e,t,n,r),e.in=t.in,e.out=t.out});function ub(e,t){return new lb({type:`pipe`,in:e,out:t})}const db=H(`ZodReadonly`,(e,t)=>{c_.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>zv(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function fb(e){return new db({type:`readonly`,innerType:e})}const pb=H(`ZodCustom`,(e,t)=>{u_.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Dv(e,t,n,r)});function mb(e,t={}){return mv(pb,e,t)}function hb(e){return hv(e)}const gb=[`plugin-skill-inductor`],_b=By({id:Q().min(1).max(64),taskSignature:Q().min(1).max(200),tags:Ry(Q().max(32)).max(5),sessionIds:Ry(Q().max(64)).max(50),size:Ay().int().min(1).max(1e3),firstAt:Ay().int().nonnegative(),lastAt:Ay().int().nonnegative(),dismissedAt:Ay().int().nonnegative().optional()});function vb(e,t){if(typeof t!=`string`||t.length===0||t.includes(`/`)||t.includes(`\\`)||t.includes(`..`))throw Error(`invalid workspaceKey for candidate file: ${t}`);return C(Jd(e),t,`candidates.json`)}function yb(e){if(!gb.includes(e.pluginId))return[];let t;try{let n=vb(e.pluginId,e.workspaceKey);if(!v(n))return[];t=b(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=_b.safeParse(e);t.success&&r.push(t.data)}return r}function bb(e){return(e.selectedOptionLabels??[]).includes(`起草 SKILL.md 给我看`)}async function xb(e){let t;try{t=await e.requestGrill({header:`技能沉淀提议`,question:om(e.brief),background:sm(e.brief),recommendation:cm(),options:lm(),askedBy:`skill-loop`})}catch(t){return e.logger?.warn(`skill-loop proposal failed: ${t instanceof Error?t.message:String(t)}`),`error`}return bb(t)?`accepted`:Sb(e)?`dismissed`:(e.logger?.warn(`skill-loop: failed to persist dismissal, candidate may resurface`),`error`)}function Sb(e){if(c())return!0;let t=vb(e.pluginId,e.workspaceKey),n=`${t}.host.tmp`;try{let r=JSON.parse(b(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,x(n,JSON.stringify(r)),$e(n,t),!0):!1}catch{try{rt(n)}catch{}return!1}}const Cb=gb[0],wb=Ui;async function Tb(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=im(yb({pluginId:Cb,workspaceKey:e.getWorkspaceKey()??Ui}),n,rm(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 xb({requestGrill:i,brief:a,pluginId:Cb,workspaceKey:e.getWorkspaceKey()??Ui,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 Eb(e){return[k({name:`skill-loop`,timing:`session.idle`,handle:async t=>{try{await Tb(e,t.sessionId)}catch(t){e.logger.warn({err:String(t)},`skill-loop: unexpected failure`)}}})]}const Db=`[sandbox-escalation]`;function Ob(e){return k({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(...Fe(o)),a.length===0)return;let s=typeof i?.targetDir==`string`?i.targetDir:`.`,c=w(r.projectRoot,s),l=Se({writePaths:a.map(e=>w(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=`${Db} ${l.reason??`requires approval`}`)}}})}function kb(e){return k({name:`skill-invocation`,timing:`tool.execute.after`,priority:50,handle(t){let{registry:n,resolveCwd:r,logger:i}=e;if(!n||t.toolName!==`bash`)return;let a=typeof t.args?.command==`string`?t.args.command:``;if(!a)return;let o=typeof t.args?.targetDir==`string`?t.args.targetDir:void 0,s=r?.(o);if(s)try{n.detectImplicitInvocation(a,s)}catch(e){i.warn?.({err:e instanceof Error?e.message:String(e)},`Skill invocation detection failed (ignored)`)}}})}function Ab(e){return e?(e.endsWith(`
532
+ `)?e.slice(0,-1):e).split(`
533
+ `).length:0}function jb(e){let{toolCallId:t,args:n}=e,r=typeof n.path==`string`?n.path:void 0;if(!r)return null;let i=typeof n.oldContent==`string`?n.oldContent:void 0,a=typeof n.newContent==`string`?n.newContent:void 0;if(i!==void 0&&a!==void 0){let e=Ab(i),n=Ab(a);return{path:r,operation:`edit`,oldContent:i,newContent:a,addedLines:Math.max(0,n-e),removedLines:Math.max(0,e-n),timestamp:Date.now(),toolCallId:t}}let o=typeof n.content==`string`?n.content:void 0;return o===void 0?null:{path:r,operation:`write`,newContent:o,addedLines:Ab(o),removedLines:0,timestamp:Date.now(),toolCallId:t}}function Mb(e={}){let{onFileEdited:t,getOnFileEdited:n,dedupCache:r}=e;return k({name:`edit-files-panel`,timing:`tool.execute.after`,priority:90,handle(e){let i=n?.()??t;if(!i||e.readonly)return;let a=jb(e);if(!a)return;let o=a.toolCallId;if(r){if(r.has(o))return;r.add(o)}i(a)}})}function Nb(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(`
534
+ `)}\n</delegate-notification>`}function Pb(){let e=new Map,t=new Set;return{hooks:[k({name:`agent-job-notification-injector`,timing:`messages.transform`,priority:25,handle:(t,n)=>{Jp(e,t,n)}}),k({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(Nb(r)),e.set(n,i)}}}const Fb=By({taskSignature:Q().min(1).max(200),outcome:Ky([`success`,`partial`,`failure`]),at:Ay().int().nonnegative(),steps:Ry(By({tool:Q().max(64)})).max(20)});function Ib(e,t){return C(Jd(e),t,`episodes.json`)}function Lb(e,t){let n;try{let r=Ib(e,t);if(!v(r))return{total:0,success:0,recent:[]};n=b(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=Fb.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 Rb(e){let t=gb[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=Lb(t,e.workspaceKey),i=yb({pluginId:t,workspaceKey:e.workspaceKey}),a=rm(e.cooldownDays),o=im(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:zb({pending:o.length,success:r.success,minClusterSize:e.minClusterSize??3})}}function zb(e){return e.pending>0?null:e.success===0?`no-episodes`:e.success<e.minClusterSize?`not-enough-successes`:`no-cluster-yet`}const Bb=By({tool:Q().min(1).max(64),intent:Q().max(160)}),Vb=By({taskSignature:Q().min(1).max(200),steps:Ry(Bb).max(20),outcome:Ky([`success`,`partial`,`failure`]),sessionId:Q().max(64),at:Ay().int().nonnegative()});function Hb(e){let t=e.limit??8,n;try{let t=C(Jd(e.pluginId),e.workspaceKey,`episodes.json`);if(!v(t))return[];n=b(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=Vb.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 Ub(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(`
428
535
  `);return`Run ${t+1} (session ${e.sessionId}):\n${n||` (no steps recorded)`}`}).join(`
429
536
 
430
- `)}function Wv(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.
537
+ `)}function Wb(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.
431
538
 
432
539
  ## The pattern
433
540
 
@@ -441,7 +548,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
441
548
  These are the actual tool sequences otto observed for this task type. They are your evidence —
442
549
  you do not need to (and cannot) go looking for the original sessions.
443
550
 
444
- ${Uv(t)}
551
+ ${Ub(t)}
445
552
 
446
553
  ## What to do
447
554
 
@@ -479,6 +586,8 @@ If the recorded paths turn out to be too varied, too thin, or not actually the s
479
586
  library permanently; skipping costs nothing — otto will offer again if the pattern recurs.
480
587
 
481
588
  The draft you produce is a proposal: it will be reviewed as a diff and only takes effect if the
482
- user explicitly applies it.`}function Gv(e){return`Draft skill: ${e.taskSignature.length>60?`${e.taskSignature.slice(0,60)}…`:e.taskSignature}`}function Kv(e){try{let t=Hv({pluginId:e.pluginId,workspaceKey:e.workspaceKey,sessionIds:e.brief.sessionIds});return{jobId:e.startJob({title:Gv(e.brief),prompt:Wv(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 qv(e){e.hookRegistry.register(Hd(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(Ot(e.memory)),e.hookRegistry.registerAll(jt({getTodoList:t=>e.getSession(t)?.session.getTodoList()}));let t=/-milestone\.md$/,n=/^Status:\s*Done\b/m;e.hookRegistry.registerAll(Dt({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(Zd(e.learningStore,e.promptManager,e.localLearningStore)),e.skillRegistry&&e.hookRegistry.registerAll(Qd(e.skillRegistry)),e.hookRegistry.registerAll(ur({workspaceDir:e.workspaceDir})),e.hookRegistry.registerAll(tf()),e.hookRegistry.on(`session.deleted`,`rfc047-notification-detach`,t=>e.notificationDispatcher.detach(t.sessionId));let r=Pv();e.hookRegistry.registerAll(r.hooks),e.hookRegistry.register(nf(e=>{C.killAllForSession(e)})),e.hookRegistry.registerAll(rf({registry:e.permissionRegistry,getPersistedAllow:t=>e.codingSessionPool.getSessionPermissionAllow(t)})),e.hookRegistry.register(Mv({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(of(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(sf({isEnabled:i})),e.hookRegistry.registerAll(Av({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})=>{Kv({startJob:t=>e.startSkillDraftJob({...t,origin:`user`}),brief:n,sessionId:t,pluginId:Dv,workspaceKey:e.getWorkspaceKey()??Ov,logger:{warn:t=>e.logger.warn(t)}})},logger:e.logger})),e.hookRegistry.register(Se({getOnFileEdited:e.getEditFileCallback,dedupCache:e.editFilesDedup})),{agentJobNotify:r.notify}}function Jv(e,t,n,r){return Bd({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 Yv(e,t){return Ie(t,Vd(Jv(e,t,e.skillRegistry?dn(e.skillRegistry,t):void 0,!1))).getAvailable(e.defaultToolPreset)}function Xv(e){return e.toolRegistry.getAvailable(e.defaultToolPreset).filter(e=>e.name.startsWith(`mcp__`))}function Zv(e,t){let n=t.skillProvider??(e.skillRegistry?dn(e.skillRegistry,e.workspaceDir):void 0);t.sandbox&&e.sandbox.pin(t.sandbox);let r={registerChild(e,t){return{pid:Ht.registerChild(e,t).pid??0}}};return Ie(e.workspaceDir,{...Vd(Jv(e,e.workspaceDir,n,t.lsp===!0)),processTracker:r})}function Qv(e){e.agentJobNotify=qv({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 $v(e){return{async readFile(e){try{return await ki(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return null;throw e}},async writeFile(e,t){await Di(Ve(e),{recursive:!0}),await nn(e,t)},async writeFileExclusive(e,t){await Di(Ve(e),{recursive:!0});try{let n=await Oi(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??xi,now:e?.now??(()=>new Date().toISOString()),...e?.confirmTrust?{confirmTrust:e.confirmTrust}:{}}}async function ey(e){if(e.ensureNotDisposed(),await e.ensureSettingsLoaded(),!e.workspaceRef&&!e.pendingWorkspaceInit&&!e.parentWorkspaceExisted)try{let t=bi($v()),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 nt(`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 Hs(e.workspaceDir,{plugins:e.activePlugins()}),e.declarativeTeams=await Js(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=()=>nt(`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 nt(`completeWorkspaceDependentStartup (session restoreAll)`,()=>ty(e)):nt(`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`&&ly(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(),Qe(`app.start() internal phases complete`),e.logger.info(`App started`)}async function ty(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 ny(e){return!!e.pendingWorkspaceInit}function ry(e){return!!e.parentWorkspaceExisted}async function iy(e){let t=e.parentWorkspaceExisted;if(!t)return e.workspaceRef;e.parentWorkspaceExisted=void 0;try{return e.workspaceRef=await bi($v()).resolveLocal(t.parentRoot),await ty(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 ay(e){let t=e.parentWorkspaceExisted;if(!t)return e.workspaceRef;e.parentWorkspaceExisted=void 0;try{return e.workspaceRef=await bi($v()).createLocal(t.currentRoot),await ty(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 oy(e){let t=e.pendingWorkspaceInit;if(!t)return e.workspaceRef;e.pendingWorkspaceInit=void 0;try{return e.workspaceRef=await bi($v()).createLocal(t.root),await ty(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=$v(),i=await Si(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 wi(n,a,r),e.workspaceRef={key:Ci(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:[b(t,`trace`),b(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 ly(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`,()=>C.killAllForOwner(e.processOwnerId)),await n(`mcpController`,()=>e.mcpController.stop()),await n(`processRuntime`,()=>Ht.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`,()=>Sl()),await n(`pluginServices`,()=>Ic()),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 uy(e,t,n){let r=n.current;if(!r)throw Error(`导出归档仅支持关系化 SQLite 后端(sessions.db)。当前后端不支持。`);let i=await ii(e,r);if(!i)throw Error(`会话 ${e.slice(0,8)} 不存在或无法加载`);let a=JSON.stringify(i,null,2),o=ui(`sha256`).update(a,`utf-8`).digest(`hex`);await Di(Ve(t),{recursive:!0}),await Ai(t,a,`utf-8`);let s=await ki(t,`utf-8`),c=ui(`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 dy(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 fy=0;function py(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 my=class{processOwnerId=`app-${++fy}`;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 rt({store:(()=>{let e=new ot(ze());return s()?ft(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 Na;expandSigilChips(e,t){return Ha(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 Ma;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=yc();pluginCapabilityQuota=new Sc;inquiryCenter=new wc;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 Yv(this,e)}connectorTools(){return Xv(this)}get agentJobs(){return this.agentJobServiceInstance||=wo({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 Mo(this)}resolveModel(e){return No(this,e)}listProviders(){return Po(this)}registerHook(e){Fo(this,e)}unregisterHook(e){return Io(this,e)}async hydrateModelCache(){return Lo(this)}getSessionAvailableModels(e){return Ro(this,e)}async refreshModels(){return Bo(this)}async reloadCapabilities(){let e=await dy({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 Vu;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??ei,this.maxToolTurns=a??_t.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=S(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 _=Od({logger:this.logger,hookRegistry:e.hookRegistry,getToolRegistry:()=>this.toolRegistry,getPermissionRegistry:()=>this.permissionRegistry,onHookTimeout:({hookName:e,timeoutMs:t})=>{let n=ac(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=Hu(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=ma({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 Qr?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=kd({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=ko({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=va({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),ue=Ad({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=jd({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,py(this);let pe=fe.swarmAgentRunner,me=Md({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=Id({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=Ld({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=Nd({mcpController:this.mcpController,callMcpTool:(e,t,n)=>this.callMcpTool(e,t,n),getActivePlugins:()=>this.activePlugins()}).panelBackendController;let _e=Rd({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=Pd({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=Fd({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}async ensureSettingsLoaded(){await zd(this.settings,()=>this.settingsLoaded,e=>{this.settingsLoaded=e}),this.freezeResilienceConfig(),this.freezeResidencyConfig();let e=this.settings.get(`residency`);e&&this._memoryGovernor.updateThresholds({warnThresholdPct:e.warn_threshold_pct,hardThresholdPct:e.hard_threshold_pct}),this._authStore.setRefreshLockTimeoutMs(this.getResilienceConfig().oauth.refreshLockTimeoutMs)}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 Ko(this,e,t)}getPermissionMode(){return qo(this)}async setPermissionMode(e){return Jo(this,e)}getSessionAlwaysAllow(e){return Yo(this,e)}bashAlwaysAllowPrefix(e){return ve(e)}isWellFormedAllowEntry(e){return Ne(e)}async disallowToolAlways(e){return Xo(this,e)}clearSessionAlwaysAllow(e){Zo(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 Za(Ja(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 ey(this)}async completeWorkspaceDependentStartup(){return ty(this)}needsWorkspaceInit(){return ny(this)}async confirmWorkspaceInit(){return oy(this)}hasParentWorkspace(){return ry(this)}async adoptParentWorkspace(){return iy(this)}async createLocalWorkspace(){return ay(this)}async setWorkspaceMemorySyncEnabled(e){return sy(this,e)}async sweepOrphanTraceFiles(){return cy(this)}async stop(){return ly(this)}async createSession(e={}){return Qo(this,e)}registerNotificationChannel(e){Ho(this,e)}registerInAppNotificationChannel(e){Uo(this,e)}setUserAskRenderer(e){this.userAskRenderer=e}async askPluginUser(e,t){let n={...gy(t),id:`plugin_ask_${++this.userAskSeq}`,askedBy:`plugin:${e}`},r=this.userAskRenderer;if(!this._interactive||!r)return hy();let i=this.inquiryCenter.enqueue({id:n.id,origin:{kind:`plugin`,pluginId:e},question:n});if(!i.accepted)return hy();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,hy()),e}}notifyUserInteraction(){Wo(this)}setTerminalFocus(e){Go(this,e)}setFollowUpPendingProbe(e){this.followUpPendingProbe=e}notifyPluginServices(e){let t=Fc(),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)?Fc().notify(e.pluginId,e.serviceId,{type:`schedule.tick`,scheduleId:t.scheduleId,occurrenceId:t.occurrenceId,occurredAt:t.occurredAt}):!1}getSession(e){return $o(this,e)}async shareSession(e,t){return es(this,e,t)}getActiveSession(){return ts(this)}listSessions(e){return ns(this,e)}async listAllSessions(e){return rs(this,e)}async removeSession(e){return is(this,e)}async exportSessionArchive(e,t){return uy(e,t,this.sessionRepoRef??{})}archiveSession(e){return as(this,e)}async forkSession(e,t){return os(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 Zv(this,e)}async buildModelCatalog(e){return Vo(this,e)}setSessionAvailableModels(e,t){zo(this,e,t)}registerHooks(){Qv(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 hy(){return{answer:``,acceptedRecommendation:!1,resolvedBy:`human`}}function gy(e){return{header:_y(e.header,160),question:_y(e.question,2e3),background:_y(e.background,4e3),recommendation:_y(e.recommendation,1e3),...e.options?{options:e.options.slice(0,8).map(e=>({label:_y(e.label,120),rationale:_y(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=>_y(e,1e3))}:{}}}function _y(e,t){return String(e??``).replace(/[--Ÿ‎‏‪-‮⁦-⁩]/g,` `).slice(0,t)}function vy(e){return new my(e)}function yy(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:()=>To(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 by(e){return{createSession:async t=>yy(await e.createSession(t)),jobs:Rt,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}}function xy(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 Sy(e,t=T){let n=t(e);return n.gated||!(e.manifest.capabilities?.includes(`tools`)??!1)?!1:!n.pendingCapabilities.includes(`tools`)}async function Cy(e,t,n){let r=[];for(let i of e){if(!Sy(i,t))continue;let e=i.manifest.contributes?.perfMetrics;if(!e?.length)continue;let a=Cl(i.scope);for(let t of e){let e=(async()=>{try{let{result:e,error:n}=await xy(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 wy=20;function Ty(e,t=20){let n=tc(e);if(!n||!E(n))return[];let r;try{r=O(n,`utf8`)}catch{return[]}let i=r.split(`
483
- `).filter(e=>e.trim().length>0).slice(-t),a=[];for(let e of i)try{a.push(JSON.parse(e))}catch{}return a}function Ey(e,t,n){let r=e?.manifest.contributes?.contextKeys;return{...t,...Un(r,n)}}function Dy(e,t){let n=e.manifest.scripts?.[t];if(!n)return Promise.reject(Error(`plugin ${e.id} 无脚本「${t}」`));let r=Xe(n);return r.safe?new Promise((r,i)=>{let a=Ti(n,{shell:!0,cwd:e.dir,stdio:`ignore`,env:Ye()});a.on(`error`,i),a.on(`exit`,e=>e===0?r():i(Error(`脚本「${t}」退出码 ${e}`)))}):Promise.reject(Error(`脚本「${t}」被安全检查拦截:${r.reason}`))}function Oy(e){let t=e.startsWith(`chrome://`);process.platform===`darwin`?Ti(`open`,t?[`-a`,`Google Chrome`,e]:[e],{detached:!0,stdio:`ignore`}).unref():process.platform===`win32`?Ti(`cmd`,[`/c`,`start`,``,e],{detached:!0,stdio:`ignore`}).unref():Ti(t?`google-chrome`:`xdg-open`,[e],{detached:!0,stdio:`ignore`}).unref()}const ky=S(`@x-otto/coding:plugin-cli-passthrough`);function Ay(e){let t=e.manifest.contributes?.cli?.bin,n=t?b(e.dir,t):jy(e.dir);if(n)return My(n,e.dir)}function jy(e){let t=b(e,`package.json`);if(E(t))try{let n=JSON.parse(O(t,`utf8`));if(typeof n.bin==`string`)return b(e,n.bin);if(n.bin&&typeof n.bin==`object`){let t=Object.values(n.bin)[0];return typeof t==`string`?b(e,t):void 0}return}catch{return}}function My(e,t){if(!E(e))return;let n,r;try{n=Gr(e),r=Gr(t)}catch{return}let i=r.endsWith(`/`)?r:`${r}/`;if(!n.startsWith(i)&&n!==r){ky.warn({candidate:e,pluginDir:t},`Plugin CLI bin resolves outside plugin directory (symlink escape rejected)`);return}try{if(!Jr(n).isFile())return}catch{return}return n}function Ny(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)){ky.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 Py(e,t){let n=Ny(e,t),r=new Map;for(let[e,t]of n){if(t.length===1){r.set(e,t[0]);continue}ky.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 Fy(e,t,n){let r=Ny(e,t).get(n);return r&&r.length>=2?r.map(e=>e.id):void 0}function Iy(e,t,n,r=6e4){return new Promise((i,a)=>{let o=Ti(e,t,{stdio:`inherit`,cwd:n,env:Ye()}),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))})})}const Ly=S(`@x-otto/coding:plugin-theme-preset-loader`),Ry=new Set([`dark`,`light`,`system`,`builtin`]);function zy(e){let t=[];for(let n of e){let e=n.manifest.contributes?.themePresets;if(!e?.length)continue;if(T(n).gated){Ly.warn({pluginId:n.id},`plugin gated (untrusted), themePresets skipped`);continue}let r=e;r.length>Dn&&(Ly.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(Ry.has(e.localId)){Ly.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{ho as AgentJobService,mt as AgentSession,my as App,xt as CodingSessionPool,Ov as DEFAULT_WORKSPACE_KEY,ja as ExtensionManager,xn as HIGH_RISK_CAPABILITIES,Dv as INDUCTOR_PLUGIN_ID,Gi as InstallManager,wy as PLUGIN_LOG_TAIL_LINES,kn as PLUGIN_MANIFEST_FILENAME,An as POINT,Ki as RegistryClient,jv as SANDBOX_ESCALATION_MARKER,Li as SCHEDULE_LEASE_MIGRATIONS,bt as SandboxUnavailableError,Ri as ScheduleRegistry,zi as SchedulerService,Na as SigilResolverRegistry,m as apiCredentialId,Ey as buildExtensionContext,ua as buildMemoryStore,Py as buildPluginCliRegistry,qi as builtinOfficialSource,Tt as captureFiles,Ji as checkArchiveBomb,Yi as checkGitUpgrades,Bu as checkPluginConsistency,Xi as checkUpgrades,cr as claudeTrustStorePath,Zi as cleanTempDir,Cy as collectPluginPerfMetrics,zy as collectPluginThemePresets,Jc as compilePluginModule,Eu as compilePluginPanels,vy as createApp,Qi as createArchive,Nn as createBuiltinHashtags,Dd as createBuiltinResolvers,lr as createClaudeHookBridgeHooks,Fn as createFileProvider,by as createFrontendPort,Zd as createLessonInjectionHooks,Bi as createLocalFireOwnership,Ln as createPluginInputRegistry,Vi as createRemoteFireOwnership,Hi as createRemoteScheduleStore,Wi as createScheduleStore,kt as createSessionStableInjectionHooks,Qd as createSkillCatalogInjectionHooks,$i as createTempDir,Hd as createToolGuidanceHook,dr as defaultHookRunner,Pt as defaultMaxToolTurnExtensions,Ds as defaultPostInstallExecutor,It as deriveSessionTitle,fr as detectClaudeExecutableSurface,zn as detectPluginExecutableSurface,pr as detectProjectConfigGating,ea as detectUninstallTarget,mr as discoverFileCommands,Bn as discoverPlugins,Hn as dispatch,gr as evaluateClaudeTrust,Wn as evaluatePluginTrust,vr as evaluateWorkspaceTrustPrompt,yr as expandCommandBody,Ha as expandSigilChips,ta as extractArchive,Fy as findPluginCliNameConflict,i as findWorkspaceRoot,Eo as getIncompleteSubagentReason,To as getLastAssistantText,Lt as globalAgentJobRegistry,zt as globalAgentObservability,Vt as globalProcessRegistry,qn as grantPluginCapabilities,Jn as grantedPluginCapabilities,Fu as installPluginFromDir,Pu as installPluginFromPackage,br as interpretPreToolUse,Yn as isPluginTrusted,xr as isProjectTrusted,Cr as isStrictProjectConfigEnabled,na as listInstalledItems,wr as loadClaudeHooksConfig,nl as loadPluginModule,Er as matchesHookMatcher,Kt as messagesFromSnapshot,Oy as openTarget,Dr as parseClaudeHooks,Or as parseDotMcpJson,Zn as parsePluginManifest,ra as parseRegistry,$n as pluginTrustStorePath,mu as purgePluginState,er as readHighRiskCapabilities,Ty as readPluginLogTail,Rv as readSkillLoopStatus,fo as readTaskOutputTail,qt as reconstructMessages,Ru as recordPluginInstalled,zu as recordPluginUninstalled,Lu as removeInstalledPluginEntry,tr as resolveActions,Ar as resolveClaudeMcpServers,Nu as resolvePackageDir,Ay as resolvePluginCliBin,Ca as resolvePluginMcpServers,Mr as resolveProjectConfigTrusted,Yt as resolveSessionTitle,Zt as restoreFiles,Dy as runPluginScript,ia as scanInstalledVersions,ir as sigilOf,Iy as spawnPluginCli,or as trustPlugin,Pr as trustProject,aa as uninstall,sr as untrustPlugin,Fr as untrustProject,Iu as upsertInstalledPluginEntry,oa as validateExtractedPaths};
589
+ user explicitly applies it.`}function Gb(e){return`Draft skill: ${e.taskSignature.length>60?`${e.taskSignature.slice(0,60)}…`:e.taskSignature}`}function Kb(e){try{let t=Hb({pluginId:e.pluginId,workspaceKey:e.workspaceKey,sessionIds:e.brief.sessionIds});return{jobId:e.startJob({title:Gb(e.brief),prompt:Wb(e.brief,t),sessionId:e.sessionId}).id}}catch(t){e.logger?.warn(`skill-loop: failed to start skill draft job: ${t instanceof Error?t.message:String(t)}`);return}}function qb(e){e.hookRegistry.register(Dp(e.toolRegistry,e.getDefaultToolPreset)),e.hookRegistry.register(Oe(e.failureSignals)),e.hookRegistry.register(ke(e.failureSignals)),e.hookRegistry.registerAll(e.contextSourcesBuildHooks(e.workspaceDir,e.memory)),e.memory&&e.hookRegistry.registerAll(nn(e.memory)),e.hookRegistry.registerAll(an({getTodoList:t=>e.getSession(t)?.session.getTodoList()}));let t=/-milestone\.md$/,n=/^Status:\s*Done\b/m;e.hookRegistry.registerAll(en({isDocSyncTrigger:e=>{let r=typeof e.args.path==`string`?e.args.path:``;if(!t.test(r))return!1;let i=typeof e.args.newContent==`string`?e.args.newContent:typeof e.args.content==`string`?e.args.content:``;return n.test(i)}})),e.hookRegistry.registerAll(Rp(e.learningStore,e.promptManager,e.localLearningStore,{evolutionSignals:e.evolutionSignals,workspaceDir:e.workspaceDir},e.memory)),e.skillRegistry&&(e.hookRegistry.registerAll(zp(e.skillRegistry)),e.hookRegistry.registerAll(qp({registry:e.skillRegistry,evolutionSignals:e.evolutionSignals,getConfig:()=>{let t=e.settings.get(`skill_internalization`);return{enabled:t?.enabled===!0,minExecutions:t?.min_executions??Bp.minExecutions,minSuccessRate:t?.min_success_rate??Bp.minSuccessRate,maxInternalized:t?.max_internalized??Bp.maxInternalized}}})),e.hookRegistry.register(kb({registry:e.skillRegistry,resolveCwd:t=>t?w(e.workspaceDir,t):e.workspaceDir,logger:e.logger}))),e.hookRegistry.registerAll(e.claudeHooks),e.hookRegistry.registerAll(Xp()),e.hookRegistry.on(`session.deleted`,`rfc047-notification-detach`,t=>e.notificationDispatcher.detach(t.sessionId));let r=Pb();e.hookRegistry.registerAll(r.hooks),e.hookRegistry.register(Zp(e=>{E.killAllForSession(e)})),e.hookRegistry.registerAll(Qp({registry:e.permissionRegistry,getPersistedAllow:t=>e.codingSessionPool.getSessionPermissionAllow(t)})),e.hookRegistry.register(Ob({getContext:()=>{let t=Pe(e.workspaceDir,at());if(!e.sandbox.enabled)return{mode:`bypass`,projectRoot:e.workspaceDir,writableRoots:[],deniedRoots:t,networkAllowed:!0};let n=e.settings.get(`permission_mode`)??`auto`;return{mode:n,projectRoot:e.workspaceDir,writableRoots:Te(n,e.workspaceDir,ot(),e.sandbox.writablePaths),deniedRoots:t,networkAllowed:e.sandbox.isNetworkAllowed,autoAllowBashIfSandboxed:e.sandbox.autoAllowBashIfSandboxed}}})),e.hookRegistry.registerAll(em(t=>e.getSession(t),e.memoryAutoExtractor,{isEnabled:()=>e.settings.get(`memory_auto_extract`)?.enabled===!0||process.env.OTTO_MEMORY_AUTO_EXTRACT===`1`}));let i=()=>e.settings.get(`skill_loop`)?.enabled===!0||process.env.OTTO_SKILL_LOOP===`1`;return e.hookRegistry.registerAll(tm({isEnabled:i},e.promptManager)),e.hookRegistry.registerAll(Eb({isEnabled:i,getMinMessages:()=>e.settings.get(`skill_loop`)?.min_messages,getCooldownDays:()=>e.settings.get(`skill_loop`)?.dismiss_cooldown_days,notifyServices:e.notifyPluginServices,getWorkspaceKey:e.getWorkspaceKey,getRequestGrill:t=>{let n=e.getSession(t);return n?e=>n.requestGrill({...e,askedBy:`skill-loop`}):void 0},onAccepted:({sessionId:t,brief:n})=>{Kb({startJob:t=>e.startSkillDraftJob({...t,origin:`user`}),brief:n,sessionId:t,pluginId:Cb,workspaceKey:e.getWorkspaceKey()??wb,logger:{warn:t=>e.logger.warn(t)}})},logger:e.logger})),e.hookRegistry.register(Mb({getOnFileEdited:e.getEditFileCallback,dedupCache:e.editFilesDedup})),{agentJobNotify:r.notify}}function Jb(e,t,n,r){return Tp({processOwnerId:e.processOwnerId,orchestrator:e.orchestrator,writeTodos:e.writeTodos,sandbox:t=>e.sandbox.isBypassed(t?.command)?void 0:e.sandbox.current??void 0,autoMemory:e.storage.autoMemory,reloadMemory:e.storage.memory?()=>e.storage.memory.loadMemory():void 0,archiveRecall:e.storage.memory,runTeam:e.runTeam,runSession:e.runSession,fileStateManager:e.fileStateManager,learningStore:e.learningStore,localLearningStore:e.localLearningStore,sessions:{list:()=>e.listSessions(),create:()=>e.createSession(),remove:t=>e.removeSession(t),get:t=>e.getSession(t)},listModels:t=>e.buildModelCatalog(t),startJob:t=>({jobId:e.agentJobs.start({...t,origin:`main`}).id}),getScheduleService:()=>e.scheduleServiceInstance,searchEcosystem:e.searchEcosystem,capabilityGapRecorder:e.capabilityGapRecorder},t,n,r)}function Yb(e,t){return Be(t,Ep(Jb(e,t,e.skillRegistry?Bn(e.skillRegistry,t):void 0,!1))).getAvailable(e.defaultToolPreset)}function Xb(e){return e.toolRegistry.getAvailable(e.defaultToolPreset).filter(e=>e.name.startsWith(`mcp__`))}function Zb(e,t){let n=t.skillProvider??(e.skillRegistry?Bn(e.skillRegistry,e.workspaceDir):void 0);t.sandbox&&e.sandbox.pin(t.sandbox);let r={registerChild(e,t){return{pid:E.registerChild(e,t).pid??0}}};return Be(e.workspaceDir,{...Ep(Jb(e,e.workspaceDir,n,t.lsp===!0)),processTracker:r})}function Qb(e){e.agentJobNotify=qb({hookRegistry:e.hookRegistry,toolRegistry:e.toolRegistry,getDefaultToolPreset:()=>e.defaultToolPreset,failureSignals:e.failureSignals,contextSourcesBuildHooks:(t,n)=>e.agentRuntime.contextSources.sealAndBuildHooks(t,n),workspaceDir:e.workspaceDir,memory:e.storage.memory,learningStore:e.learningStore,localLearningStore:e.localLearningStore,evolutionSignals:e.evolutionSignals,promptManager:e.promptManager,skillRegistry:e.skillRegistry,notificationDispatcher:e.notificationDispatcher,permissionRegistry:e.permissionRegistry,codingSessionPool:e.codingSessionPool,sandbox:e.sandbox,settings:e.settings,getEditFileCallback:()=>e.editFileCallback,editFilesDedup:e._editFilesDedup,memoryAutoExtractor:e.memoryAutoExtractor,getSession:t=>e.getSession(t),notifyPluginServices:t=>e.notifyPluginServices(t),getWorkspaceKey:()=>e.workspaceRef?.key,startSkillDraftJob:t=>e.agentJobs.start(t),claudeHooks:e.compatProducts?.hooks??[],logger:e.logger}).agentJobNotify}function $b(e){return{async readFile(e){try{return await Zi(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return null;throw e}},async writeFile(e,t){await Yi(S(e),{recursive:!0}),await Mn(e,t)},async writeFileExclusive(e,t){await Yi(S(e),{recursive:!0});try{let n=await Xi(e,`wx`);try{await n.writeFile(t,`utf8`)}finally{await n.close()}return!0}catch(e){if(e.code===`EEXIST`)return!1;throw e}},genId:e?.genId??Gi,now:e?.now??(()=>new Date().toISOString())}}function ex(e){return t=>{e?.({type:`plugin.load-failed`,...t})}}function tx(e){return new Tt({persist:Ft(`${r}/signals`),logWarn:(t,n)=>e.warn({err:n},t)})}function nx(e,t){return{record:n=>{e.record(n),t?.({type:`capability_gap.reported`,...n})}}}async function rx(e,t){let n=await e.restoreFromLog();return n>0&&t?.(n),n}async function ix(e){if(e.ensureNotDisposed(),await e.ensureSettingsLoaded(),await rx(e.evolutionSignals,t=>e.logger.info({count:t},`signal log restored %d records`)),!e.workspaceRef&&!e.pendingWorkspaceInit&&!e.parentWorkspaceExisted)try{let t=Wi($b()),n=e._workspaceId?{id:e._workspaceId}:void 0,r=await t.resolveLocal(e.workspaceDir,{...n,autoCreate:!(e._interactive&&!n)});`kind`in r&&r.kind===`uninitialized`?e.pendingWorkspaceInit={root:r.root}:`kind`in r&&r.kind===`parentWorkspaceExisted`?e.parentWorkspaceExisted={parentRoot:r.parentRoot,currentRoot:r.currentRoot,marker:r.marker}:e.workspaceRef=r}catch(t){e.logger.warn({err:t,workspaceDir:e.workspaceDir},`Workspace resolution failed; continuing without workspace identity. Sessions previously saved under a workspace key will not be restored.`)}e.storage.autoMemory&&await e.storage.autoMemory.load(),await St(`skills/agents/teams discovery + plugin module load`,async()=>{if(e.skillRegistry){await e.skillRegistry.discover();for(let t of e.settings.get(`disabled_skills`)??[])e.skillRegistry.disable(t);let t=new Set(e.settings.get(`disabled_plugins`)??[]);if(t.size>0)for(let[n,r]of e.skillRegistry.getAll())r.source?.type===`plugin`&&r.source.id&&t.has(r.source.id)&&e.skillRegistry.disable(n)}e.declarativeAgentProfiles=await zc(e.workspaceDir,{plugins:e.activePlugins(),claudeProjectAgentsAllowed:e.compatProducts?!e.compatProducts.trustVerdict.gated:void 0}),e.declarativeTeams=await Gc(e.workspaceDir);let t=await e.pluginModuleManager.reload(new Set(e.declarativeAgentProfiles.map(e=>e.name)));e.declarativeAgentProfiles.push(...t),e._pendingProviderCapabilities=(await e.pluginProviderManager.reload()).pendingCapabilityPluginIds,await e.diagnoseTopoSortIssues()});let t=()=>St(`mcpController.start()`,()=>e.mcpController.start()).then(t=>(e.syncSessionTools(),e.onMcpStartupSettled?e.onMcpStartupSettled(t):e.pendingMcpStartupResult=t,t)).catch(t=>(e.logger.warn({err:t instanceof Error?t.message:String(t)},`mcpController.start() failed unexpectedly (non-blocking path)`),{connected:0,failed:0}));e._interactive?t():await t(),e.pendingWorkspaceInit?e.logger.info({workspaceDir:e.workspaceDir},`Workspace identity pending trust confirmation; session restore deferred`):e.parentWorkspaceExisted?e.logger.info({workspaceDir:e.workspaceDir,parentRoot:e.parentWorkspaceExisted.parentRoot},`Parent workspace detected; waiting for user choice (adopt parent or create new)`):e._interactive?await St(`completeWorkspaceDependentStartup (session restoreAll)`,()=>ax(e)):St(`sweepOrphanTraceFiles (headless)`,()=>fx(e)),e._memoryGovernor.setCallbacks({onWarning:()=>{let t=e.getActiveSession();t&&t.compactNow().catch(t=>{e.logger.warn({err:t instanceof Error?t.message:String(t)},`[memory-governor] headless compactNow (soft degrade) failed`)})},onCritical:t=>{let n=process.env.OTTO_HEADLESS_OOM_POLICY??`log-only`;e.logger.error({policy:n,level:t.level,usedPct:t.usedPct,heapUsed:t.heapUsed},`[memory-governor] critical memory threshold reached (headless/service)`),n===`graceful-exit`&&px(e).finally(()=>process.exit(1))},onSample:t=>{e._residencyGovernor.setLevel(t.level);let n=performance.getEntriesByType(`measure`).length;n>5e4&&(performance.clearMeasures(),performance.clearMarks(),e.logger.warn({measureCount:n},`[memory-governor] user-timing buffer exceeded guard threshold — cleared (likely a dev-mode library leaking performance.measure; see a7eaa826)`));let r=e.getActiveSession()?.id;r&&e.storage.traceStore.append(r,{ts:t.ts,sessionId:r,kind:`lifecycle`,node:`process.memory.sample`,payload:{pid:process.pid,level:t.level,heapUsed:t.heapUsed,heapSizeLimit:t.heapSizeLimit,usedPct:Number(t.usedPct.toFixed(2)),rss:t.rss,external:t.external}}).catch(t=>{e.logger.warn({err:t instanceof Error?t.message:String(t)},`[memory-governor] trace sample append failed`)})}}),e._memoryGovernor.start(),e._fleetMonitor.setCallbacks({onSample:t=>{let n=e.getActiveSession()?.id;n&&e.storage.traceStore.append(n,{ts:t.ts,sessionId:n,kind:`lifecycle`,node:`process.fleet.sample`,payload:{pid:process.pid,processCount:t.processCount,totalRssMb:t.totalRssMb,suspectedOrphanCount:t.suspectedOrphanCount,maxGeneration:t.maxGeneration}}).catch(t=>{e.logger.warn({err:t instanceof Error?t.message:String(t)},`[fleet-monitor] trace sample append failed`)})}}),e._fleetMonitor.start(),vt(`app.start() internal phases complete`),e.logger.info(`App started`)}async function ax(e){if(e.workspaceRef&&e.planeRegistry.migrateWorkspaceGrid(`default`,e.workspaceRef.key),e.codingSessionPool.autoPersist){let t=await e.codingSessionPool.restoreAll();if(t>0){e.logger.info({count:t},`Sessions restored from storage`);for(let t of e.listSessions()){let n=e.getSession(t.id);n&&e.notificationDispatcher.attach(n)}}}fx(e)}function ox(e){return!!e.pendingWorkspaceInit}function sx(e){return!!e.parentWorkspaceExisted}async function cx(e){let t=e.parentWorkspaceExisted;if(!t)return e.workspaceRef;e.parentWorkspaceExisted=void 0;try{return e.workspaceRef=await Wi($b()).resolveLocal(t.parentRoot),await ax(e),e.workspaceRef}catch(n){e.parentWorkspaceExisted=t,e.logger.warn({err:n,parentRoot:t.parentRoot},`Failed to adopt parent workspace; continuing without workspace identity. Will retry on next startup.`);return}}async function lx(e){let t=e.parentWorkspaceExisted;if(!t)return e.workspaceRef;e.parentWorkspaceExisted=void 0;try{return e.workspaceRef=await Wi($b()).createLocal(t.currentRoot),await ax(e),e.workspaceRef}catch(n){e.parentWorkspaceExisted=t,e.logger.warn({err:n,currentRoot:t.currentRoot},`Failed to create new workspace; continuing without workspace identity. Will retry on next startup.`);return}}async function ux(e){let t=e.pendingWorkspaceInit;if(!t)return e.workspaceRef;e.pendingWorkspaceInit=void 0;try{return e.workspaceRef=await Wi($b()).createLocal(t.root),await ax(e),e.workspaceRef}catch(n){e.pendingWorkspaceInit=t,e.logger.warn({err:n,root:t.root},`Workspace identity creation failed; continuing without workspace identity. Will retry on next startup.`);return}}async function dx(e,t){let n=e.workspaceRef?.root;if(!n)return!1;let r=$b(),i=await Ki(n,r);if(!i)return!1;if(!t&&i.memorySyncEnabled){try{await e.storage.autoMemory?.load()}catch{}try{await e.learningStore.refresh()}catch{}}let a=t?{...i,memorySyncEnabled:!0}:{id:i.id,name:i.name,createdAt:i.createdAt};return await Ji(n,a,r),e.workspaceRef={key:qi(a.id),id:a.id,root:n,...a.memorySyncEnabled?{memorySyncEnabled:!0}:{}},!0}async function fx(e){let t=e.sessionStorageDir,n=e.sessionRepoRef?.current;if(!t||!n)return;let r=process.env.OTTO_TRACE_SWEEP;if(r!==`off`)try{let{sweepOrphanTraces:i}=await import(`./trace-orphan-sweeper-BdEIlLfB.js`),a=new Set(await n.listAllSessionIds());for(let t of e.codingSessionPool.listSessions())a.add(t.id);await i({dirs:[C(t,`trace`),C(t,`checkpoint`)],liveSessionIds:a,logger:e.logger,mode:r===`dry-run`?`dry-run`:`delete`})}catch(t){e.logger.warn({err:t instanceof Error?t.message:String(t)},`Orphan trace sweep failed`)}}async function px(e){if(e.disposed)return;e.disposed=!0;let t=[],n=async(e,n)=>{try{await n()}catch(n){t.push(Error(`stop:${e}: ${n.message}`))}};e.codingSessionPool.autoPersist&&await n(`saveSessions`,()=>e.codingSessionPool.saveAll()),await n(`processRegistryUnsubs`,()=>{for(let t of e.processRegistryUnsubs)t();e.processRegistryUnsubs.length=0}),await n(`bgProcesses`,()=>E.killAllForOwner(`app`,e.processOwnerId)),await n(`mcpController`,()=>e.mcpController.stop()),await n(`processRuntime`,()=>E.killAll()),await n(`scheduleService`,()=>e.scheduleServiceInstance?.stop()),await n(`memoryGovernor`,()=>e._memoryGovernor.dispose()),await n(`fleetMonitor`,()=>e._fleetMonitor.dispose()),await n(`agentJobs`,()=>e.agentJobServiceInstance?.dispose()),await n(`settings`,()=>e.settings.dispose()),await n(`toolRegistry`,()=>e.toolRegistry.dispose()),await n(`orchestrator`,()=>e.orchestrator.dispose()),await n(`notification`,()=>e.notificationDispatcher.dispose()),await n(`agentRuntime`,()=>e.agentRuntime.dispose()),await n(`hooks`,()=>{for(let t of e.ownedHookNames)e.hookRegistry.unregister(t);e.ownedHookNames.length=0}),await n(`pluginModules`,()=>e.pluginModuleManager.cleanup()),await n(`pluginProviders`,()=>e.pluginProviderManager.cleanup()),await n(`pluginWorkers`,()=>Hu()),await n(`pluginServices`,()=>vu()),await n(`sandbox`,()=>e.sandbox.dispose()),e.devtools&&await n(`devtools`,()=>e.devtools.stop()),await n(`logSub`,()=>{e.globalLogSubscription&&=(e.globalLogSubscription(),null)}),await n(`traceStore`,()=>e.storage.traceStore.close?.()),await n(`checkpointStore`,()=>e.storage.checkpointStore.close?.()),await n(`signalLog`,()=>e.evolutionSignals.close()),await n(`authStore`,()=>e._authStore.dispose()),await n(`planeRegistry`,()=>e.planeRegistry.dispose()),t.length>0&&e.logger.warn({count:t.length,errors:t.map(e=>e.message)},`stop: %d subsystems reported errors`),e.logger.info(`App stopped`)}function mx(e){return e.filter(e=>e.type===`text`).map(e=>e.text).join(`
590
+ `)}function hx(e){return typeof e==`string`?e:mx(e)}function gx(e){return mx(e)}function _x(e){return mx(e)}function vx(e){let{sessionId:t,entries:n,signals:r=[]}=e,i=[],a=0,o=-1,s=e=>{i.push({sessionId:t,seq:a++,...e})};for(let e of n){if(e.type===`message`){let t=e.message;if(t.role===`system`||t.role===`system_notification`)continue;if(t.role===`user`){o+=1,s({kind:`turn.start`,at:e.timestamp,turnIndex:o}),s({kind:`user.message`,at:e.timestamp,turnIndex:o,text:hx(t.content)});continue}if(t.role===`assistant`){s({kind:`assistant.message`,at:e.timestamp,turnIndex:o,text:gx(t.content),model:t.model,usage:{input:t.usage.inputTokens,output:t.usage.outputTokens},stopReason:t.stopReason});for(let n of ba(t))s(yx(n,e.timestamp,o));continue}if(t.role===`tool_result`){s({kind:`tool.result`,at:e.timestamp,turnIndex:o,toolCallId:t.toolCallId,toolName:t.toolName,isError:t.isError,summary:_x(t.content)});continue}continue}if(e.type===`compaction`){if(e.replacementStripped)continue;s({kind:`compaction`,at:e.timestamp,boundaryId:e.id,summary:e.summary,compactedCount:e.compactedCount});continue}}for(let e of r)e.sessionId===t&&s({kind:`signal`,at:e.at,signalKind:e.kind,key:e.key,value:e.value,...e.detail===void 0?{}:{detail:e.detail}});return i}function yx(e,t,n){return{kind:`tool.call`,at:t,turnIndex:n,toolCallId:e.id,toolName:e.name,arguments:e.arguments}}function bx(e){let t=[...e.records].sort((e,t)=>e.seq-t.seq),n=0,r=0;for(let i of t){let t=i;if(e.redact){try{t=e.redact(i)}catch{r+=1;continue}if(t===void 0){r+=1;continue}}e.output.write(`${JSON.stringify(t)}\n`),n+=1}return{written:n,suppressed:r}}function xx(e,t,n){return e.filter(e=>(t==null||e.seq>t)&&e.seq<n)}async function Sx(e){let t=await e.repo.getEntryCount(e.sessionId),n=xx(await e.repo.loadEntries(e.sessionId,e.sinceSeq),e.sinceSeq,t);for(let t of n){if(t.type!==`compaction`)continue;let n=t.data?.summary;if(typeof n!=`string`||n.length===0)throw Error(`轨迹导出失败:会话 ${e.sessionId.slice(0,8)} 的 compaction 条目 ${t.entryId.slice(0,8)} 缺 summary(blob 完整性 fail-fast)。`)}let r=n.map(e=>xi(e));return{...bx({records:vx({sessionId:e.sessionId,entries:r,signals:e.signals??[]}),redact:e.redact,output:e.output}),upperSeq:t,entryCount:n.length}}function Cx(){let e=[];return{lines:e,write(t){return e.push(t),!0}}}async function wx(e,t,n={}){let r=t.sessionRepoRef.current;if(!r)throw Error(`轨迹导出仅支持关系化 SQLite 后端(sessions.db)。当前后端不支持。`);let i=t.evolutionSignals.list();if(n.output)return Sx({sessionId:e,repo:r,redact:n.redact,output:n.output,signals:i});let a=Cx();return{...await Sx({sessionId:e,repo:r,redact:n.redact,output:a,signals:i}),lines:a.lines}}async function Tx(e){let t=await e.capabilityReloader.reload();return e.applyResults({agentProfiles:t.agentProfiles,teamDeclarations:t.teamDeclarations,pendingProviderCapabilities:t.pendingProviderCapabilities}),await e.diagnoseTopoSortIssues(),e.syncSessionTools(),e.panelBackendController.notifyReload(),{mcpTools:t.mcpTools,models:t.models,agents:t.agents,teams:t.teamCount,pendingProviderCapabilities:t.pendingProviderCapabilities,i18nEntries:t.i18nEntries,agentProfiles:t.agentProfiles,teamDeclarations:t.teamDeclarations,...t.reloadFailures?{reloadFailures:t.reloadFailures}:{}}}let Ex=0;function Dx(e){let t=`__ottoResidencyDiagnostics`,n=globalThis;n[t]||Object.defineProperty(n,t,{configurable:!1,enumerable:!1,writable:!1,value:Object.freeze({getResidency:()=>e.getResidencyDiagnostics()})})}var Ox=class{processOwnerId=`app-${++Ex}`;get processOwner(){return this.processOwnerId}settings;toolRegistry;hookRegistry;planeRegistry=new Ht;providerRegistry;wireProtocolRegistry;agentRuntime;codingSessionPool;permissionRegistry;auditLog;logger;sessionRepoRef;sessionStorageDir;get workspaceDir(){return this.workspaceRef?.root??this._workspaceDir}_workspaceDir;_workspaceId;_interactive;_shadow;_pluginHomedir;_pluginBundledDirs;workspaceRef;pendingWorkspaceInit;parentWorkspaceExisted;maxSessions;maxToolTurns;maxToolTurnExtensions;promptOutputTokenBudget;promptWallClockBudgetMs;sessionCostBudgetUSD;stallDetection;devtools=null;editFileCallback=void 0;_editFilesDedup=new Set;storage;userMemory=new Ct({store:(()=>{let e=new Dt(at());return c()?Pt(e):e})()});completeText;clock;fileStateManager;learningStore;localLearningStore;memoryAutoExtractor;promptManager;orchestrator;runSession;writeTodos;sessionConfigResolver;session;model;notifications;permissions;runTeam;skillRegistry;i18nRegistry;_pendingProviderCapabilities=[];get pendingProviderCapabilities(){return this._pendingProviderCapabilities}declarativeAgentProfiles=[];compatProducts;extensions;pluginInput=pr();sigilResolvers=new bo;expandSigilChips(e,t){return ko(e,this.sigilResolvers,{workspaceDir:this.workspaceDir},{...t,lookupResolverId:e=>{for(let t of this.pluginInput.getAll())if(t.value===e&&t.resolverId)return t.resolverId}})}feedbackRegistry=new yo;getShortcuts(){return this.settings.get(`shortcuts`)??[]}async saveShortcut(e,t,n){let r=e.trim();if(!r||!/^[A-Za-z0-9_-]+$/.test(r))throw Error(`invalid shortcut name: ${JSON.stringify(e)}`);if(!t.trim())throw Error(`shortcut text cannot be empty`);let i=this.getShortcuts();if(i.some(e=>e.name===r&&e.name!==n))throw Error(`shortcut name already exists: ${r}`);let a=[...n?i.filter(e=>e.name!==n):i,{name:r,text:t}];await this.settings.persist({shortcuts:a},`project`)}async deleteShortcut(e){let t=this.getShortcuts(),n=t.filter(t=>t.name!==e);n.length!==t.length&&await this.settings.persist({shortcuts:n},`project`)}declarativeTeams=[];mcpController;panelBackendController;get mcpManager(){return this.mcpController.manager}disposed=!1;ownedHookNames=[];failureSignals=new be;diagnoser=new ye(this.failureSignals);pluginHealthTracker=wl();pluginCapabilityQuota=new Dl;inquiryCenter=new kl;userAskRenderer;userAskSeq=0;processRegistryUnsubs=[];settingsLoaded=!1;lastSettingsConfig=null;_resilienceOverride;_resilienceConfig;defaultToolPreset=`full`;permissionSync;sandbox;_memoryGovernor;_residencyGovernor;_fleetMonitor;get tools(){return this.toolRegistry.getAvailable(this.defaultToolPreset)}agentJobNotify;agentJobServiceInstance;scheduleServiceInstance;searchEcosystem;evolutionSignals;notificationDispatcher;presenceTracker;followUpPendingProbe;toolsSyncCoordinator;onMcpStartupSettled;pendingMcpStartupResult;setMcpStartupCallback(e){this.onMcpStartupSettled=e,this.pendingMcpStartupResult&&=(e(this.pendingMcpStartupResult),void 0)}pluginContributionsFacade;buildToolsForWorkspace(e){return Yb(this,e)}connectorTools(){return Xb(this)}get agentJobs(){return this.agentJobServiceInstance||=hs({workspaceDir:this.workspaceDir,agentJobNotify:this.agentJobNotify,buildToolsForWorkspace:e=>this.buildToolsForWorkspace(e),connectorTools:()=>this.connectorTools(),settings:this.settings,modelRegistry:this.modelRegistry,stream:this.codingSessionPool.stream,logger:this.logger,hookRegistry:this.hookRegistry}),this.agentJobServiceInstance}setScheduleService(e){this.scheduleServiceInstance=e,this.pluginModuleManager?.reconcileServiceSchedules()}setEcosystemSearch(e){this.searchEcosystem!==e&&(this.searchEcosystem=e,this.reloadCapabilities().catch(e=>{this.logger.warn({err:e instanceof Error?e.message:String(e)},`Failed to refresh capability_gap after ecosystem search injection`)}))}get memoryGovernor(){return this._memoryGovernor}get fleetMonitor(){return this._fleetMonitor}get modelRegistry(){return this._modelRegistry}get authStore(){return this._authStore}modelCatalogManager;_modelRegistry;_authStore;getAllModels(){return this.model.getAllModels()}resolveModel(e){return this.model.resolveModel(e)}listProviders(){return this.model.listProviders()}registerHook(e){Es(this,e)}unregisterHook(e){return Ds(this,e)}async hydrateModelCache(){return this.model.hydrateModelCache()}getSessionAvailableModels(e){return this.model.getSessionAvailableModels(e)}async refreshModels(){return this.model.refreshModels()}async reloadCapabilities(){let{agentProfiles:e,teamDeclarations:t,...n}=await Tx({capabilityReloader:this.capabilityReloader,applyResults:e=>{this.declarativeAgentProfiles=e.agentProfiles,this.declarativeTeams=e.teamDeclarations,this._pendingProviderCapabilities=e.pendingProviderCapabilities},diagnoseTopoSortIssues:()=>this.diagnoseTopoSortIssues(),syncSessionTools:()=>this.syncSessionTools(),panelBackendController:this.panelBackendController});return n}syncSessionTools(){return this.toolsSyncCoordinator.resync()}syncSessionToolsFor(e){return this.toolsSyncCoordinator.resyncOne(e)}pluginTopology=new xf;pluginModuleManager;capabilityGapStore=new Le;capabilityGapRecorder;pluginProviderManager;capabilityReloader;computedPluginCommands(){return this.pluginContributionsFacade.computedPluginCommands()}pluginCliCommands(){return this.pluginContributionsFacade.pluginCliCommands()}pluginSlashCommands(){return this.pluginContributionsFacade.pluginSlashCommands()}get sessionManager(){return this.codingSessionPool}getResidencyDiagnostics(){return this.codingSessionPool.getResidencyDiagnostics()}globalLogSubscription=null;constructor(e){let{inspect:t,logger:n,projectConfigPath:r,maxSessions:i,maxToolTurns:a,maxToolTurnExtensions:o,promptOutputTokenBudget:s,promptWallClockBudgetMs:l,sessionCostBudgetUSD:u,stallDetection:d,workspaceDir:f,workspaceId:p,pluginHomedir:m,pluginBundledDirs:h}=e;this.maxSessions=i??gi,this.maxToolTurns=a??Wt.maxToolTurns,this.maxToolTurnExtensions=o,this.promptOutputTokenBudget=s,this.promptWallClockBudgetMs=l,this.sessionCostBudgetUSD=u,this.stallDetection=d,this._workspaceDir=f??process.cwd(),this._workspaceId=p,this._interactive=e.interactive??!1,this._shadow=e.shadow??c(),this._pluginHomedir=m??at(),this._pluginBundledDirs=h??[],this._resilienceOverride=e.resilience,this.logger=T(n.name,{level:n.level,destination:n.destination}),this.evolutionSignals=tx(this.logger);let g={};this.sessionRepoRef=g,this.sessionStorageDir=e.storage?.session&&`dir`in e.storage.session?e.storage.session.dir:void 0;let _=dp({logger:this.logger,hookRegistry:e.hookRegistry,getToolRegistry:()=>this.toolRegistry,getPermissionRegistry:()=>this.permissionRegistry,onHookTimeout:({hookName:e,timeoutMs:t})=>{let n=nl(e);n&&this.pluginHealthTracker.recordHookTimeout(n,e)}});this.sandbox=_.sandbox,this._memoryGovernor=_.memoryGovernor,this._residencyGovernor=_.residencyGovernor,this._fleetMonitor=_.fleetMonitor,this.permissionSync=_.permissionSync,this.hookRegistry=_.hookRegistry;let te=Sf(e,()=>this.settings);this._authStore=te.authStore,this._modelRegistry=te.modelRegistry,this.providerRegistry=te.providerRegistry,this.wireProtocolRegistry=te.wireProtocolRegistry,this.modelCatalogManager=te.modelCatalogManager;let ne=te.defaultModel,re=te.resolveEffectiveModel,ie=e.modelId,ae=$a({options:e,workspaceDir:this.workspaceDir,providerRegistry:this.providerRegistry,defaultModel:ne,resolveEffectiveModel:re,repoRef:g,getWorkspaceRef:()=>this.workspaceRef,onMemoryConflict:e.onMemoryConflict,getActiveSessionBytes:()=>{let e=this.codingSessionPool?.active?.session;return e instanceof mi?e.estimatedContentBytes:void 0},getRealInputTokens:()=>this.codingSessionPool?.active?.getLastTotalInputTokens(),getToolRegistry:()=>this.toolRegistry,getEffectiveMaxBytes:()=>{let e=this.codingSessionPool;if(e)return e.getResidencyDiagnostics().maxBytesPerSession},getCoverageThresholds:Ya(()=>this.settings.get(`residency`)),...Ja(e=>this.codingSessionPool?.getSession?.(e)?.session,()=>this.codingSessionPool?.active?.session)});this.storage={storageHost:ae.storageHost,autoMemory:ae.autoMemory,memory:ae.memory,traceStore:ae.traceStore,traceLive:ae.traceLive,checkpointStore:ae.checkpointStore,remoteMemoryConfigured:!!(e.storage?.remote?.getAuth&&e.storage?.session&&`url`in e.storage.session),remoteSessionConfigured:!!(e.storage?.session&&`url`in e.storage.session)},this.clock=ae.clock;let se=fp({inspect:t,loggerName:n.name,workspaceDir:this.workspaceDir,projectConfigPath:r,interactive:this._interactive,permissionSync:this.permissionSync,sandbox:this.sandbox,onSettingsApplied:e=>{this.settingsLoaded=!0,e.tool_preset&&(this.defaultToolPreset=e.tool_preset)},getI18nRegistry:()=>this.i18nRegistry});this.devtools=se.devtools,this.globalLogSubscription=se.logSubscription,this.settings=se.settings;let ce=bs({getConfig:()=>this.settings.get(`notification`),getCwd:()=>this.workspaceDir,isFollowUpPending:()=>this.followUpPendingProbe?.()??!1,emitHookNotification:e=>void this.hookRegistry.emit(`notification`,e)});this.notificationDispatcher=ce.dispatcher,this.presenceTracker=ce.presenceTracker,this.compatProducts=io(this.workspaceDir,this.activePlugins());let le=this.settings,ue=ro({skillProvider:e.skillProvider,workspaceDir:this.workspaceDir,activePlugins:()=>this.activePlugins(),resolveEffectiveModel:re,providerRegistry:this.providerRegistry,prompt:e.prompt,compatProducts:this.compatProducts,memoryStore:ae.memoryStore,evolutionSignals:this.evolutionSignals,memoryAutoExtractConfig:{enabled:!0,get everyNTurns(){return le.get(`memory_auto_extract`)?.every_n_turns},get maxLessons(){return le.get(`memory_auto_extract`)?.max_lessons},get similarityThreshold(){return le.get(`memory_auto_extract`)?.similarity_threshold},get minRelevantHits(){return le.get(`memory_auto_extract`)?.min_relevant_hits}}});this.skillRegistry=ue.skillRegistry,this.fileStateManager=ue.fileStateManager,this.learningStore=ue.learningStore,this.localLearningStore=ue.localLearningStore,this.memoryAutoExtractor=ue.memoryAutoExtractor,this.completeText=ue.completeText,this.promptManager=ue.promptManager;let de=oe(this._authStore,`delegation`),fe=pp({getModelRegistry:()=>this.modelRegistry,providerRegistry:this.providerRegistry,authStore:this._authStore,getSettings:()=>this.settings,promptManager:this.promptManager,getTools:()=>this.tools,getDeclarativeAgentProfiles:()=>this.getEnabledAgentProfiles(),defaultModel:ne,explicitModelId:ie,isModelUsable:de,maxToolTurns:this.maxToolTurns,maxToolTurnExtensions:this.maxToolTurnExtensions,promptOutputTokenBudget:this.promptOutputTokenBudget,promptWallClockBudgetMs:this.promptWallClockBudgetMs,sessionCostBudgetUSD:this.sessionCostBudgetUSD,stallDetection:this.stallDetection,workspaceDir:this.workspaceDir,getWorkspaceRef:()=>this.workspaceRef,workspaceId:this._workspaceId,logger:this.logger,getResilienceConfig:()=>this.getResilienceConfig()}),pe=fe.visionDelegateService;this.sessionConfigResolver=fe.sessionConfigResolver;let me=mp({options:e,hookRegistry:this.hookRegistry,providerRegistry:this.providerRegistry,getModelRegistry:()=>this._modelRegistry,logger:this.logger,workspaceDir:this.workspaceDir,getTools:()=>this.tools,getDeclarativeAgentProfiles:()=>this.getEnabledAgentProfiles(),getWorkspaceRef:()=>this.workspaceRef,repoRef:g,maxToolTurns:this.maxToolTurns,promptManager:this.promptManager,memory:this.storage.memory,traceStore:this.storage.traceStore,checkpointStore:this.storage.checkpointStore,clock:this.clock,devtools:this.devtools??void 0,residencyGovernor:this._residencyGovernor,getResidencyConfig:()=>this.getResidencyConfig(),visionDelegateService:pe,resolveEffectiveModel:re,defaultModel:ne,planeRegistry:this.planeRegistry,semanticReviewer:wp({getPermissionMode:()=>this.getPermissionMode(),isSemanticReviewEnabled:()=>this.settings.get(`sandbox`)?.semanticReview===!0,resolveReviewModel:()=>{let e=re();if(e)return ee(`compact`,e,this._modelRegistry)[0]??e},createLlmReviewer:e=>tn({stream:this.codingSessionPool.stream,model:e})})});this.agentRuntime=me.agentRuntime,this.codingSessionPool=me.codingSessionPool,Dx(this);let he=me.swarmAgentRunner,ge=hp({hookRegistry:this.hookRegistry,stream:this.codingSessionPool.stream,logger:this.logger,defaultModel:me.defaultModel,providerRegistry:this.providerRegistry,getDeclarativeTeams:()=>this.declarativeTeams,getDeclarativeAgentProfiles:()=>this.getEnabledAgentProfiles(),getSession:e=>this.getSession(e),createSession:e=>this.createSession(e),removeSession:e=>this.removeSession(e),sessionConfigResolver:this.sessionConfigResolver,swarmAgentRunner:he,workflowConfig:{retry:this.settings.get(`workflow`)?.retry,circuitBreaker:this.settings.get(`workflow`)?.circuitBreaker,orchestration:this.settings.get(`workflow`)?.orchestration}});this.orchestrator=ge.orchestrator,this.runSession=ge.runSession,this.runTeam=ge.runTeam,this.writeTodos=ge.writeTodos,this.toolRegistry=this.initToolRegistry(e);let _e=yp({toolRegistry:this.toolRegistry,hookRegistry:this.hookRegistry,settings:this.settings,workspaceDir:this.workspaceDir,logger:this.logger,getResilienceConfig:()=>this.getResilienceConfig(),compatProducts:this.compatProducts});this.permissionRegistry=_e.permissionRegistry,this.auditLog=_e.auditLog,this.mcpController=_e.mcpController;let ve=_e.preExistingHooks;this.extensions=bp({settings:this.settings,mcpController:this.mcpController,skillRegistry:this.skillRegistry,declarativeAgentProfiles:this.declarativeAgentProfiles,workspaceDir:this.workspaceDir,pluginHomedir:this._pluginHomedir,pluginBundledDirs:this._pluginBundledDirs,onPluginToggle:(e,t)=>{this.pluginModuleManager?.emitMonitorEvent({type:t?`plugin.enabled`:`plugin.disabled`,pluginId:e})}}),this.panelBackendController=gp({mcpController:this.mcpController,callMcpTool:(e,t,n)=>this.callMcpTool(e,t,n),getActivePlugins:()=>this.activePlugins()}).panelBackendController;let ye=xp({pluginInput:this.pluginInput,sigilResolvers:this.sigilResolvers,settings:this.settings,workspaceDir:this.workspaceDir,activePlugins:()=>this.activePlugins(),agentRuntime:this.agentRuntime,hookRegistry:this.hookRegistry,preExistingHooks:ve,codingSessionPoolGet:e=>this.codingSessionPool.getSession(e),logger:this.logger,registerHooks:()=>this.registerHooks()});this.ownedHookNames=ye.ownedHookNames,this.processRegistryUnsubs=ye.processRegistryUnsubs,this.i18nRegistry=new or;let be=_p({hookRegistry:this.hookRegistry,skillRegistry:this.skillRegistry,providerRegistry:this.providerRegistry,wireProtocolRegistry:this.wireProtocolRegistry,modelRegistry:this._modelRegistry,authStore:this._authStore,toolRegistry:this.toolRegistry,feedbackRegistry:this.feedbackRegistry,sigilResolverRegistry:this.sigilResolvers,pluginInput:this.pluginInput,workspaceDir:this.workspaceDir,activePlugins:()=>this.activePlugins(),callMcpTool:(e,t,n)=>this.callMcpTool(e,t,n),startPluginJob:({pluginId:e,title:t,prompt:n,sessionId:r})=>this.agentJobs.start({title:`[${e}] ${t}`,prompt:n,sessionId:r,origin:`plugin`}),getPluginJobSessionId:()=>this.getActiveSession()?.id,getSessionMessages:e=>this.getSession(e)?.session.messages().filter(e=>e.role===`user`||e.role===`assistant`||e.role===`tool_result`),completeText:(e,t)=>this.completeText(e,t),capabilityQuota:this.pluginCapabilityQuota,askUser:(e,t)=>this.askPluginUser(e,t),getWorkspaceKey:()=>this.workspaceRef?.key,logger:this.logger,onPluginLoadError:(e,t,n)=>{this.pluginHealthTracker.recordError(e,t),ex(this.pluginModuleManager?.emitMonitorEvent.bind(this.pluginModuleManager))({pluginId:e,reason:n,message:t})},getSchedulePort:()=>this.scheduleServiceInstance,settings:this.settings,mcpController:this.mcpController,skillRegistryForReloader:this.skillRegistry,modelCatalogManager:this.modelCatalogManager,getActivePluginsForReloader:()=>this.activePlugins(),i18nRegistry:this.i18nRegistry,getCompatTrustGated:()=>this.compatProducts?.trustVerdict.gated??!0,getSettingValue:e=>{try{return this.settings.get(e)}catch{return}},planeRegistry:this.planeRegistry});this.pluginModuleManager=be.pluginModuleManager,this.capabilityGapRecorder=nx(this.capabilityGapStore,this.pluginModuleManager.emitMonitorEvent.bind(this.pluginModuleManager)),this.pluginProviderManager=be.pluginProviderManager,this.capabilityReloader=be.capabilityReloader,this.toolRegistry.onMutation=e=>{this.permissionSync.sync(this.settings.config);for(let t of e.added??[])this.pluginModuleManager.emitMonitorEvent({type:`tool.registered`,toolName:t,source:e.source});for(let t of e.removed??[])this.pluginModuleManager.emitMonitorEvent({type:`tool.unregistered`,toolName:t,source:e.source})},this.settings.on(`change`,e=>{let t=e,n=this.lastSettingsConfig;if(this.lastSettingsConfig=t,!n)return;let r=new Set([...Object.keys(n),...Object.keys(t)]),i=[];for(let e of r)n[e]!==t[e]&&i.push(e);i.length>0&&this.pluginModuleManager.emitMonitorEvent({type:`settings.changed`,keys:i})});let xe=vp({sessionConfigResolver:this.sessionConfigResolver,getSession:e=>this.codingSessionPool.getSession(e),listSessionIds:()=>this.codingSessionPool.listSessions().map(e=>e.id),logger:this.logger,workspaceDir:this.workspaceDir,settings:this.settings,pluginModuleManager:this.pluginModuleManager,mcpController:this.mcpController,getActivePlugins:()=>this.activePlugins(),compatProducts:this.compatProducts});this.toolsSyncCoordinator=xe.toolsSyncCoordinator,this.pluginContributionsFacade=xe.pluginContributionsFacade,this.session=new nc(this),this.model=new Ns(this),this.notifications=new Rs(this),this.permissions=new Gs(this)}deferredConfigSteps(){return[{label:`resilience-config`,apply:()=>{this.freezeResilienceConfig()}},{label:`residency-config`,apply:()=>{this.freezeResidencyConfig()}},{label:`memory-governor-thresholds`,apply:()=>{let e=this.settings.get(`residency`);e&&this._memoryGovernor.updateThresholds({warnThresholdPct:e.warn_threshold_pct,hardThresholdPct:e.hard_threshold_pct})}},{label:`auth-store-lock-timeout`,apply:()=>{this._authStore.setRefreshLockTimeoutMs(this.getResilienceConfig().oauth.refreshLockTimeoutMs)}}]}async ensureSettingsLoaded(){await Sp(this.settings,()=>this.settingsLoaded,e=>{this.settingsLoaded=e}),Cp(this.deferredConfigSteps())}freezeResilienceConfig(){if(this._resilienceConfig!==void 0)return;let e=ji(process.env.OTTO_RESILIENCE_CONFIG),t=this._resilienceOverride?Pi(this._resilienceOverride):void 0;this._resilienceConfig=l(e,this.settings.get(`resilience`),t)}_residencyConfig;freezeResidencyConfig(){if(this._residencyConfig!==void 0)return;let e=this.settings.get(`residency`);this._residencyConfig={totalBytes:e?.total_bytes,minPerSessionBytes:e?.min_per_session_bytes,maxPerSessionBytes:e?.max_per_session_bytes,maxContentBytes:e?.max_content_bytes,maxHistoryMessages:e?.max_history_messages,resumeWindowMessages:e?.resume_window_messages,compactionTimeoutMs:e?.compaction_timeout_ms}}getResidencyConfig(){return this._residencyConfig}getResilienceConfig(){if(this._resilienceConfig===void 0)throw Error(`getResilienceConfig() called before settings are loaded — call after ensureSettingsLoaded()/start()`);return this._resilienceConfig}async allowToolAlways(e,t){return this.permissions.allowToolAlways(e,t)}getPermissionMode(){return this.permissions.getPermissionMode()}async setPermissionMode(e){return this.permissions.setPermissionMode(e)}getSessionAlwaysAllow(e){return this.permissions.getSessionAlwaysAllow(e)}bashAlwaysAllowPrefix(e){return this.permissions.bashAlwaysAllowPrefix(e)}isWellFormedAllowEntry(e){return this.permissions.isWellFormedAllowEntry(e)}async disallowToolAlways(e){return this.permissions.disallowToolAlways(e)}clearSessionAlwaysAllow(e){this.permissions.clearSessionAlwaysAllow(e)}activePlugins(){return this.pluginTopology.resolve({workspaceDir:this.workspaceDir,disabledPlugins:this.settings.get(`disabled_plugins`)??[],homedir:this._pluginHomedir,bundledDirs:this._pluginBundledDirs})}async diagnoseTopoSortIssues(){await this.pluginTopology.diagnose(this.logger,this.settings,ex(this.pluginModuleManager?.emitMonitorEvent.bind(this.pluginModuleManager)))}listFileCommands(){return this.pluginContributionsFacade.listFileCommands()}async callMcpTool(e,t,n){return this.pluginContributionsFacade.callMcpTool(e,t,n)}getPluginPanelRegistrations(){return this.pluginContributionsFacade.getPluginPanelRegistrations()}getPluginStatusItems(){return this.pluginContributionsFacade.getPluginStatusItems()}getGlobalMenuItems(){return this.pluginContributionsFacade.getGlobalMenuItems()}getPluginRenderers(){return this.pluginContributionsFacade.getPluginRenderers()}getPluginStatusWidgets(){return this.pluginContributionsFacade.getPluginStatusWidgets()}getPluginFileViewers(){return this.pluginContributionsFacade.getPluginFileViewers()}isFeedbackAvailable(){return this.feedbackRegistry.get()!==void 0}getPulseSurveyConfig(){return this.settings.get(`pulse_survey`)??{}}recordPulseSurvey(e){this.feedbackRegistry.get()?.recordPulseSurvey?.(e)}buildFeedbackIssueUrl(e){return this.feedbackRegistry.get()?.buildIssueUrl?.(e)}listFeedbackIssues(e){return this.feedbackRegistry.get()?.listIssues?.(e)??Promise.resolve({items:[]})}resolveFeedbackPlatform(){return this.feedbackRegistry.get()?.resolveFeedbackPlatform?.()??Promise.resolve(`github`)}markFeedbackResolved(e){return this.feedbackRegistry.get()?.markIssueResolved?.(e)??Promise.resolve(!1)}unmarkFeedbackResolved(e,t){return this.feedbackRegistry.get()?.unmarkIssueResolved?.(e,t)??Promise.resolve(!1)}listFeedbackResolvedMarks(){return this.feedbackRegistry.get()?.listResolvedMarks?.()??Promise.resolve([])}buildFeedbackCodingIssueUrl(e){return this.feedbackRegistry.get()?.buildCodingIssueUrl?.(e)??null}updateSettings(e){return this.settings.update(e)}resolveA2uiRendererPayload(e){return Ro(Fo(this.activePlugins()),e)}getPluginRegistrations(){return this.pluginContributionsFacade.getPluginRegistrations()}async firePluginActivationEvent(e){await this.pluginModuleManager.activateOn(e,new Set(this.declarativeAgentProfiles.map(e=>e.name)))}async start(){return ix(this)}async completeWorkspaceDependentStartup(){return ax(this)}needsWorkspaceInit(){return ox(this)}async confirmWorkspaceInit(){return ux(this)}hasParentWorkspace(){return sx(this)}async adoptParentWorkspace(){return cx(this)}async createLocalWorkspace(){return lx(this)}async setWorkspaceMemorySyncEnabled(e){return dx(this,e)}async sweepOrphanTraceFiles(){return fx(this)}async stop(){return px(this)}async createSession(e={}){return this.session.createSession(e)}registerNotificationChannel(e){this.notifications.registerNotificationChannel(e)}registerInAppNotificationChannel(e){this.notifications.registerInAppNotificationChannel(e)}setUserAskRenderer(e){this.userAskRenderer=e}async askPluginUser(e,t){let n={...Ax(t),id:`plugin_ask_${++this.userAskSeq}`,askedBy:`plugin:${e}`},r=this.userAskRenderer;if(!this._interactive||!r)return kx();let i=this.inquiryCenter.enqueue({id:n.id,origin:{kind:`plugin`,pluginId:e},question:n});if(!i.accepted)return kx();if(!await this.inquiryCenter.waitForTurn(n.id))return await i.answer;try{let e=await r(n);return this.inquiryCenter.settle(n.id,e),e}catch(e){throw this.inquiryCenter.settle(n.id,kx()),e}}notifyUserInteraction(){this.notifications.notifyUserInteraction()}setTerminalFocus(e){this.notifications.setTerminalFocus(e)}setFollowUpPendingProbe(e){this.followUpPendingProbe=e}notifyPluginServices(e){let t=_u(),n=Mx(this.activePlugins(),this.planeRegistry.resolveForEmit({workspaceKey:this.workspaceRef?.key})),r=0;for(let i of this.activePlugins())if(n.has(i.id))for(let n of t.runningServiceIds(i.id))t.notify(i.id,n,e)&&(this.pluginCapabilityQuota.onNotifyDelivered(i.id,e.sessionId),r+=1);return r}notifyPluginServiceSchedule(e,t){return this.activePlugins().some(t=>t.id===e.pluginId)?_u().notify(e.pluginId,e.serviceId,{type:`schedule.tick`,scheduleId:t.scheduleId,occurrenceId:t.occurrenceId,occurredAt:t.occurredAt}):!1}getSession(e){return this.session.getSession(e)}async shareSession(e,t){return this.session.shareSession(e,t)}getActiveSession(){return this.session.getActiveSession()}listSessions(e){return this.session.listSessions(e)}async listAllSessions(e){return this.session.listAllSessions(e)}async removeSession(e){return this.session.removeSession(e)}async exportSessionArchive(e,t){return this.session.exportSessionArchive(e,t)}exportTrajectory(e,t){return wx(e,{sessionRepoRef:this.sessionRepoRef??{},evolutionSignals:this.evolutionSignals},t)}archiveSession(e){return this.session.archiveSession(e)}async forkSession(e,t){return this.session.forkSession(e,t)}getEnabledAgentProfiles(){let e=new Set(this.settings.get(`disabled_agents`)??[]);return e.size===0?this.declarativeAgentProfiles:this.declarativeAgentProfiles.filter(t=>!e.has(t.name))}initToolRegistry(e){return Zb(this,e)}async buildModelCatalog(e){return this.model.buildModelCatalog(e)}setSessionAvailableModels(e,t){this.model.setSessionAvailableModels(e,t)}registerHooks(){Qb(this)}get activeSandbox(){return this.permissions.activeSandbox}approveSandboxBypass(e){this.permissions.approveSandboxBypass(e)}getRecentPermissionDecisions(e,t){return this.permissions.getRecentPermissionDecisions(e,t)}recordAutoPermissionDecision(e){this.permissions.recordAutoPermissionDecision(e)}ensureNotDisposed(){if(this.disposed)throw Error(`App has been stopped and cannot be reused.`)}};function kx(){return{answer:``,acceptedRecommendation:!1,resolvedBy:`human`}}function Ax(e){return{header:jx(e.header,160),question:jx(e.question,2e3),background:jx(e.background,4e3),recommendation:jx(e.recommendation,1e3),...e.options?{options:e.options.slice(0,8).map(e=>({label:jx(e.label,120),rationale:jx(e.rationale,1e3),...e.recommended?{recommended:!0}:{}}))}:{},...e.allowFreeform===void 0?{}:{allowFreeform:e.allowFreeform},...e.multiSelect===void 0?{}:{multiSelect:e.multiSelect},...e.evidence?{evidence:e.evidence.slice(0,8).map(e=>jx(e,1e3))}:{}}}function jx(e,t){return String(e??``).replace(/[--Ÿ‎‏‪-‮⁦-⁩]/g,` `).slice(0,t)}function Mx(e,t){let n=new Set(t.map(e=>e.pluginId).filter(e=>e!==void 0));return new Set(e.map(e=>e.id).filter(e=>n.has(e)))}function Nx(e){return new Ox(e)}function Px(e){return{get id(){return e.id},get title(){return e.title},get agentName(){return e.agentName},get model(){return{id:e.model.id,name:e.model.name,provider:e.model.provider}},get isBusy(){return e.isBusy},messageCount:()=>e.session.messages().length,lastAssistantText:()=>gs(e.session.messages()),prompt:(t,n)=>e.prompt(t,n),subscribe:((t,n)=>e.subscribe(t,n)),resolveApproval:(t,n)=>e.resolveApproval(t,n),resolveAskUser:(t,n)=>e.resolveAskUser(t,n),clearContext:()=>e.clearContext(),compactNow:()=>e.compactNow(),renameSession:t=>e.renameSession(t),abort:()=>e.abort(),dispose:()=>e.dispose()}}function Fx(e){return{createSession:async t=>Px(await e.createSession(t)),jobs:mn,models:{getAll:()=>e.modelRegistry.getAll().map(e=>({id:e.id,name:e.name,provider:e.provider})),switchModel:async(t,n)=>{let r=e.getSession(t);if(!r)return`会话未找到`;if(r.isBusy)return`当前有正在执行的对话,请等待完成后重试。`;let i=e.modelRegistry.find(n);return i?(r.applyModel(i),null):`未知模型 \`${n}\`。`},refresh:async()=>(await e.refreshModels()).map(e=>({provider:e.provider,status:e.status,added:e.added,kept:e.kept,total:e.total,reason:e.reason}))},permission:{getMode:()=>e.getPermissionMode(),setMode:t=>e.setPermissionMode(t)},auth:{getAuthSource:t=>e.authStore.getAuthSource(t)},i18n:{t:(t,n)=>e.i18nRegistry.t(t,n)},reloadCapabilities:()=>e.reloadCapabilities(),workspaceDir:e.workspaceDir}}const Ix=new Set(`assert.async_hooks.buffer.child_process.cluster.console.constants.crypto.dgram.diagnostics_channel.dns.domain.events.fs.http.http2.https.inspector.module.net.os.path.perf_hooks.process.punycode.querystring.readline.repl.sqlite.stream.string_decoder.timers.tls.trace_events.tty.url.util.v8.vm.wasi.worker_threads.zlib`.split(`.`));function Lx(e){return e.absolutePaths.length>0||e.bareSpecifiers.length>0}function Rx(e){let t=[],n=[];for(let r of e.matchAll(/require\("([^"]+)"\)/g)){let e=r[1];if(e.startsWith(`/`)){t.includes(e)||t.push(e);continue}e.startsWith(`.`)||e.startsWith(`node:`)||Ix.has(e)||n.includes(e)||n.push(e)}return{absolutePaths:t,bareSpecifiers:n}}function zx(e,t){let n=Rx(t);if(!Lx(n))return;let r=[`${e}: 产物不可分发(RFC-365 R1/R2)`];throw n.absolutePaths.length>0&&r.push(` 编译机绝对路径 require(R1)——发布机路径在用户机器不存在:`,...n.absolutePaths.map(e=>` ${e}`)),n.bareSpecifiers.length>0&&r.push(` 裸模块名 require(R2)——假设运行机有 node_modules,在 ~/.otto/plugins/<id>/ 必然 MODULE_NOT_FOUND:`,...n.bareSpecifiers.map(e=>` ${e}`)),Error(r.join(`
591
+ `))}function Bx(e,t){return new Promise((n,r)=>{let i=setTimeout(()=>r(Error(`timeout`)),t);i.unref?.(),e.then(e=>{clearTimeout(i),n(e)},e=>{clearTimeout(i),r(e)})})}function Vx(e,t=O){let n=t(e);return n.gated||!(e.manifest.capabilities?.includes(`tools`)??!1)?!1:!n.pendingCapabilities.includes(`tools`)}async function Hx(e,t,n){let r=[];for(let i of e){if(!Vx(i,t))continue;let e=i.manifest.contributes?.perfMetrics;if(!e?.length)continue;let a=Uu(i.scope);for(let t of e){let e=(async()=>{try{let{result:e,error:n}=await Bx(a.executeTool(i.id,t.toolRef,{}),5e3);return n?{id:t.id,label:t.label,error:n}:{id:t.id,label:t.label,value:e}}catch(e){let r=e instanceof Error?e.message:String(e);return r===`timeout`&&n?.(i.id),{id:t.id,label:t.label,error:r}}})();r.push(e)}}return(await Promise.allSettled(r)).map((e,t)=>e.status===`fulfilled`?e.value:{id:`unknown-${t}`,label:`unknown`,error:String(e.reason)})}const Ux=20;function Wx(e,t=20){let n=Qc(e);if(!n||!v(n))return[];let r;try{r=b(n,`utf8`)}catch{return[]}let i=r.split(`
592
+ `).filter(e=>e.trim().length>0).slice(-t),a=[];for(let e of i)try{a.push(JSON.parse(e))}catch{}return a}function Gx(e,t,n){let r=e?.manifest.contributes?.contextKeys;return{...t,...vr(r,n)}}function Kx(e,t){let n=e.manifest.scripts?.[t];if(!n)return Promise.reject(Error(`plugin ${e.id} 无脚本「${t}」`));let r=ht(n);return r.safe?new Promise((r,i)=>{let a=$i(n,{shell:!0,cwd:e.dir,stdio:`ignore`,env:mt()});a.on(`error`,i),a.on(`exit`,e=>e===0?r():i(Error(`脚本「${t}」退出码 ${e}`)))}):Promise.reject(Error(`脚本「${t}」被安全检查拦截:${r.reason}`))}function qx(e){let t=e.startsWith(`chrome://`);process.platform===`darwin`?$i(`open`,t?[`-a`,`Google Chrome`,e]:[e],{detached:!0,stdio:`ignore`}).unref():process.platform===`win32`?$i(`cmd`,[`/c`,`start`,``,e],{detached:!0,stdio:`ignore`}).unref():$i(t?`google-chrome`:`xdg-open`,[e],{detached:!0,stdio:`ignore`}).unref()}const Jx=T(`@x-otto/coding:plugin-cli-passthrough`),Yx=6e4;function Xx(e){let t=e.manifest.contributes?.cli?.bin,n=t?C(e.dir,t):Zx(e.dir);if(n)return Qx(n,e.dir)}function Zx(e){let t=C(e,`package.json`);if(v(t))try{let n=JSON.parse(b(t,`utf8`));if(typeof n.bin==`string`)return C(e,n.bin);if(n.bin&&typeof n.bin==`object`){let t=Object.values(n.bin)[0];return typeof t==`string`?C(e,t):void 0}return}catch{return}}function Qx(e,t){if(!v(e))return;let n,r;try{n=Qe(e),r=Qe(t)}catch{return}let i=r.endsWith(`/`)?r:`${r}/`;if(!n.startsWith(i)&&n!==r){Jx.warn({candidate:e,pluginDir:t},`Plugin CLI bin resolves outside plugin directory (symlink escape rejected)`);return}try{if(!tt(n).isFile())return}catch{return}return n}function $x(e,t){let n=new Map;for(let r of e){let e=r.manifest.contributes?.cli?.name;if(!e)continue;if(t.has(e)){Jx.warn({pluginId:r.id,name:e},`Plugin CLI contribution name collides with a built-in command; ignored`);continue}let i=n.get(e);i?i.push(r):n.set(e,[r])}return n}function eS(e,t){let n=$x(e,t),r=new Map;for(let[e,t]of n){if(t.length===1){r.set(e,t[0]);continue}Jx.warn({name:e,conflictingPluginIds:t.map(e=>e.id)},`Plugin CLI contribution name claimed by multiple plugins; command disabled (fail-closed, RFC-124 §10.2.2 — rename one of the conflicting plugins to resolve)`)}return r}function tS(e,t,n){let r=$x(e,t).get(n);return r&&r.length>=2?r.map(e=>e.id):void 0}function nS(e,t,n,r=Yx){return new Promise((i,a)=>{let o=$i(e,t,{stdio:`inherit`,cwd:n,env:mt()}),s=setTimeout(()=>{o.kill(`SIGTERM`),a(Error(`插件 CLI 执行超时(${r}ms),已终止子进程`))},r);s.unref(),o.on(`error`,e=>{clearTimeout(s),a(e)}),o.on(`exit`,(e,t)=>{clearTimeout(s),i(e??(t?1:0))})})}function rS(e,t){let n=new Map,r=(e,r,i)=>{if(t.has(e)){Jx.warn({pluginId:r.id,name:e,kind:i},`Plugin CLI contribution name collides with a built-in command; ignored`);return}let a=n.get(e);a?a.push({plugin:r,kind:i}):n.set(e,[{plugin:r,kind:i}])};for(let t of e){let e=t.manifest.contributes?.cli?.name;e&&r(e,t,`passthrough`);for(let e of t.manifest.contributes?.cliCommands??[])r(e.name,t,`in-process`)}return n}function iS(e,t){let n=rS(e,t),r=new Map;for(let[e,t]of n){if(t.length===1){r.set(e,t[0]);continue}Jx.warn({name:e,conflicts:t.map(e=>({pluginId:e.plugin.id,kind:e.kind}))},`Plugin CLI command name claimed by multiple contributions (cross-plugin or cross-axis); command disabled (fail-closed, RFC-410 D4 / RFC-124 §10.2.2)`)}return r}function aS(e,t){let n=iS(e,t),r=[];for(let[e,t]of n){let n=t.kind===`in-process`?t.plugin.manifest.contributes?.cliCommands?.find(t=>t.name===e)?.summary:void 0;r.push({name:e,pluginId:t.plugin.id,kind:t.kind,...n?{summary:n}:{}})}return r.sort((e,t)=>e.name.localeCompare(t.name))}function oS(e,t,n){let r=rS(e,t).get(n);return r&&r.length>=2?r:void 0}async function sS(e,t=Yx){let n,r=new Promise(e=>{n=setTimeout(()=>{Jx.warn({timeoutMs:t},`in-process plugin CLI command timed out; returning exit code 124 (handler may still be running detached — cannot be force-killed in-process)`),e(124)},t),n.unref()});try{return await Promise.race([Promise.resolve(e()),r])}catch(e){return Jx.warn({err:String(e)},`in-process plugin CLI command threw; returning exit code 1`),1}finally{n&&clearTimeout(n)}}function cS(e,t={}){return gr({cwd:t.workspaceDir??process.cwd(),homedir:t.homedir??at(),bundledDirs:t.bundledDirs}).find(t=>t.id===e)}function lS(e,t,n={}){let r=cS(e,n);if(!r)return{ok:!1,reason:`plugin-not-found`,granted:[],pending:[],message:`Plugin "${e}" not found. Install it first, or check workspaceDir/homedir options.`};let i=(r.manifest?.capabilities??[]).filter(e=>Xn.includes(e)),a=t??[],o=a.filter(e=>!Xn.includes(e));if(o.length>0)return{ok:!1,reason:`unknown-capability`,granted:[],pending:i,message:`Unknown capability: ${o.join(`, `)}. Valid high-risk capabilities: ${Xn.join(`, `)}.`};let s=a.filter(e=>!i.includes(e));if(s.length>0)return{ok:!1,reason:`capability-not-declared`,granted:[],pending:i,message:`Plugin "${e}" does not declare capability: ${s.join(`, `)}. Declared: ${i.length?i.join(`, `):`(none)`}.`};Ur(r.dir),a.length>0&&Cr(r.dir,a);let c=O(r);return{ok:!0,granted:[...a],pending:c.pendingCapabilities}}function uS(e,t={}){let n=cS(e,t);if(!n)return{found:!1,trusted:!1,gated:!1,declared:[],granted:[],pending:[]};let r=O(n),i=(n.manifest?.capabilities??[]).filter(e=>Xn.includes(e));return{found:!0,trusted:r.trusted,gated:r.gated,declared:[...i],granted:[...r.grantedCapabilities],pending:[...r.pendingCapabilities]}}function dS(e,t={}){let n=cS(e,t);return n?(Gr(n.dir),!0):!1}const fS=T(`@x-otto/coding:plugin-theme-preset-loader`),pS=new Set([`dark`,`light`,`system`,`builtin`]);function mS(e){let t=[];for(let n of e){let e=n.manifest.contributes?.themePresets;if(!e?.length)continue;if(O(n).gated){fS.warn({pluginId:n.id},`plugin gated (untrusted), themePresets skipped`);continue}let r=e;r.length>nr&&(fS.warn({pluginId:n.id,declared:r.length,limit:nr},`plugin declares more theme presets than the per-plugin limit, truncated`),r=r.slice(0,nr));for(let e of r){if(pS.has(e.localId)){fS.warn({pluginId:n.id,localId:e.localId},`themePresets localId collides with a reserved name, skipped`);continue}t.push({pluginId:n.id,localId:e.localId,label:e.label,appearance:e.appearance,colors:e.colors,markdown:e.markdown,meta:e.meta})}}return t}export{ns as AgentJobService,Bt as AgentSession,Ox as App,qt as CodingSessionPool,wb as DEFAULT_WORKSPACE_KEY,vo as ExtensionManager,Yn as HIGH_RISK_CAPABILITIES,Cb as INDUCTOR_PLUGIN_ID,Ux as PLUGIN_LOG_TAIL_LINES,ir as PLUGIN_MANIFEST_FILENAME,ar as POINT,Wd as PluginConfigStore,xa as RegistryClient,Db as SANDBOX_ESCALATION_MARKER,la as SCHEDULE_LEASE_MIGRATIONS,Kt as SandboxUnavailableError,ua as ScheduleRegistry,da as SchedulerService,bo as SigilResolverRegistry,g as apiCredentialId,zx as assertPortableArtifact,lS as authorizePlugin,Gx as buildExtensionContext,Ha as buildMemoryStore,eS as buildPluginCliRegistry,iS as buildUnifiedCliCommandRegistry,Sa as builtinOfficialSource,Zt as captureFiles,vx as captureTrajectory,Ca as checkArchiveBomb,wa as checkGitUpgrades,yf as checkPluginConsistency,Ta as checkUpgrades,Kr as claudeTrustStorePath,Ea as cleanTempDir,aS as collectPluginCliCommandsForHelp,Hx as collectPluginPerfMetrics,mS as collectPluginThemePresets,$l as compilePluginModule,af as compilePluginPanels,nu as computeSourceHash,Nx as createApp,Da as createArchive,cr as createBuiltinHashtags,up as createBuiltinResolvers,qr as createClaudeHookBridgeHooks,ur as createFileProvider,Fx as createFrontendPort,Rp as createLessonInjectionHooks,fa as createLocalFireOwnership,fr as createPluginInputRegistry,pa as createRemoteFireOwnership,ma as createRemoteScheduleStore,ga as createScheduleStore,rn as createSessionStableInjectionHooks,zp as createSkillCatalogInjectionHooks,Oa as createTempDir,Dp as createToolGuidanceHook,Yr as defaultHookRunner,ln as defaultMaxToolTurnExtensions,Cc as defaultPostInstallExecutor,fn as deriveSessionTitle,Xr as detectClaudeExecutableSurface,mr as detectPluginExecutableSurface,Di as detectProjectConfigGating,ka as detectUninstallTarget,Zr as discoverFileCommands,hr as discoverPlugins,_r as dispatch,$r as evaluateClaudeTrust,yr as evaluatePluginTrust,Oi as evaluateWorkspaceTrustPrompt,ti as expandCommandBody,ko as expandSigilChips,bx as exportTrajectory,Sx as exportTrajectoryFromSession,Aa as extractArchive,tS as findPluginCliNameConflict,Rx as findPortabilityViolations,oS as findUnifiedCliCommandConflict,a as findWorkspaceRoot,Fl as getEsbuildModule,_s as getIncompleteSubagentReason,gs as getLastAssistantText,pn as globalAgentJobRegistry,hn as globalAgentObservability,_n as globalProcessRuntime,Sr as grantPluginCapabilities,wr as grantPluginCapabilitiesWithVersion,Tr as grantedPluginCapabilities,Er as grantedPluginCapabilitiesForVersion,Lx as hasPortabilityViolations,uS as inspectPluginAuthorization,ja as install,Rl as installEsbuildExitHook,Bl as installEsbuildSignalBridges,mf as installPluginFromDir,pf as installPluginFromPackage,Zl as installPluginHostExternals,Ma as installSkill,ni as interpretPreToolUse,Cf as isInternalDelegatedSession,Dr as isPluginTrusted,ri as isProjectTrusted,kr as isSensitiveField,Ai as isStrictProjectConfigEnabled,Na as listInstalledItems,ii as loadClaudeHooksConfig,cu as loadPluginModule,Il as markEsbuildStarted,ai as matchesHookMatcher,Sn as messagesFromSnapshot,qx as openTarget,oi as parseClaudeHooks,fi as parseDotMcpJson,jr as parsePluginManifest,Pa as parseRegistry,Nr as pluginTrustStorePath,qd as purgePluginState,Pr as readHighRiskCapabilities,Wx as readPluginLogTail,Rb as readSkillLoopStatus,$o as readTaskOutputTail,Cn as reconstructMessages,_f as recordPluginInstalled,vf as recordPluginUninstalled,Fr as redactSensitiveFields,gf as removeInstalledPluginEntry,Ir as resolveActions,si as resolveClaudeMcpServers,Xl as resolveHostExternalPaths,ff as resolvePackageDir,Xx as resolvePluginCliBin,lo as resolvePluginMcpServers,Mi as resolveProjectConfigTrusted,Tn as resolveSessionTitle,Dn as restoreFiles,dS as revokePluginAuthorization,iu as rewriteArtifactSourceHash,sS as runInProcessCliCommand,Kx as runPluginScript,Fa as scanInstalledVersions,xx as selectTrajectoryEntries,Br as sigilOf,nS as spawnPluginCli,Ll as stopEsbuildService,Hr as trustPlugin,li as trustProject,Ia as uninstall,Wr as untrustPlugin,ui as untrustProject,hf as upsertInstalledPluginEntry,La as validateExtractedPaths,Vl as withBuildTimeout};
484
593
  //# sourceMappingURL=index.js.map