@x-otto/coding 0.0.1-alpha.4 → 0.0.1-alpha.5
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.d.ts.map +1 -1
- package/dist/index.js +72 -72
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
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
|
|
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{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 v,createModelSlot as ee,createModelUsabilityGate as te,createProviderRegistry as ne,createWireProtocolRegistry as re,fetchModels as y,isBuiltinProviderId as ie,mergeFetchedModels as ae,rankModelsBySlotAffinity as oe,registerCacheReportingApi as se,registerProviderDescriptor as ce,resolveModelsRequest as le,stream as ue,unregisterCacheReportingApi as de,unregisterProviderDescriptor as fe}from"@x-otto/ai";import{Diagnoser as pe,FailureSignalStore as me,PermissionAuditLog as he,assessSandboxSafety as ge,bashAlwaysAllowPrefix as _e,compilePolicyFromSetting as ve,computeSandboxRoots as ye,createDisabledToolsPolicy as be,createEditFilesPanelHook as xe,createEgressAllowlistPolicy as Se,createFailureSignalHook as Ce,createHookRegistry as we,createPermissionDenyHook as Te,createPermissionGuardHook as Ee,createPermissionModePolicy as De,createPermissionRegistry as Oe,createPermissionToolSetsFromRegistry as ke,defaultDeniedRoots as Ae,defineHook as b,extractWriteTargets as je,isWellFormedAllowEntry as Me}from"@x-otto/hooks";import{ORCHESTRATION_TOOL_NAMES as Ne,createPlatformSandbox as Pe,createToolRegistry as Fe,credentialDenyReadPaths as Ie,isPlatformSandboxAvailable as Le}from"@x-otto/tools";import{homedir as Re,tmpdir as ze}from"node:os";import{dirname as Be,extname as Ve,isAbsolute as He,join as x,relative as Ue,resolve as S,sep as We}from"node:path";import{CodedError as Ge,ProviderError as Ke,attachLogListener as qe,buildAllowedEnv as Je,checkShellCommand as Ye,createLogger as C,installGlobalProxyDispatcher as Xe,markStartupPhase as Ze,parseFrontmatterList as Qe,setDefaultProxy as $e,splitFrontmatter as et,traceStartupPhase as tt}from"@x-otto/shared";import{AutoMemory as nt,DEFAULT_MEMORY_SOURCES as rt,FileStateManager as it,FileSystemMemoryStore as at,HttpMemoryStore as ot,InMemoryArchiveStorage as st,OperationalLearningStore as ct,createMemoryAutoExtractor as lt,createMemoryManager as ut,createOverlayMemoryStore as dt,discoverAgentsSources as ft}from"@x-otto/memory";import{AgentSession as pt,FleetMonitor as mt,MemoryGovernor as ht,RUNTIME_DEFAULTS as gt,ResidencyGovernor as _t,SYSTEM_PROMPT_SECTIONS as vt,SandboxUnavailableError as yt,SessionPool as bt,applyDiff as xt,attachAgentObserver as St,buildEngineStores as Ct,captureFiles as wt,createAgentRuntime as Tt,createDocSyncReminderHooks as Et,createMemoryDeltaHooks as Dt,createSessionStableInjectionHooks as Ot,createSessionStableInjectionHooks as kt,createTodoReminderHooks as At,createToolHookExecutor as jt,createWorktree as Mt,defaultMaxToolTurnExtensions as Nt,defaultMaxToolTurnExtensions as Pt,deriveSessionTitle as Ft,globalAgentJobRegistry as It,globalAgentJobRegistry as Lt,globalAgentObservability as Rt,globalAgentObservability as zt,globalProcessRegistry as Bt,globalProcessRegistry as w,globalProcessRuntime as Vt,hasRepoDrifted as Ht,installAgentJobReaper as Ut,installProcessReaper as Wt,messagesFromSnapshot as Gt,reconstructMessages as Kt,removeWorktree as qt,resolveSessionTitle as Jt,resolveTodoContinuationConfig as Yt,restoreFiles as Xt,revertDiff as Zt,touchesCapabilitySurface as Qt,touchesForbiddenZone as $t,worktreeDiff as en}from"@x-otto/runtime";import{atomicWriteFile as tn,createFileStorageHost as nn,createInMemoryPanelStatePersistence as rn,createInMemoryPasteStatePersistence as an,createLiveTappedAppendLog as on,createPersistence as sn}from"@x-otto/persistence";import{SESSION_MAX_PER_SESSION_BYTES as cn,SESSION_RESUME_WINDOW_MESSAGES as ln}from"@x-otto/session-contract";import{createRegistrySkillProvider as un,createSkillRegistry as dn}from"@x-otto/skill";import{BUILTIN_PROMPTS_DIR as fn,PromptManager as pn,SKILL_LOOP_GUIDANCE as mn,SUBAGENT_GUARDRAILS as hn,assembleGenericSubAgentPrompt as gn,buildLessonInjection as _n,createPromptProvider as vn,resolveAgentProfile as yn}from"@x-otto/prompt";import{HIGH_RISK_CAPABILITIES as bn,ID_RE as xn,MAX_I18N_ENTRIES_PER_PLUGIN as Sn,MAX_I18N_FILE_BYTES as Cn,MAX_I18N_LOCALE_FILES_PER_PLUGIN as wn,MAX_I18N_TRANSLATION_BYTES as Tn,MAX_THEME_PRESETS_PER_PLUGIN as En,PLUGIN_API_VERSION as Dn,PLUGIN_MANIFEST_FILENAME as On,PLUGIN_MANIFEST_FILENAME as T,POINT as kn,PluginI18nRegistry as An,SHELL_POINTS as jn,createBuiltinHashtags as Mn,createBuiltinHashtags as Nn,createFileProvider as Pn,createFileProvider as Fn,createPluginInputRegistry as In,createPluginInputRegistry as Ln,detectPluginExecutableSurface as Rn,discoverPlugins as zn,discoverPlugins as Bn,dispatch as Vn,evaluateContextKeys as Hn,evaluatePluginTrust as Un,evaluatePluginTrust as E,evaluateWhen as Wn,filterEngineCompatible as Gn,grantPluginCapabilities as Kn,grantedPluginCapabilities as qn,isPluginTrusted as Jn,isPluginTrusted as Yn,parsePluginManifest as Xn,parsePluginManifest as Zn,pluginTrustStorePath as Qn,readHighRiskCapabilities as $n,resolveActions as er,resolveActions as tr,resolveActivationEvents as nr,sigilOf as rr,topoSortPlugins as ir,trustPlugin as ar,untrustPlugin as or}from"@x-otto/plugin";import{claudeTrustStorePath as sr,createClaudeHookBridgeHooks as cr,createClaudeHookBridgeHooks as lr,defaultHookRunner as ur,detectClaudeExecutableSurface as dr,detectProjectConfigGating as fr,discoverFileCommands as pr,discoverFileCommands as mr,evaluateClaudeTrust as hr,evaluateClaudeTrust as gr,evaluateWorkspaceTrustPrompt as _r,expandCommandBody as vr,interpretPreToolUse as yr,isProjectTrusted as br,isProjectTrusted as xr,isStrictProjectConfigEnabled as Sr,loadClaudeHooksConfig as Cr,mapClaudeAgentToolNames as wr,matchesHookMatcher as Tr,parseClaudeHooks as Er,parseDotMcpJson as Dr,parseDotMcpJson as Or,resolveClaudeMcpServers as kr,resolveClaudeMcpServers as Ar,resolveProjectConfigTrusted as jr,resolveProjectConfigTrusted as Mr,trustProject as Nr,untrustProject as Pr}from"@x-otto/claude-compat";import{McpManager as Fr}from"@x-otto/mcp";import{appendFileSync as Ir,closeSync as Lr,constants as Rr,existsSync as D,lstatSync as zr,mkdirSync as O,mkdtempSync as Br,openSync as Vr,readFileSync as k,readdirSync as Hr,readlinkSync as Ur,realpathSync as Wr,renameSync as Gr,rmSync as Kr,statSync as qr,symlinkSync as Jr,unlinkSync as Yr,writeFileSync as A,writeSync as Xr}from"node:fs";import{InMemorySession as Zr,RelationalSessionPersistence as Qr,SESSION_MAX as $r,SqliteSessionRepository as ei,createNoopSessionWriteLeaseManager as ti,createSessionWriteLeaseManager as ni,reassembleSnapshot as ri}from"@x-otto/session";import{Orchestrator as ii,createHandoffTool as ai,createSwarm as oi}from"@x-otto/orchestrator";import{BUILTIN_AGENT_PROFILES as si,SettingsManager as ci}from"@x-otto/setting";import{createHash as li,randomUUID as ui}from"node:crypto";import{Agent as di}from"@x-otto/agent";import{CallbackChannel as fi,CommandChannel as pi,NotificationDispatcher as mi,PresenceTracker as hi,TerminalChannel as gi,TimestampPresenceGate as _i}from"@x-otto/notification";import{DEFAULT_WORKSPACE_KEY as vi,createWorkspaceResolver as yi,genWorkspaceId as bi,readMarker as xi,workspaceKey as Si,writeMarker as Ci}from"@x-otto/workspace";import{spawn as j,spawnSync as wi}from"node:child_process";import{mkdir as Ti,open as Ei,readFile as Di,writeFile as Oi}from"node:fs/promises";import{Worker as ki}from"node:worker_threads";import{fileURLToPath as Ai,pathToFileURL as ji}from"node:url";import{DeviceFlowOAuthTemplate as Mi,PKCEOAuthTemplate as Ni}from"@x-otto/provider";import{createTodoStore as Pi}from"@x-otto/orchestration-contracts";import{SCHEDULE_LEASE_MIGRATIONS as Fi,ScheduleRegistry as Ii,SchedulerService as Li,createLocalFireOwnership as Ri,createRemoteFireOwnership as zi,createRemoteScheduleStore as Bi,createScheduleCapability as Vi,createScheduleStore as Hi}from"@x-otto/schedule";import{InstallManager as Ui,RegistryClient as Wi,builtinOfficialSource as Gi,checkArchiveBomb as Ki,checkGitUpgrades as qi,checkUpgrades as Ji,cleanTempDir as Yi,createArchive as Xi,createTempDir as Zi,detectUninstallTarget as Qi,extractArchive as $i,listInstalledItems as ea,parseRegistry as ta,scanInstalledVersions as na,uninstall as ra,validateExtractedPaths as ia}from"@x-otto/install";x(Re(),`.otto`);const aa=c(process.env.OTTO_REMOTE_STORAGE_TIMEOUT_MS,3e4),oa=C(`@x-otto/coding:rfc344-compaction-cost`);function sa(e,t){if(!e?.remote?.getAuth)throw Error(`storage.${t}.url is configured, so storage.remote.getAuth is required.`);return e.remote}function ca(e,t,n,r,i){let a=la(e,t,n,r,i);return a&&s()?dt(a):a}function la(e,t,n,r,i){let a=e?.memory;if(a&&`dir`in a)return new at(a.dir);let o=e?.session&&`url`in e.session?e.session.url:void 0;if(e?.remote?.getAuth&&o){let a=e.remote;return new ot({baseUrl:o,getAuth:a.getAuth,fetch:a.fetch??globalThis.fetch,timeoutMs:a.timeoutMs??aa,userId:n?.userId,workspaceKey:()=>r?.()?.key,isWorkspaceSyncEnabled:()=>r?.()?.memorySyncEnabled===!0,localDir:t,onConflict:i})}if(t)return new at(t)}function ua(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 ue(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 da(e){let{model:t,getModel:n,memoryStore:r,providerRegistry:i,autoMemory:a,workspaceDir:s,getLoadSessionEntries:c,getActiveSessionBytes:l,getEffectiveMaxBytes:u,getCoverageThresholds:d}=e,f=ua({model:t,getModel:n,providerRegistry:i,onUsage:e=>oa.info({inputTokens:e.inputTokens,outputTokens:e.outputTokens,cacheReadTokens:e.cacheReadTokens,cacheWriteTokens:e.cacheWriteTokens},`[RFC-344] compaction summarize request cost`)}),p=rt.filter(e=>e.writable),m=ft(s??process.cwd()),h=o()?[{path:`~/.claude/CLAUDE.md`,writable:!1},...ft(s??process.cwd(),{fileName:`CLAUDE.md`})]:[],g=[...p,...h,...m],_=r&&a?[...g,a.asSource()]:void 0;return ut({summarize:f,model:t?{contextWindow:t.contextWindow,maxOutput:t.maxOutputTokens}:void 0,getContextWindow:()=>(n?.()??t)?.contextWindow,maxContentBytes:cn,getMaxContentBytes:u,getCoverageThresholds:d,getEstimatedBytes:l,memoryStore:r,sources:_,archiveStorage:new st,messageFromEntry:e=>{let t=e.data;if(!t||typeof t!=`object`)return null;let n=t.message;return n&&typeof n.role==`string`?n:null},loadSessionEntries:async e=>{let t=c?.();if(!t)throw Error(`Session entries not wired`);return t(e)}})}function fa(e){let{options:t,workspaceDir:n,providerRegistry:r,defaultModel:i,resolveEffectiveModel:a,repoRef:o,getWorkspaceRef:c}=e,l=t.storage?.host?{host:nn({baseDir:t.storage.host.dir,namespaces:t.storage.host.namespaces}),token:t.storage.host.token}:null,u=ca(t.storage,n,t.userIdentity,c,e.onMemoryConflict),d=u?new nt({store:u}):null,f=t.memory??da({model:i,getModel:a,storage:t.storage,memoryStore:u,providerRegistry:r,autoMemory:d,workspaceDir:n,getLoadSessionEntries:()=>o.current?async e=>(await o.current.loadEntries(e)).map(e=>({type:e.type,seq:e.seq,data:e.data})):void 0}),p=t.storage?.session,m=Ct({sessionDir:p&&`dir`in p?p.dir:void 0,remoteLog:p&&`url`in p&&t.storage?.remote?.getAuth?{baseUrl:p.url,getAuth:t.storage.remote.getAuth,fetch:t.storage.remote.fetch,timeoutMs:t.storage.remote.timeoutMs??aa}:void 0,ephemeral:s()},{traceStore:t.traceStore,checkpointStore:t.checkpointStore}),{store:h,live:g}=on(m.traceStore);return{storageHost:l,autoMemory:d,memory:f,traceStore:h,traceLive:g,checkpointStore:m.checkpointStore,clock:t.clock,memoryStore:u}}const pa={delegation:`task_delegate`,"task-observability":`task_inspect`,"file-state-refresh":`capture_file_state`},ma=new Set(Object.keys(pa));function ha(e){let t=new Set;for(let[n,r]of Object.entries(pa))e.has(r)&&t.add(n);return t}function ga(e){let{skillProvider:t,workspaceDir:n,activePlugins:r,resolveEffectiveModel:i,providerRegistry:a,prompt:c,memoryStore:l,memoryAutoExtractConfig:u}=e,d=o()&&gr(n).gated,f=t?null:dn({workspaceDir:n,library:{...d?{projectDirs:[`.otto/skills`]}:{},pluginDirs:r().filter(e=>e.manifest.contributes?.skills!==!1).filter(e=>!E(e).gated).map(e=>({id:e.id,dir:x(e.dir,`skills`)}))}}),p=new it,m=s(),h=new ct({path:`${n}/.otto/lessons.json`,...l?{store:l,storePath:`./.otto/lessons.json`}:{},ephemeral:m});return{skillRegistry:f,fileStateManager:p,learningStore:h,localLearningStore:new ct({path:`${n}/.otto/local/lessons.json`,ephemeral:m}),memoryAutoExtractor:lt({llm:ua({getModel:i,providerRegistry:a}),store:h,config:u??{enabled:!0}}),completeText:ua({getModel:i,providerRegistry:a}),promptManager:new pn({provider:vn(c??{type:`local`,baseDir:fn}),knownCapabilities:ma})}}var _a=class{currentPermissionMode=void 0;constructor(e){this.deps=e}sync(e){let t=ke(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(De(n,t)),this.currentPermissionMode=n}syncDisabledToolsPolicy(e){e&&e.length>0?this.registry.register(be(e)):this.registry.unregister(`setting::disabled-tools`)}syncEgressPolicy(e){e&&e.length>0?this.registry.register(Se(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(ve({...t,name:`user::${t.name}`}))}},va=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&&!Le()?(this.logger.warn(`Sandbox pinned but no platform sandbox available (install bwrap on Linux); running WITHOUT sandbox`),this.strategy=null):this.strategy=e.enabled?Pe({network:e.network,writablePaths:e.writablePaths,denyReadPaths:e.protectCredentials?Ie():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&&!Le()?(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?Pe({network:e.network===`deny`?`deny`:`allow`,writablePaths:this.configuredWritablePaths,denyReadPaths:e.protectCredentials?Ie():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 ya(e){return typeof e==`string`&&(e.startsWith(`./`)||e.startsWith(`../`)||e.startsWith(`.\\`))}function ba(e,t){let n={...e};return ya(n.command)&&!He(n.command)&&(n.command=S(t,n.command)),Array.isArray(n.args)&&(n.args=n.args.map(e=>ya(e)?S(t,e):e)),n}function xa(e){let t=e.plugins??Bn({cwd:e.workspaceDir,homedir:e.homedir,disabled:e.disabled}),n={};for(let e of t){if(e.manifest.contributes?.mcp===!1)continue;let t=E(e);if(t.gated||!(e.manifest.capabilities?.includes(`mcp.server`)??!1)||t.pendingCapabilities.includes(`mcp.server`))continue;let r=Or(e.dir);for(let[t,i]of Object.entries(r))n[t]={...ba(i,e.dir),_pluginId:e.id}}return n}const Sa=(e,t,n)=>{let r=Vt.spawn({command:e,args:t,env:n,owner:{type:`mcp-server`,id:e},category:`mcp`,lifecycle:`pinned`,label:`mcp:${e}`});return{pid:r.pid,stdin:r.stdin,stdout:r.stdout,stderr:r.stderr,kill:()=>r.kill(),onError:e=>{r.onError(e)},onExit:e=>{r.onExit(()=>e())}}};function Ca(e){return e.code===`MCP_UNAUTHORIZED`?`MCP server "${e.name}" requires authentication. Run 'otto mcp login ${e.name}' to authenticate.`:null}var wa=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?Ar(this.workspaceDir):{},plugin:this.workspaceDir?xa({workspaceDir:this.workspaceDir,homedir:Re(),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 Fr({skipOnError:!0,processSpawnFactory:Sa,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=Ca(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)}},Ta=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)}},Ea=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})}},Da=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]})}},Oa=class{category=`plugin`;constructor(e,t,n){this.settings=e,this.getPlugins=t,this.processRuntime=n}list(){let e=new Set(this.settings.get(`disabled_plugins`)??[]);return this.getPlugins().map(t=>{let n=t.scope===`builtin`,r=E(t).gated,i=[t.scope,r?`untrusted`:void 0].filter(Boolean).join(` · `);return{category:this.category,id:t.id,name:t.manifest.name??t.id,description:t.manifest.description??``,enabled:n?!0:!e.has(t.id),detail:i||void 0,applies:`next-turn`,readonly:n||void 0,scope:t.scope}})}async setEnabled(e,t){if(this.getPlugins().find(t=>t.id===e)?.scope===`builtin`)throw Error(`插件 "${e}" 是 otto 内置插件,恒定信任+启用,无法禁用。`);let n=new Set(this.settings.get(`disabled_plugins`)??[]);t?n.delete(e):n.add(e),await this.settings.persist({disabled_plugins:[...n]}),!t&&this.processRuntime&&(await this.processRuntime.killAll({owner:{type:`plugin-hook`,id:e}}),await this.processRuntime.killAll({owner:{type:`plugin-script`,id:e}}))}},ka=class{providers;deps;constructor(e){this.deps=e,this.providers=[new Ta(e.mcp),...e.skills?[new Ea(e.settings,e.skills)]:[],new Da(e.settings,e.getAgentProfiles),...e.getPlugins?[new Oa(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)}},Aa=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}},ja=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 Ma=C(`@x-otto/coding:sigil-expand`),Na=/\[@([a-z][\w.-]*):((?:\\\]|[^\]])+)\]/g,Pa=/\[@([a-z][\w.-]*)\]/g,Fa=/@([\w./\-]+):(\d+)(?:-(\d+))?/g,Ia=/@def:([A-Za-z_]\w*)/g;function La(e,t){let n=new Set,r=[];for(let i of[Na,Pa]){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,`]`)})}}Fa.lastIndex=0;for(let i of e.matchAll(Fa)){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)}))}Ia.lastIndex=0;for(let i of e.matchAll(Ia)){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 Ra(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 za(e,t){return e.length<=t?e:`${e.slice(0,t)}\n[...truncated ${e.length-t} chars...]`}async function Ba(e,t,n,r){let i=La(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 Ma.debug({chip:e.raw},`uiHostOnly resolver skipped in non-uiHost context`),null;let c=i.timeoutMs??1e4,l=await Ra(Promise.resolve().then(()=>i.resolve(e.param,s)),c);return l===``?null:[e.raw,za(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`){Ma.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 Va=e(import.meta.url);function Ha(e,t){let n=t.entries(e);if(!n?.length)return[];let r=E(e);if(r.gated)return t.logger.warn({pluginId:e.id},`project/repository plugin not trusted, skipping ${t.axis} (fail-closed)`),[];if(!e.manifest.capabilities?.includes(t.capability))return t.logger.warn({pluginId:e.id},`plugin declares contributes.${t.axis} but not capabilities:["${t.capability}"], skipped (fail-closed)`),[];if(r.pendingCapabilities.includes(t.capability))return t.logger.warn({pluginId:e.id},`plugin capability "${t.capability}" declared but not yet granted, skipping ${t.axis} (fail-closed, ${t.pendingNote})`),[];let i=[];for(let r of n){if(t.preCheck&&!t.preCheck(e,r))continue;let n=x(e.dir,t.entryPath(r));if(!D(n)){t.logger.warn({pluginId:e.id,...t.idLogFields(r),modulePath:n},`${t.noun} entry not found, skipped`);continue}try{delete Va.cache[n];let a=Va(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 Ua(e,t,n){if(!n)return e.flatMap(e=>Ha(e,t));let r=new Map,i=[];for(let a of e)for(let e of Ha(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 Wa=C(`@x-otto/coding:plugin-a2ui-renderer-loader`),Ga={capability:`a2ui.renderer`,axis:`a2uiRenderers`,noun:`a2ui renderer`,pendingNote:`RFC-210 D5`,logger:Wa,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 Ka(e){return Ua(e,Ga)}function qa(e,t){let n=t;if(!n||typeof n!=`object`||e.role!=null&&n.role!==e.role||e.toolName!=null&&(n.name??n.toolName)!==e.toolName)return!1;if(e.contentType!=null){let t=n.content;if(!(Array.isArray(t)&&t.some(t=>t&&typeof t==`object`&&t.type===e.contentType)))return!1}return!0}const Ja=2e3;async function Ya(e,t){for(let n of e)if(qa(n.matcher,t))try{let e=await Promise.race([Promise.resolve().then(()=>n.toPayload(t)),new Promise((e,t)=>setTimeout(()=>t(Error(`toPayload timeout after ${Ja}ms`)),Ja))]);if(Array.isArray(e)&&e.length>0)return e}catch(e){Wa.warn({a2uiRendererId:n.id,err:String(e)},`toPayload failed, trying next candidate (fail-soft)`)}return null}const Xa={file_read:[`read`],file_write:[`write`],file_edit:[`edit`],shell:[`bash`],search:[`find`,`grep`]};function Za(e){if(e===void 0)return;if(e.length===0)return[];let t=new Set;for(let n of e){let e=Xa[n];if(e&&e.length>0){for(let n of e)t.add(n);continue}t.add(n)}return[...t]}function Qa(){return process.env.OTTO_SUBAGENT_MODEL_POLICY===`off`}var $a=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=oe(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 ee({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(Qa())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 eo(e,t){let n=new Set(t);return e.filter(e=>n.has(e.name))}function to(e,t,n,r,i){let a;return a=t||(n?eo(e(),n):e()),r?.length&&(a=a.filter(e=>!r.includes(e.name))),i||(a=a.filter(e=>!Ne.has(e.name))),a}function no(e,t,n,r){let i=n?[...t.disallowedToolNames??[],...r]:t.disallowedToolNames;return to(e,void 0,t.toolNames,i,t.allowSubagents)}const ro=[`edit`,`write`,`lsp_rename`,`bash`];function io(e,t,n,r){let i=yn([...t,...si],n),a=ha(new Set(r.map(e=>e.name)));return()=>e.assemblePreset({preset:`subagent`,agentName:n,profile:i,promptMode:i?.promptMode},a)}var ao=class{modelResolver;constructor(e){this.deps=e,this.modelResolver=new $a(e)}readAgentSources(e,t){let n=e?this.deps.settings.get(`agents`)?.[e]:void 0,r=t===`subagent`&&e?yn([...this.deps.getDeclarativeAgentProfiles(),...si],e):void 0;return{slot:n?.default_workflow_slot,profileTier:r?.preferredModelTier,toolNames:n?.tools??Za(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 no(this.deps.getTools,i,n,ro)}resolveTools(e,t,n,r){return to(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??[],...ro]:n.disallowedToolNames,u=this.resolveTools(e.tools,n.toolNames,l,n.allowSubagents);s.supportsTools===!1&&(u=[]);let d=ha(new Set(u.map(e=>e.name))),f=e.promptRefresh??(async()=>{let r=t===`subagent`&&e.agentName?await this.deps.promptManager.assemblePreset({preset:`subagent`,agentName:e.agentName,profile:n.profile,context:e.promptContext,promptMode:n.promptMode},d):await this.deps.promptManager.assemblePreset({preset:`main`},d),i=e.systemPrompt??n.systemPrompt;return i!==void 0&&i.length>0?r?`${r}\n\n${i}`:i:r}),m=await f(),g=e.systemPrompt===void 0&&n.systemPrompt===void 0&&t===`subagent`&&e.agentName?this.deps.promptManager.assembleSubAgentTail({preset:`subagent`,agentName:e.agentName,profile:n.profile,context:e.promptContext,promptMode:n.promptMode}):void 0,_=e.thinkingLevel??(r?void 0:this.resolvePersistedThinkingLevel())??`medium`;return{id:e.id,model:s,titleModel:c,modelResolution:o,agentName:e.agentName,systemPrompt:m??``,systemTail:g?[g]:void 0,tools:u,thinkingLevel:_,maxToolTurns:e.maxToolTurns??n.maxToolTurns??this.deps.maxToolTurns,maxToolTurnExtensions:e.maxToolTurnExtensions??n.maxToolTurnExtensions??this.deps.maxToolTurnExtensions??Pt(e.depth??0,e.transient),promptOutputTokenBudget:(e.depth??0)>0?void 0:e.promptOutputTokenBudget??n.promptOutputTokenBudget??this.deps.settings.get(`prompt_output_token_budget`)??this.deps.promptOutputTokenBudget,promptWallClockBudgetMs:(e.depth??0)>0?void 0:e.promptWallClockBudgetMs??n.promptWallClockBudgetMs??this.deps.settings.get(`prompt_wall_clock_budget_ms`)??this.deps.promptWallClockBudgetMs,sessionCostBudgetUSD:(e.depth??0)>0?void 0:e.sessionCostBudgetUSD??n.sessionCostBudgetUSD??this.deps.settings.get(`session_cost_budget_usd`)??this.deps.sessionCostBudgetUSD,stallDetection:e.stallDetection??n.stallDetection??(()=>{let e=this.deps.settings.get(`stall_detection`);if(e!==void 0)return e===!1?!1:{windowTurns:e.window_turns,repeatThreshold:e.repeat_threshold}})()??this.deps.stallDetection,todoContinuation:e.todoContinuation??(()=>{let e=this.deps.settings.get(`todo_continue_max`);if(e===void 0)return;let t=Yt(process.env),n=Number.isFinite(e)&&e>=0?Math.trunc(e):t.max;return{enabled:t.enabled,max:n}})(),promptRefresh:f,workspaceDir:e.workspaceDir??this.deps.workspaceDir,workspaceId:e.workspaceId??this.deps.getWorkspaceId?.(),transient:e.transient,depth:e.depth,interactive:e.interactive,retryAccelerate:e.retryAccelerate,streamRetry:e.streamRetry??this.deps.getResilienceConfig?.().stream,networkDisconnectRetry:e.networkDisconnectRetry??oo(this.deps.getResilienceConfig?.().networkDisconnect),describeImages:this.deps.describeImages}}};function oo(e){if(e)return{maxRetries:e.maxRetries,initialDelayMs:e.intervalMs,backoffFactor:1,maxDelayMs:e.intervalMs}}const so=Rr.O_NOFOLLOW??0;function co(e,t){let n=Vr(e,Rr.O_WRONLY|Rr.O_APPEND|Rr.O_CREAT|so,384);try{Xr(n,t.endsWith(`
|
|
3
3
|
`)?t:t+`
|
|
4
|
-
`)}finally{
|
|
4
|
+
`)}finally{Lr(n)}}function lo(e,t=20){let n;try{return n=Vr(e,Rr.O_RDONLY|so),k(n,`utf-8`).replace(/\n+$/,``).split(`
|
|
5
5
|
`).slice(-t).join(`
|
|
6
|
-
`)}catch{return``}finally{n!==void 0&&
|
|
7
|
-
`)}function
|
|
6
|
+
`)}catch{return``}finally{n!==void 0&&Lr(n)}}function uo(e){return e.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
|
|
7
|
+
`)}function fo(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 di({stream:e.stream,logger:e.logger,agentName:e.runId,maxToolTurns:e.maxToolTurns,toolHookExecutor:jt({hookRegistry:e.hookRegistry,agentName:e.runId,sessionId:e.runId}),depth:e.depth??0,approval:(t,n,i)=>{let a=e.onAwaitingInput;return a?new Promise(n=>{zt.setAwaitingApproval(e.runId,`${t}: ${i}`),r=t=>{zt.clearAwaitingApproval(e.runId),n(t)};try{co(e.outputPath,`⏳ 需要你确认「${t}」:${i}\n 进 Delegates 面板按 o,回复 yes 允许 / no 拒绝。`)}catch{}a(i)}):Promise.resolve(!1)}});i.on(`turn.end`,({message:t})=>{let n=uo(t);if(n)try{co(e.outputPath,n)}catch{}});let a=()=>{if(r){let e=r;r=void 0,e(!1)}i.abort()},o=St(i,{id:e.runId,agentName:e.runId,title:e.runId,prompt:e.prompt,model:e.model.id,origin:`user`,depth:e.depth??0,abort:a,messages:n.messages});return{promise:i.run(n).then(e=>({text:uo(e),messages:n.messages,tokenUsage:{input:e.usage.inputTokens,output:e.usage.outputTokens,cacheRead:e.usage.cacheReadTokens},durationMs:Date.now()-t})).finally(()=>{o(),zt.markEnded(e.runId)}),abort:a,steer:e=>{if(r){let t=r;r=void 0,t(/^\s*(y|yes|是|好|ok|approve|允许|同意|确认|可以|行)/i.test(e));return}i.steer({role:`user`,content:[{type:`text`,text:e}],timestamp:Date.now()})},outputPath:e.outputPath}}var po=class{ownedJobIds=new Set;handles=new Map;appliedDiffs=new Map;constructor(e){if(this.deps=e,e.appliedDiffStore)for(let{jobId:t,diff:n}of e.appliedDiffStore.loadAll())this.appliedDiffs.set(t,n)}start(e){let{repoRoot:t,registry:n,spawnRun:r,buildOutputPath:i,newJobId:a}=this.deps,o=a(),s=Mt(t,o),c=i(o),l;try{l=r({runId:o,prompt:e.prompt,outputPath:c,workspaceDir:s.path,onAwaitingInput:()=>this.deps.registry.update(o,{status:`needs_input`})})}catch(e){throw qt(s,this.deps.onWorktreeCleanupError),e}let u=n.register({id:o,sessionId:e.sessionId,title:e.title,origin:e.origin,worktree:s,outputPath:c,abort:l.abort});return this.ownedJobIds.add(o),this.handles.set(o,l),l.promise.then(t=>this.onRunComplete(o,e.title,e.sessionId,s,c,t)).catch(t=>this.onRunFailed(o,e.title,e.sessionId,t)).finally(()=>this.handles.delete(o)),u}supply(e,t){let n=this.handles.get(e);if(!n?.steer)return!1;let r=this.deps.registry.get(e);return!r||r.status!==`running`&&r.status!==`needs_input`?!1:(n.steer(t),r.status===`needs_input`&&this.deps.registry.update(e,{status:`running`}),!0)}dispose(){for(let e of this.ownedJobIds)this.deps.registry.cancel(e);this.ownedJobIds.clear(),this.handles.clear(),this.appliedDiffs.clear()}onRunComplete(e,t,n,r,i,a){let o=this.deps.registry.get(e);if(!o||o.status===`canceled`)return;let s=``;try{s=en(r)}catch(r){this.onRunFailed(e,t,n,r);return}if(this.deps.registry.update(e,{status:`ready`,diff:s}),s.trim()){this.deps.notify(n,{jobId:e,title:t,status:`ready`,summary:`produced a diff (${ho(s)})`,outputPath:i,worktree:{path:r.path,branch:r.branch}});return}let c=mo(a).trim(),l=c?`完成 — /jobs 按 o 看结果(约 ${c.length} 字)`:`完成(无文件改动、无文本输出)`;this.deps.notify(n,{jobId:e,title:t,status:`ready`,summary:l,outputPath:i})}onRunFailed(e,t,n,r){let i=this.deps.registry.get(e);if(!i||i.status===`canceled`)return;let a=r instanceof Error?r.message:String(r);this.deps.registry.update(e,{status:`failed`,error:a}),this.deps.notify(n,{jobId:e,title:t,status:`failed`,summary:a})}apply(e){let t=this.deps.registry.get(e);if(!t)return{applied:!1,status:`error`,message:`job ${e} not found`,conflictPaths:[]};if(t.status!==`ready`)return{applied:!1,status:`error`,message:`job ${e} is ${t.status}, not ready`,conflictPaths:[]};let n=$t(t.diff??``),r=Qt(t.diff??``).length>0,i=xt(this.deps.repoRoot,t.diff??``);if(i.applied)return t.diff?.trim()&&(this.appliedDiffs.set(e,t.diff),this.deps.appliedDiffStore?.save(e,t.diff)),this.deps.registry.update(e,{status:`applied`}),{applied:!0,status:`success`,message:`applied cleanly`,conflictPaths:[],forbiddenZone:n,capabilityTouched:r};let a=Ht(this.deps.repoRoot,t.worktree.base);return{applied:!1,status:i.conflictPaths.length?`partial`:`error`,message:i.conflictPaths.length?`conflicts in ${i.conflictPaths.length} file(s); resolve or cancel${a?` (main repo has moved since this job started)`:``}`:`apply failed`,conflictPaths:i.conflictPaths,repoDrifted:a}}revert(e){let t=this.appliedDiffs.get(e);if(!t)return{applied:!1,status:`error`,message:`job ${e} has no applied change to revert`,conflictPaths:[]};let n=Zt(this.deps.repoRoot,t);return n.applied?(this.appliedDiffs.delete(e),this.deps.appliedDiffStore?.delete(e),{applied:!0,status:`success`,message:`reverted cleanly`,conflictPaths:[]}):{applied:!1,status:n.conflictPaths.length?`partial`:`error`,message:n.conflictPaths.length?`cannot revert: ${n.conflictPaths.length} file(s) diverged since apply`:`revert failed`,conflictPaths:n.conflictPaths}}cancel(e){this.deps.registry.cancel(e)}};function mo(e){let t=e?.text;return typeof t==`string`?t:``}function ho(e){let t=0,n=0,r=0,i=e.split(/^diff --git /m).filter(Boolean);for(let e of i){if(e.includes(`
|
|
8
8
|
GIT binary patch`)){r++;continue}for(let r of e.split(`
|
|
9
|
-
`))r.startsWith(`+`)&&!r.startsWith(`+++`)?t++:r.startsWith(`-`)&&!r.startsWith(`---`)&&n++}let a=r>0?`, ${r} binary file${r===1?``:`s`}`:``;return`+${t}/-${n}${a}`}const
|
|
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+`
|
|
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 go=/^[a-zA-Z0-9_-]+$/;function _o(e){return{save(t,n){if(!go.test(t))throw Error(`Invalid jobId for applied diff store: ${t}`);O(e,{recursive:!0}),A(x(e,`${t}.patch`),n,`utf-8`)},load(t){let n=x(e,`${t}.patch`);if(D(n))return k(n,`utf-8`)},delete(t){let n=x(e,`${t}.patch`);D(n)&&Yr(n)},loadAll(){return D(e)?Hr(e).filter(e=>Ve(e)===`.patch`).map(t=>({jobId:t.slice(0,-6),diff:k(x(e,t),`utf-8`)})):[]}}}const vo=[`delegate_job`];function yo(e){return e.filter(e=>!vo.includes(e.name))}function bo(){return`job_${ui().replace(/-/g,``).slice(0,8)}`}function xo(e){let t=e.outputDir??x(ze(),`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 po({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?_o(e.appliedDiffDir):void 0,spawnRun:({runId:t,prompt:n,outputPath:r,workspaceDir:i,onAwaitingInput:a})=>fo({runId:t,prompt:n,outputPath:r,model:e.getModel(),systemPrompt:e.systemPrompt,tools:[...yo(e.buildTools(i)),...e.mcpTools?.()??[]],maxToolTurns:e.maxToolTurns,stream:e.stream,logger:e.logger,hookRegistry:e.hookRegistry,onAwaitingInput:a}),buildOutputPath:e=>(O(t,{recursive:!0}),x(t,`agent-job-${e}.log`)),newJobId:e.newJobId??bo})}function So(e){return xo({repoRoot:e.workspaceDir,registry:Lt,notify:(t,n)=>e.agentJobNotify?.(t,n),buildTools:t=>e.buildToolsForWorkspace(t),mcpTools:()=>e.connectorTools(),getModel:()=>{let t=e.settings.get(`model`),n=(t?e.modelRegistry.find(t):void 0)??e.modelRegistry.getAll().find(e=>e.id!==`__otto_setup__`);if(!n)throw Error(`No model available — configure a model or run /model first.`);return n},stream:e.stream,logger:e.logger,hookRegistry:e.hookRegistry,appliedDiffDir:s()?void 0:x(n,`jobs`,`applied`)})}function Co(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 wo(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 To(e){let t=Error(e);return t.name=`AbortError`,t}function Eo(e){let t=new Map;return{runSession:async n=>{let r=Date.now(),i=new AbortController;n.taskId&&t.set(n.taskId,i);let a=n.signal,o=()=>i.abort();a&&(a.aborted?i.abort():a.addEventListener(`abort`,o,{once:!0}));let s;s=n.sessionMode===`sticky`&&n.sessionId?e.getSession(n.sessionId)||await e.createSession({id:n.sessionId,agentName:n.agentName,slot:n.slot,modelId:n.model,category:n.category,delegated:!0,promptContext:n.promptContext??(n.agentName?{taskDescription:n.prompt}:void 0),depth:n.depth,readOnly:n.readOnly}):await e.createSession({agentName:n.agentName,slot:n.slot,modelId:n.model,category:n.category,delegated:!0,promptContext:n.promptContext??(n.agentName?{taskDescription:n.prompt}:void 0),depth:n.depth,transient:!0,readOnly:n.readOnly});let c=s.id,l=St(s.coreAgent,{id:c,agentName:n.agentName??`agent`,title:n.agentName??n.prompt.replace(/\s+/g,` `).slice(0,48),prompt:n.prompt,model:n.model??s.model.id,modelDecidedBy:s.modelResolution?.decidedBy,origin:`main`,depth:n.depth??0,abort:()=>s.abort(),messages:()=>s.session.messages()});try{if(i.signal.aborted)throw To(`Task cancelled before the session started`);let e=n.agentName?`<agent-guardrails>\n${hn}\n</agent-guardrails>\n\n<task>\n${n.prompt}\n</task>`:n.prompt,t=s.prompt(e);t.catch(()=>{}),await Promise.race([t,new Promise((e,t)=>{i.signal.addEventListener(`abort`,()=>{s.abort(),t(To(`Task cancelled`))})})]);let a=s.session.messages(),o=Co(a),c=wo(a);return c&&(o=`${o}\n\n[⚠ subagent did not complete cleanly (stop reason: ${c}) — the output above may be partial or unreliable; verify before relying on it]`),{text:o,sessionId:s.id,durationMs:Date.now()-r}}finally{zt.setMessages(c,s.session.messages()),l(),zt.markEnded(c),a?.removeEventListener(`abort`,o),n.taskId&&t.delete(n.taskId),n.sessionMode===`ephemeral`&&await e.removeSession(s.id).catch(t=>{e.logger.warn(`Failed to remove ephemeral session %s: %s`,s.id,t)})}},abortTask:e=>{t.get(e)?.abort()}}}function Do(e){let t=new hi({focusTracking:process.env.OTTO_TUI_FOCUS===`1`}),n=new mi({getConfig:e.getConfig,getCwd:e.getCwd,onInteraction:()=>t.recordInteraction(),isFollowUpPending:e.isFollowUpPending,gate:new _i({getCondition:()=>e.getConfig()?.condition,getIdleThresholdMs:()=>e.getConfig()?.idle_threshold_ms,state:t})});return n.registerChannel(new gi({getConfig:e.getConfig})),n.registerChannel(new fi(`hook`,()=>!0,t=>e.emitHookNotification({sessionId:t.sessionId,message:t.message,title:t.title,notification_type:t.type}))),n.registerChannel(new pi({getConfig:e.getConfig,isTrusted:()=>xr(e.getCwd())})),{dispatcher:n,presenceTracker:t}}function Oo(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 ko=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=ae(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=le(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=Oo(await y(c),c.modelIdExclude),n=ae(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 Ao(e){return e.modelRegistry.getAll()}function jo(e,t){return e.modelRegistry.resolve(t)}function Mo(e){return e.providerRegistry.list()}function No(e,t){e.hookRegistry.register(t)}function Po(e,t){return e.hookRegistry.unregister(t)}async function Fo(e){return e.modelCatalogManager.hydrate()}function Io(e,t){return e.codingSessionPool.getSessionAvailableModels(t)}function Lo(e,t,n){e.codingSessionPool.setSessionAvailableModels(t,n)}async function Ro(e){return e.modelCatalogManager.refresh()}async function zo(e,t){let n=new Set(t?e.codingSessionPool.getSessionAvailableModels(t):[]),r=te(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 Bo(e,t){e.notificationDispatcher.registerChannel(t)}function Vo(e,t){e.notificationDispatcher.registerChannel(new fi(`inapp`,()=>!0,e=>t(e.title??`otto`,e.message,e.type)))}function Ho(e){e.presenceTracker.recordInteraction()}function Uo(e,t){e.presenceTracker.setFocus(t)}async function Wo(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 Go(e){return e.settings.get(`permission_mode`)??`auto`}async function Ko(e,t){let n=Go(e);await e.settings.update({permission_mode:t}),e.settings.persist({permission_mode:t}).catch(n=>e.logger.warn({err:n instanceof Error?n.message:String(n),mode:t},`Failed to persist permission mode`)),e.logger.info({from:n,to:t},`Permission mode set`)}function qo(e,t){return e.permissionRegistry.getSessionAlwaysAllow(t)}async function Jo(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 Yo(e,t){t&&(e.permissionRegistry.clearSessionAlwaysAllow(t),e.codingSessionPool.setSessionPermissionAllow(t,[]),e.logger.info({sessionId:t},`Session always-allow list cleared`))}async function Xo(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 Zo(e,t){return e.codingSessionPool.getSession(t)}async function Qo(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 $o(e){return e.codingSessionPool.active}function es(e,t){return e.codingSessionPool.listSessions(t)}async function ts(e,t){let n=es(e,t),r;try{r=t?.workspaceId===void 0?e.workspaceRef?.key:Si(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 ns(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 rs(e,t){let n=await e.codingSessionPool.archiveSession(t);return n&&e.logger.info({sessionId:t},`Session archived`),n}async function is(e,t,n){let r=await e.codingSessionPool.forkSession(t,n);return r&&e.notificationDispatcher.attach(r),r}var as=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 os=C(`@x-otto/coding:plugin-panel-manager`);function ss(e){let t=e.plugins??Bn({cwd:e.workspaceDir,homedir:e.homedir,disabled:e.disabledPlugins}),n=[];for(let e of t){let t=e.manifest.contributes?.panels;if(!t||t.length===0)continue;let r=E(e);if(!r.gated){if(!e.manifest.capabilities?.includes(`tui.renderer`)){os.warn({pluginId:e.id},`plugin declares contributes.panels but not capabilities:["tui.renderer"], skipped (fail-closed)`);continue}if(r.pendingCapabilities.includes(`tui.renderer`)){os.warn({pluginId:e.id},`plugin capability "tui.renderer" declared but not yet granted, skipping panels (fail-closed)`);continue}for(let r of t){let t=x(e.dir,r.entry);if(!D(t)){os.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 cs(e){let t=[];for(let n of e){if(E(n).gated)continue;let e=n.manifest.contributes?.statusItems;if(!e?.length)continue;let r=Hn(n.manifest.contributes?.contextKeys);for(let i of e){if((i.point??jn.statuslineItem)!==jn.statuslineItem||!Wn(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 ls(e){let t=[];for(let n of e){if(E(n).gated)continue;let e=n.manifest.contributes;if(!e?.menus?.length)continue;let r=Hn(e.contextKeys);t.push(...tr(jn.menuItem,e.menus,e.actions,r))}return t}const us={capability:`tui.renderer`,axis:`renderers`,noun:`renderer`,pendingNote:`RFC-140 D3`,logger:C(`@x-otto/coding:plugin-renderer-loader`),entries:e=>e.manifest.contributes?.renderers,entryPath:e=>e.entry,exportName:e=>e.export,idLogFields:e=>({rendererId:e.id}),logTypeofOnNotFunction:!0,build:(e,t,n)=>({id:`${e.id}:${t.id}`,pluginId:e.id,matcher:t.matcher,render:n}),successLogFields:e=>({rendererId:e.id,matcher:e.matcher})};function ds(e){return Ua(e,us)}const fs=C(`@x-otto/coding:plugin-a2ui-component-loader`),ps=new Set([`Text`,`Card`,`List`,`Progress`,`Chip`,`Button`]),ms={capability:`a2ui.component`,axis:`a2uiComponents`,noun:`a2ui component`,pendingNote:`RFC-140 D3 pattern`,logger:fs,entries:e=>e.manifest.contributes?.a2uiComponents,entryPath:e=>e.entry,exportName:e=>e.export,idLogFields:e=>({type:e.type}),logTypeofOnNotFunction:!1,preCheck:(e,t)=>ps.has(t.type)?(fs.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 hs(e){return Ua(e,ms,{key:e=>e.type,onConflict:(e,t)=>{fs.warn({pluginId:e.pluginId,type:e.type,existingOwner:t},`a2ui component type already registered by another plugin, rejected (first-registered wins)`)}})}const gs={capability:`tui.renderer`,axis:`statusWidgets`,noun:`status widget`,pendingNote:`RFC-140 D3 pattern`,logger:C(`@x-otto/coding:plugin-status-widget-loader`),entries:e=>e.manifest.contributes?.statusWidgets,entryPath:e=>e.entry,exportName:e=>e.export,idLogFields:e=>({widgetId:e.id}),logTypeofOnNotFunction:!0,build:(e,t,n)=>({id:`${e.id}:${t.id}`,pluginId:e.id,render:n,tickMs:t.tickMs,order:t.order}),successLogFields:e=>({widgetId:e.id})};function _s(e){return Ua(e,gs)}const vs={capability:`tui.renderer`,axis:`fileViewers`,noun:`file viewer`,pendingNote:`RFC-140 D3 pattern`,logger:C(`@x-otto/coding:plugin-file-viewer-loader`),entries:e=>e.manifest.contributes?.fileViewers,entryPath:e=>e.entry,exportName:e=>e.export,idLogFields:e=>({viewerId:e.id}),logTypeofOnNotFunction:!0,build:(e,t,n)=>({id:`${e.id}:${t.id}`,pluginId:e.id,label:t.label,matcher:t.matcher,render:n,order:t.order}),successLogFields:e=>({viewerId:e.id,matcher:e.matcher})};function ys(e){return Ua(e,vs)}var bs=class{constructor(e){this.deps=e}listFileCommands(){return[...mr(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 ss({workspaceDir:this.deps.getWorkspaceDir(),homedir:Re(),disabledPlugins:this.deps.settings.get(`disabled_plugins`),plugins:this.deps.getActivePlugins()})}getPluginStatusItems(){return cs(this.deps.getActivePlugins())}getGlobalMenuItems(){return ls(this.deps.getActivePlugins())}getPluginRenderers(){return ds(this.deps.getActivePlugins())}getPluginA2uiComponents(){return hs(this.deps.getActivePlugins())}getPluginStatusWidgets(){return _s(this.deps.getActivePlugins())}getPluginFileViewers(){return ys(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 M=C(`@x-otto/coding:plugin-hooks`),xs=4096;function Ss(e,t){let n=Je();return n.OTTO_PLUGIN_DIR=e.pluginDir,n.OTTO_PLUGIN_ID=e.pluginId,e.workspaceDir&&(n.OTTO_WORKSPACE_DIR=e.workspaceDir),t&&Object.assign(n,t),n}function Cs(e){let t=Ye(e);return t.safe?null:{success:!1,hook:`pre-check`,command:e,error:`Dangerous command blocked: ${t.reason}`}}function ws(e,t){let n=!1,r,i;if(e?.length){let t=typeof e==`string`?e:e.toString(`utf-8`);r=t.slice(0,xs),n=t.length>xs}if(t?.length){let e=typeof t==`string`?t:t.toString(`utf-8`);i=e.slice(0,xs),n||=e.length>xs}return{stdout:r,stderr:i,truncated:n}}async function Ts(e,t){return Cs(t)||(M.info({pluginId:e.pluginId,command:t},`Executing postinstall hook`),new Promise(n=>{let r=j(t,{cwd:e.pluginDir,env:Ss(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}=ws(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||M.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 Es(e,t,n,r,i){let a=Cs(t);if(a){M.warn({pluginId:e.pluginId,command:t},`Setup hook blocked by safety check`),n?.(a);return}if(M.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:Ss(e),signal:i}),o=setTimeout(()=>{M.warn({pluginId:e.pluginId},`Setup hook exceeded 60s — killing`),a.kill({reason:`setup timeout (60s)`})},6e4);o.unref?.();let s=``,c=``;a.onStdoutLine(e=>{s+=e+`
|
|
11
11
|
`}),a.onStderrLine(e=>{c+=e+`
|
|
12
|
-
`}),a.onExit(r=>{clearTimeout(o);let{stdout:i,stderr:a,truncated:l}=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{reloadQueue=Promise.resolve();constructor(e,t,n,r,i,a,o,s,c,l){this.settings=e,this.mcp=t,this.skills=n,this.pluginModules=r,this.pluginProviders=i,this.tools=a,this.modelCatalog=o,this.workspaceDir=s,this.activePlugins=c,this.i18n=l}async reload(){let e=this.reloadQueue.then(()=>this.reloadSerial());return this.reloadQueue=e.catch(()=>void 0),e}async reloadSerial(){await this.settings.load(),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')
|
|
12
|
+
`}),a.onExit(r=>{clearTimeout(o);let{stdout:i,stderr:a,truncated:l}=ws(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?M.info({pluginId:e.pluginId},`Setup hook succeeded`):M.error({pluginId:e.pluginId,exitCode:r.code,signal:r.signal,stderr:a?.slice(0,512)},`Setup hook failed`),n?.(u)}),a.onError(r=>{M.error({pluginId:e.pluginId,err:r},`Setup hook spawn error`),n?.({success:!1,hook:`setup`,command:t,error:r.message})});return}let o=j(t,{cwd:e.pluginDir,env:Ss(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}=ws(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?M.info({pluginId:e.pluginId},`Setup hook succeeded`):M.error({pluginId:e.pluginId,exitCode:r,signal:i,stderr:o?.slice(0,512)},`Setup hook failed`),n?.(u)}),o.on(`error`,r=>{M.error({pluginId:e.pluginId,err:r},`Setup hook spawn error`),n?.({success:!1,hook:`setup`,command:t,error:r.message})})}const Ds=C(`@x-otto/coding:plugin-lifecycle`),Os=`plugin_lifecycle`,ks=new Set;async function As(e,t,n){let r=t.get(Os)?.setupDone??[],i=new Map(r.map(e=>[e.id,e.version])),a=new Set(e.map(e=>e.id));for(let e of i.keys())a.has(e)||i.delete(e);let o=!1;for(let r of e){let e=i.get(r.id),a=r.manifest.version,s=r.manifest.scripts?.setup;if(!s){(e===void 0||e!==a)&&(i.set(r.id,a),o=!0);continue}if(!(e!==void 0&&e===a)){if(E(r).gated){Ds.info({pluginId:r.id},`Setup hook deferred: plugin not yet trusted`);continue}ks.has(r.id)||(ks.add(r.id),Es({pluginDir:r.dir,pluginId:r.id,workspaceDir:n},s,e=>{ks.delete(r.id),i.set(r.id,a),js(t,i)},Vt))}}o&&await js(t,i)}async function js(e,t){let n=[...t].map(([e,t])=>({id:e,version:t}));await e.persist({[Os]:{setupDone:n}})}function Ms(e,t){let n;try{n=Wr(t)}catch{return!1}let r;try{r=Wr(e)}catch{r=e}return r===n||r.startsWith(n+We)}const N=C(`@x-otto/coding:plugin-i18n-loader`),Ns=/^([a-zA-Z0-9_-]+)\.json$/;function Ps(e){return Buffer.byteLength(e,`utf8`)<=Tn?e:`${Buffer.from(e,`utf8`).subarray(0,Tn).toString(`utf8`)}…`}function Fs(e,t,n){let r=new Map,i=S(t,n);if(!Ms(i,t))return N.warn({pluginId:e,i18nDir:n},`i18nDir resolves outside plugin dir, skipped`),r;let a;try{a=Hr(i)}catch{return r}let o=a.filter(e=>Ns.test(e)).sort();o.length>wn&&(N.warn({pluginId:e,i18nDir:n,declared:o.length,limit:wn},`plugin i18nDir declares more locale files than the per-plugin limit, truncated`),o=o.slice(0,wn));for(let n of o){let a=Ns.exec(n)?.[1];if(!a)continue;let o=S(i,n);if(!Ms(o,t)){N.warn({pluginId:e,filename:n},`i18nDir locale file resolves outside plugin dir, skipped`);continue}let s;try{s=k(o,`utf8`)}catch(t){N.warn({pluginId:e,filename:n,err:String(t)},`i18nDir locale file read failed, skipped`);continue}if(Buffer.byteLength(s,`utf8`)>Cn){N.warn({pluginId:e,filename:n,limit:Cn},`i18nDir locale file exceeds byte limit, skipped`);continue}let c;try{c=JSON.parse(s)}catch(t){N.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)){N.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 Is(e){let t=[];for(let n of e){if(E(n).gated)continue;let e=n.manifest.contributes?.i18nDir,r=n.manifest.contributes?.i18n;if(!e&&!r?.length)continue;let i=e?Fs(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&&N.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>Sn&&(N.warn({pluginId:n.id,declared:a.length,limit:Sn},`plugin declares more i18n entries than the per-plugin limit, truncated`),a=a.slice(0,Sn));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]=Ps(t);t.push({pluginId:n.id,id:e,translations:a})}}return t}const Ls=C(`@x-otto/coding:declarative-agents`);function Rs(e){return{...e,defaultTools:e.defaultTools?.length?wr(e.defaultTools):e.defaultTools,disallowedTools:e.disallowedTools?.length?wr(e.disallowedTools):e.disallowedTools}}function zs(e,t){let n=et(e);if(!n)return Ls.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 Ls.warn({sourcePath:t},`Agent definition requires name/description/body, skipped`),null;let s=Qe(r.get(`tools`)),c=Number.parseInt(r.get(`maxtoolturns`)??``,10),l=Number.parseInt(r.get(`maxtoolturnextensions`)??``,10),u=r.get(`prompt-mode`),d=Qe(r.get(`disallowed-tools`)),f=r.get(`allow-subagents`)===`true`?!0:r.get(`allow-subagents`)===`false`?!1:void 0;return{name:a,description:o,taskTypes:Qe(r.get(`tasktypes`))??[o],capabilities:Qe(r.get(`capabilities`))??[],systemPromptTemplate:i,promptMode:u===`append`||u===`replace`?u:void 0,defaultTools:s,disallowedTools:d?.length?d:void 0,preferredModelTier:r.get(`slot`)??r.get(`tier`),defaultMaxToolTurns:Number.isInteger(c)?c:void 0,defaultMaxToolTurnExtensions:Number.isInteger(l)?l:void 0,allowSubagents:f}}async function Bs(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??Bn({cwd:e,homedir:n()})).filter(e=>e.manifest.contributes?.agents!==!1).filter(e=>!E(e).gated).map(e=>({dir:r(e.dir,`agents`),claude:!1})),c=o(),l=c&&!gr(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 Vs(e))d.set(n.name,t?Rs(n):n);let f=[...d.values()];return f.length>0&&Ls.info(`Loaded %d declarative agent(s): %s`,f.length,f.map(e=>e.name).join(`, `)),f}async function Vs(e){let{readFile:t,readdir:n}=await import(`node:fs/promises`),{join:r}=await import(`node:path`),i;try{i=await n(e)}catch{return[]}let a=[];for(let n of i.filter(e=>e.endsWith(`.md`)).sort()){let i=r(e,n);try{let e=zs(await t(i,`utf-8`),i);e&&a.push(e)}catch(e){Ls.warn({sourcePath:i,err:e},`Failed to read agent definition, skipped`)}}return a}const Hs=C(`@x-otto/coding:declarative-teams`),Us=new Set([`handoff`,`sequential`,`parallel`,`hierarchical`,`router`]);function Ws(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 Gs(e,t){let n=et(e);if(!n)return Hs.warn({sourcePath:t},`Team definition missing frontmatter, skipped`),null;let{fields:r}=n,i=r.get(`name`),a=r.get(`pattern`),o=Qe(r.get(`agents`));if(!i||!a||!Us.has(a)||!o||o.length===0)return Hs.warn({sourcePath:t},`Team definition requires name, valid pattern and non-empty agents, skipped`),null;let s=Number.parseInt(r.get(`maxhandoffdepth`)??``,10);return{name:i,pattern:a,agentNames:o,pipeline:Qe(r.get(`pipeline`)),supervisorId:r.get(`supervisor`),entryAgentId:r.get(`entry`),routerStrategy:r.get(`router`),rules:Ws(r.get(`rules`)),maxHandoffDepth:Number.isInteger(s)?s:void 0}}async function Ks(e,t){let{homedir:n}=await import(`node:os`),{join:r}=await import(`node:path`),i=t?.globalDir??r(n(),`.otto`,`teams`),a=r(e,`.otto`,`teams`),o=new Map;for(let e of[i,a])for(let t of await qs(e))o.set(t.name,t);let s=[...o.values()];return s.length>0&&Hs.info(`Loaded %d declarative team(s): %s`,s.length,s.map(e=>e.name).join(`, `)),s}async function qs(e){let{readFile:t,readdir:n}=await import(`node:fs/promises`),{join:r}=await import(`node:path`),i;try{i=await n(e)}catch{return[]}let a=[];for(let n of i.filter(e=>e.endsWith(`.md`)).sort()){let i=r(e,n);try{let e=Gs(await t(i,`utf-8`),i);e&&a.push(e)}catch(e){Hs.warn({sourcePath:i,err:e},`Failed to read team definition, skipped`)}}return a}var Js=class{reloadQueue=Promise.resolve();constructor(e,t,n,r,i,a,o,s,c,l){this.settings=e,this.mcp=t,this.skills=n,this.pluginModules=r,this.pluginProviders=i,this.tools=a,this.modelCatalog=o,this.workspaceDir=s,this.activePlugins=c,this.i18n=l}async reload(){let e=this.reloadQueue.then(()=>this.reloadSerial());return this.reloadQueue=e.catch(()=>void 0),e}async reloadSerial(){await this.settings.load(),As(this.activePlugins(),this.settings,this.workspaceDir),await this.mcp.reload(),this.skills&&(this.skills.updatePluginDirs(this.activePlugins().filter(e=>e.manifest.contributes?.skills!==!1).filter(e=>!E(e).gated).map(e=>({id:e.id,dir:x(e.dir,`skills`)}))),await this.skills.discover());let e=Is(this.activePlugins());this.i18n.register(e);let t=(await this.modelCatalog.refresh().catch(()=>[])).reduce((e,t)=>e+(t.added??0),0),n=await Bs(this.workspaceDir,{plugins:this.activePlugins()}),r=await Ks(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 Ys=C(`@x-otto/coding:panel-backend-controller`);var Xs=class{stateListeners=new Map;statusListeners=new Map;inProcessHandlers=new Map;subscribedManager=null;constructor(e){this.deps=e}registerInProcessBackend(e,t){this.inProcessHandlers.set(e,t);let n=this.statusListeners.get(e);if(n)for(let e of n)e(`ready`)}unregisterInProcessBackend(e){this.inProcessHandlers.delete(e)}resolveServerForPlugin(e){if(this.inProcessHandlers.has(e))return{ok:!0};let t=this.deps.getActivePlugins().find(t=>t.id===e);if(!t)return{ok:!1,reason:`plugin "${e}" not found or not active`};if(!t.manifest.capabilities?.includes(`panel.backend`))return{ok:!1,reason:`plugin "${e}" does not declare capabilities:["panel.backend"]`};let n=E(t);if(n.pendingCapabilities.includes(`panel.backend`))return{ok:!1,reason:`plugin "${e}" capability "panel.backend" declared but not yet granted`};if(n.gated)return{ok:!1,reason:`plugin "${e}" is untrusted`};let r=this.deps.mcpController.listEffectiveServers(),i=Object.entries(r).filter(([,t])=>t.pluginId===e);return i.length===0?{ok:!1,reason:`plugin "${e}" has no associated MCP server`}:(i.length>1&&Ys.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 Zs=C(`@x-otto/coding:plugin-log-writer`);function Qs(){return S(n,`plugin-logs`)}function $s(e){return xn.test(e)?x(Qs(),`${e}.jsonl`):(Zs.warn({pluginId:e},`plugin id failed kebab-case validation, skipping log path resolution`),null)}function ec(e){let t;try{t=qr(e).size}catch{return}if(!(t<=5242880))try{let t=k(e,`utf8`),n=Math.floor(t.length/2),r=t.indexOf(`
|
|
13
|
+
`,n);A(e,r>=0?t.slice(r+1):t.slice(n))}catch(t){Zs.warn({path:e,err:String(t)},`plugin log truncation failed (fail-soft)`)}}function tc(e,t,n){if(!s())try{let r=$s(e);if(!r)return;let i=Qs();D(i)||O(i,{recursive:!0}),ec(r),Ir(r,`${JSON.stringify({ts:Date.now(),level:t,pluginId:e,msg:n})}\n`)}catch(t){Zs.warn({pluginId:e,err:String(t)},`plugin log append failed (fail-soft)`)}}const nc=C(`@x-otto/coding:plugin-tool-wiring`);function P(e,t){return`plugin:${e}:${t}`}function rc(e){let t=e.split(`:`);return t.length<3||t[0]!==`plugin`?null:t[1]||null}function ic(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 F={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 ac(e,t){let n=[];if(t.preToolUse){let r=t.preToolUse;n.push(b({name:P(e,`preToolUse`),timing:F.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(b({name:P(e,`postToolUse`),timing:F.postToolUse,handle:async e=>{await r({toolName:e.toolName,input:e.args,result:e.result})}}))}if(t.userPromptSubmit){let r=t.userPromptSubmit;n.push(b({name:P(e,`userPromptSubmit`),timing:F.userPromptSubmit,handle:async e=>{await r({prompt:ic(e.message)})}}))}if(t.sessionStart){let r=t.sessionStart;n.push(b({name:P(e,`sessionStart`),timing:F.sessionStart,handle:async()=>{await r()}}))}if(t.stop){let r=t.stop;n.push(b({name:P(e,`stop`),timing:F.stop,handle:async()=>{await r()}}))}if(t.sessionRestored){let r=t.sessionRestored;n.push(b({name:P(e,`sessionRestored`),timing:F.sessionRestored,handle:async e=>{await r({sessionId:e.sessionId})}}))}if(t.sessionDeleted){let r=t.sessionDeleted;n.push(b({name:P(e,`sessionDeleted`),timing:F.sessionDeleted,handle:async e=>{await r({sessionId:e.sessionId})}}))}if(t.sessionIdle){let r=t.sessionIdle;n.push(b({name:P(e,`sessionIdle`),timing:F.sessionIdle,handle:async e=>{await r({sessionId:e.sessionId})}}))}if(t.sessionError){let r=t.sessionError;n.push(b({name:P(e,`sessionError`),timing:F.sessionError,handle:async e=>{await r({sessionId:e.sessionId,error:e.error})}}))}if(t.streamStart){let r=t.streamStart;n.push(b({name:P(e,`streamStart`),timing:F.streamStart,handle:async e=>{await r({sessionId:e.sessionId,model:e.model})}}))}if(t.compactionPending){let r=t.compactionPending;n.push(b({name:P(e,`compactionPending`),timing:F.compactionPending,handle:async e=>{await r({sessionId:e.sessionId,messageCount:e.messageCount})}}))}if(t.compactionOccurred){let r=t.compactionOccurred;n.push(b({name:P(e,`compactionOccurred`),timing:F.compactionOccurred,handle:async e=>{await r({sessionId:e.sessionId,retainedCount:e.retainedCount})}}))}if(t.taskCreated){let r=t.taskCreated;n.push(b({name:P(e,`taskCreated`),timing:F.taskCreated,handle:async e=>{await r({taskId:e.task.id})}}))}if(t.taskStarted){let r=t.taskStarted;n.push(b({name:P(e,`taskStarted`),timing:F.taskStarted,handle:async e=>{await r({taskId:e.task.id,agent:e.agent})}}))}if(t.taskCompleted){let r=t.taskCompleted;n.push(b({name:P(e,`taskCompleted`),timing:F.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(b({name:P(e,`taskFailed`),timing:F.taskFailed,handle:async e=>{await r({taskId:e.task.id,error:e.error.message})}}))}return n}function oc(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 sc(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 cc(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 lc(e,t){return t instanceof Ge?t.pluginSource===void 0?new t.constructor(t.message,{code:t.code,cause:t.cause,status:t.status,headers:t.headers,errorType:t.errorType,pluginSource:e}):t:new Ke(t instanceof Error?t.message:String(t),{code:`PROVIDER_PLUGIN_ERROR`,cause:t instanceof Error?t:void 0,pluginSource:e})}function uc(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:lc(e,o.error)}:yield o}catch(t){throw lc(e,t)}}}}}function dc(e,t){try{return t()}catch(t){let n=String(t);return nc.warn({pluginId:e,err:n},`plugin oauthProviderFactory threw, skipped`),tc(e,`warn`,`oauthProviderFactory threw, skipped: ${n}`),null}}function fc(e){return e&&typeof e==`object`&&Array.isArray(e.content)?e:{content:[{type:`text`,text:typeof e==`string`?e:JSON.stringify(e??null)}]}}function pc(e,t,n){let r=t;if(!r||typeof r!=`object`)return nc.warn({pluginId:e},`plugin tool entry is not an object, skipped`),null;if(typeof r.name!=`string`||!r.name)return nc.warn({pluginId:e},`plugin tool missing valid name, skipped`),null;if(typeof r.execute!=`function`)return nc.warn({pluginId:e,tool:r.name},`plugin tool missing execute function, skipped`),null;if(!r.parameters||typeof r.parameters.safeParse!=`function`)return nc.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=fc(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 mc(e,t){let n=[],r=async(t,n)=>{try{await t.onEvent(n)}catch(n){nc.warn({pluginId:e,monitorId:t.id,err:String(n)},`plugin monitor onEvent threw, isolated`)}};for(let i of t)n.push(b({name:P(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(b({name:P(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(b({name:P(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 hc(e){return{...e}}var gc=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?hc(t):{pluginId:e,hookTimeouts:0,toolTimeouts:0}}all(){return[...this.stats.values()].map(hc)}clear(){this.stats.clear()}};function _c(e){return new gc(e)}const vc=3600*1e3;function yc(){return{authorizedSessionIds:new Set,readCountThisEpoch:0,llmCountThisEpoch:0,llmCallTimes:[],notifyTimes:[]}}var bc=class{states=new Map;constructor(e=()=>Date.now()){this.now=e}stateOf(e){let t=this.states.get(e);return t||(t=yc(),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()-vc;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()-vc;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 xc(e){return e.kind===`session`?0:1}var Sc=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)=>xc(e.request.origin)-xc(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(Cc(n.request.question)))}}shutdown(){let e=this.queue.splice(0,this.queue.length);this.inFlightId=null;for(let t of e)t.resolve(Cc(t.request.question))}};function Cc(e){return{answer:``,acceptedRecommendation:!1,resolvedBy:`human`}}const I={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 wc(){return`const { parentPort, workerData } = require('worker_threads')
|
|
14
14
|
const __send = (m) => parentPort.postMessage(m)
|
|
15
15
|
|
|
16
16
|
// RFC-303 M5:worker 侧 scoped storage 实现(无第三方依赖,直接文件读写)。
|
|
@@ -60,7 +60,7 @@ function callHost(method, params) {
|
|
|
60
60
|
return new Promise((resolve, reject) => {
|
|
61
61
|
const callId = 'hc_' + (++hostCallSeq)
|
|
62
62
|
hostCalls.set(callId, { resolve, reject })
|
|
63
|
-
__send({ type: '${
|
|
63
|
+
__send({ type: '${I.hostCall}', callId, method, params })
|
|
64
64
|
})
|
|
65
65
|
}
|
|
66
66
|
|
|
@@ -99,14 +99,14 @@ function buildHost(capabilities) {
|
|
|
99
99
|
// 服务运行期的未捕获错误 → 上报宿主(计入崩溃,触发退避重启)。不 process.exit:
|
|
100
100
|
// 让宿主决定重启策略,worker 自杀会丢失错误上下文。
|
|
101
101
|
process.on('uncaughtException', (err) => {
|
|
102
|
-
__send({ type: '${
|
|
102
|
+
__send({ type: '${I.crashed}', error: (err && err.message) || String(err) })
|
|
103
103
|
})
|
|
104
104
|
process.on('unhandledRejection', (err) => {
|
|
105
|
-
__send({ type: '${
|
|
105
|
+
__send({ type: '${I.crashed}', error: (err && err.message) || String(err) })
|
|
106
106
|
})
|
|
107
107
|
|
|
108
108
|
parentPort.on('message', async (msg) => {
|
|
109
|
-
if (msg.type === '${
|
|
109
|
+
if (msg.type === '${I.hostResult}') {
|
|
110
110
|
const pending = hostCalls.get(msg.callId)
|
|
111
111
|
if (!pending) return
|
|
112
112
|
hostCalls.delete(msg.callId)
|
|
@@ -115,12 +115,12 @@ parentPort.on('message', async (msg) => {
|
|
|
115
115
|
return
|
|
116
116
|
}
|
|
117
117
|
|
|
118
|
-
if (msg.type === '${
|
|
118
|
+
if (msg.type === '${I.start}') {
|
|
119
119
|
try {
|
|
120
120
|
const mod = require(msg.compiledPath)
|
|
121
121
|
const factory = mod && (mod.default || mod)
|
|
122
122
|
if (typeof factory !== 'function') {
|
|
123
|
-
__send({ type: '${
|
|
123
|
+
__send({ type: '${I.started}', error: 'plugin entry is not a factory function' })
|
|
124
124
|
return
|
|
125
125
|
}
|
|
126
126
|
// 工厂期 ctx:service 场景下不注入 host(host 只进 service ctx),保持与既有
|
|
@@ -129,7 +129,7 @@ parentPort.on('message', async (msg) => {
|
|
|
129
129
|
const services = Array.isArray(instance && instance.services) ? instance.services : []
|
|
130
130
|
const svc = services.find((s) => s && s.id === msg.serviceId)
|
|
131
131
|
if (!svc || typeof svc.start !== 'function') {
|
|
132
|
-
__send({ type: '${
|
|
132
|
+
__send({ type: '${I.started}', error: 'service not found: ' + msg.serviceId })
|
|
133
133
|
return
|
|
134
134
|
}
|
|
135
135
|
serviceInstance = svc
|
|
@@ -144,9 +144,9 @@ parentPort.on('message', async (msg) => {
|
|
|
144
144
|
workspaceDir: msg.serviceCtx.workspaceDir,
|
|
145
145
|
workspaceKey: msg.serviceCtx.workspaceKey,
|
|
146
146
|
logger: {
|
|
147
|
-
info: (m) => __send({ type: '${
|
|
148
|
-
warn: (m) => __send({ type: '${
|
|
149
|
-
error: (m) => __send({ type: '${
|
|
147
|
+
info: (m) => __send({ type: '${I.hostCall}', callId: 'log', method: 'log.info', params: { msg: String(m) } }),
|
|
148
|
+
warn: (m) => __send({ type: '${I.hostCall}', callId: 'log', method: 'log.warn', params: { msg: String(m) } }),
|
|
149
|
+
error: (m) => __send({ type: '${I.hostCall}', callId: 'log', method: 'log.error', params: { msg: String(m) } }),
|
|
150
150
|
},
|
|
151
151
|
host: buildHost(msg.serviceCtx.hostCapabilities),
|
|
152
152
|
storage,
|
|
@@ -154,37 +154,37 @@ parentPort.on('message', async (msg) => {
|
|
|
154
154
|
// 被动面,真正的数据面是 readTranscript,那才有独立能力门)。
|
|
155
155
|
onNotify: (handler) => { notifyHandler = typeof handler === 'function' ? handler : null },
|
|
156
156
|
})
|
|
157
|
-
__send({ type: '${
|
|
157
|
+
__send({ type: '${I.started}' })
|
|
158
158
|
} catch (err) {
|
|
159
|
-
__send({ type: '${
|
|
159
|
+
__send({ type: '${I.started}', error: (err && err.message) || String(err) })
|
|
160
160
|
}
|
|
161
161
|
return
|
|
162
162
|
}
|
|
163
163
|
|
|
164
|
-
if (msg.type === '${
|
|
164
|
+
if (msg.type === '${I.notify}') {
|
|
165
165
|
// 未注册 handler → 丢弃(服务可能还没 start 完,或根本不关心通知)。
|
|
166
166
|
if (!notifyHandler) return
|
|
167
167
|
try {
|
|
168
168
|
await notifyHandler(msg.notification)
|
|
169
169
|
} catch (err) {
|
|
170
170
|
// 不静默:handler 异常按运行期崩溃上报,宿主据此退避重启(对齐 uncaughtException 纹理)。
|
|
171
|
-
__send({ type: '${
|
|
171
|
+
__send({ type: '${I.crashed}', error: (err && err.message) || String(err) })
|
|
172
172
|
}
|
|
173
173
|
return
|
|
174
174
|
}
|
|
175
175
|
|
|
176
|
-
if (msg.type === '${
|
|
176
|
+
if (msg.type === '${I.stop}') {
|
|
177
177
|
try {
|
|
178
178
|
if (serviceInstance && typeof serviceInstance.stop === 'function') await serviceInstance.stop()
|
|
179
|
-
__send({ type: '${
|
|
179
|
+
__send({ type: '${I.stopped}' })
|
|
180
180
|
} catch (err) {
|
|
181
|
-
__send({ type: '${
|
|
181
|
+
__send({ type: '${I.stopped}', error: (err && err.message) || String(err) })
|
|
182
182
|
}
|
|
183
183
|
return
|
|
184
184
|
}
|
|
185
185
|
})
|
|
186
|
-
`}const
|
|
187
|
-
`)}function
|
|
186
|
+
`}const L=C(`@x-otto/coding:plugin-service-pool`),Tc=5e3;function Ec(e){return[`--experimental-permission`,`--allow-fs-read=*`,...e?[`--allow-fs-write=${e}`]:[]]}`${ze()}`;let Dc=null,Oc=null;function kc(){return Oc||(Dc||=Br(x(ze(),`otto-plugin-service-`)),Oc=x(Dc,`service-entry.cjs`),A(Oc,wc()),Oc)}function Ac(e,t){return`${e}:${t}`}var jc=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(Ac(e,t))?.status}restartsOf(e,t){return this.services.get(Ac(e,t))?.restarts??0}notify(e,t,n){let r=this.services.get(Ac(e,t));if(!r||r.status!==`running`)return!1;try{return r.worker.postMessage({type:I.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=Ac(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 ki(kc(),{execArgv:[...Ec(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:I.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===I.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===I.crashed){L.warn({key:e,err:n.error},`plugin service crashed at runtime`),t.status=`failed`,this.scheduleRestart(e,t);return}if(n.type===I.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:I.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}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=Ac(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===I.stopped&&(r.worker.off(`message`,t),e(!0))};r.worker.on(`message`,t);try{r.worker.postMessage({type:I.stop})}catch{e(!1)}}),a=new Promise(e=>{setTimeout(()=>e(!1),Tc).unref?.()});await Promise.race([i,a])||L.warn({key:n,timeoutMs:Tc},`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(Dc){try{Kr(Dc,{recursive:!0,force:!0})}catch{}Dc=null,Oc=null}}};let Mc=null;function Nc(){return Mc||=new jc,Mc}async function Pc(){await Mc?.dispose(),Mc=null}const Fc=[/\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 Ic(e){let t=e;for(let e of Fc)t=t.replace(e,`***`);return t}function Lc(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 Rc(e){if(e.role===`user`)return e.internal?null:{role:`user`,text:Ic(Lc(e.content))};if(e.role===`assistant`){let t=e.content.filter(e=>e.type===`tool_call`)[0]?.name,n={role:`assistant`,text:Ic(Lc(e.content))};return t&&(n.toolName=t),n}return e.role===`tool_result`?e.internal?null:{role:`tool_result`,text:Ic(Lc(e.content)),toolName:e.toolName}:null}function zc(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=Rc(e);t&&o.push(t)}return{messages:o,nextIndex:e.length}}const R=C(`@x-otto/coding:plugin-module-loader`),Bc=e(import.meta.url),Vc=[`plugin.ts`,`plugin.tsx`];function Hc(e){for(let t of Vc){let n=x(e,t);if(D(n))return n}return null}const Uc={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 Wc(){let e={};try{let t=import.meta.resolve(`@x-otto/shared`),n=Be(Ai(t)),r=Bc.resolve(`pino`,{paths:[n]});e.pino=r,e[`thread-stream`]=Bc.resolve(`thread-stream`,{paths:[Be(r)]}),e[`jsonc-parser`]=Bc.resolve(`jsonc-parser`,{paths:[n]}),e[`@x-otto/shared`]=t.startsWith(`file://`)?Ai(t):t;let i=import.meta.resolve(`@x-otto/provider`);e[`@x-otto/provider`]=i.startsWith(`file://`)?Ai(i):i;let a=import.meta.resolve(`@x-otto/interchange`);e[`@x-otto/interchange`]=a.startsWith(`file://`)?Ai(a):a;let o=import.meta.resolve(`@x-otto/env`);e[`@x-otto/env`]=o.startsWith(`file://`)?Ai(o):o}catch(e){R.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}function Gc(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 Kc(e){let t=Hc(e);if(!t)return null;let n=x(e,`plugin-dist`);O(n,{recursive:!0});let r=x(n,`plugin.cjs`),i=Wc(),a=[`react`,`ink`,`jsonc-parser`,`pino`,`thread-stream`,`@x-otto/shared`,`@x-otto/provider`,`@x-otto/interchange`,`@x-otto/env`].filter(e=>!(e in i)),{build:o}=Bc(`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:[Uc,Gc(i)]}),Zc(n,e),r}const qc=[`.ts`,`.tsx`,`.js`,`.jsx`,`.mjs`,`.cjs`,`.json`];function Jc(e){let t=[],n=r=>{let i;try{i=Hr(r,{withFileTypes:!0})}catch{return}for(let a of i){let i=a.name;if(i===`plugin-dist`||i===`panels-dist`||i===`node_modules`||i.startsWith(`.`))continue;let o=x(r,i);if(a.isDirectory())n(o);else if(a.isFile()){let n=i.lastIndexOf(`.`),r=n>=0?i.slice(n):``;qc.includes(r)&&t.push(Ue(e,o))}}};return n(e),t.sort()}function Yc(e){let t=Jc(e),n=li(`sha256`);for(let r of t){let t=r.split(We).join(`/`);n.update(t),n.update(`\0`);try{n.update(k(x(e,r)))}catch(e){n.update(`<unreadable:${e instanceof Error?e.message:String(e)}>`)}n.update(`\0`)}return n.digest(`hex`)}function Xc(e){return{apiVersion:Dn,compilerVersion:r,sourceHash:Yc(e)}}function Zc(e,t){try{let n=x(e,`meta.json`),r=x(e,`.meta.json.tmp-${process.pid}`);A(r,JSON.stringify(Xc(t))),Gr(r,n)}catch(e){R.warn(`Failed to write plugin artifact meta: %s`,e instanceof Error?e.message:String(e))}}function Qc(e){try{let t=k(x(e,`plugin-dist`,`meta.json`),`utf8`),n=JSON.parse(t),r=Xc(e);return n.apiVersion===r.apiVersion&&n.compilerVersion===r.compilerVersion&&n.sourceHash===r.sourceHash}catch{return!1}}function $c(e){let t=x(e,`plugin-dist`,`plugin.cjs`);return D(t)?Qc(e)?t:(R.info(`Plugin artifact at %s is stale (meta mismatch/missing) — recompiling`,t),null):null}async function el(e,t,n){if(!Hc(e.dir))return null;if((e.scope===`project`||e.scope===`repository`)&&!Yn(e.dir))return R.warn({pluginId:e.id},`project/repository plugin not trusted, skipping code module (fail-closed)`),null;let r=E(e);if(r.pendingCapabilities.length>0)return R.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=$c(e.dir);if(i)R.info({pluginId:e.id,outfile:i},`using prebuilt plugin module (RFC-150 D5, skip compile)`);else try{i=await Kc(e.dir)}catch(t){let r=String(t);return R.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 Bc.cache[i];let e=Bc(i);a=e?.default??e}catch(t){let r=String(t);return R.warn({pluginId:e.id,err:r},`plugin.ts load failed`),n?.(e.id,`load failed: ${r}`),null}if(typeof a!=`function`)return R.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 R.warn({pluginId:e.id,err:r},`plugin factory threw`),n?.(e.id,`factory threw: ${r}`),null}}const z={load:`worker.load`,loaded:`worker.loaded`,error:`worker.error`,toolExecute:`tool.execute`,toolResult:`tool.result`,toolCancel:`tool.cancel`,sigilResolve:`sigil.resolve`,sigilResult:`sigil.result`,onActivate:`worker.onActivate`,activated:`worker.activated`,onDeactivate:`worker.onDeactivate`,deactivated:`worker.deactivated`,stop:`worker.stop`,hostCall:`host.call`,hostResult:`host.result`};function tl(e){return`${e===`worker`?`const { parentPort } = require('worker_threads')
|
|
188
188
|
const __send = (m) => parentPort.postMessage(m)
|
|
189
189
|
const __onMessage = (fn) => parentPort.on('message', fn)`:`const __send = (m) => process.send(m)
|
|
190
190
|
const __onMessage = (fn) => process.on('message', fn)`}\n${`// RFC-303 M4:工具执行上下文——host/logger 经反向 RPC 代理回宿主
|
|
@@ -200,7 +200,7 @@ function makeHostStub(methods) {
|
|
|
200
200
|
return (...args) => new Promise((resolve, reject) => {
|
|
201
201
|
const id = 'host-' + (++hostCallSeq)
|
|
202
202
|
hostCallPending.set(id, { resolve, reject })
|
|
203
|
-
__send({ type: '${
|
|
203
|
+
__send({ type: '${z.hostCall}', id, method, args })
|
|
204
204
|
})
|
|
205
205
|
},
|
|
206
206
|
})
|
|
@@ -213,13 +213,13 @@ let pluginId = ''
|
|
|
213
213
|
let pluginInstance = null
|
|
214
214
|
|
|
215
215
|
__onMessage(async (msg) => {
|
|
216
|
-
if (msg.type === '${
|
|
216
|
+
if (msg.type === '${z.load}') {
|
|
217
217
|
pluginId = msg.pluginId
|
|
218
218
|
try {
|
|
219
219
|
const mod = require(msg.compiledPath)
|
|
220
220
|
const factory = mod?.default ?? mod
|
|
221
221
|
if (typeof factory !== 'function') {
|
|
222
|
-
__send({ type: '${
|
|
222
|
+
__send({ type: '${z.loaded}', pluginId, module: { tools: [], hookEvents: [], hasOnActivate: false, hasOnDeactivate: false } })
|
|
223
223
|
return
|
|
224
224
|
}
|
|
225
225
|
// RFC-303 M4:host stub(工具 ctx 与 factory ctx 共用;白名单方法名随 load 下发)。
|
|
@@ -268,7 +268,7 @@ __onMessage(async (msg) => {
|
|
|
268
268
|
host: hostMethods.some((m) => m !== 'listActivePlugins') ? hostStub : undefined,
|
|
269
269
|
}
|
|
270
270
|
__send({
|
|
271
|
-
type: '${
|
|
271
|
+
type: '${z.loaded}', pluginId,
|
|
272
272
|
module: {
|
|
273
273
|
contributions: instance.contributions,
|
|
274
274
|
tools: tools.map((t) => ({
|
|
@@ -284,39 +284,39 @@ __onMessage(async (msg) => {
|
|
|
284
284
|
},
|
|
285
285
|
})
|
|
286
286
|
} catch (err) {
|
|
287
|
-
__send({ type: '${
|
|
287
|
+
__send({ type: '${z.error}', pluginId, error: err?.message ?? String(err) })
|
|
288
288
|
}
|
|
289
289
|
return
|
|
290
290
|
}
|
|
291
|
-
if (msg.type === '${
|
|
291
|
+
if (msg.type === '${z.toolExecute}') {
|
|
292
292
|
const exec = toolExecutors.get(msg.name)
|
|
293
|
-
if (!exec) { __send({ type: '${
|
|
293
|
+
if (!exec) { __send({ type: '${z.toolResult}', id: msg.id, error: "tool not found" }); return }
|
|
294
294
|
try {
|
|
295
295
|
const r = await exec(msg.params, toolCtx)
|
|
296
296
|
if (cancelledToolIds.delete(msg.id)) return
|
|
297
|
-
__send({ type: '${
|
|
297
|
+
__send({ type: '${z.toolResult}', id: msg.id, result: r })
|
|
298
298
|
} catch (e) {
|
|
299
299
|
if (cancelledToolIds.delete(msg.id)) return
|
|
300
|
-
__send({ type: '${
|
|
300
|
+
__send({ type: '${z.toolResult}', id: msg.id, error: e?.message ?? String(e) })
|
|
301
301
|
}
|
|
302
302
|
return
|
|
303
303
|
}
|
|
304
|
-
if (msg.type === '${
|
|
304
|
+
if (msg.type === '${z.toolCancel}') {
|
|
305
305
|
cancelledToolIds.add(msg.id)
|
|
306
306
|
return
|
|
307
307
|
}
|
|
308
|
-
if (msg.type === '${
|
|
308
|
+
if (msg.type === '${z.sigilResolve}') {
|
|
309
309
|
const fn = sigilResolverExecutors.get(msg.name)
|
|
310
|
-
if (!fn) { __send({ type: '${
|
|
310
|
+
if (!fn) { __send({ type: '${z.sigilResult}', id: msg.id, error: "sigil resolver not found" }); return }
|
|
311
311
|
try {
|
|
312
312
|
const r = await fn(msg.param, msg.ctx)
|
|
313
|
-
__send({ type: '${
|
|
313
|
+
__send({ type: '${z.sigilResult}', id: msg.id, result: r })
|
|
314
314
|
} catch (e) {
|
|
315
|
-
__send({ type: '${
|
|
315
|
+
__send({ type: '${z.sigilResult}', id: msg.id, error: e?.message ?? String(e) })
|
|
316
316
|
}
|
|
317
317
|
return
|
|
318
318
|
}
|
|
319
|
-
if (msg.type === '${
|
|
319
|
+
if (msg.type === '${z.hostResult}') {
|
|
320
320
|
const p = hostCallPending.get(msg.id)
|
|
321
321
|
if (!p) return
|
|
322
322
|
hostCallPending.delete(msg.id)
|
|
@@ -324,26 +324,26 @@ __onMessage(async (msg) => {
|
|
|
324
324
|
else p.resolve(msg.result)
|
|
325
325
|
return
|
|
326
326
|
}
|
|
327
|
-
if (msg.type === '${
|
|
327
|
+
if (msg.type === '${z.onActivate}') {
|
|
328
328
|
if (!pluginInstance || typeof pluginInstance.onActivate !== 'function') {
|
|
329
|
-
__send({ type: '${
|
|
329
|
+
__send({ type: '${z.activated}', id: msg.id })
|
|
330
330
|
return
|
|
331
331
|
}
|
|
332
|
-
try { await pluginInstance.onActivate(); __send({ type: '${
|
|
333
|
-
catch (e) { __send({ type: '${
|
|
332
|
+
try { await pluginInstance.onActivate(); __send({ type: '${z.activated}', id: msg.id }) }
|
|
333
|
+
catch (e) { __send({ type: '${z.activated}', id: msg.id, error: e?.message ?? String(e) }) }
|
|
334
334
|
return
|
|
335
335
|
}
|
|
336
|
-
if (msg.type === '${
|
|
336
|
+
if (msg.type === '${z.onDeactivate}') {
|
|
337
337
|
if (!pluginInstance || typeof pluginInstance.onDeactivate !== 'function') {
|
|
338
|
-
__send({ type: '${
|
|
338
|
+
__send({ type: '${z.deactivated}', id: msg.id })
|
|
339
339
|
return
|
|
340
340
|
}
|
|
341
|
-
try { await pluginInstance.onDeactivate(); __send({ type: '${
|
|
342
|
-
catch (e) { __send({ type: '${
|
|
341
|
+
try { await pluginInstance.onDeactivate(); __send({ type: '${z.deactivated}', id: msg.id }) }
|
|
342
|
+
catch (e) { __send({ type: '${z.deactivated}', id: msg.id, error: e?.message ?? String(e) }) }
|
|
343
343
|
return
|
|
344
344
|
}
|
|
345
|
-
if (msg.type === '${
|
|
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: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 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
|
|
345
|
+
if (msg.type === '${z.stop}') { toolExecutors.clear(); pluginInstance = null; process.exit(0) }
|
|
346
|
+
})`}`}var nl=class{pending=new Map;idCounter=0;boundPluginId=``;hostCallDispatcher=null;setHostCallDispatcher(e){this.hostCallDispatcher=e}constructor(e){this.adapter=e,this.adapter.onMessage(e=>{if(e.type===z.loaded){let t=this.settlePending(`__load__`);t&&t.resolve(e.module);return}if(e.type===z.error){let t=this.settlePending(`__load__`);t&&t.reject(Error(e.error??this.adapter.loadFailedMessage?.()??`plugin isolated transport load failed`));return}if(e.type===z.toolResult){let t=this.settlePending(e.id);t&&t.resolve({result:e.result,error:e.error});return}if(e.type===z.sigilResult){let t=this.settlePending(e.id);t&&t.resolve({result:e.result,error:e.error});return}if(e.type===z.activated||e.type===z.deactivated){let t=this.settlePending(e.id);t&&t.resolve({error:e.error});return}if(e.type===z.hostCall){let t=this.boundPluginId,n=this.hostCallDispatcher,r=t=>{try{this.adapter.send({type:z.hostResult,id:e.id,...t})}catch{}};if(!n){r({error:`host call dispatcher not installed (plugin host capabilities unavailable)`});return}n(t,e.method??``,e.args??[]).then(e=>r({result:e})).catch(e=>r({error:e instanceof Error?e.message:String(e)}));return}}),this.adapter.onError(e=>{this.adapter.onErrorLog?.(e),this.rejectAllPending(e)}),this.adapter.onExit(e=>{if(this.pending.size===0)return;this.adapter.onExitLog?.(e);let t=this.adapter.exitErrorMessage?.(e)??`plugin isolated transport exited unexpectedly (code ${e})`;this.rejectAllPending(Error(t))})}rejectAllPending(e){for(let[,t]of this.pending)t.type===`load`?t.reject(e):t.resolve({error:e.message});this.pending.clear(),this.adapter.unref()}syncRefState(){this.pending.size>0?this.adapter.ref():this.adapter.unref()}trackPending(e,t){this.pending.set(e,t),this.syncRefState()}settlePending(e){let t=this.pending.get(e);return t&&(this.pending.delete(e),this.syncRefState()),t}async load(e,t,n){if(this.pending.has(`__load__`))throw Error(this.adapter.alreadyLoadingMessage?.(e)??`plugin isolated transport already loading ${e}`);return this.boundPluginId=e,new Promise((r,i)=>{this.trackPending(`__load__`,{type:`load`,resolve:r,reject:i}),this.adapter.send({type:z.load,pluginId:e,compiledPath:t,ctx:n,...n.hostMethods?{hostMethods:n.hostMethods}:{}})})}async executeTool(e,t,n){let r=`tool-${++this.idCounter}`,i=n?.timeoutMs??6e4,a=n?.signal;return a?.aborted?{error:`plugin tool execution aborted`}:new Promise(n=>{let o,s,c=()=>{o!==void 0&&clearTimeout(o),s&&a&&a.removeEventListener(`abort`,s)};this.trackPending(r,{type:`tool`,resolve:e=>{c(),n(e)}});let l=e=>{let t=this.settlePending(r);if(t){try{this.adapter.send({type:z.toolCancel,id:r})}catch{}t.resolve({error:e})}};i>0&&(o=setTimeout(()=>{this.adapter.onToolTimeout?.(e,i),l(`plugin tool "${e}" timed out after ${i}ms`)},i),o.unref?.()),a&&(s=()=>l(`plugin tool execution aborted`),a.addEventListener(`abort`,s,{once:!0})),this.adapter.send({type:z.toolExecute,id:r,name:e,params:t})})}async resolveSigil(e,t,n,r){let i=`sigil-${++this.idCounter}`,a=r?.timeoutMs??6e4;return new Promise(r=>{let o;this.trackPending(i,{type:`sigil`,resolve:e=>{o!==void 0&&clearTimeout(o),r(e)}}),a>0&&(o=setTimeout(()=>{let t=this.settlePending(i);t&&t.resolve({error:`sigil resolver "${e}" timed out after ${a}ms`})},a),o.unref?.()),this.adapter.send({type:z.sigilResolve,id:i,name:e,param:t,ctx:n})})}async activate(){let e=`lifecycle-${++this.idCounter}`;return new Promise(t=>{this.trackPending(e,{type:`lifecycle`,resolve:t}),this.adapter.send({type:z.onActivate,id:e})})}async deactivate(){let e=`lifecycle-${++this.idCounter}`;return new Promise(t=>{this.trackPending(e,{type:`lifecycle`,resolve:t}),this.adapter.send({type:z.onDeactivate,id:e})})}clearPending(){this.pending.clear()}};const rl=C(`@x-otto/coding:plugin-worker-pool`);let il=null,al=null;function ol(){return al||(il||=Br(x(ze(),`otto-plugin-worker-`)),al=x(il,`worker-entry.cjs`),A(al,tl(`worker`)),al)}var sl=class extends nl{worker;constructor(){let e=new ki(ol());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)=>{rl.warn({tool:e,timeoutMs:t},`plugin tool execution timed out`)},onErrorLog:e=>{rl.warn({err:String(e)},`plugin worker error`)},onExitLog:e=>{rl.warn({code:e},`plugin worker exited unexpectedly with pending requests`)},exitErrorMessage:e=>`plugin worker exited unexpectedly (code ${e})`,loadFailedMessage:()=>`plugin worker load failed`,alreadyLoadingMessage:e=>`plugin worker already loading ${e}`}),this.worker=e}async stop(){try{this.worker.postMessage({type:z.stop}),await this.worker.terminate()}catch{}this.clearPending(),this.worker.unref()}},cl=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 sl;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(),il){try{Kr(il,{recursive:!0,force:!0})}catch{}il=null,al=null}await Promise.all(e.map(e=>e.stop().catch(()=>{})))}get size(){return this.workers.size}};const ll=C(`@x-otto/coding:plugin-process-pool`);let ul=null,dl=null;function fl(){return dl||(ul||=Br(x(ze(),`otto-plugin-process-`)),dl=x(ul,`process-entry.cjs`),A(dl,tl(`process`)),dl)}var pl=class extends nl{child;sandboxToDispose;constructor(e){let t=fl(),n=process.execPath,r=[t],i=n,a=r,o;if(Le()){let t=Pe({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 ll.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=j(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)=>{ll.warn({tool:e,timeoutMs:t},`plugin tool execution timed out (isolated process)`)},onErrorLog:e=>{ll.warn({err:String(e)},`plugin process error`)},onExitLog:e=>{ll.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=>{ll.warn({stderr:e.toString().slice(0,500)},`plugin process stderr output`)}),this.child.on(`exit`,()=>{this.sandboxToDispose?.dispose().catch(()=>void 0),this.sandboxToDispose=void 0})}async stop(){try{this.child.send({type:z.stop})}catch{}try{this.child.kill()}catch{}this.clearPending()}},ml=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 pl(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(),ul){try{Kr(ul,{recursive:!0,force:!0})}catch{}ul=null,dl=null}await Promise.all(e.map(e=>e.stop().catch(()=>{})))}get size(){return this.processes.size}};const hl=C(`@x-otto/coding:plugin-module-loader-isolated`);let gl=null;function _l(){return gl||=new cl,gl}let vl=null;function yl(){return vl||=new ml,vl}async function bl(){await Promise.all([gl?.dispose()??Promise.resolve(),vl?.dispose()??Promise.resolve()])}function xl(e){return e===`project`||e===`repository`?yl():_l()}function Sl(e){return!!e.manifest.capabilities?.includes(`tools`)}function Cl(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&&hl.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 wl(e,t,n,r){if((e.scope===`project`||e.scope===`repository`)&&!Yn(e.dir))return hl.warn({pluginId:e.id},`project/repository plugin not trusted, skipping isolated code module (fail-closed)`),null;let i=E(e);if(i.pendingCapabilities.length>0)return hl.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??xl(e.scope),o;try{o=await Kc(e.dir)}catch(t){let n=String(t);return hl.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 hl.warn({pluginId:e.id},t),r?.(e.id,t),null}return hl.info({pluginId:e.id},`plugin worker pool exhausted, falling back to in-process load`),el(e,t,r)}return{pluginId:e.id,module:Cl(e.id,n,a),compiledPath:o}}catch(t){let n=String(t);return hl.warn({pluginId:e.id,err:n},`plugin.ts worker load failed`),r?.(e.id,`worker load failed: ${n}`),null}}function Tl(e,t){return e.includes(`onStartup`)?!0:e.some(e=>t.has(e))}var El=class{axisName=`hooks`;hookNamesByPlugin=new Map;constructor(e){this.hookRegistry=e}register(e){let t=e.loaded.module.hooks;if(t){let n=ac(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)}},Dl=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=mc(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()]}},Ol=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 kl=C(`@x-otto/coding:plugin-sigil-loader`);function Al(e){return e.startsWith(`!`)||e.startsWith(`#`)}function jl(e){let t=[];for(let n of e){let e=n.manifest.contributes?.sigilEntries;if(e?.length){if(E(n).gated){kl.warn({pluginId:n.id},`plugin gated (untrusted), sigilEntries skipped`);continue}for(let r of e){if(Al(r.value)){kl.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 Ml(e){for(let t of e)t.manifest.contributes?.inputEntries&&kl.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 Nl(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}):kl.warn({pluginId:e,name:r},`sigilResolvers entry is neither function nor {resolve}, skipped`)}return n}function Pl(e,t){return t.map(t=>async(n,r)=>(await t(n,r)).filter(e=>!Al(e.value)).map(t=>({...t,source:e})))}function Fl(e,t){for(let n of e)n.resolverId&&!t(n.resolverId)&&kl.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 Il=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=Nl(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 Pl(e.plugin.id,n))t.push(this.pluginInput.registerProvider(`@`,r));this.sigilProviderUnsubsByPlugin.set(e.plugin.id,t)}if(this.sigilResolverRegistry){let t=this.sigilResolverRegistry;Fl(jl([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)}},Ll=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(...oc(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()}},Rl=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(...sc(t)),this.profilesByPlugin.set(e.plugin.id,n)}unregister(e){this.profilesByPlugin.delete(e)}unregisterAll(){}setExistingAgentNames(e){this.existingAgentNames=e}resetForReload(e){this.profilesByPlugin.clear(),this.existingAgentNames=e}getAppendedAgents(){let e=new Set(this.existingAgentNames),t=[];for(let n of this.profilesByPlugin.values())for(let r of n)e.has(r.name)||(e.add(r.name),t.push(r));return t}},zl=class{axisName=`computedSkills`;skillNamesByPlugin=new Map;constructor(e){this.skillRegistry=e}register(e){let t=e.loaded.module.contributions?.skills;if(!t?.length||!this.skillRegistry)return;let n=this.skillNamesByPlugin.get(e.plugin.id)??[];for(let{definition:r,source:i}of cc(e.plugin.id,e.plugin.dir,t))this.skillRegistry.get(r.metadata.name)||(this.skillRegistry.register(r,i),n.push(r.metadata.name));n.length>0&&this.skillNamesByPlugin.set(e.plugin.id,n)}unregister(e){let t=this.skillNamesByPlugin.get(e);if(t){for(let e of t)this.skillRegistry?.unregister(e);this.skillNamesByPlugin.delete(e)}}unregisterAll(){for(let e of[...this.skillNamesByPlugin.keys()])this.unregister(e)}};const B=C(`@x-otto/coding:plugin-provider-loader`);function Bl(e){let t=C(`wire-protocol:${e}`),n=e=>(t,...n)=>e(t,...n);return{debug:n(t.debug.bind(t)),info:n(t.info.bind(t)),warn:n(t.warn.bind(t)),error:n(t.error.bind(t))}}function V(e,t){return`${e}:${t}`}function Vl(e){return new Set([...(e.contributes?.providers??[]).filter(e=>e.preserveProviderId===!0&&e.oauthRef).map(e=>e.oauthRef),...e.codeProviderIds??[]])}function Hl(e,t){let n=Vl(t);return new Set((t.contributes?.oauth??[]).map(t=>n.has(t.id)?t.id:V(e,t.id)))}function Ul(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 Wl(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 Gl(e){return`code:${e}`}function Kl(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 ql(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 Jl(e,t,n,r,i,a){return()=>{let o=r.get(a);if(!o)throw new Ke(`wire protocol '${a}' is not registered — is its provider plugin installed and trusted? (RFC-148)`,{code:`WIRE_PROTOCOL_NOT_REGISTERED`});return o.create({resolveAuth:()=>t.resolveAuth(n).then(e=>e??void 0),resolveBaseUrl:async()=>i,headers:e.headers,tokenDerivedHeaders:e.tokenDerivedHeaders,allowAuthHeaderOverride:e.allowAuthHeaderOverride,logger:Bl(a)})}}function Yl(e,t,n,r,i,a,o){let s=t.contributes?.oauth;if(s?.length&&n)if(t.capabilities?.includes(`provider`))for(let t of s){let s=r.has(t.id)?t.id:V(e,t.id);if(f.includes(t.id)||n.isReservedId(t.id)){a.rejected.push({id:t.id,reason:`oauth id collides with builtin reserved OAuth provider`}),B.warn({pluginId:e,oauthId:t.id},`plugin oauth id collides with builtin reserved, rejected (R3)`);continue}let c=t.name??i.get(t.id)??t.id,l=t.kind===`pkce`?Ni({...t,id:s,name:c,tokenExchangeEncoding:t.tokenExchangeEncoding??`form`,assumesLoopbackAlways:t.assumesLoopbackAlways??!1,subscriptionScoped:t.subscriptionScoped??!1}):Mi({...t,id:s,name:c,allowCustomDomain:t.allowCustomDomain??!1});if(o?.has(s))n.replace(l,e);else if(!n.register(l,e)){a.rejected.push({id:t.id,reason:`oauth registration rejected (id already claimed by another plugin or reserved)`});continue}}else{B.warn({pluginId:e},`plugin declares contributes.oauth but not capabilities:["provider"], skipped (fail-closed)`);for(let e of s)a.rejected.push({id:e.id,reason:`capability "provider" not declared`})}}function Xl(e,t,n,r,i,a){let o=t.contributes?.providers;if(!o?.length)return;if(!t.capabilities?.includes(`provider`)){B.warn({pluginId:e},`plugin declares contributes.providers but not capabilities:["provider"], skipped (fail-closed)`);for(let e of o)i.rejected.push({id:e.id,reason:`capability "provider" not declared`});return}let s=new Set;for(let t of o){if(i.registered.includes(t.id)){i.rejected.push({id:t.id,reason:`duplicate provider id in manifest`}),B.warn({pluginId:e,providerId:t.id},`duplicate provider id in manifest, second entry rejected (review F5)`);continue}if(ie(t.id)){i.rejected.push({id:t.id,reason:`reserved builtin provider id`}),B.warn({pluginId:e,providerId:t.id},`plugin provider id collides with builtin, rejected (R3)`);continue}let o=t.preserveProviderId===!0,c=o?t.id:V(e,t.id),l=o?t.id:V(e,t.id);if(t.catalogOnly===!0){let a=l;if(t.oauthRef){let n=o?t.oauthRef:V(e,t.oauthRef);if(!r?.get(n)){i.rejected.push({id:t.id,reason:`oauthRef '${t.oauthRef}' not found in current plugin's oauth table (R7)`}),B.warn({pluginId:e,providerId:t.id,oauthRef:t.oauthRef},`catalog provider oauthRef not found, rejected (R7)`);continue}a=n}if(t.envKey&&!n.authStore.registerEnvKey(l,t.envKey,e)){i.rejected.push({id:t.id,reason:`envKey registration rejected (reserved or claimed)`});continue}if(!ce({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=>Kl(e,a,c,t.baseUrl??``,void 0,t.supportsTools,t.responseBodyPolicy)),i=n.modelRegistry.registerWithSource(r,e);for(let t of i)B.warn({pluginId:e,modelId:t},`plugin model id collides, rejected`)}i.registered.push(t.id);continue}let u=l;if(t.oauthRef){let n=o?t.oauthRef:V(e,t.oauthRef);if(!r?.get(n)){i.rejected.push({id:t.id,reason:`oauthRef '${t.oauthRef}' not found in current plugin's oauth table (R7: cross-plugin/invalid ref rejected)`}),B.warn({pluginId:e,providerId:t.id,oauthRef:t.oauthRef},`provider oauthRef not found in current plugin oauth table, rejected (R7)`);continue}u=n,t.envKey&&B.warn({pluginId:e,providerId:t.id},`provider declares both oauthRef and envKey; ignoring envKey (R2, oauth takes priority)`)}if(t.envKey&&!t.oauthRef&&!n.authStore.registerEnvKey(l,t.envKey,e)){i.rejected.push({id:t.id,reason:`envKey registration rejected (reserved or claimed by another plugin)`});continue}let d=t.baseUrl,f=t.wireApi;if(!d||!f){i.rejected.push({id:t.id,reason:`baseUrl and wireApi required for non-catalog providers`});continue}let p=t.modelsEndpoint?ql(t.modelsEndpoint,l,c,t.baseUrl,t.headers):void 0,m=()=>{t.oauthRef&&r&&!s.has(u)&&r.unregister(u)};if(!ce({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&&B.warn({pluginId:e,providerId:t.id},`provider declares allowAuthHeaderOverride: custom headers may replace auth headers (RFC-270 D3)`);let h=Jl(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`}),fe(l),t.envKey&&!t.oauthRef&&n.authStore.unregisterEnvKey(l),m();continue}if(t.models?.length){let r=t.models.map(e=>Kl(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 Zl(e,t,n,r,i){let a={registered:[],rejected:[]},o=n.authStore.oauth;return Yl(e,t,o,Vl(t),new Map((t.contributes?.providers??[]).filter(e=>e.oauthRef&&e.name).map(e=>[e.oauthRef,e.name])),a,r),Xl(e,t,n,o,a,i),a}async function Ql(e,t,n,r,i){let a=n.authStore.oauth,o=Vl(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);fe(r),t.envKey&&!t.oauthRef&&n.authStore.unregisterEnvKey(r)}await n.providerRegistry.unregisterBySource(e,i),n.modelRegistry.unregisterBySource(e)}}var $l=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=dc(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)}},eu=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=Wl(e.plugin.id,i,e.plugin.manifest);if(!this.providerRegistry.registerPluginProvider(t,uc(e.plugin.id,a),Gl(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(ce({id:t,buildModelsRequest:ql(o,t,t)},Gl(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=>Kl(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(Gl(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)fe(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)}},tu=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){se(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)de(e);this.cacheReportingApisByPlugin.delete(e)}}unregisterAll(){let e=new Set([...this.wireProtocolSourcePluginIds,...this.cacheReportingApisByPlugin.keys()]);for(let t of e)this.unregister(t)}},nu=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=>pc(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 ru=`[plugin]`;function iu(e,t,n){let r=n.name?.trim()||n.key;return`${ru} ${e}:${t}:${n.key} — ${r}`}function au(e,t,n){let r=e.subscriber;return!r||r.kind!==`plugin-service`||r.pluginId!==t||r.serviceId!==n?!1:e.name.startsWith(ru)}function ou(e,t,n){let r=`${ru} ${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 su(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(!au(e,r,i))continue;let t=ou(e,r,i);t!==void 0&&s.set(t,e)}for(let[e,c]of o){let o=iu(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 cu(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(ru)&&t.remove(e.id)&&(r+=1)}return r}var lu=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=su({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&&su({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=cu({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=su({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 uu=/^[a-z0-9]+(?:-[a-z0-9]+)*$/,du=x(n,`plugin-state`);function fu(e){let t=pu(e);try{return Kr(t,{recursive:!0,force:!0}),{removed:!D(t),dir:t}}catch{return{removed:!1,dir:t}}}function pu(e){if(!uu.test(e))throw Error(`invalid pluginId for scoped storage: ${e} (must be kebab-case)`);return x(du,e)}var mu=class{persistence;baseDir;pluginId;workspaceKey;constructor(e,t){if(this.pluginId=e,this.workspaceKey=t,!uu.test(e))throw Error(`invalid pluginId for scoped storage: ${e} (must be kebab-case)`);if(typeof t!=`string`||t.length===0||t.includes(`/`)||t.includes(`\\`)||t.includes(`..`))throw Error(`invalid workspaceKey for scoped storage: ${t}`);if(s()){this.baseDir=`:memory:/plugin-state/${e}/${t}`,this.persistence=sn({type:`memory`});return}let n=S(x(pu(e),t));O(n,{recursive:!0});let r=Wr(n),i=Wr(du);if(r!==i&&!r.startsWith(i+`/`))throw Error(`scoped storage path escapes plugin-state root: ${r}`);this.baseDir=n,this.persistence=sn({type:`file`,baseDir:n})}async save(e,t){await this.persistence.save({id:e,data:t,version:1,metadata:{}})}async load(e){let t=await this.persistence.load(e);return t?t.data:null}delete(e){return this.persistence.delete(e)}list(){return this.persistence.list()}};function hu(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 gu(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=vu(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 zc(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 _u=new WeakMap;function vu(e){if(e.capabilityQuota)return e.capabilityQuota;let t=_u.get(e);return t||(t=new bc,_u.set(e,t)),t}const yu=new Map([[`oauthProviderFactories`,`provider`],[`providerFactories`,`provider`],[`wireProtocols`,`wire-protocol`]]);function bu(e){let t=e.manifest.contributes;return!t||typeof t!=`object`?[]:Object.keys(t)}var xu=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 El(e.hookRegistry),this.monitorsAxis=new Dl(e.hookRegistry,e.logger),this.feedbackAxis=new Ol(e.feedbackRegistry,e.logger),this.sigilAxis=new Il(e.sigilResolverRegistry,e.pluginInput,e.logger),this.computedCommandsAxis=new Ll,this.computedAgentsAxis=new Rl,this.computedSkillsAxis=new zl(e.skillRegistry),this.oauthProviderAxis=new $l(e.authStore,e.logger),this.codeProviderAxis=new eu(e.providerRegistry,e.modelRegistry,e.logger),this.wireProtocolAxis=new tu(e.wireProtocolRegistry,e.logger),this.toolsAxis=new nu(e.toolRegistry,e.logger),this.servicesAxis=new lu({pool:e.servicePool??Nc(),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=gu(n,E(n),e);if(!r)return{};let i={};return r.startJob&&(i.startJob=r.startJob),r.readTranscript&&(i.readTranscript=r.readTranscript),r.complete&&(i.complete=r.complete),r.notify&&(i.notify=r.notify),i},hostCapabilitiesFor:t=>{let n=e.activePlugins().find(e=>e.id===t);if(!n)return[];let r=gu(n,E(n),e);if(!r)return[];let i=[];return r.startJob&&i.push(`startJob`),r.readTranscript&&i.push(`readTranscript`),r.complete&&i.push(`complete`),r.notify&&i.push(`notify`),i},storageDirFor:(e,t)=>new mu(e,t).baseDir,hasStorageCapability:t=>!!e.activePlugins().find(e=>e.id===t)?.manifest.capabilities?.includes(`storage`),...e.getSchedulePort?{getSchedulePort:e.getSchedulePort}:{}}),this.axisHandlers=[this.hooksAxis,this.monitorsAxis,this.feedbackAxis,this.sigilAxis,this.computedCommandsAxis,this.computedAgentsAxis,this.computedSkillsAxis,this.oauthProviderAxis,this.codeProviderAxis,this.wireProtocolAxis,this.toolsAxis,this.servicesAxis]}get deferredPluginIds(){return this.deferredIds}emitMonitorEvent(e){return this.monitorsAxis.dispatch(e)}reconcileServiceSchedules(){this.servicesAxis.reconcileAllSchedules()}get monitorPluginIds(){return this.monitorsAxis.monitorPluginIds}async activateOn(e,t){return this.firedEvents.add(e),this.reload(t)}get commands(){return this.computedCommandsAxis.getComputedCommands()}async callOnDeactivate(t,n){let r;try{await Promise.race([n(),new Promise((n,i)=>{r=setTimeout(()=>{i(Error(`plugin "${t}" onDeactivate timed out after ${e.DEACTIVATE_TIMEOUT_MS}ms`))},e.DEACTIVATE_TIMEOUT_MS),r.unref?.()})])}catch(e){this.deps.logger.warn({pluginId:t,err:String(e)},`plugin onDeactivate failed or timed out`)}finally{r!==void 0&&clearTimeout(r)}}async unregisterAllAxes(){for(let e of this.axisHandlers)await e.unregisterAll()}async unregisterPluginAxes(e,t){let n=t?E(t):void 0;for(let r of this.axisHandlers){let i=yu.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)}vu(this.deps).reset(e)}pluginSignature(e){let t=E(e),n=`${t.gated?`gated`:`ok`}:${[...t.pendingCapabilities].sort().join(`,`)}`,r=`nofile`;for(let t of[`plugin.ts`,`plugin.tsx`])try{let n=qr(x(e.dir,t));r=`${t}:${n.mtimeMs}:${n.size}`;break}catch{}return`${JSON.stringify(e.manifest)}|${n}|${r}`}async reload(e){let t=this.deps.activePlugins(),n=new Map(t.map(e=>[e.id,e])),r=new Map(t.map(e=>[e.id,this.pluginSignature(e)])),i=[],a=new Set,o=new Set;for(let[e,t]of this.loadedModules)n.get(e)?r.get(e)!==t.signature&&(t.module.module.onDeactivate&&i.push({pluginId:e,onDeactivate:t.module.module.onDeactivate}),o.add(e)):(t.module.module.onDeactivate&&i.push({pluginId:e,onDeactivate:t.module.module.onDeactivate}),a.add(e));for(let{pluginId:e,onDeactivate:t}of i)await this.callOnDeactivate(e,t);for(let e of a)await this.unregisterPluginAxes(e,void 0),this.loadedModules.delete(e);for(let e of o)await this.unregisterPluginAxes(e,n.get(e));this.computedAgentsAxis.setExistingAgentNames(e);let s=new Set;for(let e of this.deps.activePlugins()){if(!Tl(nr(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),tc(e.id,`info`,t)},warn:t=>{this.deps.logger.warn({pluginId:e.id},t),tc(e.id,`warn`,t)},error:t=>{this.deps.logger.error({pluginId:e.id},t),tc(e.id,`error`,t)}},getWireProtocol:e=>this.deps.wireProtocolRegistry?.get(e),resolveProviderCredential:(()=>{let t=hu(e);return e=>t(e)?this.deps.providerRegistry?.resolveAccessKey(e)??Promise.resolve(null):Promise.resolve(null)})(),resolveProviderAuth:(()=>{let t=hu(e);return e=>t(e)?this.deps.providerRegistry?.resolveAuth(e)??Promise.resolve(null):Promise.resolve(null)})(),host:gu(e,E(e),this.deps),listActivePlugins:()=>this.deps.activePlugins().map(e=>({id:e.id,version:e.manifest.version,capabilities:e.manifest.capabilities??[],contributes:this.contributesSnapshot.get(e.id)??bu(e)}))},n=this.deps.useIsolatedLoading!==!1&&Sl(e)?await wl(e,t,void 0,this.deps.onPluginLoadError):await el(e,t,this.deps.onPluginLoadError);if(!n)continue;let i=E(e);if(i.gated){this.deps.logger.warn({pluginId:e.id},`project plugin not trusted, skipping code axes (fail-closed, RFC-124 C1)`);continue}let a;if(e.manifest.capabilities?.includes(`storage`))try{let t=this.deps.getWorkspaceKey?.()??vi;a=new mu(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:gu(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,bu(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=vu(this.deps);for(let t of this.deps.activePlugins())e.reset(t.id);this.firedEvents.clear()}};const Su=C(`@x-otto/coding:panel-compiler`),Cu=e(import.meta.url);function wu(e){let t=x(e,`panels`);if(!D(t))return{compiled:[],errors:[],skipped:!0};let n;try{n=Hr(t).filter(e=>e.endsWith(`.tsx`))}catch{return{compiled:[],errors:[],skipped:!0}}if(n.length===0)return{compiled:[],errors:[],skipped:!0};let r=x(e,`panels-dist`);O(r,{recursive:!0});let i=Br(x(ze(),`otto-panel-shims-`)),a=x(i,`react-shim.js`),o=x(i,`ink-shim.js`),s=x(i,`tui-shim.js`);A(a,`const R = globalThis.React
|
|
347
347
|
if (!R) throw new Error('otto panel: globalThis.React 未注入(TUI 须在加载面板前 import panel-globals)')
|
|
348
348
|
export default R
|
|
349
349
|
export const useState = R.useState, useEffect = R.useEffect, useCallback = R.useCallback,
|
|
@@ -351,13 +351,13 @@ export const useState = R.useState, useEffect = R.useEffect, useCallback = R.use
|
|
|
351
351
|
useLayoutEffect = R.useLayoutEffect, createElement = R.createElement, Fragment = R.Fragment,
|
|
352
352
|
memo = R.memo, forwardRef = R.forwardRef, createContext = R.createContext, Children = R.Children,
|
|
353
353
|
cloneElement = R.cloneElement, isValidElement = R.isValidElement
|
|
354
|
-
`),
|
|
354
|
+
`),A(o,`const I = globalThis.__ottoPanelInk
|
|
355
355
|
if (!I) throw new Error('otto panel: globalThis.__ottoPanelInk 未注入(TUI 须在加载面板前 import panel-globals)')
|
|
356
356
|
export const Box = I.Box, Text = I.Text, Newline = I.Newline, Spacer = I.Spacer, Static = I.Static,
|
|
357
357
|
Transform = I.Transform, useApp = I.useApp, useInput = I.useInput, useStdin = I.useStdin,
|
|
358
358
|
useStdout = I.useStdout, useStderr = I.useStderr, useFocus = I.useFocus,
|
|
359
359
|
useFocusManager = I.useFocusManager, measureElement = I.measureElement, render = I.render
|
|
360
|
-
`),
|
|
360
|
+
`),A(s,`const T = globalThis.__ottoPanelTui
|
|
361
361
|
if (!T) throw new Error('otto panel: globalThis.__ottoPanelTui 未注入(TUI 须在加载面板前 import panel-globals)')
|
|
362
362
|
export const Tabs = T.Tabs
|
|
363
363
|
export const DataList = T.DataList
|
|
@@ -368,26 +368,26 @@ export const ScrollIndicatorBelow = T.ScrollIndicatorBelow
|
|
|
368
368
|
export const Tabable = T.Tabable
|
|
369
369
|
export const useTabable = T.useTabable
|
|
370
370
|
export const TabScope = T.TabScope
|
|
371
|
-
`);let c=[],l=[],{buildSync:u}=
|
|
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
|
|
371
|
+
`);let c=[],l=[],{buildSync:u}=Cu(`esbuild`);for(let i of n){let n=i.replace(/\.tsx$/,`.mjs`);try{u({entryPoints:[x(t,i)],outfile:x(r,n),bundle:!0,format:`esm`,platform:`node`,alias:{react:a,ink:o,"@x-otto/tui":s},jsx:`transform`,banner:{js:`const { usePluginData } = globalThis.__ottoPanelRuntime || {};const { claim: claimPanelFocus, release: releasePanelFocus, usePanelFocusClaimed, requestClose: requestPanelClose, setHint: setPanelHint } = globalThis.__ottoPanelFocusBridge || { claim(){}, release(){}, usePanelFocusClaimed: () => true, requestClose(){}, setHint(){} };const { getTheme, getFigures } = globalThis.__ottoPanelTheme || { getTheme: () => ({ text: undefined, inactive: '#9498B8', secondary: '#C8CBDB', success: '#7EE095', error: '#FF9592', warning: '#FFC966', special: '#DD78C9', selection: '#4D7CFF', focusBorder: '#4D7CFF', panelBorder: '#9498B8' }), getFigures: () => ({ check: '✓', cross: '✗', pointer: '▶', bullet: '●' }) };const { SPACING, LAYOUT } = globalThis.__ottoPanelSpacing || { SPACING: { none: 0, tight: 1, section: 2, loose: 4 }, LAYOUT: { contentInset: 4, borderInset: 2 } };const { t: t, i18next: panelI18next } = globalThis.__ottoPanelI18n || { t: (k) => k, i18next: { language: 'en' } };const { usePanelBackend } = globalThis.__ottoPanelBackendRuntime || { usePanelBackend: () => ({ call: () => Promise.reject(new Error('otto panel: backend runtime not installed')), cancel(){}, state: undefined, status: 'disabled' }) };`},logLevel:`silent`}),c.push(x(`panels-dist`,n))}catch(t){l.push({entry:i,message:t.message}),Su.warn({pluginDir:e,entry:i,err:String(t)},`panel compile failed`)}}return Su.info({pluginDir:e,compiled:c.length,errors:l.length},`compiled plugin panels`),{compiled:c,errors:l,skipped:!1}}const Tu=C(`@x-otto/coding:plugin-install`);function Eu(e){let t=[];return(async()=>{try{let t=await Kc(e);t&&Tu.info({pluginDir:e,outfile:t},`plugin code module compiled at install time`)}catch(n){let r=n instanceof Error?n.message:String(n);Tu.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}=wu(e);if(!r&&n.length>0)for(let r of n)Tu.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);Tu.warn({pluginDir:e,err:r},`plugin panel compilation crashed unexpectedly at install time`),t.push(`面板编译异常:${r}`)}})().then(()=>t)}function Du(e){try{return zr(e).isSymbolicLink()}catch{return!1}}function Ou(e){let t=k(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 ku(e,t){let n=S(e,t.endsWith(`/*`)?t.slice(0,-2):t);if(!n.startsWith(e.endsWith(`/`)?e:e+`/`)&&n!==e)return[];if(!t.endsWith(`/*`))return D(n)?[n]:[];if(!D(n))return[];try{return Hr(n,{withFileTypes:!0}).filter(e=>e.isDirectory()).map(e=>x(n,e.name))}catch{return[]}}function Au(e,t){let n=a(t);if(!n)return;let r=Ou(x(n,`pnpm-workspace.yaml`));for(let t of r)for(let r of ku(n,t)){let t=x(r,`package.json`);if(!D(t))continue;try{if(JSON.parse(k(t,`utf8`)).name===e)return r}catch{}let n=x(r,T);if(D(n))try{if(Zn(k(n,`utf8`),n)?.id===e)return r}catch{}}}function ju(t,n=process.cwd()){let r=[ji(x(n,`__resolve__.js`)).href,import.meta.url];for(let n of r)try{return Be(e(n).resolve(`${t}/package.json`))}catch{}return Au(t,Be(Ai(import.meta.url)))??Au(t,n)}async function Mu(e){let t=ju(e.pkg,e.cwd);if(!t)throw Error(`无法解析包 ${e.pkg}(未安装或不可从当前位置解析)。`);let r=x(t,T);if(!D(r))throw Error(`${e.pkg} 不是 otto 插件:缺 ${T}(RFC-044 自描述)。`);let i=Zn(k(r,`utf8`),r);if(!i)throw Error(`${e.pkg} 的 ${T} 非法(需合法 kebab-case id)。`);let a=e.ottoDir??n,o=x(a,`plugins`,i.id);O(x(a,`plugins`),{recursive:!0});let s=S(t);if(Du(o)){try{if(S(Ur(o))===s){let e=await Eu(t);return{id:i.id,packageDir:t,dir:o,created:!1,compileWarnings:e,version:i.version}}}catch{}Yr(o)}else if(D(o))if((D(x(o,T))?Zn(k(x(o,T),`utf8`),o):null)?.id===i.id)Kr(o,{recursive:!0,force:!0});else throw Error(`目标已存在且非本插件,拒绝覆盖:${o}`);Jr(s,o);let c=await Eu(t);return{id:i.id,packageDir:t,dir:o,created:!0,compileWarnings:c,version:i.version}}async function Nu(e){let t=x(e,T);if(!D(t))throw Error(`${e} 不是 otto 插件:缺 ${T}`);let r=Zn(k(t,`utf8`),t);if(!r)throw Error(`${e} 的 ${T} 非法。`);let i=x(n,`plugins`,r.id);O(x(n,`plugins`),{recursive:!0});let a=S(e);if(Du(i)){try{if(S(Ur(i))===a){let t=await Eu(e);return{id:r.id,packageDir:e,dir:i,created:!1,compileWarnings:t,version:r.version}}}catch{}Yr(i)}else if(D(i))if((D(x(i,T))?Zn(k(x(i,T),`utf8`),i):null)?.id===r.id)Kr(i,{recursive:!0,force:!0});else throw Error(`目标已存在且非本插件,拒绝覆盖:${i}`);Jr(a,i);let o=await Eu(e);return{id:r.id,packageDir:e,dir:i,created:!0,compileWarnings:o,version:r.version}}function Pu(e,t){return[...e.filter(e=>e.id!==t.id),t]}function Fu(e,t){return e.filter(e=>e.id!==t)}async function Iu(e,t,n=()=>Date.now()){let r=Pu(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 Lu(e,t){let n={},r=!1,i=e.get(`installed_plugins`)??[];i.some(e=>e.id===t)&&(n.installed_plugins=Fu(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 Ru(e,t){let n=[],r=new Set(e.filter(e=>e.scope===`user`).map(e=>e.id)),i=t.filter(e=>e.scope===`global`),a=new Set(i.map(e=>e.id));for(let e of i)r.has(e.id)||n.push({kind:`missing-on-disk`,id:e.id,message:`${e.id}: 清单记录已安装,但磁盘 symlink 缺失,建议重装(otto extension install ${e.id})`});for(let t of e)t.scope===`user`&&!a.has(t.id)&&n.push({kind:`missing-in-registry`,id:t.id,message:`${t.id}: 磁盘已安装,但清单未记录(可能是旧版本 otto 安装的),建议重新安装以补登记`});return n}var zu=class{lastTopoSort;lastEngineIncompatible=new Map;warnedTopoIssues=new Set;warnedEngineIncompatible=new Set;resolve(e){let{compatible:t,incompatible:n}=Gn(Bn({cwd:e.workspaceDir,homedir:e.homedir??Re(),disabled:e.disabledPlugins,bundledDirs:e.bundledDirs}));this.lastEngineIncompatible=n;let r=ir(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:Dn},`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 Mu({pkg:n});t&&await Iu(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 Bu(e,t){let{model:n,authStore:r,modelRegistry:i,providerRegistry:a}=e,o=r??_(),s=i??v(),c=a??ne({authStore:o,modelRegistry:s}),l=re(),u=new ko(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 Vu(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=ha(new Set(a.map(e=>e.name)));return{model:i,systemPrompt:``,tools:a,thinkingLevel:`medium`,maxToolTurns:t.maxToolTurns,promptRefresh:e?io(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 ei({dbPath:n?`:memory:`:x(i.dir,`sessions.db`)});t.repoRef&&(t.repoRef.current=a);let o=n?ti():ni({lockDir:x(i.dir,`locks`)}),c=new Qr({repo:a,workspaceKey:t.getWorkspaceKey??(()=>vi),maxLoadEntries:ln,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 Tt({providerRegistry:t.providerRegistry,hookRegistry:t.hookRegistry,logger:t.logger,workspaceDir:t.workspaceDir,clock:t.clock,traceStore:t.traceStore,checkpointStore:t.checkpointStore,memory:t.memory,maxSessions:e.maxSessions,devtools:t.devtools,configProvider:r,residencyGovernor:t.residencyGovernor,getResidencyConfig:t.getResidencyConfig,storage:{kind:`custom`,persistence:c,autoPersist:!0,...n?{panelStatePersistence:rn(),pasteStatePersistence:an()}:{panelStateDir:x(i.dir,`panel-state`)},listColdSessionsOverride:l,isSessionWriteLocked:u,inspectSessionWriteLease:d,forceReleaseSessionWriteLease:f,onDispose:()=>{o.close(),a.close()}}})}i&&`dir`in i&&process.env.OTTO_SESSION_BLOB===`1`&&C(`@x-otto/coding:session-pool-factory`).warn(`OTTO_SESSION_BLOB=1 — blob session persistence is deprecated (M63). Relational append (sessions.db) is the default since M60. The blob escape hatch will be removed when the relational path has proven stable in production.`);let a=i?`dir`in i?{kind:`disk`,sessionDir:i.dir}:`url`in i?(()=>{let n=sa(e.storage,`session`);return{kind:`remote`,sessionUrl:i.url,fetch:n.fetch??globalThis.fetch,getAuth:n.getAuth,timeoutMs:n.timeoutMs,userId:e.userIdentity?.userId,wsKey:t.getWorkspaceKey}})():void 0:void 0;return Tt({providerRegistry:t.providerRegistry,hookRegistry:t.hookRegistry,logger:t.logger,workspaceDir:t.workspaceDir,clock:t.clock,traceStore:t.traceStore,checkpointStore:t.checkpointStore,memory:t.memory,maxSessions:e.maxSessions,storage:a,devtools:t.devtools,configProvider:r,residencyGovernor:t.residencyGovernor})}function Hu(e){return e.map(e=>({name:e.name,description:typeof e.description==`function`?e.description({projectRoot:``}):e.description,parameters:e.parameters}))}function Uu(e,t,n){if(e.length===0)return[];if(!n.getTools)return n.logger.warn(`Swarm member "%s" requested %d tools but leaf has no tool directory (getTools not injected); all hidden (fail closed)`,t,e.length),[];let r=yn(n.getDeclarativeAgentProfiles?.()??[],t),i=r?Za(r.defaultTools):void 0,a=to(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 Wu(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(ai(o.context.from,o.context.allowedTargets,r))}return i}function Gu(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=Uu(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=Wu(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 di({stream:e.stream,logger:e.logger,agentName:t.agentId,maxToolTurns:t.maxToolTurns,toolHookExecutor:jt({hookRegistry:e.hookRegistry,agentName:t.agentId,sessionId:u}),depth:d}),p=()=>f.abort();t.signal?.aborted?f.abort():t.signal?.addEventListener(`abort`,p,{once:!0});let m=`${u}:${t.agentId}`,h=St(f,{id:m,agentName:t.agentId,title:t.agentId,prompt:t.prompt,model:t.model??r.id,origin:`main`,depth:d,abort:()=>f.abort(),messages:l.messages}),g;try{g=await f.run(l)}finally{t.signal?.removeEventListener(`abort`,p),h(),zt.markEnded(m)}return{agentId:t.agentId,messages:l.messages,handoff:t.signal?.aborted?void 0:a,text:g.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
|
|
373
|
+
`),tokenUsage:{input:g.usage.inputTokens,output:g.usage.outputTokens,cacheRead:g.usage.cacheReadTokens},durationMs:Date.now()-n}}}function Ku(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??Gu(t)}}function qu(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=qu(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=Ku(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 oi(d).run(e,{signal:t});return{agentId:c,messages:[],text:n.output,tokenUsage:{input:0,output:0,cacheRead:0},durationMs:n.durationMs}}});continue}let l=yn(o,c);if(!l){s.push({kind:`agent`,id:c,name:c,description:c,systemPrompt:gn(c),tools:Hu(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:Hu(t.resolveTools(void 0,Za(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 Ju(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=qu(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 oi(Ku(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 Yu=`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
374
|
- Overall layout (columns/sections, relative position and proportions)
|
|
375
375
|
- Color palette (primary/secondary colors as hex codes)
|
|
376
376
|
- Text content and font-size hierarchy (headings vs body)
|
|
377
377
|
- Interactive component inventory (buttons, inputs, nav items, etc.)
|
|
378
378
|
- Key size ratios/dimensions
|
|
379
379
|
|
|
380
|
-
If the image is not a UI/design screenshot, give a normal concise description instead. Do not speculate beyond what's visible.`;var
|
|
381
|
-
`),c=Math.max(1,n);if(c>s.length)return null;let l=Math.min(s.length,r>0?r:n);return
|
|
382
|
-
`))}function
|
|
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
|
|
380
|
+
If the image is not a UI/design screenshot, give a normal concise description instead. Do not speculate beyond what's visible.`;var Xu=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?`${Yu}\n\nContext: ${t.contextHint}`:Yu},{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 li(`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 Zu(e){let t=e?.slots?.vision;if(t)return Array.isArray(t)?t:[t]}function Qu(e,t){globalThis[e]||Object.defineProperty(globalThis,e,{value:Object.freeze(t()),writable:!1,configurable:!1})}var $u=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,Qu(`__ottoPanelRuntime`,()=>({callMcpTool:(e,t,n)=>this.callMcpTool(e,t,n),usePluginData:ed(this)}))}};function ed(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 td=new $u;function nd(e){td.install(e)}const rd=`backend/`;function id(e){return e.startsWith(rd)?e:`${rd}${e}`}var ad=class{fns=null;get(){return this.fns}install(e){this.fns=e,Qu(`__ottoPanelBackendRuntime`,()=>({usePanelBackend:sd(this)}))}};function od(){return globalThis.__ottoCurrentPanelPluginId}function sd(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=od(),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,id(e),t,i)},[n]),cancel:t.useCallback(e=>{!n||!r||r.cancel(n,e)},[n]),state:i,status:o}}}const cd=new ad;function ld(e){cd.install(e)}function ud(){let e=process.env.LC_ALL||process.env.LC_MESSAGES||process.env.LANG||``;return/zh/i.test(e)?`zh`:`en`}function dd(e){return!e||e===`auto`?ud():e}var fd=class{loadedPluginIds=[];previousSnapshot=[];constructor(e){this.deps=e}async reload(){let e=0,t=0,n=[],r=new Map;for(let e of this.deps.activePlugins()){let i=!!e.manifest.contributes?.oauth?.length,a=!!e.manifest.contributes?.providers?.length;if(!i&&!a)continue;let o=E(e);if(o.gated){this.deps.logger.warn({pluginId:e.id},`project plugin not trusted, skipping declarative providers (fail-closed, RFC-124 C1)`),t+=(e.manifest.contributes?.providers?.length??0)+(e.manifest.contributes?.oauth?.length??0);continue}if(o.pendingCapabilities.includes(`provider`)){this.deps.logger.warn({pluginId:e.id},`plugin capability "provider" declared but not yet granted, skipping declarative providers (fail-closed, RFC-124 C2)`),t+=(e.manifest.contributes?.providers?.length??0)+(e.manifest.contributes?.oauth?.length??0),n.push(e.id);continue}r.set(e.id,e.manifest)}let i=e=>JSON.stringify(e),a=[],o=new Map,s=new Map;for(let e of this.previousSnapshot){let t=r.get(e.id);if(t!==void 0&&i(t)!==i(e.manifest)){let n=Hl(e.id,e.manifest),r=Hl(e.id,t),i=new Set([...n].filter(e=>r.has(e)));i.size>0&&o.set(e.id,i);let a=Ul(e.id,e.manifest),c=Ul(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 Ql(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=Zl(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 Ql(e,t,this.deps);this.previousSnapshot=[],this.loadedPluginIds=[]}};function pd(e,n){if(!e)return{devtools:null,logSubscription:null};let r=new t;return{devtools:r,logSubscription:qe(e=>{if(typeof e==`object`&&e&&`name`in e&&`level`in e&&`msg`in e){let t=e;t.name===n&&r.sendLog(t)}})}}var md=class{registry;auditLog;constructor(e,t){let n=ke(e.getAll());this.auditLog=new he,this.registry=Oe({toolSets:n}),t.register(Ee(this.registry,this.auditLog))}};const hd=C(`@x-otto/coding:plugin-context-sources`),gd=64*1024;function _d(e,t,n){let r=S(t,n);if(!Ms(r,t)){hd.warn({pluginId:e,file:n},`contextSources.content.file resolves outside plugin dir, skipped`);return}try{let e=k(r,`utf8`);return Buffer.byteLength(e,`utf8`)>gd?`${e.slice(0,gd)}\n<!-- truncated -->`:e}catch(t){hd.warn({pluginId:e,file:n,err:String(t)},`contextSources.content.file read failed, skipped`);return}}function vd(e){let t=[];for(let n of e){if(E(n).gated)continue;let e=n.manifest.contributes?.contextSources;if(e?.length){if(!n.manifest.capabilities?.includes(`context`)){hd.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:_d(n.id,n.dir,r.content.file);if(e!=null)return`<!-- plugin:${n.id} -->\n${e}`}})}}return t}function yd(e){Wt(),Ut(void 0,e.repoRoot);let t=(t,n)=>{e.hasSession(n.sessionId)&&e.emitHook(t,n).catch(n=>{e.logger.warn({err:n instanceof Error?n.message:String(n),timing:t},`Failed to emit process lifecycle hook`)})};return[w.onSpawn(n=>{e.logger.info({id:n.id,pid:n.pid,command:n.command,port:n.port},`Background process started`),t(`process.spawned`,{sessionId:n.sessionId,processId:n.id,pid:n.pid,command:n.command,port:n.port})}),w.onExit(n=>{e.logger.info({id:n.id,pid:n.pid,status:n.status,exitCode:n.exitCode},`Background process exited`),t(`process.exited`,{sessionId:n.sessionId,processId:n.id,pid:n.pid,command:n.command,status:n.status,exitCode:n.exitCode})})]}const bd=2e4,xd=(e,t)=>{let n=wi(`git`,[...e],{cwd:t,timeout:1e4,encoding:`utf-8`,maxBuffer:4194304});return n.error||n.status!==0?null:n.stdout??``};function Sd(e){return e.length<=bd?e:`${e.slice(0,bd)}\n[...truncated ${e.length-bd} chars...]`}function Cd(e,t,n,r){let i=S(e),a=He(t)?t:S(i,t);if(a!==i&&!a.startsWith(`${i}/`)||!D(a)||!qr(a).isFile())return null;let o;try{o=k(a,`utf-8`)}catch{return null}if(o.includes(`\0`))return null;let s=o.split(`
|
|
381
|
+
`),c=Math.max(1,n);if(c>s.length)return null;let l=Math.min(s.length,r>0?r:n);return Sd(s.slice(c-1,l).join(`
|
|
382
|
+
`))}function wd(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 Cd(e,a[1],o,o+r)}function Td(e){let t=e?.gitRunner??xd;return[{id:`file-range`,resolve:(e,t)=>{let n=/^([\w./\-]+):(\d+)(?:-(\d+))?$/.exec(e);if(!n)return``;let r=Cd(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=wd(n.workspaceDir,e,t);return r===null?``:`\n\n@def:${e}:\n\`\`\`\n${r}\n\`\`\`\n`}}]}function Ed(e){return{sandbox:new va(e.logger),memoryGovernor:new ht({logger:e.logger}),residencyGovernor:new _t,fleetMonitor:new mt({logger:e.logger}),permissionSync:new _a({logger:e.logger,getToolRegistry:e.getToolRegistry,getPermissionRegistry:e.getPermissionRegistry}),hookRegistry:e.hookRegistry??we({preset:`default`,onHookTimeout:e.onHookTimeout})}}function Dd(e){let t=pd(e.inspect,e.loggerName),n=t.devtools,r=t.logSubscription,i=new ci({workspaceDir:e.workspaceDir,projectConfigPath:e.projectConfigPath,projectConfigTrusted:()=>Mr(e.workspaceDir,{interactive:e.interactive})});return i.on(`change`,t=>{e.onSettingsApplied(t),e.permissionSync.sync(t),e.sandbox.applySetting(e.sandbox.resolveConfig(t));let n=t.proxy,r=n?.enabled!==!1&&n?.url?n.url:void 0;$e(r),Xe(r),e.getI18nRegistry().setLocale(dd(t.language))}),{devtools:n,logSubscription:r,settings:i}}function Od(e){let t=new Xu({getModelRegistry:e.getModelRegistry,providerRegistry:e.providerRegistry,getVisionSlotCandidates:()=>Zu(e.getSettings().get(`model_slots`)),isModelUsable:e.isModelUsable,logger:e.logger});return{visionDelegateService:t,sessionConfigResolver:new ao({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 kd(e){let t=Vu(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:Gu({hookRegistry:e.hookRegistry,stream:n.stream,logger:e.logger,defaultModel:e.defaultModel,getTools:e.getTools,getDeclarativeAgentProfiles:e.getDeclarativeAgentProfiles}),defaultModel:e.defaultModel}}function Ad(e){let{runSession:t,abortTask:n}=Eo({logger:e.logger,getSession:e.getSession,createSession:e.createSession,removeSession:e.removeSession}),r=new ii({hookRegistry:e.hookRegistry,runSession:t,abortTask:n,runAgentTurn:e.swarmAgentRunner,workflowConfig:e.workflowConfig});return{orchestrator:r,runSession:t,runTeam:Ju({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:Pi()}}function jd(e){nd(e.callMcpTool);let t=new Xs({mcpController:e.mcpController,getActivePlugins:e.getActivePlugins});return ld({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 Md(e){let t=new xu({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 fd({providerRegistry:e.providerRegistry,authStore:e.authStore,modelRegistry:e.modelRegistry,wireProtocolRegistry:e.wireProtocolRegistry,activePlugins:e.activePlugins,logger:e.logger});return e.i18nRegistry.register(Is(e.activePlugins())),{pluginModuleManager:t,pluginProviderManager:n,capabilityReloader:new Js(e.settings,e.mcpController,e.skillRegistryForReloader,t,n,e.toolRegistry,e.modelCatalogManager,e.workspaceDir,e.getActivePluginsForReloader,e.i18nRegistry)}}function Nd(e){return{toolsSyncCoordinator:new as({sessionConfigResolver:e.sessionConfigResolver,getSession:e.getSession,listSessionIds:e.listSessionIds,logger:e.logger}),pluginContributionsFacade:new bs({getWorkspaceDir:()=>e.workspaceDir,settings:e.settings,getActivePlugins:e.getActivePlugins,pluginModuleManager:e.pluginModuleManager,mcpController:e.mcpController})}}function Pd(e){let t=new Set(e.hookRegistry.getRegistered().map(e=>e.name)),n=new md(e.toolRegistry,e.hookRegistry),r=new wa(e.settings,e.toolRegistry,e.logger,e.workspaceDir,e.getResilienceConfig);return{permissionRegistry:n.registry,auditLog:n.auditLog,mcpController:r,preExistingHooks:t}}function Fd(e){return new ka({settings:e.settings,mcp:e.mcpController,skills:e.skillRegistry,getAgentProfiles:()=>e.declarativeAgentProfiles,getPlugins:()=>Bn({cwd:e.workspaceDir,homedir:e.pluginHomedir,bundledDirs:e.pluginBundledDirs}),processRuntime:Vt,onPluginToggle:e.onPluginToggle})}function Id(e){e.pluginInput.register(Nn()),e.pluginInput.registerProvider(`@`,Fn({cwd:e.workspaceDir})),e.sigilResolvers.register(Td(),`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=jl(e.activePlugins());t.length>0&&e.pluginInput.register(t),Ml(e.activePlugins());for(let t of vd(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:yd({hasSession:t=>!!e.codingSessionPoolGet(t),emitHook:(t,n)=>e.hookRegistry.emit(t,n),logger:e.logger,repoRoot:e.workspaceDir})}}async function Ld(e,t,n){t()||(await e.load(),n(!0))}function Rd(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:Vi(e.getScheduleService),searchEcosystem:e.searchEcosystem}}function zd(e){let{orchestrator:t,writeTodos:n,skillProvider:r,autoMemory:i,reloadMemory:a,archiveRecall:o}=e,s=e.processOwner,c=s?{register:e=>w.register({...e,owner:s}),get:e=>w.get(e),getForSession:(e,t)=>w.getForSession(e,t),listForSession:e=>w.listForSession(e),kill:e=>w.kill(e),updateDetectedService:(e,t)=>w.updateDetectedService(e,t)}:w;return{orchestration:{dispatchTask:t.dispatchTask,getTask:t.getTask,listTasks:t.listTasks,updateTask:t.updateTask,getBackgroundOutput:t.getBackgroundOutput,cancelBackground:t.cancelBackground,writeTodos:n,startJob:e.startJob},agents:{callAgent:t.callAgent},fork:{fork:async(t,n,r)=>({ok:!0,value:(await e.runSession({prompt:t,sessionMode:`ephemeral`,depth:n,signal:r})).text})},skills:r?{loadSkill:e=>r.load(e),executeSkill:e=>r.execute(e)}:void 0,memory:i?{recordMemory:async e=>{await i.record(e,e.scope),e.scope===`project-shared`&&a&&await a()},readMemory:e=>i.read(e),archive:o?{read:e=>o.readArchive(e),list:e=>o.listArchives(e)}:void 0}:void 0,team:{runTeam:e.runTeam},session:{manager:{list:async()=>e.sessions.list().map(e=>({id:e.id,title:e.id,messageCount:e.messageCount})),create:async()=>({id:(await e.sessions.create()).id}),remove:async t=>e.sessions.remove(t),compact:async t=>{let n=e.sessions.get(t);return n?(await n.compactNow(),!0):!1}}},features:{listModels:e.listModels,grill:(t,n)=>{let r=e.sessions.get(t);return r?r.requestGrill(n):Promise.resolve({answer:n.recommendation,acceptedRecommendation:!0,resolvedBy:`auto_recommendation`})},enableLsp:e.enableLsp,sandbox:e.sandbox,processRegistry:c,captureFileState:async t=>{let n=await e.fileStateManager.capture({workspaceDir:e.workspaceDir,recentFiles:t.recentFiles,planStatus:t.planStatus});return{success:!0,summary:e.fileStateManager.formatSnapshot(n),timestamp:n.timestamp}},learn:async t=>{let{lesson:n,deduped:r}=await(t.scope===`local`?e.localLearningStore??e.learningStore:e.learningStore).saveDeduped({tags:t.tags,trigger:t.trigger,insight:t.insight,sourceSessionId:t.sessionId});return{success:!0,lessonId:n.id,deduped:r}}},schedule:e.schedule?{create:e.schedule.create,list:e.schedule.list,delete:e.schedule.delete,run:e.schedule.run,cancel:e.schedule.cancel}:void 0,capabilityGap:e.searchEcosystem?{search:e.searchEcosystem}:void 0}}function Bd(e,t){return b({name:`tool-guidance-injection`,timing:`system.prompt.transform`,priority:vt.toolGuidance.priority,handle:async(n,r)=>{let i=e.buildToolGuidance(t());i&&(r.systemPrompt=`${r.systemPrompt}\n\n${i}`)}})}const Vd=x(process.cwd(),`docs/rfc/RFC-284-core-pack/content.txt`),Hd=x(process.cwd(),`docs/rfc/RFC-284-governance-plan.json`);function Ud(){if(!D(Vd))return;let e=k(Vd,`utf8`).trim();return e.length>0?e:void 0}function Wd(){if(!D(Hd))return new Map;let e=JSON.parse(k(Hd,`utf8`));return new Map((e.decisions??[]).map(e=>[e.key,e]))}function Gd(e){return new Set(e.toLowerCase().split(/[^\p{L}\p{N}._/-]+/u).filter(e=>e.length>=3))}function Kd(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 qd(e,t){let n=Gd(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=Gd(`${e.trigger} ${e.insight}`);for(let e of n)a.has(e)&&(r+=1);return r}function Jd(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=qd(e,n);if(a<=0)return;let o=`[${e.tags.join(`, `)}] ${e.trigger} → ${e.insight}`;return{lesson:e,score:a,text:o,tokens:Kd(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 Yd(e,t,n){let r=kt({name:`lesson-injection`,priority:vt.lesson.priority,compute:async()=>{let r=Ud(),i=n?await n.list():[];if(r){let e=i.length>0?await t.loadRuntimeLessonsTemplate()??void 0:void 0;return[r,i.length>0?_n(i,e):``].filter(e=>e.length>0).join(`
|
|
385
385
|
|
|
386
|
-
`)||void 0}let a=[...await e.list(),...i];if(a.length!==0)return
|
|
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
|
|
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(`
|
|
386
|
+
`)||void 0}let a=[...await e.list(),...i];if(a.length!==0)return _n(a,await t.loadRuntimeLessonsTemplate()??void 0)||void 0}}),i=b({name:`lesson-relevant-hints`,timing:`system.prompt.transform`,priority:vt.lesson.priority+1,handle:async(t,n)=>{if(!t.userText)return;let r=Wd();if(r.size===0)return;let i=Jd(await e.list(),r,t.userText);i&&(await e.recordRelevantHits(i.hitIds),n.systemTail=[...n.systemTail??[],i.text])}});return[...r,i]}function Xd(e){return kt({name:`skill-catalog-injection`,priority:vt.skillCatalog.priority,compute:()=>{let t=e.buildCatalog();if(t)return`${t}\n\nUse the skill tool with a skill name to load its full instructions.`}})}function Zd(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 Qd(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 $d(){let e=new Map;return[b({name:`background-process-exit-collector`,timing:`process.exited`,handle:t=>{let n=e.get(t.sessionId)??[];n.push(Qd(t)),e.set(t.sessionId,n)}}),b({name:`background-process-exit-injector`,timing:`messages.transform`,priority:25,handle:(t,n)=>{Zd(e,t,n)}}),b({name:`background-process-notification-cleanup`,timing:`session.deleted`,handle:t=>{e.delete(t.sessionId)}})]}function ef(e){return b({name:`background-process-session-kill`,timing:`session.deleted`,handle:t=>{let n=t.metadata.reason;n===`idle`||n===`evicted`||e(t.sessionId)}})}function tf(e){return[b({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)}}),b({name:`session-permission-cleanup`,timing:`session.deleted`,handle:t=>{e.registry.clearSessionAlwaysAllow(t.sessionId)}})]}function nf(e){return e.role===`user`||e.role===`assistant`||e.role===`tool_result`}function rf(e,t,n={}){let r=n.minMessages??6;return[b({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(nf))}}),b({name:`memory-auto-extract-cleanup`,timing:`session.deleted`,handle:e=>{t.reset(e.sessionId)}})]}function af(e){return kt({name:vt.skillLoopGuidance.name,priority:vt.skillLoopGuidance.priority,compute:()=>e.isEnabled()?mn:void 0})}const of=336*60*60*1e3;function sf(e){return typeof e!=`number`||!Number.isFinite(e)?of:Math.max(864e5,Math.round(e*24*60*60*1e3))}function cf(e,t,n=of){return e.filter(e=>e.dismissedAt===void 0||t-e.dismissedAt>=n)}function lf(e){return new Date(e).toISOString().slice(0,10)}function uf(e){return`你重复做过同一类任务 ${e.size} 次,要把它的执行流程固化成一个可复用的 skill 吗?`}function df(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}`,`时间跨度:${lf(e.firstAt)} ~ ${lf(e.lastAt)}`,``,`若同意,otto 会据这些会话的执行路径起草一份 SKILL.md 交你审阅——生成物仍需你显式 apply 才会生效。`,`完整候选数据可用 read 工具查看插件状态目录下的 candidates.json。`].join(`
|
|
388
|
+
`)}function ff(){return`暂不生成。技能固化应由你在看到具体流程后主动决定;无人应答时默认跳过,稍后同类任务再出现会重新征询。`}function pf(){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 mf=class extends Error{constructor(){super(`Encountered Promise during synchronous parse. Use .parseAsync() instead.`)}},hf=class extends Error{constructor(e){super(`Encountered unidirectional transform during encode: ${e}`),this.name=`ZodEncodeError`}};const gf={};function _f(e){return e&&Object.assign(gf,e),gf}function vf(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 yf(e,t){return typeof t==`bigint`?t.toString():t}function bf(e){return{get value(){{let t=e();return Object.defineProperty(this,`value`,{value:t}),t}throw Error(`cached value already set`)}}}function xf(e){return e==null}function Sf(e){let t=e.startsWith(`^`)?1:0,n=e.endsWith(`$`)?e.length-1:e.length;return e.slice(t,n)}function Cf(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 wf=Symbol(`evaluating`);function U(e,t,n){let r;Object.defineProperty(e,t,{get(){if(r!==wf)return r===void 0&&(r=wf,r=n()),r},set(n){Object.defineProperty(e,t,{value:n})},configurable:!0})}function Tf(e,t,n){Object.defineProperty(e,t,{value:n,writable:!0,enumerable:!0,configurable:!0})}function Ef(...e){let t={};for(let n of e)Object.assign(t,Object.getOwnPropertyDescriptors(n));return Object.defineProperties({},t)}function Df(e){return JSON.stringify(e)}function Of(e){return e.toLowerCase().trim().replace(/[^\w\s-]/g,``).replace(/[\s_-]+/g,`-`).replace(/^-+|-+$/g,``)}const kf=`captureStackTrace`in Error?Error.captureStackTrace:(...e)=>{};function Af(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const jf=bf(()=>{if(typeof navigator<`u`&&navigator?.userAgent?.includes(`Cloudflare`))return!1;try{return Function(``),!0}catch{return!1}});function Mf(e){if(Af(e)===!1)return!1;let t=e.constructor;if(t===void 0||typeof t!=`function`)return!0;let n=t.prototype;return!(Af(n)===!1||Object.prototype.hasOwnProperty.call(n,`isPrototypeOf`)===!1)}function Nf(e){return Mf(e)?{...e}:Array.isArray(e)?[...e]:e}const Pf=new Set([`string`,`number`,`symbol`]);function Ff(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function If(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 If(e,Ef(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 Tf(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 If(e,Ef(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 Tf(this,`shape`,r),r},checks:[]}))}function Vf(e,t){if(!Mf(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 If(e,Ef(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t};return Tf(this,`shape`,n),n}}))}function Hf(e,t){if(!Mf(t))throw Error(`Invalid input to safeExtend: expected a plain object`);return If(e,Ef(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t};return Tf(this,`shape`,n),n}}))}function Uf(e,t){return If(e,Ef(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t._zod.def.shape};return Tf(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 If(t,Ef(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 Tf(this,`shape`,i),i},checks:[]}))}function Gf(e,t,n){return If(t,Ef(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 Tf(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,yf,2),Object.defineProperty(e,`toString`,{value:()=>e.message,enumerable:!1})},$f=H(`$ZodError`,Qf),ep=H(`$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 mf;if(o.issues.length){let t=new(i?.Err??e)(o.issues.map(e=>Yf(e,a,_f())));throw kf(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,_f())));throw kf(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 mf;return a.issues.length?{success:!1,error:new(e??$f)(a.issues.map(e=>Yf(e,i,_f())))}:{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,_f())))}:{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=H(`$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=H(`$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=H(`$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=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):Cf(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=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]=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=H(`$ZodCheckMaxLength`,(e,t)=>{var n;G.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!xf(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=H(`$ZodCheckMinLength`,(e,t)=>{var n;G.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!xf(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=H(`$ZodCheckLengthEquals`,(e,t)=>{var n;G.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!xf(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=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=()=>{})}),em=H(`$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=H(`$ZodCheckLowerCase`,(e,t)=>{t.pattern??=Up,$p.init(e,t)}),nm=H(`$ZodCheckUpperCase`,(e,t)=>{t.pattern??=Wp,$p.init(e,t)}),rm=H(`$ZodCheckIncludes`,(e,t)=>{G.init(e,t);let n=Ff(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=H(`$ZodCheckStartsWith`,(e,t)=>{G.init(e,t);let n=RegExp(`^${Ff(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=H(`$ZodCheckEndsWith`,(e,t)=>{G.init(e,t);let n=RegExp(`.*${Ff(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=H(`$ZodCheckOverwrite`,(e,t)=>{G.init(e,t),e._zod.check=e=>{e.value=t.tx(e.value)}});var sm=class{constructor(e=[]){this.content=[],this.indent=0,this&&(this.args=e)}indented(e){this.indent+=1,e(this),--this.indent}write(e){if(typeof e==`function`){e(this,{execution:`sync`}),e(this,{execution:`async`});return}let t=e.split(`
|
|
389
389
|
`).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=
|
|
390
|
+
`))}};const cm={major:4,minor:3,patch:6},K=H(`$ZodType`,(e,t)=>{var n;e??={},e._zod.def=t,e._zod.bag=e._zod.bag||{},e._zod.version=cm;let r=[...e._zod.def.checks??[]];e._zod.traits.has(`$ZodCheck`)&&r.unshift(e);for(let t of r)for(let n of t._zod.onattach)n(e);if(r.length===0)(n=e._zod).deferred??(n.deferred=[]),e._zod.deferred?.push(()=>{e._zod.run=e._zod.parse});else{let t=(e,t,n)=>{let r=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 mf;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 mf;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 mf;return o.then(e=>t(e,r,a))}return t(o,r,a)}}U(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=H(`$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=H(`$ZodStringFormat`,(e,t)=>{$p.init(e,t),lm.init(e,t)}),um=H(`$ZodGUID`,(e,t)=>{t.pattern??=wp,q.init(e,t)}),dm=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??=Tp(e)}else t.pattern??=Tp();q.init(e,t)}),fm=H(`$ZodEmail`,(e,t)=>{t.pattern??=Ep,q.init(e,t)}),pm=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})}}}),mm=H(`$ZodEmoji`,(e,t)=>{t.pattern??=Dp(),q.init(e,t)}),hm=H(`$ZodNanoID`,(e,t)=>{t.pattern??=Sp,q.init(e,t)}),gm=H(`$ZodCUID`,(e,t)=>{t.pattern??=_p,q.init(e,t)}),_m=H(`$ZodCUID2`,(e,t)=>{t.pattern??=vp,q.init(e,t)}),vm=H(`$ZodULID`,(e,t)=>{t.pattern??=yp,q.init(e,t)}),ym=H(`$ZodXID`,(e,t)=>{t.pattern??=bp,q.init(e,t)}),bm=H(`$ZodKSUID`,(e,t)=>{t.pattern??=xp,q.init(e,t)}),xm=H(`$ZodISODateTime`,(e,t)=>{t.pattern??=zp(t),q.init(e,t)}),Sm=H(`$ZodISODate`,(e,t)=>{t.pattern??=Ip,q.init(e,t)}),Cm=H(`$ZodISOTime`,(e,t)=>{t.pattern??=Rp(t),q.init(e,t)}),wm=H(`$ZodISODuration`,(e,t)=>{t.pattern??=Cp,q.init(e,t)}),Tm=H(`$ZodIPv4`,(e,t)=>{t.pattern??=Op,q.init(e,t),e._zod.bag.format=`ipv4`}),Em=H(`$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=H(`$ZodCIDRv4`,(e,t)=>{t.pattern??=Ap,q.init(e,t)}),Om=H(`$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=H(`$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=H(`$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=H(`$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=H(`$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=H(`$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=H(`$ZodNumberFormat`,(e,t)=>{Yp.init(e,t),Im.init(e,t)}),Rm=H(`$ZodUnknown`,(e,t)=>{K.init(e,t),e._zod.parse=e=>e}),zm=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 Bm(e,t,n){e.issues.length&&t.issues.push(...qf(n,e.issues)),t.value[n]=e.value}const Vm=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=>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=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=bf(()=>Um(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=Af,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=H(`$ZodObjectJIT`,(e,t)=>{Gm.init(e,t);let n=e._zod.parse,r=bf(()=>Um(t)),i=e=>{let t=new sm([`shape`,`payload`,`ctx`]),n=r.value,i=e=>{let t=Df(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=Df(r),s=e[r]?._zod?.optout===`optional`;t.write(`const ${n} = ${i(r)};`),s?t.write(`
|
|
391
391
|
if (${n}.issues.length) {
|
|
392
392
|
if (${o} in input) {
|
|
393
393
|
payload.issues = payload.issues.concat(${n}.issues.map(iss => ({
|
|
@@ -421,10 +421,10 @@ If the image is not a UI/design screenshot, give a normal concise description in
|
|
|
421
421
|
newResult[${o}] = ${n}.value;
|
|
422
422
|
}
|
|
423
423
|
|
|
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>
|
|
424
|
+
`)}t.write(`payload.value = newResult;`),t.write(`return payload;`);let s=t.compile();return(t,n)=>s(e,t,n)},a,o=Af,s=!gf.jitless,c=s&&jf.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,_f())))}),t)}const Jm=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=>Sf(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=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])=>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(Mf(e)&&Mf(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=H(`$ZodEnum`,(e,t)=>{K.init(e,t);let n=vf(t.entries),r=new Set(n);e._zod.values=r,e._zod.pattern=RegExp(`^(${n.filter(e=>Pf.has(typeof e)).map(e=>typeof e==`string`?Ff(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=H(`$ZodTransform`,(e,t)=>{K.init(e,t),e._zod.parse=(n,r)=>{if(r.direction===`backward`)throw new hf(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 mf;return n.value=i,n}});function eh(e,t){return e.issues.length&&t===void 0?{issues:[],value:void 0}:e}const th=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(`^(${Sf(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=H(`$ZodExactOptional`,(e,t)=>{th.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)}),rh=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(`^(${Sf(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)}),ih=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=>ah(e,t)):ah(r,t)}});function ah(e,t){return e.value===void 0&&(e.value=t.defaultValue),e}const oh=H(`$ZodPrefault`,(e,t)=>{K.init(e,t),e._zod.optin=`optional`,U(e._zod,`values`,()=>t.innerType._zod.values),e._zod.parse=(e,n)=>(n.direction===`backward`||e.value===void 0&&(e.value=t.defaultValue),t.innerType._zod.run(e,n))}),sh=H(`$ZodNonOptional`,(e,t)=>{K.init(e,t),U(e._zod,`values`,()=>{let e=t.innerType._zod.values;return e?new Set([...e].filter(e=>e!==void 0)):void 0}),e._zod.parse=(n,r)=>{let i=t.innerType._zod.run(n,r);return i instanceof Promise?i.then(t=>ch(t,e)):ch(i,e)}});function ch(e,t){return!e.issues.length&&e.value===void 0&&e.issues.push({code:`invalid_type`,expected:`nonoptional`,input:e.value,inst:t}),e}const lh=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=>Yf(e,n,_f()))},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,_f()))},input:e.value}),e.issues=[]),e)}}),uh=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=>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=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(ph):ph(r)}});function ph(e){return e.value=Object.freeze(e.value),e}const mh=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=>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=>Of(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>
|
|
425
425
|
|
|
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:[
|
|
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=vf(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=H(`ZodISODateTime`,(e,t)=>{xm.init(e,t),$.init(e,t)});function Kg(e){return Uh(Gg,e)}const qg=H(`ZodISODate`,(e,t)=>{Sm.init(e,t),$.init(e,t)});function Jg(e){return Wh(qg,e)}const Yg=H(`ZodISOTime`,(e,t)=>{Cm.init(e,t),$.init(e,t)});function Xg(e){return Gh(Yg,e)}const Zg=H(`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,yf,2)}},addIssues:{value:t=>{e.issues.push(...t),e.message=JSON.stringify(e.issues,yf,2)}},isEmpty:{get(){return e.issues.length===0}}})};H(`ZodError`,$g);const X=H(`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=H(`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(Ef(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)=>If(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_=H(`_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_=H(`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 $=H(`ZodStringFormat`,(e,t)=>{q.init(e,t),f_.init(e,t)}),m_=H(`ZodEmail`,(e,t)=>{fm.init(e,t),$.init(e,t)}),h_=H(`ZodGUID`,(e,t)=>{um.init(e,t),$.init(e,t)}),g_=H(`ZodUUID`,(e,t)=>{dm.init(e,t),$.init(e,t)}),__=H(`ZodURL`,(e,t)=>{pm.init(e,t),$.init(e,t)}),v_=H(`ZodEmoji`,(e,t)=>{mm.init(e,t),$.init(e,t)}),y_=H(`ZodNanoID`,(e,t)=>{hm.init(e,t),$.init(e,t)}),b_=H(`ZodCUID`,(e,t)=>{gm.init(e,t),$.init(e,t)}),x_=H(`ZodCUID2`,(e,t)=>{_m.init(e,t),$.init(e,t)}),S_=H(`ZodULID`,(e,t)=>{vm.init(e,t),$.init(e,t)}),C_=H(`ZodXID`,(e,t)=>{ym.init(e,t),$.init(e,t)}),w_=H(`ZodKSUID`,(e,t)=>{bm.init(e,t),$.init(e,t)}),T_=H(`ZodIPv4`,(e,t)=>{Tm.init(e,t),$.init(e,t)}),E_=H(`ZodIPv6`,(e,t)=>{Em.init(e,t),$.init(e,t)}),D_=H(`ZodCIDRv4`,(e,t)=>{Dm.init(e,t),$.init(e,t)}),O_=H(`ZodCIDRv6`,(e,t)=>{Om.init(e,t),$.init(e,t)}),k_=H(`ZodBase64`,(e,t)=>{Am.init(e,t),$.init(e,t)}),A_=H(`ZodBase64URL`,(e,t)=>{Mm.init(e,t),$.init(e,t)}),j_=H(`ZodE164`,(e,t)=>{Nm.init(e,t),$.init(e,t)}),M_=H(`ZodJWT`,(e,t)=>{Fm.init(e,t),$.init(e,t)}),N_=H(`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_=H(`ZodNumberFormat`,(e,t)=>{Lm.init(e,t),N_.init(e,t)});function I_(e){return Jh(F_,e)}const L_=H(`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_=H(`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_=H(`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_=H(`ZodObject`,(e,t)=>{Km.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Pg(e,t,n,r),U(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_=H(`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_=H(`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_=H(`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_=H(`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 hf(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 $_=H(`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=H(`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=H(`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=H(`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():Nf(t)}})}const sv=H(`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():Nf(t)}})}const lv=H(`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=H(`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=H(`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=H(`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=H(`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 x(pu(e),t,`candidates.json`)}function Cv(e){if(!bv.includes(e.pluginId))return[];let t;try{let n=Sv(e.pluginId,e.workspaceKey);if(!D(n))return[];t=k(n,`utf8`)}catch{return[]}let n;try{n=JSON.parse(t)?.data?.items}catch{return[]}if(!Array.isArray(n))return[];let r=[];for(let e of n){let t=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:uf(e.brief),background:df(e.brief),recommendation:ff(),options:pf(),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(k(t,`utf8`)),i=r?.data?.items;if(!Array.isArray(i))return!1;let a=i.find(t=>t?.id===e.brief.id);return a?(a.dismissedAt=e.now,A(n,JSON.stringify(r)),Gr(n,t),!0):!1}catch{try{Yr(n)}catch{}return!1}}const Dv=bv[0],Ov=vi;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=cf(Cv({pluginId:Dv,workspaceKey:e.getWorkspaceKey()??vi}),n,sf(e.getCooldownDays?.()))}catch(t){return e.logger.warn({err:String(t)},`skill-loop: reading candidates failed`),`no-candidates`}if(r.length===0)return`no-candidates`;let i=e.getRequestGrill(t);if(!i)return`no-session`;let a=r[0];if(!a)return`no-candidates`;let o=await Tv({requestGrill:i,brief:a,pluginId:Dv,workspaceKey:e.getWorkspaceKey()??vi,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[b({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 b({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(...je(o)),a.length===0)return;let s=typeof i?.targetDir==`string`?i.targetDir:`.`,c=S(r.projectRoot,s),l=ge({writePaths:a.map(e=>S(c,e))},r);if(l.verdict===`deny`){n.cancelled=!0,n.decision=`deny`,n.decisionReason=l.reason??`sandbox policy`,n.cancelReason=`Sandbox denied: ${n.decisionReason}`;return}if(l.verdict===`ask`){if(r.autoAllowBashIfSandboxed===!0&&t.toolName===`bash`&&n.decision!==`deny`&&n.decision!==`ask`)return;n.decision!==`deny`&&(n.decision=`ask`,n.decisionReason=`${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:[b({name:`agent-job-notification-injector`,timing:`messages.transform`,priority:25,handle:(t,n)=>{Zd(e,t,n)}}),b({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 x(pu(e),t,`episodes.json`)}function Lv(e,t){let n;try{let r=Iv(e,t);if(!D(r))return{total:0,success:0,recent:[]};n=k(r,`utf8`)}catch{return{total:0,success:0,recent:[]}}let r;try{r=JSON.parse(n)?.data?.items}catch{return{total:0,success:0,recent:[]}}if(!Array.isArray(r))return{total:0,success:0,recent:[]};let i=0,a=[];for(let e of r){let t=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=sf(e.cooldownDays),o=cf(i,e.now,a);return{pluginInstalled:!0,episodeCount:r.total,successCount:r.success,candidateCount:i.length,pendingCount:o.length,coolingCount:i.length-o.length,recentSignatures:r.recent,pending:o.slice(0,5),nextProposalHint: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=x(pu(e.pluginId),e.workspaceKey,`episodes.json`);if(!D(t))return[];n=k(t,`utf8`)}catch{return[]}let r;try{r=JSON.parse(n)?.data?.items}catch{return[]}if(!Array.isArray(r))return[];let i=new Set(e.sessionIds),a=[];for(let e of r){let n=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(`
|
|
428
428
|
`);return`Run ${t+1} (session ${e.sessionId}):\n${n||` (no steps recorded)`}`}).join(`
|
|
429
429
|
|
|
430
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.
|
|
@@ -479,6 +479,6 @@ If the recorded paths turn out to be too varied, too thin, or not actually the s
|
|
|
479
479
|
library permanently; skipping costs nothing — otto will offer again if the pattern recurs.
|
|
480
480
|
|
|
481
481
|
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,...
|
|
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(Bd(e.toolRegistry,e.getDefaultToolPreset)),e.hookRegistry.register(Ce(e.failureSignals)),e.hookRegistry.register(Te(e.failureSignals)),e.hookRegistry.registerAll(e.contextSourcesBuildHooks(e.workspaceDir,e.memory)),e.memory&&e.hookRegistry.registerAll(Dt(e.memory)),e.hookRegistry.registerAll(At({getTodoList:t=>e.getSession(t)?.session.getTodoList()}));let t=/-milestone\.md$/,n=/^Status:\s*Done\b/m;e.hookRegistry.registerAll(Et({isDocSyncTrigger:e=>{let r=typeof e.args.path==`string`?e.args.path:``;if(!t.test(r))return!1;let i=typeof e.args.newContent==`string`?e.args.newContent:typeof e.args.content==`string`?e.args.content:``;return n.test(i)}})),e.hookRegistry.registerAll(Yd(e.learningStore,e.promptManager,e.localLearningStore)),e.skillRegistry&&e.hookRegistry.registerAll(Xd(e.skillRegistry)),e.hookRegistry.registerAll(lr({workspaceDir:e.workspaceDir})),e.hookRegistry.registerAll($d()),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(ef(e=>{w.killAllForSession(e)})),e.hookRegistry.registerAll(tf({registry:e.permissionRegistry,getPersistedAllow:t=>e.codingSessionPool.getSessionPermissionAllow(t)})),e.hookRegistry.register(Mv({getContext:()=>{let t=Ae(e.workspaceDir,Re());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:ye(n,e.workspaceDir,ze(),e.sandbox.writablePaths),deniedRoots:t,networkAllowed:e.sandbox.isNetworkAllowed,autoAllowBashIfSandboxed:e.sandbox.autoAllowBashIfSandboxed}}})),e.hookRegistry.registerAll(rf(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(af({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(xe({getOnFileEdited:e.getEditFileCallback,dedupCache:e.editFilesDedup})),{agentJobNotify:r.notify}}function Jv(e,t,n,r){return Rd({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 Fe(t,zd(Jv(e,t,e.skillRegistry?un(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?un(e.skillRegistry,e.workspaceDir):void 0);t.sandbox&&e.sandbox.pin(t.sandbox);let r={registerChild(e,t){return{pid:Vt.registerChild(e,t).pid??0}}};return Fe(e.workspaceDir,{...zd(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 Di(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return null;throw e}},async writeFile(e,t){await Ti(Be(e),{recursive:!0}),await tn(e,t)},async writeFileExclusive(e,t){await Ti(Be(e),{recursive:!0});try{let n=await Ei(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??bi,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=yi($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 tt(`skills/agents/teams discovery + plugin module load`,async()=>{if(e.skillRegistry){await e.skillRegistry.discover();for(let t of e.settings.get(`disabled_skills`)??[])e.skillRegistry.disable(t);let t=new Set(e.settings.get(`disabled_plugins`)??[]);if(t.size>0)for(let[n,r]of e.skillRegistry.getAll())r.source?.type===`plugin`&&r.source.id&&t.has(r.source.id)&&e.skillRegistry.disable(n)}e.declarativeAgentProfiles=await Bs(e.workspaceDir,{plugins:e.activePlugins()}),e.declarativeTeams=await Ks(e.workspaceDir);let t=await e.pluginModuleManager.reload(new Set(e.declarativeAgentProfiles.map(e=>e.name)));e.declarativeAgentProfiles.push(...t),e._pendingProviderCapabilities=(await e.pluginProviderManager.reload()).pendingCapabilityPluginIds,await e.diagnoseTopoSortIssues()});let t=()=>tt(`mcpController.start()`,()=>e.mcpController.start()).then(t=>(e.syncSessionTools(),e.onMcpStartupSettled?e.onMcpStartupSettled(t):e.pendingMcpStartupResult=t,t)).catch(t=>(e.logger.warn({err:t instanceof Error?t.message:String(t)},`mcpController.start() failed unexpectedly (non-blocking path)`),{connected:0,failed:0}));e._interactive?t():await t(),e.pendingWorkspaceInit?e.logger.info({workspaceDir:e.workspaceDir},`Workspace identity pending trust confirmation; session restore deferred`):e.parentWorkspaceExisted?e.logger.info({workspaceDir:e.workspaceDir,parentRoot:e.parentWorkspaceExisted.parentRoot},`Parent workspace detected; waiting for user choice (adopt parent or create new)`):e._interactive?await tt(`completeWorkspaceDependentStartup (session restoreAll)`,()=>ty(e)):tt(`sweepOrphanTraceFiles (headless)`,()=>cy(e)),e.devtools&&await e.devtools.start(),e._memoryGovernor.setCallbacks({onWarning:()=>{let t=e.getActiveSession();t&&t.compactNow().catch(t=>{e.logger.warn({err:t instanceof Error?t.message:String(t)},`[memory-governor] headless compactNow (soft degrade) failed`)})},onCritical:t=>{let n=process.env.OTTO_HEADLESS_OOM_POLICY??`log-only`;e.logger.error({policy:n,level:t.level,usedPct:t.usedPct,heapUsed:t.heapUsed},`[memory-governor] critical memory threshold reached (headless/service)`),n===`graceful-exit`&&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(),Ze(`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 yi($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 yi($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 yi($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 xi(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 Ci(n,a,r),e.workspaceRef={key:Si(a.id),id:a.id,backend:e.workspaceRef.backend,root:n,...a.remote?{remote:a.remote}:{},...a.memorySyncEnabled?{memorySyncEnabled:!0}:{}},!0}async function cy(e){let t=e.sessionStorageDir,n=e.sessionRepoRef?.current;if(!t||!n)return;let r=process.env.OTTO_TRACE_SWEEP;if(r!==`off`)try{let{sweepOrphanTraces:i}=await import(`./trace-orphan-sweeper-BdEIlLfB.js`),a=new Set(await n.listAllSessionIds());for(let t of e.codingSessionPool.listSessions())a.add(t.id);await i({dirs:[x(t,`trace`),x(t,`checkpoint`)],liveSessionIds:a,logger:e.logger,mode:r===`dry-run`?`dry-run`:`delete`})}catch(t){e.logger.warn({err:t instanceof Error?t.message:String(t)},`Orphan trace sweep failed`)}}async function 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`,()=>w.killAllForOwner(e.processOwnerId)),await n(`mcpController`,()=>e.mcpController.stop()),await n(`processRuntime`,()=>Vt.killAll()),await n(`scheduleService`,()=>e.scheduleServiceInstance?.stop()),await n(`memoryGovernor`,()=>e._memoryGovernor.dispose()),await n(`fleetMonitor`,()=>e._fleetMonitor.dispose()),await n(`agentJobs`,()=>e.agentJobServiceInstance?.dispose()),await n(`settings`,()=>e.settings.dispose()),await n(`toolRegistry`,()=>e.toolRegistry.dispose()),await n(`orchestrator`,()=>e.orchestrator.dispose()),await n(`notification`,()=>e.notificationDispatcher.dispose()),await n(`agentRuntime`,()=>e.agentRuntime.dispose()),await n(`hooks`,()=>{for(let t of e.ownedHookNames)e.hookRegistry.unregister(t);e.ownedHookNames.length=0}),await n(`pluginModules`,()=>e.pluginModuleManager.cleanup()),await n(`pluginProviders`,()=>e.pluginProviderManager.cleanup()),await n(`pluginWorkers`,()=>bl()),await n(`pluginServices`,()=>Pc()),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 ri(e,r);if(!i)throw Error(`会话 ${e.slice(0,8)} 不存在或无法加载`);let a=JSON.stringify(i,null,2),o=li(`sha256`).update(a,`utf-8`).digest(`hex`);await Ti(Be(t),{recursive:!0}),await Oi(t,a,`utf-8`);let s=await Di(t,`utf-8`),c=li(`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 nt({store:(()=>{let e=new at(Re());return s()?dt(e):e})()});completeText;clock;fileStateManager;learningStore;localLearningStore;memoryAutoExtractor;promptManager;orchestrator;runSession;writeTodos;sessionConfigResolver;runTeam;skillRegistry;i18nRegistry;_pendingProviderCapabilities=[];get pendingProviderCapabilities(){return this._pendingProviderCapabilities}declarativeAgentProfiles=[];extensions;pluginInput=Ln();sigilResolvers=new ja;expandSigilChips(e,t){return Ba(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 Aa;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 me;diagnoser=new pe(this.failureSignals);pluginHealthTracker=_c();pluginCapabilityQuota=new bc;inquiryCenter=new Sc;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||=So({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 Ao(this)}resolveModel(e){return jo(this,e)}listProviders(){return Mo(this)}registerHook(e){No(this,e)}unregisterHook(e){return Po(this,e)}async hydrateModelCache(){return Fo(this)}getSessionAvailableModels(e){return Io(this,e)}async refreshModels(){return Ro(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 zu;pluginModuleManager;pluginProviderManager;capabilityReloader;computedPluginCommands(){return this.pluginContributionsFacade.computedPluginCommands()}get sessionManager(){return this.codingSessionPool}getResidencyDiagnostics(){return this.codingSessionPool.getResidencyDiagnostics()}globalLogSubscription=null;constructor(e){let{inspect:t,logger:n,projectConfigPath:r,maxSessions:i,maxToolTurns:a,maxToolTurnExtensions:o,promptOutputTokenBudget:c,promptWallClockBudgetMs:l,sessionCostBudgetUSD:u,stallDetection:d,workspaceDir:f,workspaceId:p,pluginHomedir:m,pluginBundledDirs:h}=e;this.maxSessions=i??$r,this.maxToolTurns=a??gt.maxToolTurns,this.maxToolTurnExtensions=o,this.promptOutputTokenBudget=c,this.promptWallClockBudgetMs=l,this.sessionCostBudgetUSD=u,this.stallDetection=d,this._workspaceDir=f??process.cwd(),this._workspaceId=p,this._interactive=e.interactive??!1,this._shadow=e.shadow??s(),this._pluginHomedir=m??Re(),this._pluginBundledDirs=h??[],this._resilienceOverride=e.resilience,this.logger=C(n.name,{level:n.level,destination:n.destination});let g={};this.sessionRepoRef=g,this.sessionStorageDir=e.storage?.session&&`dir`in e.storage.session?e.storage.session.dir:void 0;let _=Ed({logger:this.logger,hookRegistry:e.hookRegistry,getToolRegistry:()=>this.toolRegistry,getPermissionRegistry:()=>this.permissionRegistry,onHookTimeout:({hookName:e,timeoutMs:t})=>{let n=rc(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 v=Bu(e,()=>this.settings);this._authStore=v.authStore,this._modelRegistry=v.modelRegistry,this.providerRegistry=v.providerRegistry,this.wireProtocolRegistry=v.wireProtocolRegistry,this.modelCatalogManager=v.modelCatalogManager;let ee=v.defaultModel,ne=v.resolveEffectiveModel,re=e.modelId,y=fa({options:e,workspaceDir:this.workspaceDir,providerRegistry:this.providerRegistry,defaultModel:ee,resolveEffectiveModel:ne,repoRef:g,getWorkspaceRef:()=>this.workspaceRef,onMemoryConflict:e.onMemoryConflict,getActiveSessionBytes:()=>{let e=this.codingSessionPool?.active?.session;return e instanceof Zr?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:y.storageHost,autoMemory:y.autoMemory,memory:y.memory,traceStore:y.traceStore,traceLive:y.traceLive,checkpointStore:y.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=y.clock;let ie=Dd({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=ie.devtools,this.globalLogSubscription=ie.logSubscription,this.settings=ie.settings;let ae=Do({getConfig:()=>this.settings.get(`notification`),getCwd:()=>this.workspaceDir,isFollowUpPending:()=>this.followUpPendingProbe?.()??!1,emitHookNotification:e=>void this.hookRegistry.emit(`notification`,e)});this.notificationDispatcher=ae.dispatcher,this.presenceTracker=ae.presenceTracker;let oe=this.settings,se=ga({skillProvider:e.skillProvider,workspaceDir:this.workspaceDir,activePlugins:()=>this.activePlugins(),resolveEffectiveModel:ne,providerRegistry:this.providerRegistry,prompt:e.prompt,memoryStore:y.memoryStore,memoryAutoExtractConfig:{enabled:!0,get everyNTurns(){return oe.get(`memory_auto_extract`)?.every_n_turns},get maxLessons(){return oe.get(`memory_auto_extract`)?.max_lessons},get similarityThreshold(){return oe.get(`memory_auto_extract`)?.similarity_threshold}}});this.skillRegistry=se.skillRegistry,this.fileStateManager=se.fileStateManager,this.learningStore=se.learningStore,this.localLearningStore=se.localLearningStore,this.memoryAutoExtractor=se.memoryAutoExtractor,this.completeText=se.completeText,this.promptManager=se.promptManager;let ce=te(this._authStore),le=Od({getModelRegistry:()=>this.modelRegistry,providerRegistry:this.providerRegistry,authStore:this._authStore,getSettings:()=>this.settings,promptManager:this.promptManager,getTools:()=>this.tools,getDeclarativeAgentProfiles:()=>this.getEnabledAgentProfiles(),defaultModel:ee,explicitModelId:re,isModelUsable:ce,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()}),ue=le.visionDelegateService;this.sessionConfigResolver=le.sessionConfigResolver;let de=kd({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:ue,resolveEffectiveModel:ne,defaultModel:ee});this.agentRuntime=de.agentRuntime,this.codingSessionPool=de.codingSessionPool,py(this);let fe=de.swarmAgentRunner,pe=Ad({hookRegistry:this.hookRegistry,stream:this.codingSessionPool.stream,logger:this.logger,defaultModel:de.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:fe,workflowConfig:{retry:this.settings.get(`workflow`)?.retry,circuitBreaker:this.settings.get(`workflow`)?.circuitBreaker}});this.orchestrator=pe.orchestrator,this.runSession=pe.runSession,this.runTeam=pe.runTeam,this.writeTodos=pe.writeTodos,this.toolRegistry=this.initToolRegistry(e);let me=Pd({toolRegistry:this.toolRegistry,hookRegistry:this.hookRegistry,settings:this.settings,workspaceDir:this.workspaceDir,logger:this.logger,getResilienceConfig:()=>this.getResilienceConfig()});this.permissionRegistry=me.permissionRegistry,this.auditLog=me.auditLog,this.mcpController=me.mcpController;let he=me.preExistingHooks;this.extensions=Fd({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=jd({mcpController:this.mcpController,callMcpTool:(e,t,n)=>this.callMcpTool(e,t,n),getActivePlugins:()=>this.activePlugins()}).panelBackendController;let ge=Id({pluginInput:this.pluginInput,sigilResolvers:this.sigilResolvers,settings:this.settings,workspaceDir:this.workspaceDir,activePlugins:()=>this.activePlugins(),agentRuntime:this.agentRuntime,hookRegistry:this.hookRegistry,preExistingHooks:he,codingSessionPoolGet:e=>this.codingSessionPool.getSession(e),logger:this.logger,registerHooks:()=>this.registerHooks()});this.ownedHookNames=ge.ownedHookNames,this.processRegistryUnsubs=ge.processRegistryUnsubs,this.i18nRegistry=new An;let _e=Md({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=_e.pluginModuleManager,this.pluginProviderManager=_e.pluginProviderManager,this.capabilityReloader=_e.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 ve=Nd({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=ve.toolsSyncCoordinator,this.pluginContributionsFacade=ve.pluginContributionsFacade}async ensureSettingsLoaded(){await Ld(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 Wo(this,e,t)}getPermissionMode(){return Go(this)}async setPermissionMode(e){return Ko(this,e)}getSessionAlwaysAllow(e){return qo(this,e)}bashAlwaysAllowPrefix(e){return _e(e)}isWellFormedAllowEntry(e){return Me(e)}async disallowToolAlways(e){return Jo(this,e)}clearSessionAlwaysAllow(e){Yo(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 Ya(Ka(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 Xo(this,e)}registerNotificationChannel(e){Bo(this,e)}registerInAppNotificationChannel(e){Vo(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(){Ho(this)}setTerminalFocus(e){Uo(this,e)}setFollowUpPendingProbe(e){this.followUpPendingProbe=e}notifyPluginServices(e){let t=Nc(),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)?Nc().notify(e.pluginId,e.serviceId,{type:`schedule.tick`,scheduleId:t.scheduleId,occurrenceId:t.occurrenceId,occurredAt:t.occurredAt}):!1}getSession(e){return Zo(this,e)}async shareSession(e,t){return Qo(this,e,t)}getActiveSession(){return $o(this)}listSessions(e){return es(this,e)}async listAllSessions(e){return ts(this,e)}async removeSession(e){return ns(this,e)}async exportSessionArchive(e,t){return uy(e,t,this.sessionRepoRef??{})}archiveSession(e){return rs(this,e)}async forkSession(e,t){return is(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 zo(this,e)}setSessionAvailableModels(e,t){Lo(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:()=>Co(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:Lt,models:{getAll:()=>e.modelRegistry.getAll().map(e=>({id:e.id,name:e.name,provider:e.provider})),switchModel:async(t,n)=>{let r=e.getSession(t);if(!r)return`会话未找到`;if(r.isBusy)return`当前有正在执行的对话,请等待完成后重试。`;let i=e.modelRegistry.find(n);return i?(r.model=i,null):`未知模型 \`${n}\`。`},refresh:async()=>(await e.refreshModels()).map(e=>({provider:e.provider,status:e.status,added:e.added,kept:e.kept,total:e.total,reason:e.reason}))},permission:{getMode:()=>e.getPermissionMode(),setMode:t=>e.setPermissionMode(t)},auth:{getAuthSource:t=>e.authStore.getAuthSource(t)},i18n:{t:(t,n)=>e.i18nRegistry.t(t,n)},reloadCapabilities:()=>e.reloadCapabilities(),workspaceDir:e.workspaceDir}}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=E){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=xl(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=$s(e);if(!n||!D(n))return[];let r;try{r=k(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,...Hn(r,n)}}function Dy(e,t){let n=e.manifest.scripts?.[t];if(!n)return Promise.reject(Error(`plugin ${e.id} 无脚本「${t}」`));let r=Ye(n);return r.safe?new Promise((r,i)=>{let a=j(n,{shell:!0,cwd:e.dir,stdio:`ignore`,env:Je()});a.on(`error`,i),a.on(`exit`,e=>e===0?r():i(Error(`脚本「${t}」退出码 ${e}`)))}):Promise.reject(Error(`脚本「${t}」被安全检查拦截:${r.reason}`))}function Oy(e){let t=e.startsWith(`chrome://`);process.platform===`darwin`?j(`open`,t?[`-a`,`Google Chrome`,e]:[e],{detached:!0,stdio:`ignore`}).unref():process.platform===`win32`?j(`cmd`,[`/c`,`start`,``,e],{detached:!0,stdio:`ignore`}).unref():j(t?`google-chrome`:`xdg-open`,[e],{detached:!0,stdio:`ignore`}).unref()}const ky=C(`@x-otto/coding:plugin-cli-passthrough`);function Ay(e){let t=e.manifest.contributes?.cli?.bin,n=t?x(e.dir,t):jy(e.dir);if(n)return My(n,e.dir)}function jy(e){let t=x(e,`package.json`);if(D(t))try{let n=JSON.parse(k(t,`utf8`));if(typeof n.bin==`string`)return x(e,n.bin);if(n.bin&&typeof n.bin==`object`){let t=Object.values(n.bin)[0];return typeof t==`string`?x(e,t):void 0}return}catch{return}}function My(e,t){if(!D(e))return;let n,r;try{n=Wr(e),r=Wr(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(!qr(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=j(e,t,{stdio:`inherit`,cwd:n,env:Je()}),s=setTimeout(()=>{o.kill(`SIGTERM`),a(Error(`插件 CLI 执行超时(${r}ms),已终止子进程`))},r);s.unref(),o.on(`error`,e=>{clearTimeout(s),a(e)}),o.on(`exit`,(e,t)=>{clearTimeout(s),i(e??(t?1:0))})})}const Ly=C(`@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(E(n).gated){Ly.warn({pluginId:n.id},`plugin gated (untrusted), themePresets skipped`);continue}let r=e;r.length>En&&(Ly.warn({pluginId:n.id,declared:r.length,limit:En},`plugin declares more theme presets than the per-plugin limit, truncated`),r=r.slice(0,En));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{po as AgentJobService,pt as AgentSession,my as App,bt as CodingSessionPool,Ov as DEFAULT_WORKSPACE_KEY,ka as ExtensionManager,bn as HIGH_RISK_CAPABILITIES,Dv as INDUCTOR_PLUGIN_ID,Ui as InstallManager,wy as PLUGIN_LOG_TAIL_LINES,On as PLUGIN_MANIFEST_FILENAME,kn as POINT,Wi as RegistryClient,jv as SANDBOX_ESCALATION_MARKER,Fi as SCHEDULE_LEASE_MIGRATIONS,yt as SandboxUnavailableError,Ii as ScheduleRegistry,Li as SchedulerService,ja as SigilResolverRegistry,m as apiCredentialId,Ey as buildExtensionContext,ca as buildMemoryStore,Py as buildPluginCliRegistry,Gi as builtinOfficialSource,wt as captureFiles,Ki as checkArchiveBomb,qi as checkGitUpgrades,Ru as checkPluginConsistency,Ji as checkUpgrades,sr as claudeTrustStorePath,Yi as cleanTempDir,Cy as collectPluginPerfMetrics,zy as collectPluginThemePresets,Kc as compilePluginModule,wu as compilePluginPanels,vy as createApp,Xi as createArchive,Mn as createBuiltinHashtags,Td as createBuiltinResolvers,cr as createClaudeHookBridgeHooks,Pn as createFileProvider,by as createFrontendPort,Yd as createLessonInjectionHooks,Ri as createLocalFireOwnership,In as createPluginInputRegistry,zi as createRemoteFireOwnership,Bi as createRemoteScheduleStore,Hi as createScheduleStore,Ot as createSessionStableInjectionHooks,Xd as createSkillCatalogInjectionHooks,Zi as createTempDir,Bd as createToolGuidanceHook,ur as defaultHookRunner,Nt as defaultMaxToolTurnExtensions,Ts as defaultPostInstallExecutor,Ft as deriveSessionTitle,dr as detectClaudeExecutableSurface,Rn as detectPluginExecutableSurface,fr as detectProjectConfigGating,Qi as detectUninstallTarget,pr as discoverFileCommands,zn as discoverPlugins,Vn as dispatch,hr as evaluateClaudeTrust,Un as evaluatePluginTrust,_r as evaluateWorkspaceTrustPrompt,vr as expandCommandBody,Ba as expandSigilChips,$i as extractArchive,Fy as findPluginCliNameConflict,i as findWorkspaceRoot,wo as getIncompleteSubagentReason,Co as getLastAssistantText,It as globalAgentJobRegistry,Rt as globalAgentObservability,Bt as globalProcessRegistry,Kn as grantPluginCapabilities,qn as grantedPluginCapabilities,Nu as installPluginFromDir,Mu as installPluginFromPackage,yr as interpretPreToolUse,Jn as isPluginTrusted,br as isProjectTrusted,Sr as isStrictProjectConfigEnabled,ea as listInstalledItems,Cr as loadClaudeHooksConfig,el as loadPluginModule,Tr as matchesHookMatcher,Gt as messagesFromSnapshot,Oy as openTarget,Er as parseClaudeHooks,Dr as parseDotMcpJson,Xn as parsePluginManifest,ta as parseRegistry,Qn as pluginTrustStorePath,fu as purgePluginState,$n as readHighRiskCapabilities,Ty as readPluginLogTail,Rv as readSkillLoopStatus,lo as readTaskOutputTail,Kt as reconstructMessages,Iu as recordPluginInstalled,Lu as recordPluginUninstalled,Fu as removeInstalledPluginEntry,er as resolveActions,kr as resolveClaudeMcpServers,ju as resolvePackageDir,Ay as resolvePluginCliBin,xa as resolvePluginMcpServers,jr as resolveProjectConfigTrusted,Jt as resolveSessionTitle,Xt as restoreFiles,Dy as runPluginScript,na as scanInstalledVersions,rr as sigilOf,Iy as spawnPluginCli,ar as trustPlugin,Nr as trustProject,ra as uninstall,or as untrustPlugin,Pr as untrustProject,Pu as upsertInstalledPluginEntry,ia as validateExtractedPaths};
|
|
484
484
|
//# sourceMappingURL=index.js.map
|