@x-otto/coding 0.0.1-alpha.11 → 0.0.1-alpha.13
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 +235 -54
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +75 -75
- package/dist/index.js.map +1 -1
- package/package.json +17 -17
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,
|
|
2
|
-
`)}}function ga(e){let{model:t,getModel:n,memoryStore:r,providerRegistry:i,autoMemory:a,workspaceDir:s,getLoadSessionEntries:c,getActiveSessionBytes:l,getEffectiveMaxBytes:u,getCoverageThresholds:d}=e,f=ha({model:t,getModel:n,providerRegistry:i,onUsage:e=>da.info({inputTokens:e.inputTokens,outputTokens:e.outputTokens,cacheReadTokens:e.cacheReadTokens,cacheWriteTokens:e.cacheWriteTokens},`[RFC-344] compaction summarize request cost`)}),p=rt.filter(e=>e.writable),m=ft(s??process.cwd()),h=o()?[{path:`~/.claude/CLAUDE.md`,writable:!1},...ft(s??process.cwd(),{fileName:`CLAUDE.md`})]:[],g=[...p,...h,...m],_=r&&a?[...g,a.asSource()]:void 0;return ut({summarize:f,model:t?{contextWindow:t.contextWindow,maxOutput:t.maxOutputTokens}:void 0,getContextWindow:()=>(n?.()??t)?.contextWindow,maxContentBytes:cn,getMaxContentBytes:u,getCoverageThresholds:d,getEstimatedBytes:l,memoryStore:r,sources:_,archiveStorage:new st,messageFromEntry:e=>{let t=e.data;if(!t||typeof t!=`object`)return null;let n=t.message;return n&&typeof n.role==`string`?n:null},loadSessionEntries:async e=>{let t=c?.();if(!t)throw Error(`Session entries not wired`);return t(e)}})}function _a(e){let{options:t,workspaceDir:n,providerRegistry:r,defaultModel:i,resolveEffectiveModel:a,repoRef:o,getWorkspaceRef:c}=e,l=t.storage?.host?{host:nn({baseDir:t.storage.host.dir,namespaces:t.storage.host.namespaces}),token:t.storage.host.token}:null,u=pa(t.storage,n,t.userIdentity,c,e.onMemoryConflict),d=u?new nt({store:u}):null,f=t.memory??ga({model:i,getModel:a,storage:t.storage,memoryStore:u,providerRegistry:r,autoMemory:d,workspaceDir:n,getLoadSessionEntries:()=>o.current?async e=>(await o.current.loadEntries(e)).map(e=>({type:e.type,seq:e.seq,data:e.data})):void 0}),p=t.storage?.session,m=Ct({sessionDir:p&&`dir`in p?p.dir:void 0,remoteLog:p&&`url`in p&&t.storage?.remote?.getAuth?{baseUrl:p.url,getAuth:t.storage.remote.getAuth,fetch:t.storage.remote.fetch,timeoutMs:t.storage.remote.timeoutMs??ua}:void 0,ephemeral:s()},{traceStore:t.traceStore,checkpointStore:t.checkpointStore}),{store:h,live:g}=on(m.traceStore);return{storageHost:l,autoMemory:d,memory:f,traceStore:h,traceLive:g,checkpointStore:m.checkpointStore,clock:t.clock,memoryStore:u}}const va={delegation:`task_delegate`,"task-observability":`task_inspect`,"file-state-refresh":`capture_file_state`},ya=new Set(Object.keys(va));function ba(e){let t=new Set;for(let[n,r]of Object.entries(va))e.has(r)&&t.add(n);return t}function xa(e){let{skillProvider:t,workspaceDir:n,activePlugins:r,resolveEffectiveModel:i,providerRegistry:a,prompt:c,memoryStore:l,memoryAutoExtractConfig:u}=e,d=o()&&br(n).gated,f=t?null:dn({workspaceDir:n,library:{...d?{projectDirs:[`.otto/skills`]}:{},pluginDirs:r().filter(e=>e.manifest.contributes?.skills!==!1).filter(e=>!E(e).gated).map(e=>({id:e.id,dir:x(e.dir,`skills`)}))}}),p=new it,m=s(),h=new ct({path:`${n}/.otto/lessons.json`,...l?{store:l,storePath:`./.otto/lessons.json`}:{},ephemeral:m});return{skillRegistry:f,fileStateManager:p,learningStore:h,localLearningStore:new ct({path:`${n}/.otto/local/lessons.json`,ephemeral:m}),memoryAutoExtractor:lt({llm:ha({getModel:i,providerRegistry:a}),store:h,config:u??{enabled:!0}}),completeText:ha({getModel:i,providerRegistry:a}),promptManager:new pn({provider:vn(c??{type:`local`,baseDir:fn}),knownCapabilities:ya})}}var Sa=class{currentPermissionMode=void 0;constructor(e){this.deps=e}sync(e){let t=Ae(this.deps.getToolRegistry().getAll());this.syncModePolicy(e.permission_mode,t),this.syncDisabledToolsPolicy(e.disabled_tools),this.syncEgressPolicy(e.web_fetch_allowed_hosts),this.syncUserPolicies(e.permissions),this.registry.setAlwaysAllow(e.permission_always_allow??[]),this.deps.logger.debug(`Permission policies synced: %d policies active`,this.registry.getAll().length)}get registry(){return this.deps.getPermissionRegistry()}syncModePolicy(e,t){let n=e??`auto`;this.currentPermissionMode&&this.registry.unregister(`mode::${this.currentPermissionMode}`),this.registry.register(Oe(n,t)),this.currentPermissionMode=n}syncDisabledToolsPolicy(e){e&&e.length>0?this.registry.register(xe(e)):this.registry.unregister(`setting::disabled-tools`)}syncEgressPolicy(e){e&&e.length>0?this.registry.register(Ce(e)):this.registry.unregister(`setting::egress-allowlist`)}syncUserPolicies(e){for(let e of this.registry.getAll())e.name.startsWith(`user::`)&&this.registry.unregister(e.name);if(e)for(let t of e)this.registry.register(ye({...t,name:`user::${t.name}`}))}},Ca=class{strategy=null;pinned=!1;settingSnapshot=`null`;networkAllowed=!0;configuredWritablePaths=[];autoAllowBash=!1;constructor(e){this.logger=e}get current(){return this.strategy}get activeName(){return this.strategy?.name??null}get enabled(){return this.strategy!==null}get isNetworkAllowed(){return this.networkAllowed}get writablePaths(){return this.configuredWritablePaths}get autoAllowBashIfSandboxed(){return this.autoAllowBash}bypassCommands=new Set;approveBypass(e){e&&this.bypassCommands.add(e)}isBypassed(e){return e!==void 0&&this.bypassCommands.has(e)}pin(e){this.pinned=!0,this.networkAllowed=e.network!==`deny`,this.configuredWritablePaths=Array.isArray(e.writablePaths)?e.writablePaths.filter(e=>typeof e==`string`):[],this.autoAllowBash=e.autoAllowBashIfSandboxed===!0,e.enabled&&!Re()?(this.logger.warn(`Sandbox pinned but no platform sandbox available (install bwrap on Linux); running WITHOUT sandbox`),this.strategy=null):this.strategy=e.enabled?Fe({network:e.network,writablePaths:e.writablePaths,denyReadPaths:e.protectCredentials?Le():void 0}):null}applySetting(e){if(this.pinned)return;let t=JSON.stringify(e??null);if(t===this.settingSnapshot)return;this.settingSnapshot=t,this.networkAllowed=e?.network!==`deny`,this.configuredWritablePaths=Array.isArray(e?.writablePaths)?e.writablePaths.filter(e=>typeof e==`string`):[],this.autoAllowBash=e?.autoAllowBashIfSandboxed===!0;let n=this.strategy;e?.enabled===!0&&!Re()?(this.logger.warn(`Sandbox enabled but no platform sandbox available (install bwrap on Linux); running WITHOUT sandbox`),this.strategy=null):this.strategy=e?.enabled===!0?Fe({network:e.network===`deny`?`deny`:`allow`,writablePaths:this.configuredWritablePaths,denyReadPaths:e.protectCredentials?Le():void 0}):null,n?.dispose().catch(()=>void 0),this.logger.info(`Sandbox strategy %s (settings)`,this.strategy?`enabled: ${this.strategy.name}`:`disabled`)}resolveConfig(e){if(e.sandbox)return e.sandbox;if((e.permission_mode??`auto`)!==`bypass`)return{enabled:!0,network:process.env.OTTO_SANDBOX_NETWORK===`deny`?`deny`:`allow`,writablePaths:[]}}async dispose(){this.strategy&&=(await this.strategy.dispose().catch(()=>void 0),null)}};function wa(e){return typeof e==`string`&&(e.startsWith(`./`)||e.startsWith(`../`)||e.startsWith(`.\\`))}function Ta(e,t){let n={...e};return wa(n.command)&&!He(n.command)&&(n.command=S(t,n.command)),Array.isArray(n.args)&&(n.args=n.args.map(e=>wa(e)?S(t,e):e)),n}function Ea(e){let t=e.plugins??Vn({cwd:e.workspaceDir,homedir:e.homedir,disabled:e.disabled}),n={};for(let e of t){if(e.manifest.contributes?.mcp===!1)continue;let t=E(e);if(t.gated||!(e.manifest.capabilities?.includes(`mcp.server`)??!1)||t.pendingCapabilities.includes(`mcp.server`))continue;let r=Mr(e.dir);for(let[t,i]of Object.entries(r))n[t]={...Ta(i,e.dir),_pluginId:e.id}}return n}const Da=(e,t,n)=>{let r=Vt.spawn({command:e,args:t,env:n,owner:{type:`mcp-server`,id:e},category:`mcp`,lifecycle:`pinned`,label:`mcp:${e}`});return{pid:r.pid,stdin:r.stdin,stdout:r.stdout,stderr:r.stderr,kill:()=>r.kill(),onError:e=>{r.onError(e)},onExit:e=>{r.onExit(()=>e())}}};function Oa(e){return e.code===`MCP_UNAUTHORIZED`?`MCP server "${e.name}" requires authentication. Run 'otto mcp login ${e.name}' to authenticate.`:null}var ka=class{_manager=null;get manager(){return this._manager}getMcpClient(e){return this._manager?.getClient(e)}constructor(e,t,n,r,i){this.settings=e,this.toolRegistry=t,this.logger=n,this.workspaceDir=r,this.getResilienceConfig=i}resolveServerLayers(){return{otto:this.settings.get(`mcp_servers`)??{},claude:this.workspaceDir?Pr(this.workspaceDir):{},plugin:this.workspaceDir?Ea({workspaceDir:this.workspaceDir,homedir:ze(),disabled:this.settings.get(`disabled_plugins`)??[]}):{}}}effectiveServers(){let{otto:e,claude:t,plugin:n}=this.resolveServerLayers();return{...n,...t,...e}}listEffectiveServers(){let{otto:e,claude:t,plugin:n}=this.resolveServerLayers(),r={};for(let[e,t]of Object.entries(n)){let n=t;r[e]={...t,source:`plugin`,pluginId:n._pluginId}}for(let[e,n]of Object.entries(t))r[e]={...n,source:`claude`};for(let[t,n]of Object.entries(e))r[t]={...n,source:`otto`};for(let[t,n]of Object.entries(r))n.source===`otto`?n.disabled=(e[t]??{}).disabled??!1:n.source===`plugin`&&n.managed&&(n.disabled=this.settings.get(`disabled_plugins`)?.includes(n.pluginId??``)??!1);return r}syncTools(){let e=this.toolRegistry.getAll().map(e=>e.name).filter(e=>e.startsWith(`mcp__`));e.length>0&&this.toolRegistry.unregister(e);let t=this._manager?.getAllTools()??[];t.length>0&&this.toolRegistry.register(t,{category:`mcp`,preset:`full`})}ensureManager(){if(this._manager)return this._manager;let e=this.getResilienceConfig?.(),t=new zr({skipOnError:!0,processSpawnFactory:Da,maxReconnectAttempts:e?.mcp.maxReconnectAttempts,reconnectDelayMs:e?.mcp.reconnectDelayMs,requestTimeoutMs:e?.mcp.requestTimeoutMs});this._manager=t;let n=()=>this.syncTools();return t.on(`server.connected`,n),t.on(`tools.changed`,n),t.on(`server.disconnected`,n),t.on(`server.error`,e=>{let t=Oa(e);t&&this.logger.warn(t)}),t}async start(){let e=this.effectiveServers();if(Object.keys(e).length===0)return{connected:0,failed:0};let t=Object.fromEntries(Object.entries(e).filter(([,e])=>!e.disabled));if(Object.keys(t).length===0)return{connected:0,failed:0};let n=await this.ensureManager().connectAll(t);return this.syncTools(),n}async setServerEnabled(e,t){let n={...this.settings.get(`mcp_servers`)??{}},r=n[e];if(!r)throw Error(`Unknown MCP server "${e}"`);n[e]={...r,disabled:!t},await this.settings.persist({mcp_servers:n}),t?await this.ensureManager().connect(e,n[e]):await this._manager?.disconnect(e),this.syncTools()}async reload(){this._manager&&=(await this._manager.disconnectAll(),null),await this.start(),this.syncTools()}async stop(){this._manager&&=(await this._manager.disconnectAll(),null)}},Aa=class{category=`mcp`;constructor(e){this.mcp=e}list(){let e=this.mcp.listEffectiveServers(),t=this.mcp.manager?.getServerInfos()??[],n=new Map(t.map(e=>[e.name,e])),r=(e,t)=>{let r=n.get(t),i=[];return e&&r&&(i.push(String(r.status)),r.tools?.length&&i.push(`${r.tools.length} tools`)),i.length?i.join(` · `):void 0},i=[];for(let[t,n]of Object.entries(e)){if(n.source===`claude`)continue;let e=n.source===`plugin`&&n.managed===!0,a=n.source===`otto`;if(!e&&!a)continue;let o=e?`由 ${n.pluginId??`unknown`} 插件管理`:n.url??n.command??`MCP server`,s=[r(!n.disabled,t),e?`managed`:void 0].filter(Boolean).join(` · `);i.push({category:this.category,id:t,name:t,description:o,enabled:!n.disabled,detail:s||void 0,applies:`live`,readonly:e})}return i}async setEnabled(e,t){let n=this.mcp.listEffectiveServers()[e];if(n?.source===`plugin`&&n.managed)throw Error(`MCP server "${e}" 由插件 ${n.pluginId??`unknown`} 管理,无法单独禁用。请卸载插件以移除。`);await this.mcp.setServerEnabled(e,t)}},ja=class{category=`skill`;constructor(e,t){this.settings=e,this.skills=t}list(){let e=[];for(let[t,n]of this.skills.getAll())e.push({category:this.category,id:t,name:t,description:n.definition.metadata.description??``,enabled:n.status!==`disabled`,detail:n.source?.type,applies:`next-turn`});return e}async setEnabled(e,t){t?this.skills.enable(e):this.skills.disable(e);let n=[];for(let[e,t]of this.skills.getAll())t.status===`disabled`&&n.push(e);await this.settings.persist({disabled_skills:n})}},Ma=class{category=`agent`;constructor(e,t){this.settings=e,this.getProfiles=t}list(){let e=new Set(this.settings.get(`disabled_agents`)??[]);return this.getProfiles().map(t=>({category:this.category,id:t.name,name:t.name,description:t.description??``,enabled:!e.has(t.name),applies:`next-turn`}))}async setEnabled(e,t){let n=new Set(this.settings.get(`disabled_agents`)??[]);t?n.delete(e):n.add(e),await this.settings.persist({disabled_agents:[...n]})}},Na=class{category=`plugin`;constructor(e,t,n){this.settings=e,this.getPlugins=t,this.processRuntime=n}list(){let e=new Set(this.settings.get(`disabled_plugins`)??[]);return this.getPlugins().map(t=>{let n=t.scope===`builtin`,r=E(t).gated,i=[t.scope,r?`untrusted`:void 0].filter(Boolean).join(` · `);return{category:this.category,id:t.id,name:t.manifest.name??t.id,description:t.manifest.description??``,enabled:n?!0:!e.has(t.id),detail:i||void 0,applies:`next-turn`,readonly:n||void 0,scope:t.scope}})}async setEnabled(e,t){if(this.getPlugins().find(t=>t.id===e)?.scope===`builtin`)throw Error(`插件 "${e}" 是 otto 内置插件,恒定信任+启用,无法禁用。`);let n=new Set(this.settings.get(`disabled_plugins`)??[]);t?n.delete(e):n.add(e),await this.settings.persist({disabled_plugins:[...n]}),!t&&this.processRuntime&&(await this.processRuntime.killAll({owner:{type:`plugin-hook`,id:e}}),await this.processRuntime.killAll({owner:{type:`plugin-script`,id:e}}))}},Pa=class{providers;deps;constructor(e){this.deps=e,this.providers=[new Aa(e.mcp),...e.skills?[new ja(e.settings,e.skills)]:[],new Ma(e.settings,e.getAgentProfiles),...e.getPlugins?[new Na(e.settings,e.getPlugins,e.processRuntime)]:[]]}list(){return this.providers.flatMap(e=>e.list())}async setEnabled(e,t,n){let r=this.providers.find(t=>t.category===e);if(!r)throw Error(`Unknown extension category "${e}"`);await r.setEnabled(t,n),e===`plugin`&&this.deps.onPluginToggle&&this.deps.onPluginToggle(t,n)}},Fa=class{provider;source;register(e,t){return this.source!==void 0&&this.source!==t?!1:(this.provider=e,this.source=t,!0)}replace(e,t){this.provider=e,this.source=t}unregister(e){this.source===e&&(this.provider=void 0,this.source=void 0)}get(){return this.provider}reset(){this.provider=void 0,this.source=void 0}},Ia=class{resolvers=new Map;register(e,t){for(let n of e)this.resolvers.set(n.id,{resolver:n,source:t})}get(e){return this.resolvers.get(e)?.resolver}unregisterBySource(e){for(let[t,n]of this.resolvers)n.source===e&&this.resolvers.delete(t)}getAll(){let e=new Map;for(let[t,n]of this.resolvers)e.set(t,n.resolver);return e}get size(){return this.resolvers.size}};const La=C(`@x-otto/coding:sigil-expand`),Ra=/\[@([a-z][\w.-]*):((?:\\\]|[^\]])+)\]/g,za=/\[@([a-z][\w.-]*)\]/g,Ba=/@([\w./\-]+):(\d+)(?:-(\d+))?/g,Va=/@def:([A-Za-z_]\w*)/g;function Ha(e,t){let n=new Set,r=[];for(let i of[Ra,za]){i.lastIndex=0;for(let a of e.matchAll(i)){let e=a[0];if(n.has(e))continue;n.add(e);let i=a[1];t?.has(i)||r.push({raw:e,kind:i,param:(a[2]??``).replace(/\\\]/g,`]`)})}}Ba.lastIndex=0;for(let i of e.matchAll(Ba)){let e=i[0];n.has(e)||(n.add(e),!t?.has(`file-range`)&&r.push({raw:e,kind:`file-range`,param:e.slice(1)}))}Va.lastIndex=0;for(let i of e.matchAll(Va)){let e=i[0];n.has(e)||(n.add(e),!t?.has(`def`)&&r.push({raw:e,kind:`def`,param:i[1]}))}return r}function Ua(e,t){return new Promise((n,r)=>{let i=setTimeout(()=>r(Error(`resolver timeout after ${t}ms`)),t);e.then(e=>{clearTimeout(i),n(e)},e=>{clearTimeout(i),r(e)})})}function Wa(e,t){return e.length<=t?e:`${e.slice(0,t)}\n[...truncated ${e.length-t} chars...]`}async function Ga(e,t,n,r){let i=Ha(e,r?.skipPrefixes);if(i.length===0)return e;let a=r?.uiHost??!0,o=r?.maxOutput??2e4,s={workspaceDir:n.workspaceDir,maxOutput:o},c=i.map(async e=>{let n=r?.lookupResolverId?.(e.raw),i=(n?t.get(n):void 0)??t.get(e.kind);if(!i)return null;if(i.uiHostOnly&&!a)return La.debug({chip:e.raw},`uiHostOnly resolver skipped in non-uiHost context`),null;let c=i.timeoutMs??1e4,l=await Ua(Promise.resolve().then(()=>i.resolve(e.param,s)),c);return l===``?null:[e.raw,Wa(l,o)]}),l=await Promise.allSettled(c),u=e;for(let e=0;e<l.length;e++){let t=l[e];if(t.status===`rejected`){La.warn({chip:i[e].raw,err:String(t.reason)},`sigil resolver failed, chip left as-is`);continue}if(t.value===null)continue;let[n,r]=t.value;u=u.split(n).join(r)}return u}const Ka=e(import.meta.url);function qa(e,t){let n=t.entries(e);if(!n?.length)return[];let r=E(e);if(r.gated)return t.logger.warn({pluginId:e.id},`project/repository plugin not trusted, skipping ${t.axis} (fail-closed)`),[];if(!e.manifest.capabilities?.includes(t.capability))return t.logger.warn({pluginId:e.id},`plugin declares contributes.${t.axis} but not capabilities:["${t.capability}"], skipped (fail-closed)`),[];if(r.pendingCapabilities.includes(t.capability))return t.logger.warn({pluginId:e.id},`plugin capability "${t.capability}" declared but not yet granted, skipping ${t.axis} (fail-closed, ${t.pendingNote})`),[];let i=[];for(let r of n){if(t.preCheck&&!t.preCheck(e,r))continue;let n=x(e.dir,t.entryPath(r));if(!D(n)){t.logger.warn({pluginId:e.id,...t.idLogFields(r),modulePath:n},`${t.noun} entry not found, skipped`);continue}try{delete Ka.cache[n];let a=Ka(n),o=t.exportName(r)??`default`,s=a?.[o];if(typeof s!=`function`){t.logger.warn({pluginId:e.id,...t.idLogFields(r),exportName:o,...t.logTypeofOnNotFunction?{type:typeof s}:{}},`${t.noun} export is not a function, skipped`);continue}i.push(t.build(e,r,s)),t.successLogFields&&t.logger.info({pluginId:e.id,...t.successLogFields(r)},`plugin ${t.noun} loaded successfully`)}catch(n){t.logger.warn({pluginId:e.id,...t.idLogFields(r),err:String(n)},`${t.noun} load failed, skipped`)}}return i}function Ja(e,t,n){if(!n)return e.flatMap(e=>qa(e,t));let r=new Map,i=[];for(let a of e)for(let e of qa(a,t)){let t=n.key(e),a=r.get(t);if(a){n.onConflict(e,a);continue}r.set(t,e.pluginId),i.push(e)}return i}const Ya=C(`@x-otto/coding:plugin-a2ui-renderer-loader`),Xa={capability:`a2ui.renderer`,axis:`a2uiRenderers`,noun:`a2ui renderer`,pendingNote:`RFC-210 D5`,logger:Ya,entries:e=>e.manifest.contributes?.a2uiRenderers,entryPath:e=>e.entry,exportName:e=>e.export,idLogFields:e=>({a2uiRendererId:e.id}),logTypeofOnNotFunction:!0,build:(e,t,n)=>({id:`${e.id}:${t.id}`,pluginId:e.id,matcher:t.matcher,toPayload:n}),successLogFields:e=>({a2uiRendererId:e.id,matcher:e.matcher})};function Za(e){return Ja(e,Xa)}function Qa(e,t){let n=t;if(!n||typeof n!=`object`||e.role!=null&&n.role!==e.role||e.toolName!=null&&(n.name??n.toolName)!==e.toolName)return!1;if(e.contentType!=null){let t=n.content;if(!(Array.isArray(t)&&t.some(t=>t&&typeof t==`object`&&t.type===e.contentType)))return!1}return!0}const $a=2e3;async function eo(e,t){for(let n of e)if(Qa(n.matcher,t))try{let e=await Promise.race([Promise.resolve().then(()=>n.toPayload(t)),new Promise((e,t)=>setTimeout(()=>t(Error(`toPayload timeout after ${$a}ms`)),$a))]);if(Array.isArray(e)&&e.length>0)return e}catch(e){Ya.warn({a2uiRendererId:n.id,err:String(e)},`toPayload failed, trying next candidate (fail-soft)`)}return null}const to={file_read:[`read`],file_write:[`write`],file_edit:[`edit`],shell:[`bash`],search:[`find`,`grep`]};function no(e){if(e===void 0)return;if(e.length===0)return[];let t=new Set;for(let n of e){let e=to[n];if(e&&e.length>0){for(let n of e)t.add(n);continue}t.add(n)}return[...t]}function ro(){return process.env.OTTO_SUBAGENT_MODEL_POLICY===`off`}var io=class{constructor(e){this.deps=e}async resolveModel(e,t,n,r){let i=this.deps.getModelRegistry(),a=[],o=new Set,s=(e,t)=>{e&&!o.has(e.id)&&(o.add(e.id),a.push({model:e,layer:t}))};s(e,`explicit`);let c=this.deps.settings.get(`model_slots`),l=this.deps.settings.get(`model`),d=c?.default??l,f=(d===void 0?void 0:i.tryResolve(d))??this.deps.defaultModel??(this.deps.explicitModelSpec?i.tryResolve(this.deps.explicitModelSpec):void 0);if(t&&f)for(let e of this.slotCandidates(t,f,i))s(e,`slot`);if(r&&n)for(let e of this.categoryCandidates(n,f,i))s(e,`category`);s(f,`default`);let p=[];for(let{model:e,layer:t}of a){if(!r)return{model:e,decidedBy:t,rejected:p};let n=await this.checkUsable(e);if(n.usable)return{model:e,decidedBy:t,rejected:p};n.reason&&p.push({spec:e.id,reason:n.reason})}if(a.length===0&&!d&&!this.deps.defaultModel&&!this.deps.explicitModelSpec)throw Error(`No model configured. Set model in .otto/config.json or pass modelId to createApp().`);let m=t??(n?u[n]:void 0);return{model:await this.pickUsableFallback(i,m),decidedBy:`fallback`,rejected:p}}async checkUsable(e){if(this.deps.isModelUsable)try{return await this.deps.isModelUsable(e)}catch{}if(this.deps.hasCredential)try{return await this.deps.hasCredential(e.provider)?{usable:!0}:{usable:!1,reason:`unauthenticated`}}catch{}return{usable:!0}}async pickUsableFallback(e,t){let n=se(e.getAll(),t);for(let e of n)if((await this.checkUsable(e)).usable)return e;let r=this.deps.defaultModel??n[0];if(r)return r;throw Error(`No model available — sign in (/login) or pick a model (/model) first.`)}slotCandidates(e,t,n){return te({slots:this.deps.settings.get(`model_slots`)?.slots??{},default:t},n).candidates(e).filter(e=>e.id!==t.id)}categoryCandidates(e,t,n){let r=[],i=e=>{if(e){let t=n.tryResolve(e);t&&r.push(t)}},a=this.deps.settings.get(`categories`)?.[e];i(a?.default_model);for(let e of a?.preferred_models??[])i(e);if(r.length>0)return r;if(ro())return[];let o=u[e];if(!o||!t)return[];for(let e of this.slotCandidates(o,t,n))r.push(e);return r.length>0?r:h(o,t,n)}};function ao(e,t){let n=new Set(t);return e.filter(e=>n.has(e.name))}function oo(e,t,n,r,i){let a;return a=t||(n?ao(e(),n):e()),r?.length&&(a=a.filter(e=>!r.includes(e.name))),i||(a=a.filter(e=>!Pe.has(e.name))),a}function so(e,t,n,r){let i=n?[...t.disallowedToolNames??[],...r]:t.disallowedToolNames;return oo(e,void 0,t.toolNames,i,t.allowSubagents)}const co=[`edit`,`write`,`lsp_rename`,`bash`];function lo(e,t,n,r){let i=yn([...t,...di],n),a=ba(new Set(r.map(e=>e.name)));return()=>e.assemblePreset({preset:`subagent`,agentName:n,profile:i,promptMode:i?.promptMode},a)}var uo=class{modelResolver;constructor(e){this.deps=e,this.modelResolver=new io(e)}readAgentSources(e,t){let n=e?this.deps.settings.get(`agents`)?.[e]:void 0,r=t===`subagent`&&e?yn([...this.deps.getDeclarativeAgentProfiles(),...di],e):void 0;return{slot:n?.default_workflow_slot,profileTier:r?.preferredModelTier,toolNames:n?.tools??no(r?.defaultTools),disallowedToolNames:r?.disallowedTools,allowSubagents:t===`main`?!0:r?.allowSubagents,systemPrompt:n?.system_prompt,maxToolTurns:n?.max_tool_turns??r?.defaultMaxToolTurns,maxToolTurnExtensions:n?.max_tool_turn_extensions??r?.defaultMaxToolTurnExtensions,promptOutputTokenBudget:n?.prompt_output_token_budget,promptWallClockBudgetMs:n?.prompt_wall_clock_budget_ms,sessionCostBudgetUSD:n?.session_cost_budget_usd,stallDetection:n?.stall_detection===!1?!1:n?.stall_detection?{windowTurns:n.stall_detection.window_turns,repeatThreshold:n.stall_detection.repeat_threshold}:void 0,promptMode:r?.promptMode,promptContext:void 0,profile:r}}resolvePersistedThinkingLevel(){let e=this.deps.settings.get(`thinking_level`),t=e===`minimal`?`low`:e;return typeof t==`string`&&[`low`,`medium`,`high`,`xhigh`,`max`].includes(t)?t:void 0}resolveToolsForResync(e,t,n){let r=t??(e?`subagent`:`main`),i=this.readAgentSources(e,r);return so(this.deps.getTools,i,n,co)}resolveTools(e,t,n,r){return oo(this.deps.getTools,e,t,n,r)}async resolve(e){let t=e.promptPreset??(e.agentName?`subagent`:`main`),n=this.readAgentSources(e.agentName,t),r=t===`subagent`||e.delegated===!0,i=e.slot??n.slot??p[n.profileTier??``];!i&&r&&!e.category&&(i=this.deps.settings.get(`model_slots`)?.subagent_default_slot);let a=e.model??(e.modelId?this.deps.getModelRegistry().tryResolve(e.modelId):void 0)??(this.deps.explicitModelSpec?this.deps.getModelRegistry().tryResolve(this.deps.explicitModelSpec):void 0),o=await this.modelResolver.resolveModel(a,i,e.category,r),s=o.model,c=h(`compact`,s,this.deps.getModelRegistry())[0]??s;r&&this.deps.logger?.debug({model:s.id,decidedBy:o.decidedBy,category:e.category,slot:i,rejected:o.rejected},`subagent model resolved`);let l=e.readOnly?[...n.disallowedToolNames??[],...co]:n.disallowedToolNames,u=this.resolveTools(e.tools,n.toolNames,l,n.allowSubagents);s.supportsTools===!1&&(u=[]);let d=ba(new Set(u.map(e=>e.name))),f=e.promptRefresh??(async()=>{let r=t===`subagent`&&e.agentName?await this.deps.promptManager.assemblePreset({preset:`subagent`,agentName:e.agentName,profile:n.profile,context:e.promptContext,promptMode:n.promptMode},d):await this.deps.promptManager.assemblePreset({preset:`main`},d),i=e.systemPrompt??n.systemPrompt;return i!==void 0&&i.length>0?r?`${r}\n\n${i}`:i:r}),m=await f(),g=e.systemPrompt===void 0&&n.systemPrompt===void 0&&t===`subagent`&&e.agentName?this.deps.promptManager.assembleSubAgentTail({preset:`subagent`,agentName:e.agentName,profile:n.profile,context:e.promptContext,promptMode:n.promptMode}):void 0,_=e.thinkingLevel??(r?void 0:this.resolvePersistedThinkingLevel())??`medium`;return{id:e.id,model:s,titleModel:c,modelResolution:o,agentName:e.agentName,systemPrompt:m??``,systemTail:g?[g]:void 0,tools:u,thinkingLevel:_,maxToolTurns:e.maxToolTurns??n.maxToolTurns??this.deps.maxToolTurns,maxToolTurnExtensions:e.maxToolTurnExtensions??n.maxToolTurnExtensions??this.deps.maxToolTurnExtensions??Pt(e.depth??0,e.transient),promptOutputTokenBudget:(e.depth??0)>0?void 0:e.promptOutputTokenBudget??n.promptOutputTokenBudget??this.deps.settings.get(`prompt_output_token_budget`)??this.deps.promptOutputTokenBudget,promptWallClockBudgetMs:(e.depth??0)>0?void 0:e.promptWallClockBudgetMs??n.promptWallClockBudgetMs??this.deps.settings.get(`prompt_wall_clock_budget_ms`)??this.deps.promptWallClockBudgetMs,sessionCostBudgetUSD:(e.depth??0)>0?void 0:e.sessionCostBudgetUSD??n.sessionCostBudgetUSD??this.deps.settings.get(`session_cost_budget_usd`)??this.deps.sessionCostBudgetUSD,stallDetection:e.stallDetection??n.stallDetection??(()=>{let e=this.deps.settings.get(`stall_detection`);if(e!==void 0)return e===!1?!1:{windowTurns:e.window_turns,repeatThreshold:e.repeat_threshold}})()??this.deps.stallDetection,todoContinuation:e.todoContinuation??(()=>{let e=this.deps.settings.get(`todo_continue_max`);if(e===void 0)return;let t=Yt(process.env),n=Number.isFinite(e)&&e>=0?Math.trunc(e):t.max;return{enabled:t.enabled,max:n}})(),promptRefresh:f,workspaceDir:e.workspaceDir??this.deps.workspaceDir,workspaceId:e.workspaceId??this.deps.getWorkspaceId?.(),transient:e.transient,depth:e.depth,interactive:e.interactive,listable:e.listable,retryAccelerate:e.retryAccelerate,streamRetry:e.streamRetry??this.deps.getResilienceConfig?.().stream,networkDisconnectRetry:e.networkDisconnectRetry??fo(this.deps.getResilienceConfig?.().networkDisconnect),lifecycleAsyncTimeoutMs:po(process.env.OTTO_LIFECYCLE_ASYNC_TIMEOUT_MS),describeImages:this.deps.describeImages}}};function fo(e){if(e)return{maxRetries:e.maxRetries,initialDelayMs:e.intervalMs,backoffFactor:1,maxDelayMs:e.intervalMs}}function po(e){if(!e)return;let t=Number(e);return Number.isFinite(t)&&t>0?t:void 0}const mo=Hr.O_NOFOLLOW??0;function ho(e,t){let n=Gr(e,Hr.O_WRONLY|Hr.O_APPEND|Hr.O_CREAT|mo,384);try{ei(n,t.endsWith(`
|
|
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,collectModelCapabilityFacts as g,complete as _,createDefaultAuthStore as ee,createDefaultModelRegistry as te,createModelSlot as ne,createModelUsabilityGate as re,createProviderRegistry as ie,createWireProtocolRegistry as v,fetchModels as ae,isBuiltinProviderId as oe,mergeFetchedModels as se,rankModelsBySlotAffinity as ce,registerCacheReportingApi as le,registerProviderDescriptor as ue,resolveModelsRequest as de,stream as fe,unregisterCacheReportingApi as pe,unregisterProviderDescriptor as me}from"@x-otto/ai";import{Diagnoser as he,FailureSignalStore as ge,PermissionAuditLog as _e,assessSandboxSafety as ve,bashAlwaysAllowPrefix as ye,compilePolicyFromSetting as be,computeSandboxRoots as xe,createDisabledToolsPolicy as Se,createEditFilesPanelHook as Ce,createEgressAllowlistPolicy as we,createFailureSignalHook as Te,createHookRegistry as Ee,createPermissionDenyHook as De,createPermissionGuardHook as Oe,createPermissionModePolicy as ke,createPermissionRegistry as Ae,createPermissionToolSetsFromRegistry as je,defaultDeniedRoots as Me,defineHook as y,extractWriteTargets as Ne,isWellFormedAllowEntry as Pe}from"@x-otto/hooks";import{ORCHESTRATION_TOOL_NAMES as Fe,createPlatformSandbox as Ie,createToolRegistry as Le,credentialDenyReadPaths as Re,isPlatformSandboxAvailable as ze}from"@x-otto/tools";import{homedir as Be,tmpdir as Ve}from"node:os";import{dirname as b,extname as He,isAbsolute as Ue,join as x,relative as We,resolve as S,sep as Ge}from"node:path";import{CodedError as Ke,ProviderError as qe,attachLogListener as Je,buildAllowedEnv as Ye,checkShellCommand as Xe,createLogger as C,installGlobalProxyDispatcher as Ze,markStartupPhase as Qe,parseFrontmatterList as $e,setDefaultProxy as et,splitFrontmatter as tt,traceStartupPhase as nt}from"@x-otto/shared";import{AutoMemory as rt,DEFAULT_MEMORY_SOURCES as it,FileStateManager as at,FileSystemMemoryStore as ot,HttpMemoryStore as st,InMemoryArchiveStorage as ct,OperationalLearningStore as lt,createMemoryAutoExtractor as ut,createMemoryManager as dt,createOverlayMemoryStore as ft,discoverAgentsSources as pt}from"@x-otto/memory";import{AgentSession as mt,FleetMonitor as ht,MemoryGovernor as gt,RUNTIME_DEFAULTS as _t,ResidencyGovernor as vt,SYSTEM_PROMPT_SECTIONS as yt,SandboxUnavailableError as bt,SessionPool as xt,applyDiff as St,applySectionBudget as Ct,attachAgentObserver as wt,buildEngineStores as Tt,captureFiles as Et,createAgentRuntime as Dt,createDocSyncReminderHooks as Ot,createMemoryDeltaHooks as kt,createSessionStableInjectionHooks as At,createSessionStableInjectionHooks as jt,createTodoReminderHooks as Mt,createToolHookExecutor as Nt,createWorktree as Pt,defaultMaxToolTurnExtensions as Ft,defaultMaxToolTurnExtensions as It,deriveSessionTitle as Lt,globalAgentJobRegistry as Rt,globalAgentJobRegistry as zt,globalAgentObservability as Bt,globalAgentObservability as Vt,globalProcessRegistry as Ht,globalProcessRegistry as w,globalProcessRuntime as Ut,hasRepoDrifted as Wt,installAgentJobReaper as Gt,installProcessReaper as Kt,messagesFromSnapshot as qt,reconstructMessages as Jt,removeWorktree as Yt,resolveSessionTitle as Xt,resolveTodoContinuationConfig as Zt,restoreFiles as Qt,revertDiff as $t,touchesCapabilitySurface as en,touchesForbiddenZone as tn,worktreeDiff as nn}from"@x-otto/runtime";import{atomicWriteFile as rn,createFileStorageHost as an,createInMemoryPanelStatePersistence as on,createInMemoryPasteStatePersistence as sn,createLiveTappedAppendLog as cn,createPersistence as ln}from"@x-otto/persistence";import{SESSION_MAX_PER_SESSION_BYTES as un,SESSION_RESUME_WINDOW_MESSAGES as dn}from"@x-otto/session-contract";import{createRegistrySkillProvider as fn,createSkillRegistry as pn}from"@x-otto/skill";import{BUILTIN_PROMPTS_DIR as mn,PromptManager as hn,SKILL_LOOP_GUIDANCE as gn,SUBAGENT_GUARDRAILS as _n,assembleGenericSubAgentPrompt as vn,buildLessonInjection as yn,createPromptProvider as bn,resolveAgentProfile as xn}from"@x-otto/prompt";import{HIGH_RISK_CAPABILITIES as Sn,HIGH_RISK_CAPABILITIES as Cn,ID_RE as wn,MAX_I18N_ENTRIES_PER_PLUGIN as Tn,MAX_I18N_FILE_BYTES as En,MAX_I18N_LOCALE_FILES_PER_PLUGIN as Dn,MAX_I18N_TRANSLATION_BYTES as On,MAX_THEME_PRESETS_PER_PLUGIN as kn,PLUGIN_API_VERSION as An,PLUGIN_MANIFEST_FILENAME as jn,PLUGIN_MANIFEST_FILENAME as T,POINT as Mn,PluginI18nRegistry as Nn,SHELL_POINTS as Pn,createBuiltinHashtags as Fn,createBuiltinHashtags as In,createFileProvider as Ln,createFileProvider as Rn,createPluginInputRegistry as zn,createPluginInputRegistry as Bn,detectPluginExecutableSurface as Vn,discoverPlugins as Hn,discoverPlugins as Un,dispatch as Wn,evaluateContextKeys as Gn,evaluatePluginTrust as Kn,evaluatePluginTrust as E,evaluateWhen as qn,filterEngineCompatible as Jn,grantPluginCapabilities as Yn,grantPluginCapabilities as Xn,grantedPluginCapabilities as Zn,isPluginTrusted as Qn,isPluginTrusted as $n,parsePluginManifest as er,parsePluginManifest as tr,pluginTrustStorePath as nr,readHighRiskCapabilities as rr,resolveActions as ir,resolveActions as ar,resolveActivationEvents as or,sigilOf as sr,topoSortPlugins as cr,trustPlugin as lr,trustPlugin as ur,untrustPlugin as dr,untrustPlugin as fr}from"@x-otto/plugin";import{claudeTrustStorePath as pr,createClaudeHookBridgeHooks as mr,createClaudeHookBridgeHooks as hr,defaultHookRunner as gr,detectClaudeExecutableSurface as _r,detectProjectConfigGating as vr,discoverFileCommands as yr,discoverFileCommands as br,evaluateClaudeTrust as xr,evaluateClaudeTrust as Sr,evaluateWorkspaceTrustPrompt as Cr,expandCommandBody as wr,interpretPreToolUse as Tr,isProjectTrusted as Er,isProjectTrusted as Dr,isStrictProjectConfigEnabled as Or,loadClaudeHooksConfig as kr,mapClaudeAgentToolNames as Ar,matchesHookMatcher as jr,parseClaudeHooks as Mr,parseDotMcpJson as Nr,parseDotMcpJson as Pr,resolveClaudeMcpServers as Fr,resolveClaudeMcpServers as Ir,resolveProjectConfigTrusted as Lr,resolveProjectConfigTrusted as Rr,trustProject as zr,untrustProject as Br}from"@x-otto/claude-compat";import{McpManager as Vr}from"@x-otto/mcp";import{appendFileSync as Hr,closeSync as Ur,constants as Wr,existsSync as D,lstatSync as Gr,mkdirSync as Kr,mkdtempSync as qr,openSync as Jr,readFileSync as O,readdirSync as Yr,readlinkSync as Xr,realpathSync as Zr,renameSync as Qr,rmSync as $r,statSync as ei,symlinkSync as ti,unlinkSync as ni,writeFileSync as k,writeSync as ri}from"node:fs";import{InMemorySession as ii,RelationalSessionPersistence as ai,SESSION_MAX as oi,SqliteSessionRepository as si,createNoopSessionWriteLeaseManager as ci,createSessionWriteLeaseManager as li,reassembleSnapshot as ui}from"@x-otto/session";import{Orchestrator as di,createHandoffTool as fi,createSwarm as pi}from"@x-otto/orchestrator";import{BUILTIN_AGENT_PROFILES as mi,SettingsManager as hi}from"@x-otto/setting";import{createHash as gi,randomUUID as _i}from"node:crypto";import{Agent as vi}from"@x-otto/agent";import{CallbackChannel as yi,CommandChannel as bi,NotificationDispatcher as xi,PresenceTracker as Si,TerminalChannel as Ci,TimestampPresenceGate as wi}from"@x-otto/notification";import{DEFAULT_WORKSPACE_KEY as Ti,createWorkspaceResolver as Ei,genWorkspaceId as Di,readMarker as Oi,workspaceKey as ki,writeMarker as Ai}from"@x-otto/workspace";import{spawn as ji,spawnSync as Mi}from"node:child_process";import{mkdir as Ni,open as Pi,readFile as Fi,writeFile as Ii}from"node:fs/promises";import{Worker as Li}from"node:worker_threads";import{fileURLToPath as Ri,pathToFileURL as zi}from"node:url";import{DeviceFlowOAuthTemplate as Bi,PKCEOAuthTemplate as Vi}from"@x-otto/provider";import{createTodoStore as Hi}from"@x-otto/orchestration-contracts";import{SCHEDULE_LEASE_MIGRATIONS as Ui,ScheduleRegistry as Wi,SchedulerService as Gi,createLocalFireOwnership as Ki,createRemoteFireOwnership as qi,createRemoteScheduleStore as Ji,createScheduleCapability as Yi,createScheduleStore as Xi}from"@x-otto/schedule";import{InstallManager as Zi,RegistryClient as Qi,builtinOfficialSource as $i,checkArchiveBomb as ea,checkGitUpgrades as ta,checkUpgrades as na,cleanTempDir as ra,createArchive as ia,createTempDir as aa,detectUninstallTarget as oa,extractArchive as sa,listInstalledItems as ca,parseRegistry as la,scanInstalledVersions as ua,uninstall as da,validateExtractedPaths as fa}from"@x-otto/install";x(Be(),`.otto`);const pa=c(process.env.OTTO_REMOTE_STORAGE_TIMEOUT_MS,3e4),ma=C(`@x-otto/coding:rfc344-compaction-cost`);function ha(e,t){if(!e?.remote?.getAuth)throw Error(`storage.${t}.url is configured, so storage.remote.getAuth is required.`);return e.remote}function ga(e,t,n,r,i){let a=_a(e,t,n,r,i);return a&&s()?ft(a):a}function _a(e,t,n,r,i){let a=e?.memory;if(a&&`dir`in a)return new ot(a.dir);let o=e?.session&&`url`in e.session?e.session.url:void 0;if(e?.remote?.getAuth&&o){let a=e.remote;return new st({baseUrl:o,getAuth:a.getAuth,fetch:a.fetch??globalThis.fetch,timeoutMs:a.timeoutMs??pa,userId:n?.userId,workspaceKey:()=>r?.()?.key,isWorkspaceSyncEnabled:()=>r?.()?.memorySyncEnabled===!0,localDir:t,onConflict:i})}if(t)return new ot(t)}function va(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 fe(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 ya(e){let{model:t,getModel:n,memoryStore:r,providerRegistry:i,autoMemory:a,workspaceDir:s,getLoadSessionEntries:c,getActiveSessionBytes:l,getEffectiveMaxBytes:u,getCoverageThresholds:d}=e,f=va({model:t,getModel:n,providerRegistry:i,onUsage:e=>ma.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:un,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 ba(e){let{options:t,workspaceDir:n,providerRegistry:r,defaultModel:i,resolveEffectiveModel:a,repoRef:o,getWorkspaceRef:c}=e,l=t.storage?.host?{host:an({baseDir:t.storage.host.dir,namespaces:t.storage.host.namespaces}),token:t.storage.host.token}:null,u=ga(t.storage,n,t.userIdentity,c,e.onMemoryConflict),d=u?new rt({store:u}):null,f=t.memory??ya({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=Tt({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??pa}:void 0,ephemeral:s()},{traceStore:t.traceStore,checkpointStore:t.checkpointStore}),{store:h,live:g}=cn(m.traceStore);return{storageHost:l,autoMemory:d,memory:f,traceStore:h,traceLive:g,checkpointStore:m.checkpointStore,clock:t.clock,memoryStore:u}}const xa={delegation:`task_delegate`,"task-observability":`task_inspect`,"file-state-refresh":`capture_file_state`},Sa=new Set(Object.keys(xa));function Ca(e){let t=new Set;for(let[n,r]of Object.entries(xa))e.has(r)&&t.add(n);return t}function wa(e){let{skillProvider:t,workspaceDir:n,activePlugins:r,resolveEffectiveModel:i,providerRegistry:a,prompt:c,memoryStore:l,memoryAutoExtractConfig:u}=e,d=o()&&Sr(n).gated,f=t?null:pn({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 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:va({getModel:i,providerRegistry:a}),store:h,config:u??{enabled:!0}}),completeText:va({getModel:i,providerRegistry:a}),promptManager:new hn({provider:bn(c??{type:`local`,baseDir:mn}),knownCapabilities:Sa})}}var Ta=class{currentPermissionMode=void 0;constructor(e){this.deps=e}sync(e){let t=je(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(ke(n,t)),this.currentPermissionMode=n}syncDisabledToolsPolicy(e){e&&e.length>0?this.registry.register(Se(e)):this.registry.unregister(`setting::disabled-tools`)}syncEgressPolicy(e){e&&e.length>0?this.registry.register(we(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(be({...t,name:`user::${t.name}`}))}},Ea=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&&!ze()?(this.logger.warn(`Sandbox pinned but no platform sandbox available (install bwrap on Linux); running WITHOUT sandbox`),this.strategy=null):this.strategy=e.enabled?Ie({network:e.network,writablePaths:e.writablePaths,denyReadPaths:e.protectCredentials?Re():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&&!ze()?(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?Ie({network:e.network===`deny`?`deny`:`allow`,writablePaths:this.configuredWritablePaths,denyReadPaths:e.protectCredentials?Re():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 Da(e){return typeof e==`string`&&(e.startsWith(`./`)||e.startsWith(`../`)||e.startsWith(`.\\`))}function Oa(e,t){let n={...e};return Da(n.command)&&!Ue(n.command)&&(n.command=S(t,n.command)),Array.isArray(n.args)&&(n.args=n.args.map(e=>Da(e)?S(t,e):e)),n}function ka(e){let t=e.plugins??Un({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=Pr(e.dir);for(let[t,i]of Object.entries(r))n[t]={...Oa(i,e.dir),_pluginId:e.id}}return n}const Aa=(e,t,n)=>{let r=Ut.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 ja(e){return e.code===`MCP_UNAUTHORIZED`?`MCP server "${e.name}" requires authentication. Run 'otto mcp login ${e.name}' to authenticate.`:null}var Ma=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?Ir(this.workspaceDir):{},plugin:this.workspaceDir?ka({workspaceDir:this.workspaceDir,homedir:Be(),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 Vr({skipOnError:!0,processSpawnFactory:Aa,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=ja(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)}},Na=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)}},Pa=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})}},Fa=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]})}},Ia=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}}))}},La=class{providers;deps;constructor(e){this.deps=e,this.providers=[new Na(e.mcp),...e.skills?[new Pa(e.settings,e.skills)]:[],new Fa(e.settings,e.getAgentProfiles),...e.getPlugins?[new Ia(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)}},Ra=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}},za=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 Ba=C(`@x-otto/coding:sigil-expand`),Va=/\[@([a-z][\w.-]*):((?:\\\]|[^\]])+)\]/g,Ha=/\[@([a-z][\w.-]*)\]/g,Ua=/@([\w./\-]+):(\d+)(?:-(\d+))?/g,Wa=/@def:([A-Za-z_]\w*)/g;function Ga(e,t){let n=new Set,r=[];for(let i of[Va,Ha]){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,`]`)})}}Ua.lastIndex=0;for(let i of e.matchAll(Ua)){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)}))}Wa.lastIndex=0;for(let i of e.matchAll(Wa)){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 Ka(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 qa(e,t){return e.length<=t?e:`${e.slice(0,t)}\n[...truncated ${e.length-t} chars...]`}async function Ja(e,t,n,r){let i=Ga(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 Ba.debug({chip:e.raw},`uiHostOnly resolver skipped in non-uiHost context`),null;let c=i.timeoutMs??1e4,l=await Ka(Promise.resolve().then(()=>i.resolve(e.param,s)),c);return l===``?null:[e.raw,qa(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`){Ba.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 Ya=e(import.meta.url);function Xa(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 Ya.cache[n];let a=Ya(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 Za(e,t,n){if(!n)return e.flatMap(e=>Xa(e,t));let r=new Map,i=[];for(let a of e)for(let e of Xa(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 Qa=C(`@x-otto/coding:plugin-a2ui-renderer-loader`),$a={capability:`a2ui.renderer`,axis:`a2uiRenderers`,noun:`a2ui renderer`,pendingNote:`RFC-210 D5`,logger:Qa,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 eo(e){return Za(e,$a)}function to(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 no=2e3;async function ro(e,t){for(let n of e)if(to(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 ${no}ms`)),no))]);if(Array.isArray(e)&&e.length>0)return e}catch(e){Qa.warn({a2uiRendererId:n.id,err:String(e)},`toPayload failed, trying next candidate (fail-soft)`)}return null}const io={file_read:[`read`],file_write:[`write`],file_edit:[`edit`],shell:[`bash`],search:[`find`,`grep`]};function ao(e){if(e===void 0)return;if(e.length===0)return[];let t=new Set;for(let n of e){let e=io[n];if(e&&e.length>0){for(let n of e)t.add(n);continue}t.add(n)}return[...t]}function oo(){return process.env.OTTO_SUBAGENT_MODEL_POLICY===`off`}var so=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,capabilityFacts:g(e)};let n=await this.checkUsable(e);if(n.usable)return{model:e,decidedBy:t,rejected:p,capabilityFacts:g(e)};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),h=await this.pickUsableFallback(i,m);return{model:h,decidedBy:`fallback`,rejected:p,capabilityFacts:g(h)}}async checkUsable(e){if(this.deps.isModelUsable)try{return await this.deps.isModelUsable(e)}catch{}if(this.deps.hasCredential)try{return await this.deps.hasCredential(e.provider)?{usable:!0}:{usable:!1,reason:`unauthenticated`}}catch{}return{usable:!0}}async pickUsableFallback(e,t){let n=ce(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 ne({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(oo())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 co(e,t){let n=new Set(t);return e.filter(e=>n.has(e.name))}function lo(e,t,n,r,i){let a;return a=t||(n?co(e(),n):e()),r?.length&&(a=a.filter(e=>!r.includes(e.name))),i||(a=a.filter(e=>!Fe.has(e.name))),a}function uo(e,t,n,r){let i=n?[...t.disallowedToolNames??[],...r]:t.disallowedToolNames;return lo(e,void 0,t.toolNames,i,t.allowSubagents)}const fo=[`edit`,`write`,`lsp_rename`,`bash`];function po(e,t,n,r){let i=xn([...t,...mi],n),a=Ca(new Set(r.map(e=>e.name)));return()=>e.assemblePreset({preset:`subagent`,agentName:n,profile:i,promptMode:i?.promptMode},a)}var mo=class{modelResolver;constructor(e){this.deps=e,this.modelResolver=new so(e)}readAgentSources(e,t){let n=e?this.deps.settings.get(`agents`)?.[e]:void 0,r=t===`subagent`&&e?xn([...this.deps.getDeclarativeAgentProfiles(),...mi],e):void 0;return{slot:n?.default_workflow_slot,profileTier:r?.preferredModelTier,toolNames:n?.tools??ao(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 uo(this.deps.getTools,i,n,fo)}resolveTools(e,t,n,r){return lo(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??[],...fo]:n.disallowedToolNames,u=this.resolveTools(e.tools,n.toolNames,l,n.allowSubagents);s.supportsTools===!1&&(u=[]);let d=Ca(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??It(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=Zt(process.env),n=Number.isFinite(e)&&e>=0?Math.trunc(e):t.max;return{enabled:t.enabled,max:n}})(),promptRefresh:f,workspaceDir:e.workspaceDir??this.deps.workspaceDir,workspaceId:e.workspaceId??this.deps.getWorkspaceId?.(),transient:e.transient,depth:e.depth,interactive:e.interactive,listable:e.listable,retryAccelerate:e.retryAccelerate,streamRetry:e.streamRetry??this.deps.getResilienceConfig?.().stream,networkDisconnectRetry:e.networkDisconnectRetry??ho(this.deps.getResilienceConfig?.().networkDisconnect),lifecycleAsyncTimeoutMs:go(process.env.OTTO_LIFECYCLE_ASYNC_TIMEOUT_MS),describeImages:this.deps.describeImages}}};function ho(e){if(e)return{maxRetries:e.maxRetries,initialDelayMs:e.intervalMs,backoffFactor:1,maxDelayMs:e.intervalMs}}function go(e){if(!e)return;let t=Number(e);return Number.isFinite(t)&&t>0?t:void 0}const _o=Wr.O_NOFOLLOW??0;function vo(e,t){let n=Jr(e,Wr.O_WRONLY|Wr.O_APPEND|Wr.O_CREAT|_o,384);try{ri(n,t.endsWith(`
|
|
3
3
|
`)?t:t+`
|
|
4
|
-
`)}finally{
|
|
4
|
+
`)}finally{Ur(n)}}function yo(e,t=20){let n;try{return n=Jr(e,Wr.O_RDONLY|_o),O(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&&Ur(n)}}function bo(e){return e.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
|
|
7
|
+
`)}function xo(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 vi({stream:e.stream,logger:e.logger,agentName:e.runId,maxToolTurns:e.maxToolTurns,toolHookExecutor:Nt({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=>{Vt.setAwaitingApproval(e.runId,`${t}: ${i}`),r=t=>{Vt.clearAwaitingApproval(e.runId),n(t)};try{vo(e.outputPath,`⏳ 需要你确认「${t}」:${i}\n 进 Delegates 面板按 o,回复 yes 允许 / no 拒绝。`)}catch{}a(i)}):Promise.resolve(!1)}});i.on(`turn.end`,({message:t})=>{let n=bo(t);if(n)try{vo(e.outputPath,n)}catch{}});let a=()=>{if(r){let e=r;r=void 0,e(!1)}i.abort()},o=wt(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:bo(e),messages:n.messages,tokenUsage:{input:e.usage.inputTokens,output:e.usage.outputTokens,cacheRead:e.usage.cacheReadTokens},durationMs:Date.now()-t})).finally(()=>{o(),Vt.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 So=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=Pt(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 Yt(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=nn(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 (${wo(s)})`,outputPath:i,worktree:{path:r.path,branch:r.branch}});return}let c=Co(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=tn(t.diff??``),r=en(t.diff??``).length>0,i=St(this.deps.repoRoot,t.diff??``);if(i.applied)return t.diff?.trim()&&(this.appliedDiffs.set(e,t.diff),this.deps.appliedDiffStore?.save(e,t.diff)),this.deps.registry.update(e,{status:`applied`}),{applied:!0,status:`success`,message:`applied cleanly`,conflictPaths:[],forbiddenZone:n,capabilityTouched:r};let a=Wt(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=$t(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 Co(e){let t=e?.text;return typeof t==`string`?t:``}function wo(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 Ao(e){for(let t=e.length-1;t>=0;t--){let n=e[t];if(n?.role!==`assistant`)continue;let r=n.stopReason;return r===`refusal`||r===`max_tokens`?r:null}return null}function jo(e){let t=Error(e);return t.name=`AbortError`,t}function Mo(e){let t=new Map;return{runSession:async n=>{let r=Date.now(),i=new AbortController;n.taskId&&t.set(n.taskId,i);let a=n.signal,o=()=>i.abort();a&&(a.aborted?i.abort():a.addEventListener(`abort`,o,{once:!0}));let s;s=n.sessionMode===`sticky`&&n.sessionId?e.getSession(n.sessionId)||await e.createSession({id:n.sessionId,agentName:n.agentName,slot:n.slot,modelId:n.model,category:n.category,delegated:!0,promptContext:n.promptContext??(n.agentName?{taskDescription:n.prompt}:void 0),depth:n.depth,readOnly:n.readOnly}):await e.createSession({agentName:n.agentName,slot:n.slot,modelId:n.model,category:n.category,delegated:!0,promptContext:n.promptContext??(n.agentName?{taskDescription:n.prompt}:void 0),depth:n.depth,transient:!0,readOnly:n.readOnly});let c=s.id,l=St(s.coreAgent,{id:c,agentName:n.agentName??`agent`,title:n.agentName??n.prompt.replace(/\s+/g,` `).slice(0,48),prompt:n.prompt,model:n.model??s.model.id,modelDecidedBy:s.modelResolution?.decidedBy,origin:`main`,depth:n.depth??0,abort:()=>s.abort(),messages:()=>s.session.messages()});try{if(i.signal.aborted)throw jo(`Task cancelled before the session started`);let e=n.agentName?`<agent-guardrails>\n${hn}\n</agent-guardrails>\n\n<task>\n${n.prompt}\n</task>`:n.prompt,t=s.prompt(e);t.catch(()=>{}),await Promise.race([t,new Promise((e,t)=>{i.signal.addEventListener(`abort`,()=>{s.abort(),t(jo(`Task cancelled`))})})]);let a=s.session.messages(),o=ko(a),c=Ao(a);return c&&(o=`${o}\n\n[⚠ subagent did not complete cleanly (stop reason: ${c}) — the output above may be partial or unreliable; verify before relying on it]`),{text:o,sessionId:s.id,durationMs:Date.now()-r}}finally{zt.setMessages(c,s.session.messages()),l(),zt.markEnded(c),a?.removeEventListener(`abort`,o),n.taskId&&t.delete(n.taskId),n.sessionMode===`ephemeral`&&await e.removeSession(s.id).catch(t=>{e.logger.warn(`Failed to remove ephemeral session %s: %s`,s.id,t)})}},abortTask:e=>{t.get(e)?.abort()}}}function No(e){let t=new yi({focusTracking:process.env.OTTO_TUI_FOCUS===`1`}),n=new vi({getConfig:e.getConfig,getCwd:e.getCwd,onInteraction:()=>t.recordInteraction(),isFollowUpPending:e.isFollowUpPending,gate:new xi({getCondition:()=>e.getConfig()?.condition,getIdleThresholdMs:()=>e.getConfig()?.idle_threshold_ms,state:t})});return n.registerChannel(new bi({getConfig:e.getConfig})),n.registerChannel(new gi(`hook`,()=>!0,t=>e.emitHookNotification({sessionId:t.sessionId,message:t.message,title:t.title,notification_type:t.type}))),n.registerChannel(new _i({getConfig:e.getConfig,isTrusted:()=>Tr(e.getCwd())})),{dispatcher:n,presenceTracker:t}}function Po(e,t){if(!t||t.length===0)return e;let n=t.map(e=>RegExp(`^`+e.replace(/[.+^${}()|[\]\\]/g,`\\$&`).replace(/\*/g,`.*`)+`$`,`i`));return e.filter(e=>!n.some(t=>t.test(e)))}var Fo=class{catalog;derivedModelIds=new Map;constructor(e,t,n){this.modelRegistry=e,this.authStore=t,this.catalog=n??new d}async hydrate(){let e=new Set,t=await this.catalog.load();if(!t)return e;for(let n of Object.values(t.providers)){let t=oe(this.modelRegistry,n.mergeProvider,n.modelIds,{templateApi:n.modelApi});for(let n of t.availableIds)e.add(n);let r=this.derivedModelIds.get(n.mergeProvider)??new Set;for(let e of t.derivedIds)r.add(e);this.derivedModelIds.set(n.mergeProvider,r)}return e}refreshInFlight=null;async refresh(){return this.refreshInFlight||=this.doRefresh().finally(()=>{this.refreshInFlight=null}),this.refreshInFlight}async doRefresh(){let e=this.modelRegistry,t=this.authStore,n=t.listProviders(),r=await Promise.all(n.map(e=>t.getAuthSource(e).catch(()=>null))),i=[];for(let a=0;a<n.length;a++){let o=n[a];if(!r[a]){i.push({provider:o,status:`skipped`,reason:`not authenticated`});continue}let s=await t.resolveAuth(o).catch(()=>null);if(!s?.token){let e=r[a]===`oauth`&&!t.oauth.has(o)?`provider capability not granted — trust the plugin in /extension`:`credential expired or refresh failed — re-login`;i.push({provider:o,status:`skipped`,reason:e});continue}let c=ue(o,s.token,{mode:s.mode,beta:s.beta});if(!c){let t=e.getByProvider(o);if(t.length>0){let e=t.map(e=>e.id);await this.catalog.put(o,{fetchedAt:Date.now(),mergeProvider:o,modelIds:e}).catch(()=>{}),i.push({provider:o,status:`ok`,added:0,kept:e.length,total:e.length,availableIds:e})}else i.push({provider:o,status:`skipped`,reason:`no live models endpoint`});continue}try{let t=Po(await v(c),c.modelIdExclude),n=oe(e,c.mergeProvider,t,{templateApi:c.modelApi}),r=new Set(n.availableIds),a=this.derivedModelIds.get(c.mergeProvider)??new Set;for(let t of a)r.has(t)||e.unregister(t);this.derivedModelIds.set(c.mergeProvider,new Set([...[...a].filter(e=>r.has(e)),...n.derivedIds])),await this.catalog.put(o,{fetchedAt:Date.now(),mergeProvider:c.mergeProvider,modelApi:c.modelApi,modelIds:t}).catch(()=>{}),i.push({provider:o,status:`ok`,added:n.added,kept:n.kept,total:n.total,availableIds:n.availableIds})}catch(e){i.push({provider:o,status:`failed`,reason:e instanceof Error?e.message:String(e)})}}return i}};function Io(e){return e.modelRegistry.getAll()}function Lo(e,t){return e.modelRegistry.resolve(t)}function Ro(e){return e.providerRegistry.list()}function zo(e,t){e.hookRegistry.register(t)}function Bo(e,t){return e.hookRegistry.unregister(t)}async function Vo(e){return e.modelCatalogManager.hydrate()}function Ho(e,t){return e.codingSessionPool.getSessionAvailableModels(t)}function Uo(e,t,n){e.codingSessionPool.setSessionAvailableModels(t,n)}async function Wo(e){return e.modelCatalogManager.refresh()}async function Go(e,t){let n=new Set(t?e.codingSessionPool.getSessionAvailableModels(t):[]),r=ne(e.authStore,`delegation`);return Promise.all(e.modelRegistry.getAll().filter(e=>e.id!==`__otto_setup__`).map(async e=>{let t=await r(e);return{id:e.id,provider:e.provider,strengths:e.strengths??[],available:n.has(e.id),usable:t.usable,...t.reason?{unusableReason:t.reason}:{}}}))}function Ko(e,t){e.notificationDispatcher.registerChannel(t)}function qo(e,t){e.notificationDispatcher.registerChannel(new gi(`inapp`,()=>!0,e=>t(e.title??`otto`,e.message,e.type)))}function Jo(e){e.presenceTracker.recordInteraction()}function Yo(e,t){e.presenceTracker.setFocus(t)}async function Xo(e,t,n){if(!t)return;if(n){e.permissionRegistry.addSessionAlwaysAllow(n,t),e.codingSessionPool.setSessionPermissionAllow(n,e.permissionRegistry.getSessionAlwaysAllow(n)),e.logger.info({tool:t,sessionId:n},`Tool added to session always-allow list`);return}let r=e.settings.get(`permission_always_allow`)??[];r.includes(t)||(e.permissionRegistry.addAlwaysAllow(t),await e.settings.persist({permission_always_allow:[...r,t]}),e.logger.info({tool:t},`Tool added to project always-allow list`))}function Zo(e){return e.settings.get(`permission_mode`)??`auto`}async function Qo(e,t){let n=Zo(e);await e.settings.update({permission_mode:t}),e.settings.persist({permission_mode:t}).catch(n=>e.logger.warn({err:n instanceof Error?n.message:String(n),mode:t},`Failed to persist permission mode`)),e.logger.info({from:n,to:t},`Permission mode set`)}function $o(e,t){return e.permissionRegistry.getSessionAlwaysAllow(t)}async function es(e,t){if(!t)return!1;let n=e.settings.get(`permission_always_allow`)??[];if(!n.includes(t))return!1;let r=n.filter(e=>e!==t);return e.permissionRegistry.setAlwaysAllow(r),await e.settings.persist({permission_always_allow:r}),e.logger.info({tool:t},`Tool removed from project always-allow list`),!0}function ts(e,t){t&&(e.permissionRegistry.clearSessionAlwaysAllow(t),e.codingSessionPool.setSessionPermissionAllow(t,[]),e.logger.info({sessionId:t},`Session always-allow list cleared`))}async function ns(e,t={}){e.ensureNotDisposed(),await e.ensureSettingsLoaded();let n=await e.sessionConfigResolver.resolve(t),r=await e.agentRuntime.createSession(n);return e.notificationDispatcher.attach(r),e.toolsSyncCoordinator?.record(r.id,{agentName:t.agentName,promptPreset:t.promptPreset??(t.agentName?`subagent`:`main`),readOnly:t.readOnly,hasExplicitTools:t.tools!==void 0}),e.logger.info({sessionId:r.id},`Session created`),r}function rs(e,t){return e.codingSessionPool.getSession(t)}async function is(e,t,n){if(!e.storage.storageHost)throw Error(`shareSession requires a configured storage.host`);await e.storage.storageHost.host.updateMetadata(`sessions`,e.workspaceRef?.key,t,{visibility:n.visibility},void 0),e.logger.info({sessionId:t,visibility:n.visibility},`Session visibility changed`)}function as(e){return e.codingSessionPool.active}function os(e,t){return e.codingSessionPool.listSessions(t)}async function ss(e,t){let n=os(e,t).filter(t=>{let n=e.codingSessionPool.getSession(t.id);return n?!(n.transient===!0||n.depth>0||n.listable===!1):!0}),r;try{r=t?.workspaceId===void 0?e.workspaceRef?.key:Ei(t.workspaceId)}catch{r=void 0}if(!r)return n;let i=await e.codingSessionPool.listAllPersistedSessions({workspaceKey:r}).catch(()=>[]),a=t?.workspaceId??e.workspaceRef?.id,o=new Set(n.map(e=>e.id)),s=i.filter(e=>!o.has(e.id)).map(e=>({...e,workspaceId:a})),c=[...n,...s];return c.sort((e,t)=>{let n=e.updatedAt?.getTime()??e.createdAt.getTime();return(t.updatedAt?.getTime()??t.createdAt.getTime())-n}),c}async function cs(e,t){e.notificationDispatcher.detach(t);let n=await e.codingSessionPool.removeSession(t);return n&&(e.toolsSyncCoordinator?.forget(t),e.logger.info({sessionId:t},`Session removed`)),n}async function ls(e,t){let n=await e.codingSessionPool.archiveSession(t);return n&&e.logger.info({sessionId:t},`Session archived`),n}async function us(e,t,n){let r=await e.codingSessionPool.forkSession(t,n);return r&&e.notificationDispatcher.attach(r),r}var ds=class{contexts=new Map;constructor(e){this.deps=e}record(e,t){t.hasExplicitTools||this.contexts.set(e,{agentName:t.agentName,promptPreset:t.promptPreset,readOnly:t.readOnly})}forget(e){this.contexts.delete(e)}resyncOne(e){let t=this.contexts.get(e);return t?this.resyncSession(e,t):!1}resync(){let e=new Set(this.deps.listSessionIds());for(let t of this.contexts.keys())e.has(t)||this.contexts.delete(t);let t=0;for(let[e,n]of this.contexts)this.resyncSession(e,n)&&t++;return t}resyncSession(e,t){let n=this.deps.getSession(e);if(!n)return!1;try{let e=this.deps.sessionConfigResolver.resolveToolsForResync(t.agentName,t.promptPreset,t.readOnly);return n.model.supportsTools===!1&&(e=[]),n.tools=e,!0}catch(t){return this.deps.logger.warn({sessionId:e,err:t instanceof Error?t.message:String(t)},`[session-tools-sync] resync failed for session, skipping (fail-soft)`),!1}}};const fs=C(`@x-otto/coding:plugin-panel-manager`);function ps(e){let t=e.plugins??Vn({cwd:e.workspaceDir,homedir:e.homedir,disabled:e.disabledPlugins}),n=[];for(let e of t){let t=e.manifest.contributes?.panels;if(!t||t.length===0)continue;let r=E(e);if(!r.gated){if(!e.manifest.capabilities?.includes(`tui.renderer`)){fs.warn({pluginId:e.id},`plugin declares contributes.panels but not capabilities:["tui.renderer"], skipped (fail-closed)`);continue}if(r.pendingCapabilities.includes(`tui.renderer`)){fs.warn({pluginId:e.id},`plugin capability "tui.renderer" declared but not yet granted, skipping panels (fail-closed)`);continue}for(let r of t){let t=x(e.dir,r.entry);if(!D(t)){fs.warn({pluginId:e.id,panelId:r.id,modulePath:t},`panel entry not found — postinstall build may not have run`);continue}n.push({id:`${e.id}:${r.id}`,pluginId:e.id,title:r.title,modulePath:t,exportName:r.export??`default`})}}}return n}function ms(e){let t=[];for(let n of e){if(E(n).gated)continue;let e=n.manifest.contributes?.statusItems;if(!e?.length)continue;let r=Un(n.manifest.contributes?.contextKeys);for(let i of e){if((i.point??Mn.statuslineItem)!==Mn.statuslineItem||!Gn(i.when,r))continue;let e=r[i.dataSource.contextKey];e!=null&&t.push({item:{id:`${n.id}:${i.id}`,text:e},order:i.order??0})}}return t.sort((e,t)=>e.order-t.order).map(e=>e.item)}function hs(e){let t=[];for(let n of e){if(E(n).gated)continue;let e=n.manifest.contributes;if(!e?.menus?.length)continue;let r=Un(e.contextKeys);t.push(...rr(Mn.menuItem,e.menus,e.actions,r))}return t}const gs={capability:`tui.renderer`,axis:`renderers`,noun:`renderer`,pendingNote:`RFC-140 D3`,logger:C(`@x-otto/coding:plugin-renderer-loader`),entries:e=>e.manifest.contributes?.renderers,entryPath:e=>e.entry,exportName:e=>e.export,idLogFields:e=>({rendererId:e.id}),logTypeofOnNotFunction:!0,build:(e,t,n)=>({id:`${e.id}:${t.id}`,pluginId:e.id,matcher:t.matcher,render:n}),successLogFields:e=>({rendererId:e.id,matcher:e.matcher})};function _s(e){return Ja(e,gs)}const vs=C(`@x-otto/coding:plugin-a2ui-component-loader`),ys=new Set([`Text`,`Card`,`List`,`Progress`,`Chip`,`Button`]),bs={capability:`a2ui.component`,axis:`a2uiComponents`,noun:`a2ui component`,pendingNote:`RFC-140 D3 pattern`,logger:vs,entries:e=>e.manifest.contributes?.a2uiComponents,entryPath:e=>e.entry,exportName:e=>e.export,idLogFields:e=>({type:e.type}),logTypeofOnNotFunction:!1,preCheck:(e,t)=>ys.has(t.type)?(vs.warn({pluginId:e.id,type:t.type},`plugin a2ui component type collides with builtin reserved type, rejected (R4)`),!1):!0,build:(e,t,n)=>({type:t.type,pluginId:e.id,render:n})};function xs(e){return Ja(e,bs,{key:e=>e.type,onConflict:(e,t)=>{vs.warn({pluginId:e.pluginId,type:e.type,existingOwner:t},`a2ui component type already registered by another plugin, rejected (first-registered wins)`)}})}const Ss={capability:`tui.renderer`,axis:`statusWidgets`,noun:`status widget`,pendingNote:`RFC-140 D3 pattern`,logger:C(`@x-otto/coding:plugin-status-widget-loader`),entries:e=>e.manifest.contributes?.statusWidgets,entryPath:e=>e.entry,exportName:e=>e.export,idLogFields:e=>({widgetId:e.id}),logTypeofOnNotFunction:!0,build:(e,t,n)=>({id:`${e.id}:${t.id}`,pluginId:e.id,render:n,tickMs:t.tickMs,order:t.order}),successLogFields:e=>({widgetId:e.id})};function Cs(e){return Ja(e,Ss)}const ws={capability:`tui.renderer`,axis:`fileViewers`,noun:`file viewer`,pendingNote:`RFC-140 D3 pattern`,logger:C(`@x-otto/coding:plugin-file-viewer-loader`),entries:e=>e.manifest.contributes?.fileViewers,entryPath:e=>e.entry,exportName:e=>e.export,idLogFields:e=>({viewerId:e.id}),logTypeofOnNotFunction:!0,build:(e,t,n)=>({id:`${e.id}:${t.id}`,pluginId:e.id,label:t.label,matcher:t.matcher,render:n,order:t.order}),successLogFields:e=>({viewerId:e.id,matcher:e.matcher})};function Ts(e){return Ja(e,ws)}var Es=class{constructor(e){this.deps=e}listFileCommands(){return[...vr(this.deps.getWorkspaceDir(),this.deps.getActivePlugins()),...this.deps.pluginModuleManager.commands]}computedPluginCommands(){return this.deps.pluginModuleManager.commands}async callMcpTool(e,t,n){let r=this.deps.mcpController.getMcpClient(e);if(!r)throw Error(`MCP server "${e}" not connected or not found`);let i=await r.callTool({name:t,arguments:n});return{content:i.content,isError:i.isError}}getPluginPanelRegistrations(){return ps({workspaceDir:this.deps.getWorkspaceDir(),homedir:ze(),disabledPlugins:this.deps.settings.get(`disabled_plugins`),plugins:this.deps.getActivePlugins()})}getPluginStatusItems(){return ms(this.deps.getActivePlugins())}getGlobalMenuItems(){return hs(this.deps.getActivePlugins())}getPluginRenderers(){return _s(this.deps.getActivePlugins())}getPluginA2uiComponents(){return xs(this.deps.getActivePlugins())}getPluginStatusWidgets(){return Cs(this.deps.getActivePlugins())}getPluginFileViewers(){return Ts(this.deps.getActivePlugins())}getPluginRegistrations(){let e=new Map,t=t=>{let n=e.get(t);return n||(n={pluginId:t},e.set(t,n)),n};for(let e of this.getPluginRenderers()){let n=t(e.pluginId);(n.renderers??=[]).push(e)}for(let e of this.getPluginStatusItems()){let n=t(e.id.split(`:`)[0]??e.id);(n.statusItems??=[]).push(e)}for(let e of this.getPluginPanelRegistrations()){let n=t(e.pluginId);(n.panels??=[]).push(e)}for(let e of this.getPluginA2uiComponents()){let n=t(e.pluginId);(n.a2uiComponents??=[]).push(e)}for(let e of this.getPluginStatusWidgets()){let n=t(e.pluginId);(n.statusWidgets??=[]).push(e)}for(let e of this.getPluginFileViewers()){let n=t(e.pluginId);(n.fileViewers??=[]).push(e)}return[...e.values()]}};const j=C(`@x-otto/coding:plugin-hooks`),Ds=4096;function Os(e,t){let n=Je();return n.OTTO_PLUGIN_DIR=e.pluginDir,n.OTTO_PLUGIN_ID=e.pluginId,e.workspaceDir&&(n.OTTO_WORKSPACE_DIR=e.workspaceDir),t&&Object.assign(n,t),n}function ks(e){let t=Ye(e);return t.safe?null:{success:!1,hook:`pre-check`,command:e,error:`Dangerous command blocked: ${t.reason}`}}function As(e,t){let n=!1,r,i;if(e?.length){let t=typeof e==`string`?e:e.toString(`utf-8`);r=t.slice(0,Ds),n=t.length>Ds}if(t?.length){let e=typeof t==`string`?t:t.toString(`utf-8`);i=e.slice(0,Ds),n||=e.length>Ds}return{stdout:r,stderr:i,truncated:n}}async function js(e,t){return ks(t)||(j.info({pluginId:e.pluginId,command:t},`Executing postinstall hook`),new Promise(n=>{let r=Oi(t,{cwd:e.pluginDir,env:Os(e),shell:!0,stdio:`pipe`}),i=[],a=[];r.stdout?.on(`data`,e=>{i.push(e)}),r.stderr?.on(`data`,e=>{a.push(e)});let o=!1,s=setTimeout(()=>{o=!0,r.kill()},3e4);r.on(`close`,(r,c)=>{clearTimeout(s);let{stdout:l,stderr:u,truncated:d}=As(Buffer.concat(i),Buffer.concat(a)),f={success:!o&&r===0&&c===null,hook:`postinstall`,command:t,exitCode:r,signal:c??void 0,stdout:l,stderr:u,truncated:d||void 0};o&&(f.timeout=!0,f.error=`postinstall hook timed out (30s)`),f.success||j.warn({pluginId:e.pluginId,result:f},`Postinstall hook failed`),n(f)}),r.on(`error`,e=>{clearTimeout(s),n({success:!1,hook:`postinstall`,command:t,error:e.message})})}))}function Ms(e,t,n,r,i){let a=ks(t);if(a){j.warn({pluginId:e.pluginId,command:t},`Setup hook blocked by safety check`),n?.(a);return}if(j.info({pluginId:e.pluginId,command:t},`Executing setup hook (async)`),r){let a=r.spawn({command:t,args:[],options:{shell:!0},owner:{type:`plugin-hook`,id:e.pluginId},category:`plugin`,label:`${e.pluginId}:setup`,lifecycle:`evictable`,killGraceMs:5e3,cwd:e.pluginDir,env:Os(e),signal:i}),o=setTimeout(()=>{j.warn({pluginId:e.pluginId},`Setup hook exceeded 60s — killing`),a.kill({reason:`setup timeout (60s)`})},6e4);o.unref?.();let s=``,c=``;a.onStdoutLine(e=>{s+=e+`
|
|
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 To=/^[a-zA-Z0-9_-]+$/;function Eo(e){return{save(t,n){if(!To.test(t))throw Error(`Invalid jobId for applied diff store: ${t}`);Kr(e,{recursive:!0}),k(x(e,`${t}.patch`),n,`utf-8`)},load(t){let n=x(e,`${t}.patch`);if(D(n))return O(n,`utf-8`)},delete(t){let n=x(e,`${t}.patch`);D(n)&&ni(n)},loadAll(){return D(e)?Yr(e).filter(e=>He(e)===`.patch`).map(t=>({jobId:t.slice(0,-6),diff:O(x(e,t),`utf-8`)})):[]}}}const Do=[`delegate_job`];function Oo(e){return e.filter(e=>!Do.includes(e.name))}function ko(){return`job_${_i().replace(/-/g,``).slice(0,8)}`}function Ao(e){let t=e.outputDir??x(Ve(),`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 So({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?Eo(e.appliedDiffDir):void 0,spawnRun:({runId:t,prompt:n,outputPath:r,workspaceDir:i,onAwaitingInput:a})=>xo({runId:t,prompt:n,outputPath:r,model:e.getModel(),systemPrompt:e.systemPrompt,tools:[...Oo(e.buildTools(i)),...e.mcpTools?.()??[]],maxToolTurns:e.maxToolTurns,stream:e.stream,logger:e.logger,hookRegistry:e.hookRegistry,onAwaitingInput:a}),buildOutputPath:e=>(Kr(t,{recursive:!0}),x(t,`agent-job-${e}.log`)),newJobId:e.newJobId??ko})}function jo(e){return Ao({repoRoot:e.workspaceDir,registry:zt,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 Mo(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 No(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 Po(e){let t=Error(e);return t.name=`AbortError`,t}function Fo(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,parentTaskId:n.parentTaskId,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,parentTaskId:n.parentTaskId,transient:!0,readOnly:n.readOnly});let c=s.id,l=wt(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 Po(`Task cancelled before the session started`);let e=n.agentName?`<agent-guardrails>\n${_n}\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(Po(`Task cancelled`))})})]);let a=s.session.messages(),o=Mo(a),c=No(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{Vt.setMessages(c,s.session.messages()),l(),Vt.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 Io(e){let t=new Si({focusTracking:process.env.OTTO_TUI_FOCUS===`1`}),n=new xi({getConfig:e.getConfig,getCwd:e.getCwd,onInteraction:()=>t.recordInteraction(),isFollowUpPending:e.isFollowUpPending,gate:new wi({getCondition:()=>e.getConfig()?.condition,getIdleThresholdMs:()=>e.getConfig()?.idle_threshold_ms,state:t})});return n.registerChannel(new Ci({getConfig:e.getConfig})),n.registerChannel(new yi(`hook`,()=>!0,t=>e.emitHookNotification({sessionId:t.sessionId,message:t.message,title:t.title,notification_type:t.type}))),n.registerChannel(new bi({getConfig:e.getConfig,isTrusted:()=>Dr(e.getCwd())})),{dispatcher:n,presenceTracker:t}}function Lo(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 Ro=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=se(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=de(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=Lo(await ae(c),c.modelIdExclude),n=se(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 zo(e){return e.modelRegistry.getAll()}function Bo(e,t){return e.modelRegistry.resolve(t)}function Vo(e){return e.providerRegistry.list()}function Ho(e,t){e.hookRegistry.register(t)}function Uo(e,t){return e.hookRegistry.unregister(t)}async function Wo(e){return e.modelCatalogManager.hydrate()}function Go(e,t){return e.codingSessionPool.getSessionAvailableModels(t)}function Ko(e,t,n){e.codingSessionPool.setSessionAvailableModels(t,n)}async function qo(e){return e.modelCatalogManager.refresh()}async function Jo(e,t){let n=new Set(t?e.codingSessionPool.getSessionAvailableModels(t):[]),r=re(e.authStore,`delegation`);return Promise.all(e.modelRegistry.getAll().filter(e=>e.id!==`__otto_setup__`).map(async e=>{let t=await r(e);return{id:e.id,provider:e.provider,strengths:e.strengths??[],available:n.has(e.id),usable:t.usable,...t.reason?{unusableReason:t.reason}:{}}}))}function Yo(e,t){e.notificationDispatcher.registerChannel(t)}function Xo(e,t){e.notificationDispatcher.registerChannel(new yi(`inapp`,()=>!0,e=>t(e.title??`otto`,e.message,e.type)))}function Zo(e){e.presenceTracker.recordInteraction()}function Qo(e,t){e.presenceTracker.setFocus(t)}async function $o(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 es(e){return e.settings.get(`permission_mode`)??`auto`}async function ts(e,t){let n=es(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 ns(e,t){return e.permissionRegistry.getSessionAlwaysAllow(t)}async function rs(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 is(e,t){t&&(e.permissionRegistry.clearSessionAlwaysAllow(t),e.codingSessionPool.setSessionPermissionAllow(t,[]),e.logger.info({sessionId:t},`Session always-allow list cleared`))}async function as(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 os(e,t){return e.codingSessionPool.getSession(t)}async function ss(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 cs(e){return e.codingSessionPool.active}function ls(e,t){return e.codingSessionPool.listSessions(t)}async function us(e,t){let n=ls(e,t).filter(t=>{let n=e.codingSessionPool.getSession(t.id);return n?!(n.transient===!0||n.depth>0||n.listable===!1):!0}),r;try{r=t?.workspaceId===void 0?e.workspaceRef?.key:ki(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 ds(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 fs(e,t){let n=await e.codingSessionPool.archiveSession(t);return n&&e.logger.info({sessionId:t},`Session archived`),n}async function ps(e,t,n){let r=await e.codingSessionPool.forkSession(t,n);return r&&e.notificationDispatcher.attach(r),r}var ms=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 hs=C(`@x-otto/coding:plugin-panel-manager`);function gs(e){let t=e.plugins??Un({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`)){hs.warn({pluginId:e.id},`plugin declares contributes.panels but not capabilities:["tui.renderer"], skipped (fail-closed)`);continue}if(r.pendingCapabilities.includes(`tui.renderer`)){hs.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)){hs.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 _s(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=Gn(n.manifest.contributes?.contextKeys);for(let i of e){if((i.point??Pn.statuslineItem)!==Pn.statuslineItem||!qn(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 vs(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=Gn(e.contextKeys);t.push(...ar(Pn.menuItem,e.menus,e.actions,r))}return t}const ys={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 bs(e){return Za(e,ys)}const xs=C(`@x-otto/coding:plugin-a2ui-component-loader`),Ss=new Set([`Text`,`Card`,`List`,`Progress`,`Chip`,`Button`]),Cs={capability:`a2ui.component`,axis:`a2uiComponents`,noun:`a2ui component`,pendingNote:`RFC-140 D3 pattern`,logger:xs,entries:e=>e.manifest.contributes?.a2uiComponents,entryPath:e=>e.entry,exportName:e=>e.export,idLogFields:e=>({type:e.type}),logTypeofOnNotFunction:!1,preCheck:(e,t)=>Ss.has(t.type)?(xs.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 ws(e){return Za(e,Cs,{key:e=>e.type,onConflict:(e,t)=>{xs.warn({pluginId:e.pluginId,type:e.type,existingOwner:t},`a2ui component type already registered by another plugin, rejected (first-registered wins)`)}})}const Ts={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 Es(e){return Za(e,Ts)}const Ds={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 Os(e){return Za(e,Ds)}var ks=class{constructor(e){this.deps=e}listFileCommands(){return[...br(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 gs({workspaceDir:this.deps.getWorkspaceDir(),homedir:Be(),disabledPlugins:this.deps.settings.get(`disabled_plugins`),plugins:this.deps.getActivePlugins()})}getPluginStatusItems(){return _s(this.deps.getActivePlugins())}getGlobalMenuItems(){return vs(this.deps.getActivePlugins())}getPluginRenderers(){return bs(this.deps.getActivePlugins())}getPluginA2uiComponents(){return ws(this.deps.getActivePlugins())}getPluginStatusWidgets(){return Es(this.deps.getActivePlugins())}getPluginFileViewers(){return Os(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=C(`@x-otto/coding:plugin-hooks`),As=4096;function js(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 Ms(e){let t=Xe(e);return t.safe?null:{success:!1,hook:`pre-check`,command:e,error:`Dangerous command blocked: ${t.reason}`}}function Ns(e,t){let n=!1,r,i;if(e?.length){let t=typeof e==`string`?e:e.toString(`utf-8`);r=t.slice(0,As),n=t.length>As}if(t?.length){let e=typeof t==`string`?t:t.toString(`utf-8`);i=e.slice(0,As),n||=e.length>As}return{stdout:r,stderr:i,truncated:n}}async function Ps(e,t){return Ms(t)||(A.info({pluginId:e.pluginId,command:t},`Executing postinstall hook`),new Promise(n=>{let r=ji(t,{cwd:e.pluginDir,env:js(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}=Ns(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 Fs(e,t,n,r,i){let a=Ms(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:js(e),signal:i}),o=setTimeout(()=>{A.warn({pluginId:e.pluginId},`Setup hook exceeded 60s — killing`),a.kill({reason:`setup timeout (60s)`})},6e4);o.unref?.();let s=``,c=``;a.onStdoutLine(e=>{s+=e+`
|
|
11
11
|
`}),a.onStderrLine(e=>{c+=e+`
|
|
12
|
-
`}),a.onExit(r=>{clearTimeout(o);let{stdout:i,stderr:a,truncated:l}=As(s,c),u={success:r.code===0&&r.signal===null,hook:`setup`,command:t,exitCode:r.code,signal:r.signal??void 0,stdout:i,stderr:a,truncated:l||void 0};u.success?j.info({pluginId:e.pluginId},`Setup hook succeeded`):j.error({pluginId:e.pluginId,exitCode:r.code,signal:r.signal,stderr:a?.slice(0,512)},`Setup hook failed`),n?.(u)}),a.onError(r=>{j.error({pluginId:e.pluginId,err:r},`Setup hook spawn error`),n?.({success:!1,hook:`setup`,command:t,error:r.message})});return}let o=Oi(t,{cwd:e.pluginDir,env:Os(e),shell:!0,timeout:6e4,stdio:`pipe`}),s=``,c=``;o.stdout?.on(`data`,e=>{s+=e.toString(`utf-8`)}),o.stderr?.on(`data`,e=>{c+=e.toString(`utf-8`)}),o.on(`close`,(r,i)=>{let{stdout:a,stderr:o,truncated:l}=As(s,c),u={success:r===0&&i===null,hook:`setup`,command:t,exitCode:r,signal:i,stdout:a,stderr:o,truncated:l||void 0};u.success?j.info({pluginId:e.pluginId},`Setup hook succeeded`):j.error({pluginId:e.pluginId,exitCode:r,signal:i,stderr:o?.slice(0,512)},`Setup hook failed`),n?.(u)}),o.on(`error`,r=>{j.error({pluginId:e.pluginId,err:r},`Setup hook spawn error`),n?.({success:!1,hook:`setup`,command:t,error:r.message})})}const Ns=C(`@x-otto/coding:plugin-lifecycle`),Ps=`plugin_lifecycle`,Fs=new Set;async function Is(e,t,n){let r=t.get(Ps)?.setupDone??[],i=new Map(r.map(e=>[e.id,e.version])),a=new Set(e.map(e=>e.id));for(let e of i.keys())a.has(e)||i.delete(e);let o=!1;for(let r of e){let e=i.get(r.id),a=r.manifest.version,s=r.manifest.scripts?.setup;if(!s){(e===void 0||e!==a)&&(i.set(r.id,a),o=!0);continue}if(!(e!==void 0&&e===a)){if(E(r).gated){Ns.info({pluginId:r.id},`Setup hook deferred: plugin not yet trusted`);continue}Fs.has(r.id)||(Fs.add(r.id),Ms({pluginDir:r.dir,pluginId:r.id,workspaceDir:n},s,e=>{Fs.delete(r.id),i.set(r.id,a),Ls(t,i)},Vt))}}o&&await Ls(t,i)}async function Ls(e,t){let n=[...t].map(([e,t])=>({id:e,version:t}));await e.persist({[Ps]:{setupDone:n}})}function Rs(e,t){let n;try{n=Jr(t)}catch{return!1}let r;try{r=Jr(e)}catch{r=e}return r===n||r.startsWith(n+We)}const M=C(`@x-otto/coding:plugin-i18n-loader`),zs=/^([a-zA-Z0-9_-]+)\.json$/;function Bs(e){return Buffer.byteLength(e,`utf8`)<=En?e:`${Buffer.from(e,`utf8`).subarray(0,En).toString(`utf8`)}…`}function Vs(e,t,n){let r=new Map,i=S(t,n);if(!Rs(i,t))return M.warn({pluginId:e,i18nDir:n},`i18nDir resolves outside plugin dir, skipped`),r;let a;try{a=Kr(i)}catch{return r}let o=a.filter(e=>zs.test(e)).sort();o.length>Tn&&(M.warn({pluginId:e,i18nDir:n,declared:o.length,limit:Tn},`plugin i18nDir declares more locale files than the per-plugin limit, truncated`),o=o.slice(0,Tn));for(let n of o){let a=zs.exec(n)?.[1];if(!a)continue;let o=S(i,n);if(!Rs(o,t)){M.warn({pluginId:e,filename:n},`i18nDir locale file resolves outside plugin dir, skipped`);continue}let s;try{s=k(o,`utf8`)}catch(t){M.warn({pluginId:e,filename:n,err:String(t)},`i18nDir locale file read failed, skipped`);continue}if(Buffer.byteLength(s,`utf8`)>wn){M.warn({pluginId:e,filename:n,limit:wn},`i18nDir locale file exceeds byte limit, skipped`);continue}let c;try{c=JSON.parse(s)}catch(t){M.warn({pluginId:e,filename:n,err:String(t)},`i18nDir locale file is not valid JSON, skipped`);continue}if(typeof c!=`object`||!c||Array.isArray(c)){M.warn({pluginId:e,filename:n},`i18nDir locale file is not a flat object, skipped`);continue}for(let[e,t]of Object.entries(c)){if(typeof t!=`string`)continue;let n=r.get(e)??{};n[a]=t,r.set(e,n)}}return r}function Hs(e){let t=[];for(let n of e){if(E(n).gated)continue;let e=n.manifest.contributes?.i18nDir,r=n.manifest.contributes?.i18n;if(!e&&!r?.length)continue;let i=e?Vs(n.id,n.dir,e):new Map;if(r?.length)for(let e of r){let t=i.get(e.id)??{};for(let[r,i]of Object.entries(e.translations))r in t&&M.debug({pluginId:n.id,id:e.id,locale:r},`i18n inline entry overrides locale dir value`),t[r]=i;i.set(e.id,t)}let a=[...i.keys()];a.length>Cn&&(M.warn({pluginId:n.id,declared:a.length,limit:Cn},`plugin declares more i18n entries than the per-plugin limit, truncated`),a=a.slice(0,Cn));for(let e of a){let r=i.get(e);if(!r)continue;let a={};for(let[e,t]of Object.entries(r))a[e]=Bs(t);t.push({pluginId:n.id,id:e,translations:a})}}return t}const Us=C(`@x-otto/coding:declarative-agents`);function Ws(e){return{...e,defaultTools:e.defaultTools?.length?Or(e.defaultTools):e.defaultTools,disallowedTools:e.disallowedTools?.length?Or(e.disallowedTools):e.disallowedTools}}function Gs(e,t){let n=et(e);if(!n)return Us.warn({sourcePath:t},`Agent definition missing frontmatter, skipped`),null;let{fields:r,body:i}=n,a=r.get(`name`),o=r.get(`description`);if(!a||!o||!i)return Us.warn({sourcePath:t},`Agent definition requires name/description/body, skipped`),null;let s=Qe(r.get(`tools`)),c=Number.parseInt(r.get(`maxtoolturns`)??``,10),l=Number.parseInt(r.get(`maxtoolturnextensions`)??``,10),u=r.get(`prompt-mode`),d=Qe(r.get(`disallowed-tools`)),f=r.get(`allow-subagents`)===`true`?!0:r.get(`allow-subagents`)===`false`?!1:void 0;return{name:a,description:o,taskTypes:Qe(r.get(`tasktypes`))??[o],capabilities:Qe(r.get(`capabilities`))??[],systemPromptTemplate:i,promptMode:u===`append`||u===`replace`?u:void 0,defaultTools:s,disallowedTools:d?.length?d:void 0,preferredModelTier:r.get(`slot`)??r.get(`tier`),defaultMaxToolTurns:Number.isInteger(c)?c:void 0,defaultMaxToolTurnExtensions:Number.isInteger(l)?l:void 0,allowSubagents:f}}async function Ks(e,t){let{homedir:n}=await import(`node:os`),{join:r}=await import(`node:path`),i=t?.globalDir??r(n(),`.otto`,`agents`),a=r(e,`.otto`,`agents`),s=(t?.plugins??Vn({cwd:e,homedir:n()})).filter(e=>e.manifest.contributes?.agents!==!1).filter(e=>!E(e).gated).map(e=>({dir:r(e.dir,`agents`),claude:!1})),c=o(),l=c&&!br(e).gated,u=[...s,...c?[{dir:r(n(),`.claude`,`agents`),claude:!0}]:[],{dir:i,claude:!1},...l?[{dir:r(e,`.claude`,`agents`),claude:!0}]:[],{dir:a,claude:!1}],d=new Map;for(let{dir:e,claude:t}of u)for(let n of await qs(e))d.set(n.name,t?Ws(n):n);let f=[...d.values()];return f.length>0&&Us.info(`Loaded %d declarative agent(s): %s`,f.length,f.map(e=>e.name).join(`, `)),f}async function qs(e){let{readFile:t,readdir:n}=await import(`node:fs/promises`),{join:r}=await import(`node:path`),i;try{i=await n(e)}catch{return[]}let a=[];for(let n of i.filter(e=>e.endsWith(`.md`)).sort()){let i=r(e,n);try{let e=Gs(await t(i,`utf-8`),i);e&&a.push(e)}catch(e){Us.warn({sourcePath:i,err:e},`Failed to read agent definition, skipped`)}}return a}const Js=C(`@x-otto/coding:declarative-teams`),Ys=new Set([`handoff`,`sequential`,`parallel`,`hierarchical`,`router`]);function Xs(e){if(!e)return;let t=[];for(let n of e.split(`|`)){let[e,r]=n.split(/→|->/);if(e===void 0||r===void 0)continue;let i=e.split(`,`).map(e=>e.trim().toLowerCase()).filter(e=>e!==``),a=r.trim();i.length>0&&a!==``&&t.push({keywords:i,agentId:a})}return t.length>0?t:void 0}function Zs(e,t){let n=et(e);if(!n)return Js.warn({sourcePath:t},`Team definition missing frontmatter, skipped`),null;let{fields:r}=n,i=r.get(`name`),a=r.get(`pattern`),o=Qe(r.get(`agents`));if(!i||!a||!Ys.has(a)||!o||o.length===0)return Js.warn({sourcePath:t},`Team definition requires name, valid pattern and non-empty agents, skipped`),null;let s=Number.parseInt(r.get(`maxhandoffdepth`)??``,10);return{name:i,pattern:a,agentNames:o,pipeline:Qe(r.get(`pipeline`)),supervisorId:r.get(`supervisor`),entryAgentId:r.get(`entry`),routerStrategy:r.get(`router`),rules:Xs(r.get(`rules`)),maxHandoffDepth:Number.isInteger(s)?s:void 0}}async function Qs(e,t){let{homedir:n}=await import(`node:os`),{join:r}=await import(`node:path`),i=t?.globalDir??r(n(),`.otto`,`teams`),a=r(e,`.otto`,`teams`),o=new Map;for(let e of[i,a])for(let t of await $s(e))o.set(t.name,t);let s=[...o.values()];return s.length>0&&Js.info(`Loaded %d declarative team(s): %s`,s.length,s.map(e=>e.name).join(`, `)),s}async function $s(e){let{readFile:t,readdir:n}=await import(`node:fs/promises`),{join:r}=await import(`node:path`),i;try{i=await n(e)}catch{return[]}let a=[];for(let n of i.filter(e=>e.endsWith(`.md`)).sort()){let i=r(e,n);try{let e=Zs(await t(i,`utf-8`),i);e&&a.push(e)}catch(e){Js.warn({sourcePath:i,err:e},`Failed to read team definition, skipped`)}}return a}var ec=class{reloadQueue=Promise.resolve();constructor(e,t,n,r,i,a,o,s,c,l){this.settings=e,this.mcp=t,this.skills=n,this.pluginModules=r,this.pluginProviders=i,this.tools=a,this.modelCatalog=o,this.workspaceDir=s,this.activePlugins=c,this.i18n=l}async reload(){let e=this.reloadQueue.then(()=>this.reloadSerial());return this.reloadQueue=e.catch(()=>void 0),e}async reloadSerial(){await this.settings.load(),Is(this.activePlugins(),this.settings,this.workspaceDir),await this.mcp.reload(),this.skills&&(this.skills.updatePluginDirs(this.activePlugins().filter(e=>e.manifest.contributes?.skills!==!1).filter(e=>!E(e).gated).map(e=>({id:e.id,dir:x(e.dir,`skills`)}))),await this.skills.discover());let e=Hs(this.activePlugins());this.i18n.register(e);let t=(await this.modelCatalog.refresh().catch(()=>[])).reduce((e,t)=>e+(t.added??0),0),n=await Ks(this.workspaceDir,{plugins:this.activePlugins()}),r=await Qs(this.workspaceDir),i=await this.pluginModules.reload(new Set(n.map(e=>e.name)));n.push(...i);let a=await this.pluginProviders.reload();return{mcpTools:this.tools.getAvailable(`full`).filter(e=>e.name.startsWith(`mcp__`)).length,models:t,agents:n.length,teamCount:r.length,agentProfiles:n,teamDeclarations:r,pendingProviderCapabilities:a.pendingCapabilityPluginIds,i18nEntries:e.length}}};const tc=C(`@x-otto/coding:panel-backend-controller`);var nc=class{stateListeners=new Map;statusListeners=new Map;inProcessHandlers=new Map;subscribedManager=null;constructor(e){this.deps=e}registerInProcessBackend(e,t){this.inProcessHandlers.set(e,t);let n=this.statusListeners.get(e);if(n)for(let e of n)e(`ready`)}unregisterInProcessBackend(e){this.inProcessHandlers.delete(e)}resolveServerForPlugin(e){if(this.inProcessHandlers.has(e))return{ok:!0};let t=this.deps.getActivePlugins().find(t=>t.id===e);if(!t)return{ok:!1,reason:`plugin "${e}" not found or not active`};if(!t.manifest.capabilities?.includes(`panel.backend`))return{ok:!1,reason:`plugin "${e}" does not declare capabilities:["panel.backend"]`};let n=E(t);if(n.pendingCapabilities.includes(`panel.backend`))return{ok:!1,reason:`plugin "${e}" capability "panel.backend" declared but not yet granted`};if(n.gated)return{ok:!1,reason:`plugin "${e}" is untrusted`};let r=this.deps.mcpController.listEffectiveServers(),i=Object.entries(r).filter(([,t])=>t.pluginId===e);return i.length===0?{ok:!1,reason:`plugin "${e}" has no associated MCP server`}:(i.length>1&&tc.warn({pluginId:e,serverNames:i.map(([e])=>e)},`plugin contributes multiple MCP servers; panel backend uses the first match (multi-server routing not yet supported)`),{ok:!0,serverName:i[0][0]})}async call(e,t,n,r){let i=this.inProcessHandlers.get(e);if(i)return i(t,n);let a=this.resolveServerForPlugin(e);if(!a.ok||!a.serverName)throw Error(a.reason??`cannot resolve backend server for plugin "${e}"`);let o=this.deps.mcpController.getMcpClient(a.serverName);if(!o)throw Error(`MCP server "${a.serverName}" for plugin "${e}" is not connected`);let s=r?.operationId?{...n,__operationId:r.operationId}:n;return o.callRaw(t,s,r?.signal)}async cancel(e,t){if(this.inProcessHandlers.has(e))return;let n=this.resolveServerForPlugin(e);if(!n.ok||!n.serverName)return;let r=this.deps.mcpController.getMcpClient(n.serverName);r&&await r.callRaw(`backend/cancel`,{id:t}).catch(()=>void 0)}subscribeState(e,t){return this.ensureNotificationSubscription(),this.stateListeners.has(e)||this.stateListeners.set(e,new Set),this.stateListeners.get(e).add(t),()=>{this.stateListeners.get(e)?.delete(t)}}onStatusChange(e,t){return this.ensureNotificationSubscription(),this.statusListeners.has(e)||this.statusListeners.set(e,new Set),this.statusListeners.get(e).add(t),()=>{this.statusListeners.get(e)?.delete(t)}}getStatus(e){if(this.inProcessHandlers.has(e))return`ready`;let t=this.resolveServerForPlugin(e);if(!t.ok||!t.serverName||this.deps.mcpController.listEffectiveServers()[t.serverName]?.disabled)return`disabled`;let n=this.deps.mcpController.getMcpClient(t.serverName);if(!n)return`crashed`;let r=n.getStatus();return r===`ready`?`ready`:r===`connecting`||r===`reconnecting`?`connecting`:`crashed`}notifyReload(){this.ensureNotificationSubscription();for(let[e,t]of this.statusListeners){if(t.size===0)continue;let n=this.getStatus(e);for(let e of t)e(n)}}ensureNotificationSubscription(){let e=this.deps.mcpController.manager;if(this.subscribedManager===e||(this.subscribedManager=e,!e))return;e.on(`server.notification`,({name:e,method:t,params:n})=>{if(t!==`backend/state`)return;let r=this.pluginIdForServer(e);if(!r)return;let i=this.stateListeners.get(r);if(!(!i||i.size===0))for(let e of i)e(n??{})});let t=e=>{let t=this.pluginIdForServer(e);if(!t)return;let n=this.statusListeners.get(t);if(!n||n.size===0)return;let r=this.getStatus(t);for(let e of n)e(r)};e.on(`server.connected`,({name:e})=>t(e)),e.on(`server.disconnected`,({name:e})=>t(e))}pluginIdForServer(e){return this.deps.mcpController.listEffectiveServers()[e]?.pluginId}};const rc=C(`@x-otto/coding:plugin-log-writer`);function ic(){return S(n,`plugin-logs`)}function ac(e){return Sn.test(e)?x(ic(),`${e}.jsonl`):(rc.warn({pluginId:e},`plugin id failed kebab-case validation, skipping log path resolution`),null)}function oc(e){let t;try{t=Zr(e).size}catch{return}if(!(t<=5242880))try{let t=k(e,`utf8`),n=Math.floor(t.length/2),r=t.indexOf(`
|
|
13
|
-
`,n);A(e,r>=0?t.slice(r+1):t.slice(n))}catch(t){rc.warn({path:e,err:String(t)},`plugin log truncation failed (fail-soft)`)}}function sc(e,t,n){if(!s())try{let r=ac(e);if(!r)return;let i=ic();D(i)||O(i,{recursive:!0}),oc(r),Br(r,`${JSON.stringify({ts:Date.now(),level:t,pluginId:e,msg:n})}\n`)}catch(t){rc.warn({pluginId:e,err:String(t)},`plugin log append failed (fail-soft)`)}}const cc=C(`@x-otto/coding:plugin-tool-wiring`);function N(e,t){return`plugin:${e}:${t}`}function lc(e){let t=e.split(`:`);return t.length<3||t[0]!==`plugin`?null:t[1]||null}function uc(e){let t=e?.content;return typeof t==`string`?t:Array.isArray(t)?t.map(e=>e&&typeof e==`object`&&`text`in e?String(e.text):``).join(``):``}const P={preToolUse:`tool.execute.before`,postToolUse:`tool.execute.after`,userPromptSubmit:`chat.message.before`,sessionStart:`session.created`,stop:`stream.end`,sessionRestored:`session.restored`,sessionDeleted:`session.deleted`,sessionIdle:`session.idle`,sessionError:`session.error`,streamStart:`stream.start`,compactionPending:`compaction.before`,compactionOccurred:`compaction.after`,taskCreated:`task.created`,taskStarted:`task.started`,taskCompleted:`task.completed`,taskFailed:`task.failed`};function dc(e,t){let n=[];if(t.preToolUse){let r=t.preToolUse;n.push(y({name:N(e,`preToolUse`),timing:P.preToolUse,handle:async(t,n)=>{let i=await r({toolName:t.toolName,input:t.args});i&&(i.decision===`deny`?(n.decision=`deny`,n.cancelled=!0,n.cancelReason=i.reason??`denied by plugin ${e}`):i.decision===`ask`&&(n.decision=`ask`,n.decisionReason=i.reason??`requires approval (plugin ${e})`))}}))}if(t.postToolUse){let r=t.postToolUse;n.push(y({name:N(e,`postToolUse`),timing:P.postToolUse,handle:async e=>{await r({toolName:e.toolName,input:e.args,result:e.result})}}))}if(t.userPromptSubmit){let r=t.userPromptSubmit;n.push(y({name:N(e,`userPromptSubmit`),timing:P.userPromptSubmit,handle:async e=>{await r({prompt:uc(e.message)})}}))}if(t.sessionStart){let r=t.sessionStart;n.push(y({name:N(e,`sessionStart`),timing:P.sessionStart,handle:async()=>{await r()}}))}if(t.stop){let r=t.stop;n.push(y({name:N(e,`stop`),timing:P.stop,handle:async()=>{await r()}}))}if(t.sessionRestored){let r=t.sessionRestored;n.push(y({name:N(e,`sessionRestored`),timing:P.sessionRestored,handle:async e=>{await r({sessionId:e.sessionId})}}))}if(t.sessionDeleted){let r=t.sessionDeleted;n.push(y({name:N(e,`sessionDeleted`),timing:P.sessionDeleted,handle:async e=>{await r({sessionId:e.sessionId})}}))}if(t.sessionIdle){let r=t.sessionIdle;n.push(y({name:N(e,`sessionIdle`),timing:P.sessionIdle,handle:async e=>{await r({sessionId:e.sessionId})}}))}if(t.sessionError){let r=t.sessionError;n.push(y({name:N(e,`sessionError`),timing:P.sessionError,handle:async e=>{await r({sessionId:e.sessionId,error:e.error})}}))}if(t.streamStart){let r=t.streamStart;n.push(y({name:N(e,`streamStart`),timing:P.streamStart,handle:async e=>{await r({sessionId:e.sessionId,model:e.model})}}))}if(t.compactionPending){let r=t.compactionPending;n.push(y({name:N(e,`compactionPending`),timing:P.compactionPending,handle:async e=>{await r({sessionId:e.sessionId,messageCount:e.messageCount})}}))}if(t.compactionOccurred){let r=t.compactionOccurred;n.push(y({name:N(e,`compactionOccurred`),timing:P.compactionOccurred,handle:async e=>{await r({sessionId:e.sessionId,retainedCount:e.retainedCount})}}))}if(t.taskCreated){let r=t.taskCreated;n.push(y({name:N(e,`taskCreated`),timing:P.taskCreated,handle:async e=>{await r({taskId:e.task.id})}}))}if(t.taskStarted){let r=t.taskStarted;n.push(y({name:N(e,`taskStarted`),timing:P.taskStarted,handle:async e=>{await r({taskId:e.task.id,agent:e.agent})}}))}if(t.taskCompleted){let r=t.taskCompleted;n.push(y({name:N(e,`taskCompleted`),timing:P.taskCompleted,handle:async e=>{await r({taskId:e.task.id,status:e.task.status,durationMs:e.result.durationMs,tokenUsage:e.result.tokenUsage})}}))}if(t.taskFailed){let r=t.taskFailed;n.push(y({name:N(e,`taskFailed`),timing:P.taskFailed,handle:async e=>{await r({taskId:e.task.id,error:e.error.message})}}))}return n}function fc(e,t,n,r){return r.map(r=>({name:r.name,description:r.description,argumentHint:r.argumentHint,allowedTools:r.allowedTools,model:r.model,body:r.body,source:`plugin`,scope:t===`bundled`?`project`:t,pluginId:e,filePath:`${n}#computed:${r.name}`}))}function pc(e){return e.map(e=>({name:e.name,description:e.description,taskTypes:e.taskTypes??[],capabilities:e.capabilities??[],systemPromptTemplate:e.systemPromptTemplate,...e.promptMode?{promptMode:e.promptMode}:{},...e.defaultTools?{defaultTools:e.defaultTools}:{},...e.disallowedTools?{disallowedTools:e.disallowedTools}:{},...e.preferredModelTier?{preferredModelTier:e.preferredModelTier}:{},...e.allowSubagents===void 0?{}:{allowSubagents:e.allowSubagents}}))}function mc(e,t,n){return n.map(n=>({definition:{metadata:{name:n.name,description:n.description??``},body:n.body,directory:t,filePath:`${t}#computed:${n.name}`,supportingFiles:[]},source:{type:`plugin`,root:t,id:e}}))}function hc(e,t){return t instanceof Ge?t.pluginSource===void 0?new t.constructor(t.message,{code:t.code,cause:t.cause,status:t.status,headers:t.headers,errorType:t.errorType,pluginSource:e}):t:new Ke(t instanceof Error?t.message:String(t),{code:`PROVIDER_PLUGIN_ERROR`,cause:t instanceof Error?t:void 0,pluginSource:e})}function gc(e,t){return()=>{let n=t();return{...n,async*converse(t,r,i,a){try{for await(let o of n.converse(t,r,i,a))o.type===`error`?yield{type:`error`,error:hc(e,o.error)}:yield o}catch(t){throw hc(e,t)}}}}}function _c(e,t){try{return t()}catch(t){let n=String(t);return cc.warn({pluginId:e,err:n},`plugin oauthProviderFactory threw, skipped`),sc(e,`warn`,`oauthProviderFactory threw, skipped: ${n}`),null}}function vc(e){return e&&typeof e==`object`&&Array.isArray(e.content)?e:{content:[{type:`text`,text:typeof e==`string`?e:JSON.stringify(e??null)}]}}function yc(e,t,n){let r=t;if(!r||typeof r!=`object`)return cc.warn({pluginId:e},`plugin tool entry is not an object, skipped`),null;if(typeof r.name!=`string`||!r.name)return cc.warn({pluginId:e},`plugin tool missing valid name, skipped`),null;if(typeof r.execute!=`function`)return cc.warn({pluginId:e,tool:r.name},`plugin tool missing execute function, skipped`),null;if(!r.parameters||typeof r.parameters.safeParse!=`function`)return cc.warn({pluginId:e,tool:r.name},`plugin tool missing valid parameters.safeParse, skipped`),null;let i=r.name,a=r.description??``,o=r.parameters,s=r.execute;return{name:i,description:a,parameters:o,async execute(t){try{let r={pluginId:e,workspaceDir:n?.workspaceDir??``,logger:n?.logger??{info:()=>{},warn:()=>{},error:()=>{}},host:n?.host,signal:t.signal,storage:n?.storage},i=vc(await s(t.params,r));return i.isError?{...i,pluginSource:e}:i}catch(t){throw t instanceof Error&&Object.assign(t,{pluginSource:e}),t}}}}function bc(e,t){let n=[],r=async(t,n)=>{try{await t.onEvent(n)}catch(n){cc.warn({pluginId:e,monitorId:t.id,err:String(n)},`plugin monitor onEvent threw, isolated`)}};for(let i of t)n.push(y({name:N(e,`monitor:${i.id}:stream.end`),timing:`stream.end`,handle:async e=>{e.tokenUsage&&await r(i,{type:`turn.completed`,sessionId:e.sessionId,tokens:{input:e.tokenUsage.input,output:e.tokenUsage.output}})}})),n.push(y({name:N(e,`monitor:${i.id}:compaction.after`),timing:`compaction.after`,handle:async e=>{await r(i,{type:`compaction.occurred`,sessionId:e.sessionId})}})),n.push(y({name:N(e,`monitor:${i.id}:session.error`),timing:`session.error`,handle:async e=>{await r(i,{type:`error`,sessionId:e.sessionId,message:e.error})}}));return n}function xc(e){return{...e}}var Sc=class{stats=new Map;clock;constructor(e=()=>Date.now()){this.clock=e}ensure(e){let t=this.stats.get(e);return t||(t={pluginId:e,hookTimeouts:0,toolTimeouts:0},this.stats.set(e,t)),t}recordHookTimeout(e,t){let n=this.ensure(e);n.hookTimeouts++,n.lastTimeoutHook=t}recordToolTimeout(e){let t=this.ensure(e);t.toolTimeouts++}recordError(e,t){let n=this.ensure(e);n.lastError={message:t,timestamp:this.clock()}}query(e){let t=this.stats.get(e);return t?xc(t):{pluginId:e,hookTimeouts:0,toolTimeouts:0}}all(){return[...this.stats.values()].map(xc)}clear(){this.stats.clear()}};function Cc(e){return new Sc(e)}const wc=3600*1e3;function Tc(){return{authorizedSessionIds:new Set,readCountThisEpoch:0,llmCountThisEpoch:0,llmCallTimes:[],notifyTimes:[]}}var Ec=class{states=new Map;constructor(e=()=>Date.now()){this.now=e}stateOf(e){let t=this.states.get(e);return t||(t=Tc(),this.states.set(e,t)),t}onNotifyDelivered(e,t){let n=this.stateOf(e);n.authorizedSessionIds.add(t),n.readCountThisEpoch=0,n.llmCountThisEpoch=0}isSessionAuthorized(e,t){return this.stateOf(e).authorizedSessionIds.has(t)}tryConsumeRead(e){let t=this.stateOf(e);return t.readCountThisEpoch>=1?!1:(t.readCountThisEpoch+=1,!0)}tryConsumeLlm(e){let t=this.stateOf(e);if(t.llmCountThisEpoch>=2)return{ok:!1,reason:`epoch`};let n=this.now()-wc;return t.llmCallTimes=t.llmCallTimes.filter(e=>e>n),t.llmCallTimes.length>=30?{ok:!1,reason:`hourly`}:(t.llmCountThisEpoch+=1,t.llmCallTimes.push(this.now()),{ok:!0})}tryConsumeNotify(e){let t=this.stateOf(e),n=this.now()-wc;return t.notifyTimes=t.notifyTimes.filter(e=>e>n),t.notifyTimes.length>=20?!1:(t.notifyTimes.push(this.now()),!0)}reset(e){this.states.delete(e)}};function Dc(e){return e.kind===`session`?0:1}var Oc=class{queue=[];inFlightId=null;maxPending;maxPerPlugin;ttlMs;now;constructor(e={}){this.maxPending=e.maxPending??8,this.maxPerPlugin=e.maxPerPlugin??1,this.ttlMs=e.ttlMs??3e5,this.now=e.now??Date.now}enqueue(e){if(this.sweepExpired(),this.queue.length>=this.maxPending)return{accepted:!1,reason:`queue-full`};if(e.origin.kind===`plugin`){let t=e.origin.pluginId;if(this.queue.filter(e=>e.request.origin.kind===`plugin`&&e.request.origin.pluginId===t).length>=this.maxPerPlugin)return{accepted:!1,reason:`plugin-concurrency`}}let t,n=new Promise(e=>{t=e}),r={...e,enqueuedAt:this.now()};return this.queue.push({request:r,resolve:t,dispatched:!1}),this.queue.sort((e,t)=>Dc(e.request.origin)-Dc(t.request.origin)||e.request.enqueuedAt-t.request.enqueuedAt),{accepted:!0,answer:n}}async waitForTurn(e,t=25){for(;;){if(this.takeNext()?.id===e)return!0;if(!this.queue.some(t=>t.request.id===e))return!1;await new Promise(e=>setTimeout(e,t))}}takeNext(){if(this.sweepExpired(),this.inFlightId!==null)return;let e=this.queue.find(e=>!e.dispatched);if(e)return e.dispatched=!0,this.inFlightId=e.request.id,e.request}settle(e,t){let n=this.queue.findIndex(t=>t.request.id===e);if(n===-1)return!1;let[r]=this.queue.splice(n,1);return this.inFlightId===e&&(this.inFlightId=null),r.resolve(t),!0}release(e){let t=this.queue.findIndex(t=>t.request.id===e);return t===-1?!1:(this.queue.splice(t,1),this.inFlightId===e&&(this.inFlightId=null),!0)}get hasInFlight(){return this.inFlightId!==null}get size(){return this.queue.length}sweepExpired(){let e=this.now()-this.ttlMs;for(let t=this.queue.length-1;t>=0;t--){let n=this.queue[t];n.dispatched||n.request.enqueuedAt>e||(this.queue.splice(t,1),n.resolve(kc(n.request.question)))}}shutdown(){let e=this.queue.splice(0,this.queue.length);this.inFlightId=null;for(let t of e)t.resolve(kc(t.request.question))}};function kc(e){return{answer:``,acceptedRecommendation:!1,resolvedBy:`human`}}const F={start:`service.start`,started:`service.started`,stop:`service.stop`,stopped:`service.stopped`,hostCall:`service.hostCall`,hostResult:`service.hostResult`,crashed:`service.crashed`,notify:`service.notify`};function Ac(){return`const { parentPort, workerData } = require('worker_threads')
|
|
12
|
+
`}),a.onExit(r=>{clearTimeout(o);let{stdout:i,stderr:a,truncated:l}=Ns(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=ji(t,{cwd:e.pluginDir,env:js(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}=Ns(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 Is=C(`@x-otto/coding:plugin-lifecycle`),Ls=`plugin_lifecycle`,Rs=new Set;async function zs(e,t,n){let r=t.get(Ls)?.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){Is.info({pluginId:r.id},`Setup hook deferred: plugin not yet trusted`);continue}Rs.has(r.id)||(Rs.add(r.id),Fs({pluginDir:r.dir,pluginId:r.id,workspaceDir:n},s,e=>{Rs.delete(r.id),i.set(r.id,a),Bs(t,i)},Ut))}}o&&await Bs(t,i)}async function Bs(e,t){let n=[...t].map(([e,t])=>({id:e,version:t}));await e.persist({[Ls]:{setupDone:n}})}function Vs(e,t){let n;try{n=Zr(t)}catch{return!1}let r;try{r=Zr(e)}catch{r=e}return r===n||r.startsWith(n+Ge)}const j=C(`@x-otto/coding:plugin-i18n-loader`),Hs=/^([a-zA-Z0-9_-]+)\.json$/;function Us(e){return Buffer.byteLength(e,`utf8`)<=On?e:`${Buffer.from(e,`utf8`).subarray(0,On).toString(`utf8`)}…`}function Ws(e,t,n){let r=new Map,i=S(t,n);if(!Vs(i,t))return j.warn({pluginId:e,i18nDir:n},`i18nDir resolves outside plugin dir, skipped`),r;let a;try{a=Yr(i)}catch{return r}let o=a.filter(e=>Hs.test(e)).sort();o.length>Dn&&(j.warn({pluginId:e,i18nDir:n,declared:o.length,limit:Dn},`plugin i18nDir declares more locale files than the per-plugin limit, truncated`),o=o.slice(0,Dn));for(let n of o){let a=Hs.exec(n)?.[1];if(!a)continue;let o=S(i,n);if(!Vs(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`)>En){j.warn({pluginId:e,filename:n,limit:En},`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 Gs(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?Ws(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>Tn&&(j.warn({pluginId:n.id,declared:a.length,limit:Tn},`plugin declares more i18n entries than the per-plugin limit, truncated`),a=a.slice(0,Tn));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]=Us(t);t.push({pluginId:n.id,id:e,translations:a})}}return t}const Ks=C(`@x-otto/coding:declarative-agents`);function qs(e){return{...e,defaultTools:e.defaultTools?.length?Ar(e.defaultTools):e.defaultTools,disallowedTools:e.disallowedTools?.length?Ar(e.disallowedTools):e.disallowedTools}}function Js(e,t){let n=tt(e);if(!n)return Ks.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 Ks.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 Ys(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??Un({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&&!Sr(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 Xs(e))d.set(n.name,t?qs(n):n);let f=[...d.values()];return f.length>0&&Ks.info(`Loaded %d declarative agent(s): %s`,f.length,f.map(e=>e.name).join(`, `)),f}async function Xs(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=Js(await t(i,`utf-8`),i);e&&a.push(e)}catch(e){Ks.warn({sourcePath:i,err:e},`Failed to read agent definition, skipped`)}}return a}const Zs=C(`@x-otto/coding:declarative-teams`),Qs=new Set([`handoff`,`sequential`,`parallel`,`hierarchical`,`router`]);function $s(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 ec(e,t){let n=tt(e);if(!n)return Zs.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||!Qs.has(a)||!o||o.length===0)return Zs.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:$s(r.get(`rules`)),maxHandoffDepth:Number.isInteger(s)?s:void 0}}async function tc(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 nc(e))o.set(t.name,t);let s=[...o.values()];return s.length>0&&Zs.info(`Loaded %d declarative team(s): %s`,s.length,s.map(e=>e.name).join(`, `)),s}async function nc(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=ec(await t(i,`utf-8`),i);e&&a.push(e)}catch(e){Zs.warn({sourcePath:i,err:e},`Failed to read team definition, skipped`)}}return a}var rc=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(),zs(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=Gs(this.activePlugins());this.i18n.register(e);let t=(await this.modelCatalog.refresh().catch(()=>[])).reduce((e,t)=>e+(t.added??0),0),n=await Ys(this.workspaceDir,{plugins:this.activePlugins()}),r=await tc(this.workspaceDir),i=[],a=[];try{a=await this.pluginModules.reload(new Set(n.map(e=>e.name)))}catch(e){i.push({path:`pluginModules`,error:e instanceof Error?e.message:String(e)})}n.push(...a);let o={pendingCapabilityPluginIds:[]};try{o=await this.pluginProviders.reload()}catch(e){i.push({path:`pluginProviders`,error:e instanceof Error?e.message:String(e)})}return{mcpTools:this.tools.getAvailable(`full`).filter(e=>e.name.startsWith(`mcp__`)).length,models:t,agents:n.length,teamCount:r.length,agentProfiles:n,teamDeclarations:r,pendingProviderCapabilities:o.pendingCapabilityPluginIds,i18nEntries:e.length,...i.length>0?{reloadFailures:i}:{}}}};const ic=C(`@x-otto/coding:panel-backend-controller`);var ac=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&&ic.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 oc=C(`@x-otto/coding:plugin-log-writer`);function sc(){return S(n,`plugin-logs`)}function cc(e){return wn.test(e)?x(sc(),`${e}.jsonl`):(oc.warn({pluginId:e},`plugin id failed kebab-case validation, skipping log path resolution`),null)}function lc(e){let t;try{t=ei(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){oc.warn({path:e,err:String(t)},`plugin log truncation failed (fail-soft)`)}}function uc(e,t,n){if(!s())try{let r=cc(e);if(!r)return;let i=sc();D(i)||Kr(i,{recursive:!0}),lc(r),Hr(r,`${JSON.stringify({ts:Date.now(),level:t,pluginId:e,msg:n})}\n`)}catch(t){oc.warn({pluginId:e,err:String(t)},`plugin log append failed (fail-soft)`)}}const dc=C(`@x-otto/coding:plugin-tool-wiring`);function M(e,t){return`plugin:${e}:${t}`}function fc(e){let t=e.split(`:`);return t.length<3||t[0]!==`plugin`?null:t[1]||null}function pc(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 mc(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:pc(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 hc(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 gc(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 _c(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 vc(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 yc(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:vc(e,o.error)}:yield o}catch(t){throw vc(e,t)}}}}}function bc(e,t){try{return t()}catch(t){let n=String(t);return dc.warn({pluginId:e,err:n},`plugin oauthProviderFactory threw, skipped`),uc(e,`warn`,`oauthProviderFactory threw, skipped: ${n}`),null}}function xc(e){return e&&typeof e==`object`&&Array.isArray(e.content)?e:{content:[{type:`text`,text:typeof e==`string`?e:JSON.stringify(e??null)}]}}function Sc(e,t,n){let r=t;if(!r||typeof r!=`object`)return dc.warn({pluginId:e},`plugin tool entry is not an object, skipped`),null;if(typeof r.name!=`string`||!r.name)return dc.warn({pluginId:e},`plugin tool missing valid name, skipped`),null;if(typeof r.execute!=`function`)return dc.warn({pluginId:e,tool:r.name},`plugin tool missing execute function, skipped`),null;if(!r.parameters||typeof r.parameters.safeParse!=`function`)return dc.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=xc(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 Cc(e,t){let n=[],r=async(t,n)=>{try{await t.onEvent(n)}catch(n){dc.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})}})),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 wc(e){return{...e}}var Tc=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?wc(t):{pluginId:e,hookTimeouts:0,toolTimeouts:0}}all(){return[...this.stats.values()].map(wc)}clear(){this.stats.clear()}};function Ec(e){return new Tc(e)}const Dc=3600*1e3;function Oc(){return{authorizedSessionIds:new Set,readCountThisEpoch:0,llmCountThisEpoch:0,llmCallTimes:[],notifyTimes:[]}}var kc=class{states=new Map;constructor(e=()=>Date.now()){this.now=e}stateOf(e){let t=this.states.get(e);return t||(t=Oc(),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()-Dc;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()-Dc;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 Ac(e){return e.kind===`session`?0:1}var jc=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)=>Ac(e.request.origin)-Ac(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(Mc(n.request.question)))}}shutdown(){let e=this.queue.splice(0,this.queue.length);this.inFlightId=null;for(let t of e)t.resolve(Mc(t.request.question))}};function Mc(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 Nc(){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: '${P.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: '${P.crashed}', error: (err && err.message) || String(err) })
|
|
103
103
|
})
|
|
104
104
|
process.on('unhandledRejection', (err) => {
|
|
105
|
-
__send({ type: '${
|
|
105
|
+
__send({ type: '${P.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 === '${P.hostResult}') {
|
|
110
110
|
const pending = hostCalls.get(msg.callId)
|
|
111
111
|
if (!pending) return
|
|
112
112
|
hostCalls.delete(msg.callId)
|
|
@@ -115,7 +115,7 @@ parentPort.on('message', async (msg) => {
|
|
|
115
115
|
return
|
|
116
116
|
}
|
|
117
117
|
|
|
118
|
-
if (msg.type === '${
|
|
118
|
+
if (msg.type === '${P.start}') {
|
|
119
119
|
try {
|
|
120
120
|
// RFC-365 R3:host-slot 注入槽——service worker 是第三条加载路径,同样是独立 realm
|
|
121
121
|
// 且 entry 落在 tmpdir。与隔离端 entry 同一处理(宿主运行机解析绝对路径 → 消息下发
|
|
@@ -130,7 +130,7 @@ parentPort.on('message', async (msg) => {
|
|
|
130
130
|
const mod = require(msg.compiledPath)
|
|
131
131
|
const factory = mod && (mod.default || mod)
|
|
132
132
|
if (typeof factory !== 'function') {
|
|
133
|
-
__send({ type: '${
|
|
133
|
+
__send({ type: '${P.started}', error: 'plugin entry is not a factory function' })
|
|
134
134
|
return
|
|
135
135
|
}
|
|
136
136
|
// 工厂期 ctx:service 场景下不注入 host(host 只进 service ctx),保持与既有
|
|
@@ -139,7 +139,7 @@ parentPort.on('message', async (msg) => {
|
|
|
139
139
|
const services = Array.isArray(instance && instance.services) ? instance.services : []
|
|
140
140
|
const svc = services.find((s) => s && s.id === msg.serviceId)
|
|
141
141
|
if (!svc || typeof svc.start !== 'function') {
|
|
142
|
-
__send({ type: '${
|
|
142
|
+
__send({ type: '${P.started}', error: 'service not found: ' + msg.serviceId })
|
|
143
143
|
return
|
|
144
144
|
}
|
|
145
145
|
serviceInstance = svc
|
|
@@ -154,9 +154,9 @@ parentPort.on('message', async (msg) => {
|
|
|
154
154
|
workspaceDir: msg.serviceCtx.workspaceDir,
|
|
155
155
|
workspaceKey: msg.serviceCtx.workspaceKey,
|
|
156
156
|
logger: {
|
|
157
|
-
info: (m) => __send({ type: '${
|
|
158
|
-
warn: (m) => __send({ type: '${
|
|
159
|
-
error: (m) => __send({ type: '${
|
|
157
|
+
info: (m) => __send({ type: '${P.hostCall}', callId: 'log', method: 'log.info', params: { msg: String(m) } }),
|
|
158
|
+
warn: (m) => __send({ type: '${P.hostCall}', callId: 'log', method: 'log.warn', params: { msg: String(m) } }),
|
|
159
|
+
error: (m) => __send({ type: '${P.hostCall}', callId: 'log', method: 'log.error', params: { msg: String(m) } }),
|
|
160
160
|
},
|
|
161
161
|
host: buildHost(msg.serviceCtx.hostCapabilities),
|
|
162
162
|
storage,
|
|
@@ -164,37 +164,37 @@ parentPort.on('message', async (msg) => {
|
|
|
164
164
|
// 被动面,真正的数据面是 readTranscript,那才有独立能力门)。
|
|
165
165
|
onNotify: (handler) => { notifyHandler = typeof handler === 'function' ? handler : null },
|
|
166
166
|
})
|
|
167
|
-
__send({ type: '${
|
|
167
|
+
__send({ type: '${P.started}' })
|
|
168
168
|
} catch (err) {
|
|
169
|
-
__send({ type: '${
|
|
169
|
+
__send({ type: '${P.started}', error: (err && err.message) || String(err) })
|
|
170
170
|
}
|
|
171
171
|
return
|
|
172
172
|
}
|
|
173
173
|
|
|
174
|
-
if (msg.type === '${
|
|
174
|
+
if (msg.type === '${P.notify}') {
|
|
175
175
|
// 未注册 handler → 丢弃(服务可能还没 start 完,或根本不关心通知)。
|
|
176
176
|
if (!notifyHandler) return
|
|
177
177
|
try {
|
|
178
178
|
await notifyHandler(msg.notification)
|
|
179
179
|
} catch (err) {
|
|
180
180
|
// 不静默:handler 异常按运行期崩溃上报,宿主据此退避重启(对齐 uncaughtException 纹理)。
|
|
181
|
-
__send({ type: '${
|
|
181
|
+
__send({ type: '${P.crashed}', error: (err && err.message) || String(err) })
|
|
182
182
|
}
|
|
183
183
|
return
|
|
184
184
|
}
|
|
185
185
|
|
|
186
|
-
if (msg.type === '${
|
|
186
|
+
if (msg.type === '${P.stop}') {
|
|
187
187
|
try {
|
|
188
188
|
if (serviceInstance && typeof serviceInstance.stop === 'function') await serviceInstance.stop()
|
|
189
|
-
__send({ type: '${
|
|
189
|
+
__send({ type: '${P.stopped}' })
|
|
190
190
|
} catch (err) {
|
|
191
|
-
__send({ type: '${
|
|
191
|
+
__send({ type: '${P.stopped}', error: (err && err.message) || String(err) })
|
|
192
192
|
}
|
|
193
193
|
return
|
|
194
194
|
}
|
|
195
195
|
})
|
|
196
|
-
`}const jc=e(import.meta.url);let Mc=!1,Nc=()=>jc(`esbuild`);function Pc(){return Nc()}function Fc(){Mc=!0}function Ic(){if(Mc)try{Nc().stop?.()}catch{}}function Lc(e=process){e.once(`exit`,()=>Ic())}const Rc=[`SIGINT`,`SIGTERM`,`SIGHUP`];function zc(e=process){for(let t of Rc){let n=()=>{e.listenerCount(t)>1||(Ic(),e.removeListener(t,n),e.kill?.(e.pid??process.pid,t))};e.on(t,n)}}function Bc(e,t,n){let r,i=!1,a=new Promise((e,n)=>{r=setTimeout(()=>{i=!0,n(Error(`esbuild build timed out after ${t}ms`))},t)});return Promise.race([e,a]).finally(()=>clearTimeout(r)).catch(e=>{throw i&&n(),e})}const I=C(`@x-otto/coding:plugin-module-loader`),L=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=b(Fi(t)),r=L.resolve(`pino`,{paths:[n]});e.pino=r,e[`thread-stream`]=L.resolve(`thread-stream`,{paths:[b(r)]}),e[`jsonc-parser`]=L.resolve(`jsonc-parser`,{paths:[n]}),e[`@x-otto/shared`]=t.startsWith(`file://`)?Fi(t):t;let i=import.meta.resolve(`@x-otto/provider`);e[`@x-otto/provider`]=i.startsWith(`file://`)?Fi(i):i;let a=import.meta.resolve(`@x-otto/interchange`);e[`@x-otto/interchange`]=a.startsWith(`file://`)?Fi(a):a;let o=import.meta.resolve(`@x-otto/env`);e[`@x-otto/env`]=o.startsWith(`file://`)?Fi(o):o}catch(e){I.warn({err:String(e)},`failed to pre-resolve pino/thread-stream/jsonc-parser/@x-otto absolute paths, falling back to bare-specifier external (pre-fix behavior)`)}return e}const Gc=[`pino`,`thread-stream`,`jsonc-parser`],Kc=`otto-host-external`,qc=`__ottoPluginHostExternals`;function Jc(){let e=RegExp(`^(${Gc.join(`|`)})$`);return{name:`otto-plugin-host-slot`,setup(t){t.onResolve({filter:e},e=>({path:e.path,namespace:Kc})),t.onLoad({filter:/.*/,namespace:Kc},e=>({contents:`const __slot = globalThis[${JSON.stringify(qc)}]\nif (!__slot || !__slot[${JSON.stringify(e.path)}]) {\n throw new Error('otto plugin: host external ${e.path} 未注入' +\n '(宿主须在加载插件产物前调用 installPluginHostExternals;隔离端见 RFC-365 R3)')\n}\nmodule.exports = __slot[${JSON.stringify(e.path)}]\n`,loader:`js`}))}}}function Yc(){let e={};try{let t=b(Fi(import.meta.resolve(`@x-otto/shared`))),n=L.resolve(`pino`,{paths:[t]});e.pino=n,e[`thread-stream`]=L.resolve(`thread-stream`,{paths:[b(n)]}),e[`jsonc-parser`]=L.resolve(`jsonc-parser`,{paths:[t]})}catch(e){I.warn({err:String(e)},`failed to resolve host external paths (pino/thread-stream/jsonc-parser) — plugins compiled in portable mode will fail to load`)}return e}function Xc(){let e=globalThis,t=e[qc]??={};for(let[e,n]of Object.entries(Yc()))if(t[e]===void 0)try{t[e]=L(n)}catch(t){I.warn({module:e,path:n,err:String(t)},`failed to load host external into injection slot`)}}function Zc(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 Qc(e,t){let n=Hc(e);if(!n)return null;let r=x(e,`plugin-dist`);O(r,{recursive:!0});let i=x(r,`plugin.cjs`),a=t?.portable?{}:Wc(),o=(t?.portable?[`react`,`ink`]:[`react`,`ink`,`jsonc-parser`,`pino`,`thread-stream`,`@x-otto/shared`,`@x-otto/provider`,`@x-otto/interchange`,`@x-otto/env`]).filter(e=>!(e in a)),{build:s}=Pc();return Fc(),await Bc(s({entryPoints:[n],outfile:i,bundle:!0,format:`cjs`,platform:`node`,external:o,jsx:`transform`,logLevel:`silent`,define:{"import.meta.url":`__otto_plugin_import_meta_url`},banner:{js:`const __otto_plugin_import_meta_url = require("url").pathToFileURL(__filename).href;`},plugins:[Uc,...t?.portable?[Jc()]:[Zc(a)]]}),t?.timeoutMs??12e4,()=>Ic()),il(r,e),i}const $c=[`.ts`,`.tsx`,`.js`,`.jsx`,`.mjs`,`.cjs`,`.json`];function el(e){let t=[],n=r=>{let i;try{i=Kr(r,{withFileTypes:!0})}catch{return}for(let a of i){let i=a.name;if(i===`plugin-dist`||i===`panels-dist`||i===`node_modules`||i.startsWith(`.`))continue;let o=x(r,i);if(a.isDirectory())n(o);else if(a.isFile()){let n=i.lastIndexOf(`.`),r=n>=0?i.slice(n):``;$c.includes(r)&&t.push(Ue(e,o))}}};return n(e),t.sort()}function tl(e){let t=el(e),n=pi(`sha256`);for(let r of t){let t=r.split(We).join(`/`);n.update(t),n.update(`\0`);try{n.update(k(x(e,r)))}catch(e){n.update(`<unreadable:${e instanceof Error?e.message:String(e)}>`)}n.update(`\0`)}return n.digest(`hex`)}function nl(e){return{apiVersion:On,compilerVersion:r,sourceHash:tl(e)}}function rl(e,t=e){let n=x(e,`plugin-dist`,`meta.json`);if(D(n))try{let e=JSON.parse(k(n,`utf8`));e.sourceHash=tl(t),A(n,JSON.stringify(e))}catch(t){I.warn({pluginDir:e,err:String(t)},`failed to rewrite artifact sourceHash`)}}function il(e,t){try{let n=x(e,`meta.json`),r=x(e,`.meta.json.tmp-${process.pid}`);A(r,JSON.stringify(nl(t))),Yr(r,n)}catch(e){I.warn(`Failed to write plugin artifact meta: %s`,e instanceof Error?e.message:String(e))}}function al(e){try{let t=k(x(e,`plugin-dist`,`meta.json`),`utf8`),n=JSON.parse(t),r=nl(e);return n.apiVersion===r.apiVersion&&n.compilerVersion===r.compilerVersion&&n.sourceHash===r.sourceHash}catch{return!1}}function ol(e){let t=x(e,`plugin-dist`,`plugin.cjs`);return D(t)?al(e)?t:(I.info(`Plugin artifact at %s is stale (meta mismatch/missing) — recompiling`,t),null):null}async function sl(e,t,n){if(!Hc(e.dir))return null;if((e.scope===`project`||e.scope===`repository`)&&!Zn(e.dir))return I.warn({pluginId:e.id},`project/repository plugin not trusted, skipping code module (fail-closed)`),null;let r=E(e);if(r.pendingCapabilities.length>0)return I.warn({pluginId:e.id,pendingCapabilities:r.pendingCapabilities},`plugin declares high-risk capabilities not yet granted, skipping code module entirely before factory execution (fail-closed, RFC-140 D3)`),null;let i=!1,a=ol(e.dir);if(a)i=!0,I.info({pluginId:e.id,outfile:a},`using prebuilt plugin module (RFC-150 D5, skip compile)`);else try{a=await Qc(e.dir)}catch(t){let r=String(t);return I.warn({pluginId:e.id,err:r},`plugin.ts compile failed`),n?.(e.id,`compile failed: ${r}`),null}if(!a)return null;Xc();let o;try{delete L.cache[a];let e=L(a);o=e?.default??e}catch(t){if(i){I.warn({pluginId:e.id,outfile:a,err:String(t)},`prebuilt plugin module failed to load — recompiling for this machine`);try{let t=await Qc(e.dir);if(!t)throw Error(`recompile produced no artifact`);a=t,delete L.cache[a];let n=L(a);o=n?.default??n}catch(t){let r=String(t);return I.warn({pluginId:e.id,err:r},`plugin.ts load failed (after recompile retry)`),n?.(e.id,`load failed: ${r}`),null}}else{let r=String(t);return I.warn({pluginId:e.id,err:r},`plugin.ts load failed`),n?.(e.id,`load failed: ${r}`),null}}if(typeof o!=`function`)return I.warn({pluginId:e.id},`plugin.ts default export is not a factory function`),n?.(e.id,`default export is not a factory function`),null;try{let n=await o(t);return{pluginId:e.id,module:n,compiledPath:a??void 0}}catch(t){let r=String(t);return I.warn({pluginId:e.id,err:r},`plugin factory threw`),n?.(e.id,`factory threw: ${r}`),null}}const R=C(`@x-otto/coding:plugin-service-pool`),cl=5e3;function ll(e){return[`--experimental-permission`,`--allow-fs-read=*`,...e?[`--allow-fs-write=${e}`]:[]]}`${Be()}`;let ul=null,dl=null;function fl(){return dl||(ul||=Wr(x(Be(),`otto-plugin-service-`)),dl=x(ul,`service-entry.cjs`),A(dl,Ac()),dl)}function pl(e,t){return`${e}:${t}`}var ml=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(pl(e,t))?.status}restartsOf(e,t){return this.services.get(pl(e,t))?.restarts??0}notify(e,t,n){let r=this.services.get(pl(e,t));if(!r||r.status!==`running`)return!1;try{return r.worker.postMessage({type:F.notify,notification:n}),!0}catch{return!1}}runningServiceIds(e){let t=`${e}:`;return[...this.services.entries()].filter(([e,n])=>e.startsWith(t)&&n.status===`running`).map(([e])=>e.slice(t.length))}async start(e){let t=pl(e.pluginId,e.serviceId);return await this.stop(e.pluginId,e.serviceId),this.spawnAndStart(t,e,0)}spawnAndStart(e,t,n){return new Promise(r=>{let i;try{i=new Pi(fl(),{execArgv:[...ll(t.storageDir)]})}catch(t){R.error({key:e,err:String(t)},`failed to create service worker`),r({error:String(t)});return}i.unref();let a={worker:i,input:t,status:`starting`,restarts:n,stopping:!1};this.services.set(e,a);let o=!1,s=e=>{o||(o=!0,r(e))};i.on(`message`,t=>{this.onWorkerMessage(e,a,t,s)}),i.on(`error`,t=>{R.warn({key:e,err:String(t)},`service worker error`),a.status=`failed`,s({error:String(t)}),this.scheduleRestart(e,a)}),i.on(`exit`,()=>{a.stopping||(a.status!==`failed`&&(a.status=`failed`),s({error:`service worker exited unexpectedly`}),this.scheduleRestart(e,a))}),i.postMessage({type:F.start,compiledPath:t.compiledPath,hostExternals:Yc(),serviceId:t.serviceId,factoryCtx:t.factoryCtx,serviceCtx:{pluginId:t.pluginId,workspaceDir:t.workspaceDir,workspaceKey:t.workspaceKey,hostCapabilities:t.hostCapabilities,storageDir:t.storageDir,hasStorageCapability:t.hasStorageCapability}})})}async onWorkerMessage(e,t,n,r){if(n.type===F.started){n.error?(t.status=`failed`,R.warn({key:e,err:n.error},`plugin service failed to start`),r({error:n.error}),this.scheduleRestart(e,t)):(t.status=`running`,R.info({key:e},`plugin service started`),r({}));return}if(n.type===F.crashed){R.warn({key:e,err:n.error},`plugin service crashed at runtime`),t.status=`failed`,this.scheduleRestart(e,t);return}if(n.type===F.hostCall){await this.dispatchHostCall(e,t,n);return}}async dispatchHostCall(e,t,n){let{callId:r,method:i,params:a}=n;if(i===`log.info`||i===`log.warn`||i===`log.error`){let e=a?.msg??``;R[i.slice(4)]({pluginId:t.input.pluginId,serviceId:t.input.serviceId},e);return}if(!r)return;let o=(e,n)=>{try{t.worker.postMessage({type:F.hostResult,callId:r,result:e,error:n})}catch{}};if(i===`startJob`){let e=t.input.bridge.startJob;if(!e){o(void 0,`capability not granted: agent.dispatch`);return}let n=a;try{o(await e({title:String(n?.title??``),prompt:String(n?.prompt??``)}))}catch(e){o(void 0,e instanceof Error?e.message:String(e))}return}if(i===`readTranscript`){let e=t.input.bridge.readTranscript;if(!e){o(void 0,`capability not granted: session.read`);return}let n=a;try{let t=typeof n?.sinceIndex==`number`?n.sinceIndex:void 0;o(await e({sessionId:String(n?.sessionId??``),sinceIndex:t}))}catch(e){o(void 0,e instanceof Error?e.message:String(e))}return}if(i===`notify`){let e=t.input.bridge.notify;if(!e){o(void 0,`capability not granted: user.notify`);return}let n=a,r=String(n?.level??`info`),i=r===`warning`||r===`error`?r:`info`;try{await e({level:i,code:String(n?.code??``),message:String(n?.message??``)}),o(void 0)}catch(e){o(void 0,e instanceof Error?e.message:String(e))}return}if(i===`ask`){o(void 0,`capability not granted: user.ask`);return}if(i===`complete`){let e=t.input.bridge.complete;if(!e){o(void 0,`capability not granted: llm.complete`);return}let n=a;try{let t=typeof n?.maxTokens==`number`?n.maxTokens:void 0;o(await e({prompt:String(n?.prompt??``),maxTokens:t}))}catch(e){o(void 0,e instanceof Error?e.message:String(e))}return}R.warn({key:e,method:i},`plugin service requested unknown host method (rejected)`),o(void 0,`unknown host method: ${String(i)}`)}scheduleRestart(e,t){if(t.stopping||t.restartTimer)return;if(t.restarts>=5){R.error({key:e,restarts:t.restarts},`plugin service exceeded restart limit, giving up (no further restarts)`),t.status=`failed`;return}let n=t.restarts+1,r=Math.min(1e3*2**(n-1),3e4);R.warn({key:e,attempt:n,delayMs:r},`restarting plugin service after crash`);let i=setTimeout(()=>{t.restartTimer=void 0;let r=this.services.get(e);!r||r.stopping||this.spawnAndStart(e,t.input,n)},r);i.unref?.(),t.restartTimer=i}async stop(e,t){let n=pl(e,t),r=this.services.get(n);if(!r)return;r.stopping=!0,r.restartTimer&&=(clearTimeout(r.restartTimer),void 0),this.services.delete(n);let i=new Promise(e=>{let t=n=>{n?.type===F.stopped&&(r.worker.off(`message`,t),e(!0))};r.worker.on(`message`,t);try{r.worker.postMessage({type:F.stop})}catch{e(!1)}}),a=new Promise(e=>{setTimeout(()=>e(!1),cl).unref?.()});await Promise.race([i,a])||R.warn({key:n,timeoutMs:cl},`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(ul){try{Xr(ul,{recursive:!0,force:!0})}catch{}ul=null,dl=null}}};let hl=null;function gl(){return hl||=new ml,hl}async function _l(){await hl?.dispose(),hl=null}const vl=[/\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 yl(e){let t=e;for(let e of vl)t=t.replace(e,`***`);return t}function bl(e){if(typeof e==`string`)return e;if(!Array.isArray(e))return``;let t=[];for(let n of e){let e=n;e?.type===`text`&&typeof e.text==`string`&&t.push(e.text)}return t.join(`
|
|
197
|
-
`)}function
|
|
196
|
+
`}const Pc=e(import.meta.url);let Fc=!1,Ic=()=>Pc(`esbuild`);function Lc(){return Ic()}function Rc(){Fc=!0}function zc(){if(Fc)try{Ic().stop?.()}catch{}}function Bc(e=process){e.once(`exit`,()=>zc())}const Vc=[`SIGINT`,`SIGTERM`,`SIGHUP`];function Hc(e=process){for(let t of Vc){let n=()=>{e.listenerCount(t)>1||(zc(),e.removeListener(t,n),e.kill?.(e.pid??process.pid,t))};e.on(t,n)}}function Uc(e,t,n){let r,i=!1,a=new Promise((e,n)=>{r=setTimeout(()=>{i=!0,n(Error(`esbuild build timed out after ${t}ms`))},t)});return Promise.race([e,a]).finally(()=>clearTimeout(r)).catch(e=>{throw i&&n(),e})}const F=C(`@x-otto/coding:plugin-module-loader`),I=e(import.meta.url),Wc=[`plugin.ts`,`plugin.tsx`];function Gc(e){for(let t of Wc){let n=x(e,t);if(D(n))return n}return null}const Kc={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 qc(){let e={};try{let t=import.meta.resolve(`@x-otto/shared`),n=b(Ri(t)),r=I.resolve(`pino`,{paths:[n]});e.pino=r,e[`thread-stream`]=I.resolve(`thread-stream`,{paths:[b(r)]}),e[`jsonc-parser`]=I.resolve(`jsonc-parser`,{paths:[n]}),e[`@x-otto/shared`]=t.startsWith(`file://`)?Ri(t):t;let i=import.meta.resolve(`@x-otto/provider`);e[`@x-otto/provider`]=i.startsWith(`file://`)?Ri(i):i;let a=import.meta.resolve(`@x-otto/interchange`);e[`@x-otto/interchange`]=a.startsWith(`file://`)?Ri(a):a;let o=import.meta.resolve(`@x-otto/env`);e[`@x-otto/env`]=o.startsWith(`file://`)?Ri(o):o}catch(e){F.warn({err:String(e)},`failed to pre-resolve pino/thread-stream/jsonc-parser/@x-otto absolute paths, falling back to bare-specifier external (pre-fix behavior)`)}return e}const Jc=[`pino`,`thread-stream`,`jsonc-parser`],Yc=`otto-host-external`,Xc=`__ottoPluginHostExternals`;function Zc(){let e=RegExp(`^(${Jc.join(`|`)})$`);return{name:`otto-plugin-host-slot`,setup(t){t.onResolve({filter:e},e=>({path:e.path,namespace:Yc})),t.onLoad({filter:/.*/,namespace:Yc},e=>({contents:`const __slot = globalThis[${JSON.stringify(Xc)}]\nif (!__slot || !__slot[${JSON.stringify(e.path)}]) {\n throw new Error('otto plugin: host external ${e.path} 未注入' +\n '(宿主须在加载插件产物前调用 installPluginHostExternals;隔离端见 RFC-365 R3)')\n}\nmodule.exports = __slot[${JSON.stringify(e.path)}]\n`,loader:`js`}))}}}function Qc(){let e={};try{let t=b(Ri(import.meta.resolve(`@x-otto/shared`))),n=I.resolve(`pino`,{paths:[t]});e.pino=n,e[`thread-stream`]=I.resolve(`thread-stream`,{paths:[b(n)]}),e[`jsonc-parser`]=I.resolve(`jsonc-parser`,{paths:[t]})}catch(e){F.warn({err:String(e)},`failed to resolve host external paths (pino/thread-stream/jsonc-parser) — plugins compiled in portable mode will fail to load`)}return e}function $c(){let e=globalThis,t=e[Xc]??={};for(let[e,n]of Object.entries(Qc()))if(t[e]===void 0)try{t[e]=I(n)}catch(t){F.warn({module:e,path:n,err:String(t)},`failed to load host external into injection slot`)}}function el(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 tl(e,t){let n=Gc(e);if(!n)return null;let r=x(e,`plugin-dist`);Kr(r,{recursive:!0});let i=x(r,`plugin.cjs`),a=t?.portable?{}:qc(),o=(t?.portable?[`react`,`ink`]:[`react`,`ink`,`jsonc-parser`,`pino`,`thread-stream`,`@x-otto/shared`,`@x-otto/provider`,`@x-otto/interchange`,`@x-otto/env`]).filter(e=>!(e in a)),{build:s}=Lc();return Rc(),await Uc(s({entryPoints:[n],outfile:i,bundle:!0,format:`cjs`,platform:`node`,external:o,jsx:`transform`,logLevel:`silent`,define:{"import.meta.url":`__otto_plugin_import_meta_url`},banner:{js:`const __otto_plugin_import_meta_url = require("url").pathToFileURL(__filename).href;`},plugins:[Kc,...t?.portable?[Zc()]:[el(a)]]}),t?.timeoutMs??12e4,()=>zc()),sl(r,e),i}const nl=[`.ts`,`.tsx`,`.js`,`.jsx`,`.mjs`,`.cjs`,`.json`];function rl(e){let t=[],n=r=>{let i;try{i=Yr(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):``;nl.includes(r)&&t.push(We(e,o))}}};return n(e),t.sort()}function il(e){let t=rl(e),n=gi(`sha256`);for(let r of t){let t=r.split(Ge).join(`/`);n.update(t),n.update(`\0`);try{n.update(O(x(e,r)))}catch(e){n.update(`<unreadable:${e instanceof Error?e.message:String(e)}>`)}n.update(`\0`)}return n.digest(`hex`)}function al(e){return{apiVersion:An,compilerVersion:r,sourceHash:il(e)}}function ol(e,t=e){let n=x(e,`plugin-dist`,`meta.json`);if(D(n))try{let e=JSON.parse(O(n,`utf8`));e.sourceHash=il(t),k(n,JSON.stringify(e))}catch(t){F.warn({pluginDir:e,err:String(t)},`failed to rewrite artifact sourceHash`)}}function sl(e,t){try{let n=x(e,`meta.json`),r=x(e,`.meta.json.tmp-${process.pid}`);k(r,JSON.stringify(al(t))),Qr(r,n)}catch(e){F.warn(`Failed to write plugin artifact meta: %s`,e instanceof Error?e.message:String(e))}}function cl(e){try{let t=O(x(e,`plugin-dist`,`meta.json`),`utf8`),n=JSON.parse(t),r=al(e);return n.apiVersion===r.apiVersion&&n.compilerVersion===r.compilerVersion&&n.sourceHash===r.sourceHash}catch{return!1}}function ll(e){let t=x(e,`plugin-dist`,`plugin.cjs`);return D(t)?cl(e)?t:(F.info(`Plugin artifact at %s is stale (meta mismatch/missing) — recompiling`,t),null):null}async function ul(e,t,n){if(!Gc(e.dir))return null;if((e.scope===`project`||e.scope===`repository`)&&!$n(e.dir))return F.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 F.warn({pluginId:e.id,pendingCapabilities:r.pendingCapabilities},`plugin declares high-risk capabilities not yet granted, skipping code module entirely before factory execution (fail-closed, RFC-140 D3)`),null;let i=!1,a=ll(e.dir);if(a)i=!0,F.info({pluginId:e.id,outfile:a},`using prebuilt plugin module (RFC-150 D5, skip compile)`);else try{a=await tl(e.dir)}catch(t){let r=String(t);return F.warn({pluginId:e.id,err:r},`plugin.ts compile failed`),n?.(e.id,`compile failed: ${r}`),null}if(!a)return null;$c();let o;try{delete I.cache[a];let e=I(a);o=e?.default??e}catch(t){if(i){F.warn({pluginId:e.id,outfile:a,err:String(t)},`prebuilt plugin module failed to load — recompiling for this machine`);try{let t=await tl(e.dir);if(!t)throw Error(`recompile produced no artifact`);a=t,delete I.cache[a];let n=I(a);o=n?.default??n}catch(t){let r=String(t);return F.warn({pluginId:e.id,err:r},`plugin.ts load failed (after recompile retry)`),n?.(e.id,`load failed: ${r}`),null}}else{let r=String(t);return F.warn({pluginId:e.id,err:r},`plugin.ts load failed`),n?.(e.id,`load failed: ${r}`),null}}if(typeof o!=`function`)return F.warn({pluginId:e.id},`plugin.ts default export is not a factory function`),n?.(e.id,`default export is not a factory function`),null;try{let n=await o(t);return{pluginId:e.id,module:n,compiledPath:a??void 0}}catch(t){let r=String(t);return F.warn({pluginId:e.id,err:r},`plugin factory threw`),n?.(e.id,`factory threw: ${r}`),null}}const L=C(`@x-otto/coding:plugin-service-pool`),dl=5e3;function fl(e){return[`--experimental-permission`,`--allow-fs-read=*`,...e?[`--allow-fs-write=${e}`]:[]]}`${Ve()}`;let pl=null,ml=null;function hl(){return ml||(pl||=qr(x(Ve(),`otto-plugin-service-`)),ml=x(pl,`service-entry.cjs`),k(ml,Nc()),ml)}function gl(e,t){return`${e}:${t}`}var _l=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(gl(e,t))?.status}restartsOf(e,t){return this.services.get(gl(e,t))?.restarts??0}notify(e,t,n){let r=this.services.get(gl(e,t));if(!r||r.status!==`running`)return!1;try{return r.worker.postMessage({type:P.notify,notification:n}),!0}catch{return!1}}runningServiceIds(e){let t=`${e}:`;return[...this.services.entries()].filter(([e,n])=>e.startsWith(t)&&n.status===`running`).map(([e])=>e.slice(t.length))}async start(e){let t=gl(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 Li(hl(),{execArgv:[...fl(t.storageDir)]})}catch(t){L.error({key:e,err:String(t)},`failed to create service worker`),r({error:String(t)});return}i.unref();let a={worker:i,input:t,status:`starting`,restarts:n,stopping:!1};this.services.set(e,a);let o=!1,s=e=>{o||(o=!0,r(e))};i.on(`message`,t=>{this.onWorkerMessage(e,a,t,s)}),i.on(`error`,t=>{L.warn({key:e,err:String(t)},`service worker error`),a.status=`failed`,s({error:String(t)}),this.scheduleRestart(e,a)}),i.on(`exit`,()=>{a.stopping||(a.status!==`failed`&&(a.status=`failed`),s({error:`service worker exited unexpectedly`}),this.scheduleRestart(e,a))}),i.postMessage({type:P.start,compiledPath:t.compiledPath,hostExternals:Qc(),serviceId:t.serviceId,factoryCtx:t.factoryCtx,serviceCtx:{pluginId:t.pluginId,workspaceDir:t.workspaceDir,workspaceKey:t.workspaceKey,hostCapabilities:t.hostCapabilities,storageDir:t.storageDir,hasStorageCapability:t.hasStorageCapability}})})}async onWorkerMessage(e,t,n,r){if(n.type===P.started){n.error?(t.status=`failed`,L.warn({key:e,err:n.error},`plugin service failed to start`),r({error:n.error}),this.scheduleRestart(e,t)):(t.status=`running`,L.info({key:e},`plugin service started`),r({}));return}if(n.type===P.crashed){L.warn({key:e,err:n.error},`plugin service crashed at runtime`),t.status=`failed`,this.scheduleRestart(e,t);return}if(n.type===P.hostCall){await this.dispatchHostCall(e,t,n);return}}async dispatchHostCall(e,t,n){let{callId:r,method:i,params:a}=n;if(i===`log.info`||i===`log.warn`||i===`log.error`){let e=a?.msg??``;L[i.slice(4)]({pluginId:t.input.pluginId,serviceId:t.input.serviceId},e);return}if(!r)return;let o=(e,n)=>{try{t.worker.postMessage({type:P.hostResult,callId:r,result:e,error:n})}catch{}};if(i===`startJob`){let e=t.input.bridge.startJob;if(!e){o(void 0,`capability not granted: agent.dispatch`);return}let n=a;try{o(await e({title:String(n?.title??``),prompt:String(n?.prompt??``)}))}catch(e){o(void 0,e instanceof Error?e.message:String(e))}return}if(i===`readTranscript`){let e=t.input.bridge.readTranscript;if(!e){o(void 0,`capability not granted: session.read`);return}let n=a;try{let t=typeof n?.sinceIndex==`number`?n.sinceIndex:void 0;o(await e({sessionId:String(n?.sessionId??``),sinceIndex:t}))}catch(e){o(void 0,e instanceof Error?e.message:String(e))}return}if(i===`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=gl(e,t),r=this.services.get(n);if(!r)return;r.stopping=!0,r.restartTimer&&=(clearTimeout(r.restartTimer),void 0),this.services.delete(n);let i=new Promise(e=>{let t=n=>{n?.type===P.stopped&&(r.worker.off(`message`,t),e(!0))};r.worker.on(`message`,t);try{r.worker.postMessage({type:P.stop})}catch{e(!1)}}),a=new Promise(e=>{setTimeout(()=>e(!1),dl).unref?.()});await Promise.race([i,a])||L.warn({key:n,timeoutMs:dl},`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(pl){try{$r(pl,{recursive:!0,force:!0})}catch{}pl=null,ml=null}}};let vl=null;function yl(){return vl||=new _l,vl}async function bl(){await vl?.dispose(),vl=null}const xl=[/\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 Sl(e){let t=e;for(let e of xl)t=t.replace(e,`***`);return t}function Cl(e){if(typeof e==`string`)return e;if(!Array.isArray(e))return``;let t=[];for(let n of e){let e=n;e?.type===`text`&&typeof e.text==`string`&&t.push(e.text)}return t.join(`
|
|
197
|
+
`)}function wl(e){if(e.role===`user`)return e.internal?null:{role:`user`,text:Sl(Cl(e.content))};if(e.role===`assistant`){let t=e.content.filter(e=>e.type===`tool_call`)[0]?.name,n={role:`assistant`,text:Sl(Cl(e.content))};return t&&(n.toolName=t),n}return e.role===`tool_result`?e.internal?null:{role:`tool_result`,text:Sl(Cl(e.content)),toolName:e.toolName}:null}function Tl(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=wl(e);t&&o.push(t)}return{messages:o,nextIndex:e.length}}const R={load:`worker.load`,loaded:`worker.loaded`,error:`worker.error`,toolExecute:`tool.execute`,toolResult:`tool.result`,toolCancel:`tool.cancel`,sigilResolve:`sigil.resolve`,sigilResult:`sigil.result`,onActivate:`worker.onActivate`,activated:`worker.activated`,onDeactivate:`worker.onDeactivate`,deactivated:`worker.deactivated`,stop:`worker.stop`,hostCall:`host.call`,hostResult:`host.result`};function El(e){return`${e===`worker`?`const { parentPort } = require('worker_threads')
|
|
198
198
|
const __send = (m) => parentPort.postMessage(m)
|
|
199
199
|
const __onMessage = (fn) => parentPort.on('message', fn)`:`const __send = (m) => process.send(m)
|
|
200
200
|
const __onMessage = (fn) => process.on('message', fn)`}\n${`// RFC-303 M4:工具执行上下文——host/logger 经反向 RPC 代理回宿主
|
|
@@ -210,7 +210,7 @@ function makeHostStub(methods) {
|
|
|
210
210
|
return (...args) => new Promise((resolve, reject) => {
|
|
211
211
|
const id = 'host-' + (++hostCallSeq)
|
|
212
212
|
hostCallPending.set(id, { resolve, reject })
|
|
213
|
-
__send({ type: '${
|
|
213
|
+
__send({ type: '${R.hostCall}', id, method, args })
|
|
214
214
|
})
|
|
215
215
|
},
|
|
216
216
|
})
|
|
@@ -223,7 +223,7 @@ let pluginId = ''
|
|
|
223
223
|
let pluginInstance = null
|
|
224
224
|
|
|
225
225
|
__onMessage(async (msg) => {
|
|
226
|
-
if (msg.type === '${
|
|
226
|
+
if (msg.type === '${R.load}') {
|
|
227
227
|
pluginId = msg.pluginId
|
|
228
228
|
try {
|
|
229
229
|
// RFC-365 R3:host-slot 注入槽——隔离端是独立 realm(worker_threads / child_process
|
|
@@ -240,7 +240,7 @@ __onMessage(async (msg) => {
|
|
|
240
240
|
const mod = require(msg.compiledPath)
|
|
241
241
|
const factory = mod?.default ?? mod
|
|
242
242
|
if (typeof factory !== 'function') {
|
|
243
|
-
__send({ type: '${
|
|
243
|
+
__send({ type: '${R.loaded}', pluginId, module: { tools: [], hookEvents: [], hasOnActivate: false, hasOnDeactivate: false } })
|
|
244
244
|
return
|
|
245
245
|
}
|
|
246
246
|
// RFC-303 M4:host stub(工具 ctx 与 factory ctx 共用;白名单方法名随 load 下发)。
|
|
@@ -289,7 +289,7 @@ __onMessage(async (msg) => {
|
|
|
289
289
|
host: hostMethods.some((m) => m !== 'listActivePlugins') ? hostStub : undefined,
|
|
290
290
|
}
|
|
291
291
|
__send({
|
|
292
|
-
type: '${
|
|
292
|
+
type: '${R.loaded}', pluginId,
|
|
293
293
|
module: {
|
|
294
294
|
contributions: instance.contributions,
|
|
295
295
|
tools: tools.map((t) => ({
|
|
@@ -305,39 +305,39 @@ __onMessage(async (msg) => {
|
|
|
305
305
|
},
|
|
306
306
|
})
|
|
307
307
|
} catch (err) {
|
|
308
|
-
__send({ type: '${
|
|
308
|
+
__send({ type: '${R.error}', pluginId, error: err?.message ?? String(err) })
|
|
309
309
|
}
|
|
310
310
|
return
|
|
311
311
|
}
|
|
312
|
-
if (msg.type === '${
|
|
312
|
+
if (msg.type === '${R.toolExecute}') {
|
|
313
313
|
const exec = toolExecutors.get(msg.name)
|
|
314
|
-
if (!exec) { __send({ type: '${
|
|
314
|
+
if (!exec) { __send({ type: '${R.toolResult}', id: msg.id, error: "tool not found" }); return }
|
|
315
315
|
try {
|
|
316
316
|
const r = await exec(msg.params, toolCtx)
|
|
317
317
|
if (cancelledToolIds.delete(msg.id)) return
|
|
318
|
-
__send({ type: '${
|
|
318
|
+
__send({ type: '${R.toolResult}', id: msg.id, result: r })
|
|
319
319
|
} catch (e) {
|
|
320
320
|
if (cancelledToolIds.delete(msg.id)) return
|
|
321
|
-
__send({ type: '${
|
|
321
|
+
__send({ type: '${R.toolResult}', id: msg.id, error: e?.message ?? String(e) })
|
|
322
322
|
}
|
|
323
323
|
return
|
|
324
324
|
}
|
|
325
|
-
if (msg.type === '${
|
|
325
|
+
if (msg.type === '${R.toolCancel}') {
|
|
326
326
|
cancelledToolIds.add(msg.id)
|
|
327
327
|
return
|
|
328
328
|
}
|
|
329
|
-
if (msg.type === '${
|
|
329
|
+
if (msg.type === '${R.sigilResolve}') {
|
|
330
330
|
const fn = sigilResolverExecutors.get(msg.name)
|
|
331
|
-
if (!fn) { __send({ type: '${
|
|
331
|
+
if (!fn) { __send({ type: '${R.sigilResult}', id: msg.id, error: "sigil resolver not found" }); return }
|
|
332
332
|
try {
|
|
333
333
|
const r = await fn(msg.param, msg.ctx)
|
|
334
|
-
__send({ type: '${
|
|
334
|
+
__send({ type: '${R.sigilResult}', id: msg.id, result: r })
|
|
335
335
|
} catch (e) {
|
|
336
|
-
__send({ type: '${
|
|
336
|
+
__send({ type: '${R.sigilResult}', id: msg.id, error: e?.message ?? String(e) })
|
|
337
337
|
}
|
|
338
338
|
return
|
|
339
339
|
}
|
|
340
|
-
if (msg.type === '${
|
|
340
|
+
if (msg.type === '${R.hostResult}') {
|
|
341
341
|
const p = hostCallPending.get(msg.id)
|
|
342
342
|
if (!p) return
|
|
343
343
|
hostCallPending.delete(msg.id)
|
|
@@ -345,26 +345,26 @@ __onMessage(async (msg) => {
|
|
|
345
345
|
else p.resolve(msg.result)
|
|
346
346
|
return
|
|
347
347
|
}
|
|
348
|
-
if (msg.type === '${
|
|
348
|
+
if (msg.type === '${R.onActivate}') {
|
|
349
349
|
if (!pluginInstance || typeof pluginInstance.onActivate !== 'function') {
|
|
350
|
-
__send({ type: '${
|
|
350
|
+
__send({ type: '${R.activated}', id: msg.id })
|
|
351
351
|
return
|
|
352
352
|
}
|
|
353
|
-
try { await pluginInstance.onActivate(); __send({ type: '${
|
|
354
|
-
catch (e) { __send({ type: '${
|
|
353
|
+
try { await pluginInstance.onActivate(); __send({ type: '${R.activated}', id: msg.id }) }
|
|
354
|
+
catch (e) { __send({ type: '${R.activated}', id: msg.id, error: e?.message ?? String(e) }) }
|
|
355
355
|
return
|
|
356
356
|
}
|
|
357
|
-
if (msg.type === '${
|
|
357
|
+
if (msg.type === '${R.onDeactivate}') {
|
|
358
358
|
if (!pluginInstance || typeof pluginInstance.onDeactivate !== 'function') {
|
|
359
|
-
__send({ type: '${
|
|
359
|
+
__send({ type: '${R.deactivated}', id: msg.id })
|
|
360
360
|
return
|
|
361
361
|
}
|
|
362
|
-
try { await pluginInstance.onDeactivate(); __send({ type: '${
|
|
363
|
-
catch (e) { __send({ type: '${
|
|
362
|
+
try { await pluginInstance.onDeactivate(); __send({ type: '${R.deactivated}', id: msg.id }) }
|
|
363
|
+
catch (e) { __send({ type: '${R.deactivated}', id: msg.id, error: e?.message ?? String(e) }) }
|
|
364
364
|
return
|
|
365
365
|
}
|
|
366
|
-
if (msg.type === '${
|
|
367
|
-
})`}`}var wl=class{pending=new Map;idCounter=0;boundPluginId=``;hostCallDispatcher=null;setHostCallDispatcher(e){this.hostCallDispatcher=e}constructor(e){this.adapter=e,this.adapter.onMessage(e=>{if(e.type===z.loaded){let t=this.settlePending(`__load__`);t&&t.resolve(e.module);return}if(e.type===z.error){let t=this.settlePending(`__load__`);t&&t.reject(Error(e.error??this.adapter.loadFailedMessage?.()??`plugin isolated transport load failed`));return}if(e.type===z.toolResult){let t=this.settlePending(e.id);t&&t.resolve({result:e.result,error:e.error});return}if(e.type===z.sigilResult){let t=this.settlePending(e.id);t&&t.resolve({result:e.result,error:e.error});return}if(e.type===z.activated||e.type===z.deactivated){let t=this.settlePending(e.id);t&&t.resolve({error:e.error});return}if(e.type===z.hostCall){let t=this.boundPluginId,n=this.hostCallDispatcher,r=t=>{try{this.adapter.send({type:z.hostResult,id:e.id,...t})}catch{}};if(!n){r({error:`host call dispatcher not installed (plugin host capabilities unavailable)`});return}n(t,e.method??``,e.args??[]).then(e=>r({result:e})).catch(e=>r({error:e instanceof Error?e.message:String(e)}));return}}),this.adapter.onError(e=>{this.adapter.onErrorLog?.(e),this.rejectAllPending(e)}),this.adapter.onExit(e=>{if(this.pending.size===0)return;this.adapter.onExitLog?.(e);let t=this.adapter.exitErrorMessage?.(e)??`plugin isolated transport exited unexpectedly (code ${e})`;this.rejectAllPending(Error(t))})}rejectAllPending(e){for(let[,t]of this.pending)t.type===`load`?t.reject(e):t.resolve({error:e.message});this.pending.clear(),this.adapter.unref()}syncRefState(){this.pending.size>0?this.adapter.ref():this.adapter.unref()}trackPending(e,t){this.pending.set(e,t),this.syncRefState()}settlePending(e){let t=this.pending.get(e);return t&&(this.pending.delete(e),this.syncRefState()),t}async load(e,t,n){if(this.pending.has(`__load__`))throw Error(this.adapter.alreadyLoadingMessage?.(e)??`plugin isolated transport already loading ${e}`);return this.boundPluginId=e,new Promise((r,i)=>{this.trackPending(`__load__`,{type:`load`,resolve:r,reject:i}),this.adapter.send({type:z.load,pluginId:e,compiledPath:t,ctx:n,...n.hostMethods?{hostMethods:n.hostMethods}:{},...n.hostExternals?{hostExternals:n.hostExternals}:{}})})}async executeTool(e,t,n){let r=`tool-${++this.idCounter}`,i=n?.timeoutMs??6e4,a=n?.signal;return a?.aborted?{error:`plugin tool execution aborted`}:new Promise(n=>{let o,s,c=()=>{o!==void 0&&clearTimeout(o),s&&a&&a.removeEventListener(`abort`,s)};this.trackPending(r,{type:`tool`,resolve:e=>{c(),n(e)}});let l=e=>{let t=this.settlePending(r);if(t){try{this.adapter.send({type:z.toolCancel,id:r})}catch{}t.resolve({error:e})}};i>0&&(o=setTimeout(()=>{this.adapter.onToolTimeout?.(e,i),l(`plugin tool "${e}" timed out after ${i}ms`)},i),o.unref?.()),a&&(s=()=>l(`plugin tool execution aborted`),a.addEventListener(`abort`,s,{once:!0})),this.adapter.send({type:z.toolExecute,id:r,name:e,params:t})})}async resolveSigil(e,t,n,r){let i=`sigil-${++this.idCounter}`,a=r?.timeoutMs??6e4;return new Promise(r=>{let o;this.trackPending(i,{type:`sigil`,resolve:e=>{o!==void 0&&clearTimeout(o),r(e)}}),a>0&&(o=setTimeout(()=>{let t=this.settlePending(i);t&&t.resolve({error:`sigil resolver "${e}" timed out after ${a}ms`})},a),o.unref?.()),this.adapter.send({type:z.sigilResolve,id:i,name:e,param:t,ctx:n})})}async activate(){let e=`lifecycle-${++this.idCounter}`;return new Promise(t=>{this.trackPending(e,{type:`lifecycle`,resolve:t}),this.adapter.send({type:z.onActivate,id:e})})}async deactivate(){let e=`lifecycle-${++this.idCounter}`;return new Promise(t=>{this.trackPending(e,{type:`lifecycle`,resolve:t}),this.adapter.send({type:z.onDeactivate,id:e})})}clearPending(){this.pending.clear()}};const Tl=C(`@x-otto/coding:plugin-worker-pool`);let El=null,Dl=null;function Ol(){return Dl||(El||=Wr(x(Be(),`otto-plugin-worker-`)),Dl=x(El,`worker-entry.cjs`),A(Dl,Cl(`worker`)),Dl)}var kl=class extends wl{worker;constructor(){let e=new Pi(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)=>{Tl.warn({tool:e,timeoutMs:t},`plugin tool execution timed out`)},onErrorLog:e=>{Tl.warn({err:String(e)},`plugin worker error`)},onExitLog:e=>{Tl.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()}},Al=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 kl;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(),El){try{Xr(El,{recursive:!0,force:!0})}catch{}El=null,Dl=null}await Promise.all(e.map(e=>e.stop().catch(()=>{})))}get size(){return this.workers.size}};const jl=C(`@x-otto/coding:plugin-process-pool`);let Ml=null,Nl=null;function Pl(){return Nl||(Ml||=Wr(x(Be(),`otto-plugin-process-`)),Nl=x(Ml,`process-entry.cjs`),A(Nl,Cl(`process`)),Nl)}var Fl=class extends wl{child;sandboxToDispose;constructor(e){let t=Pl(),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 jl.warn(`No platform sandbox available for project/repository scope plugin isolation — falling back to plain child_process (still process-isolated, but without OS-level file/network constraints)`);let s=Oi(i,a,{cwd:e,stdio:[`ignore`,`ignore`,`pipe`,`ipc`]});s.unref(),super({send:e=>s.send(e),onMessage:e=>s.on(`message`,t=>e(t)),onError:e=>s.on(`error`,t=>e(t)),onExit:e=>s.on(`exit`,e),ref:()=>{s.channel?.ref(),s.stderr?.ref?.()},unref:()=>{s.channel?.unref(),s.stderr?.unref?.()},onToolTimeout:(e,t)=>{jl.warn({tool:e,timeoutMs:t},`plugin tool execution timed out (isolated process)`)},onErrorLog:e=>{jl.warn({err:String(e)},`plugin process error`)},onExitLog:e=>{jl.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=>{jl.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()}},Il=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 Fl(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(),Ml){try{Xr(Ml,{recursive:!0,force:!0})}catch{}Ml=null,Nl=null}await Promise.all(e.map(e=>e.stop().catch(()=>{})))}get size(){return this.processes.size}};const Ll=C(`@x-otto/coding:plugin-module-loader-isolated`);let Rl=null;function zl(){return Rl||=new Al,Rl}let Bl=null;function Vl(){return Bl||=new Il,Bl}async function Hl(){await Promise.all([Rl?.dispose()??Promise.resolve(),Bl?.dispose()??Promise.resolve()])}function Ul(e){return e===`project`||e===`repository`?Vl():zl()}function Wl(e){return!!e.manifest.capabilities?.includes(`tools`)}function Gl(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&&Ll.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 Kl(e,t,n,r){if((e.scope===`project`||e.scope===`repository`)&&!Zn(e.dir))return Ll.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 Ll.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??Ul(e.scope),o=ol(e.dir);try{o?Ll.info({pluginId:e.id,compiledPath:o},`using prebuilt plugin module (isolated path, RFC-150 D5)`):o=await Qc(e.dir)}catch(t){let n=String(t);return Ll.warn({pluginId:e.id,err:n},`plugin.ts compile failed (isolated path)`),r?.(e.id,`compile failed: ${n}`),null}if(!o)return null;let s=[...Object.keys(t.host??{}),`listActivePlugins`];if(t.host&&Object.keys(t.host).length>0||t.listActivePlugins){let e=t.host;a.setHostCallDispatcher?.(async(n,r,i)=>{if(r===`listActivePlugins`)return t.listActivePlugins?t.listActivePlugins():[];if(!e||typeof e[r]!=`function`)throw Error(`host method '${r}' not available (not declared or not granted)`);if(!(r in e))throw Error(`host method '${r}' not in whitelist`);let a=e[r];return a(...i)})}try{let n=await a.load(e.id,o,{pluginId:t.pluginId,pluginDir:t.pluginDir,workspaceDir:t.workspaceDir,hostMethods:s,listActivePlugins:!0,hostExternals:Yc()});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 Ll.warn({pluginId:e.id},t),r?.(e.id,t),null}return Ll.info({pluginId:e.id},`plugin worker pool exhausted, falling back to in-process load`),sl(e,t,r)}return{pluginId:e.id,module:Gl(e.id,n,a),compiledPath:o}}catch(t){let n=String(t);return Ll.warn({pluginId:e.id,err:n},`plugin.ts worker load failed`),r?.(e.id,`worker load failed: ${n}`),null}}function ql(e,t){return e.includes(`onStartup`)?!0:e.some(e=>t.has(e))}var Jl=class{axisName=`hooks`;hookNamesByPlugin=new Map;constructor(e){this.hookRegistry=e}register(e){let t=e.loaded.module.hooks;if(t){let n=dc(e.plugin.id,t);this.hookRegistry.registerAll(n);let r=this.hookNamesByPlugin.get(e.plugin.id)??[];r.push(...n.map(e=>e.name)),this.hookNamesByPlugin.set(e.plugin.id,r)}}unregister(e){let t=this.hookNamesByPlugin.get(e);if(t){for(let e of t)this.hookRegistry.unregister(e);this.hookNamesByPlugin.delete(e)}}unregisterAll(){for(let e of[...this.hookNamesByPlugin.keys()])this.unregister(e)}},Yl=class{axisName=`monitors`;hookNamesByPlugin=new Map;monitorsByPlugin=new Map;constructor(e,t){this.hookRegistry=e,this.logger=t}register(e){let t=e.loaded.module.monitors;if(!t?.length)return;if(!e.plugin.manifest.capabilities?.includes(`monitor`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares monitors but not capabilities:["monitor"], skipped (fail-closed)`);return}let n=bc(e.plugin.id,t);this.hookRegistry.registerAll(n);let r=this.hookNamesByPlugin.get(e.plugin.id)??[];r.push(...n.map(e=>e.name)),this.hookNamesByPlugin.set(e.plugin.id,r),this.monitorsByPlugin.set(e.plugin.id,t)}unregister(e){let t=this.hookNamesByPlugin.get(e);if(t){for(let e of t)this.hookRegistry.unregister(e);this.hookNamesByPlugin.delete(e)}this.monitorsByPlugin.delete(e)}unregisterAll(){for(let e of[...this.hookNamesByPlugin.keys()])this.unregister(e)}async dispatch(e){for(let[t,n]of this.monitorsByPlugin)for(let r of n)try{await r.onEvent(e)}catch(n){this.logger.warn({pluginId:t,monitorId:r.id,eventType:e.type,err:String(n)},`plugin monitor onEvent threw (host event), isolated`)}}get monitorPluginIds(){return[...this.monitorsByPlugin.keys()]}},Xl=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 Zl=C(`@x-otto/coding:plugin-sigil-loader`);function Ql(e){return e.startsWith(`!`)||e.startsWith(`#`)}function $l(e){let t=[];for(let n of e){let e=n.manifest.contributes?.sigilEntries;if(e?.length){if(E(n).gated){Zl.warn({pluginId:n.id},`plugin gated (untrusted), sigilEntries skipped`);continue}for(let r of e){if(Ql(r.value)){Zl.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 eu(e){for(let t of e)t.manifest.contributes?.inputEntries&&Zl.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 tu(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}):Zl.warn({pluginId:e,name:r},`sigilResolvers entry is neither function nor {resolve}, skipped`)}return n}function nu(e,t){return t.map(t=>async(n,r)=>(await t(n,r)).filter(e=>!Ql(e.value)).map(t=>({...t,source:e})))}function ru(e,t){for(let n of e)n.resolverId&&!t(n.resolverId)&&Zl.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 iu=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=tu(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 nu(e.plugin.id,n))t.push(this.pluginInput.registerProvider(`@`,r));this.sigilProviderUnsubsByPlugin.set(e.plugin.id,t)}if(this.sigilResolverRegistry){let t=this.sigilResolverRegistry;ru($l([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)}},au=class{axisName=`computedCommands`;commandsByPlugin=new Map;register(e){let t=e.loaded.module.contributions?.commands;if(t?.length&&e.plugin.scope!==`builtin`){let n=this.commandsByPlugin.get(e.plugin.id)??[];n.push(...fc(e.plugin.id,e.plugin.scope,e.plugin.dir,t)),this.commandsByPlugin.set(e.plugin.id,n)}}unregister(e){this.commandsByPlugin.delete(e)}unregisterAll(){}resetForReload(){this.commandsByPlugin.clear()}getComputedCommands(){return[...this.commandsByPlugin.values()].flat()}},ou=class{axisName=`computedAgents`;profilesByPlugin=new Map;existingAgentNames=new Set;register(e){let t=e.loaded.module.contributions?.agents;if(!t?.length)return;let n=this.profilesByPlugin.get(e.plugin.id)??[];n.push(...pc(t)),this.profilesByPlugin.set(e.plugin.id,n)}unregister(e){this.profilesByPlugin.delete(e)}unregisterAll(){}setExistingAgentNames(e){this.existingAgentNames=e}resetForReload(e){this.profilesByPlugin.clear(),this.existingAgentNames=e}getAppendedAgents(){let e=new Set(this.existingAgentNames),t=[];for(let n of this.profilesByPlugin.values())for(let r of n)e.has(r.name)||(e.add(r.name),t.push(r));return t}},su=class{axisName=`computedSkills`;skillNamesByPlugin=new Map;constructor(e){this.skillRegistry=e}register(e){let t=e.loaded.module.contributions?.skills;if(!t?.length||!this.skillRegistry)return;let n=this.skillNamesByPlugin.get(e.plugin.id)??[];for(let{definition:r,source:i}of mc(e.plugin.id,e.plugin.dir,t))this.skillRegistry.get(r.metadata.name)||(this.skillRegistry.register(r,i),n.push(r.metadata.name));n.length>0&&this.skillNamesByPlugin.set(e.plugin.id,n)}unregister(e){let t=this.skillNamesByPlugin.get(e);if(t){for(let e of t)this.skillRegistry?.unregister(e);this.skillNamesByPlugin.delete(e)}}unregisterAll(){for(let e of[...this.skillNamesByPlugin.keys()])this.unregister(e)}};const B=C(`@x-otto/coding:plugin-provider-loader`);function cu(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 lu(e){return new Set([...(e.contributes?.providers??[]).filter(e=>e.preserveProviderId===!0&&e.oauthRef).map(e=>e.oauthRef),...e.codeProviderIds??[]])}function uu(e,t){let n=lu(t);return new Set((t.contributes?.oauth??[]).map(t=>n.has(t.id)?t.id:V(e,t.id)))}function du(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 fu(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 pu(e){return`code:${e}`}function mu(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 hu(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 gu(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:cu(a)})}}function _u(e,t,n,r,i,a,o){let s=t.contributes?.oauth;if(s?.length&&n)if(t.capabilities?.includes(`provider`))for(let t of s){let s=r.has(t.id)?t.id:V(e,t.id);if(f.includes(t.id)||n.isReservedId(t.id)){a.rejected.push({id:t.id,reason:`oauth id collides with builtin reserved OAuth provider`}),B.warn({pluginId:e,oauthId:t.id},`plugin oauth id collides with builtin reserved, rejected (R3)`);continue}let c=t.name??i.get(t.id)??t.id,l=t.kind===`pkce`?Ri({...t,id:s,name:c,tokenExchangeEncoding:t.tokenExchangeEncoding??`form`,assumesLoopbackAlways:t.assumesLoopbackAlways??!1,subscriptionScoped:t.subscriptionScoped??!1}):Li({...t,id:s,name:c,allowCustomDomain:t.allowCustomDomain??!1});if(o?.has(s))n.replace(l,e);else if(!n.register(l,e)){a.rejected.push({id:t.id,reason:`oauth registration rejected (id already claimed by another plugin or reserved)`});continue}}else{B.warn({pluginId:e},`plugin declares contributes.oauth but not capabilities:["provider"], skipped (fail-closed)`);for(let e of s)a.rejected.push({id:e.id,reason:`capability "provider" not declared`})}}function vu(e,t,n,r,i,a){let o=t.contributes?.providers;if(!o?.length)return;if(!t.capabilities?.includes(`provider`)){B.warn({pluginId:e},`plugin declares contributes.providers but not capabilities:["provider"], skipped (fail-closed)`);for(let e of o)i.rejected.push({id:e.id,reason:`capability "provider" not declared`});return}let s=new Set;for(let t of o){if(i.registered.includes(t.id)){i.rejected.push({id:t.id,reason:`duplicate provider id in manifest`}),B.warn({pluginId:e,providerId:t.id},`duplicate provider id in manifest, second entry rejected (review F5)`);continue}if(ae(t.id)){i.rejected.push({id:t.id,reason:`reserved builtin provider id`}),B.warn({pluginId:e,providerId:t.id},`plugin provider id collides with builtin, rejected (R3)`);continue}let o=t.preserveProviderId===!0,c=o?t.id:V(e,t.id),l=o?t.id:V(e,t.id);if(t.catalogOnly===!0){let a=l;if(t.oauthRef){let n=o?t.oauthRef:V(e,t.oauthRef);if(!r?.get(n)){i.rejected.push({id:t.id,reason:`oauthRef '${t.oauthRef}' not found in current plugin's oauth table (R7)`}),B.warn({pluginId:e,providerId:t.id,oauthRef:t.oauthRef},`catalog provider oauthRef not found, rejected (R7)`);continue}a=n}if(t.envKey&&!n.authStore.registerEnvKey(l,t.envKey,e)){i.rejected.push({id:t.id,reason:`envKey registration rejected (reserved or claimed)`});continue}if(!le({id:l,name:t.name,env:t.oauthRef?void 0:t.envKey,requiresIntranet:t.requiresIntranet===!0},e)){i.rejected.push({id:t.id,reason:`provider descriptor id already claimed`}),t.envKey&&n.authStore.unregisterEnvKey(l);continue}if(t.models?.length){let r=t.models.map(e=>mu(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?hu(t.modelsEndpoint,l,c,t.baseUrl,t.headers):void 0,m=()=>{t.oauthRef&&r&&!s.has(u)&&r.unregister(u)};if(!le({id:l,name:t.name,env:t.oauthRef?void 0:t.envKey,buildModelsRequest:p,requiresIntranet:t.requiresIntranet===!0},e)){i.rejected.push({id:t.id,reason:`provider descriptor id already claimed by another plugin`}),t.envKey&&!t.oauthRef&&n.authStore.unregisterEnvKey(l),m();continue}t.allowAuthHeaderOverride&&B.warn({pluginId:e,providerId:t.id},`provider declares allowAuthHeaderOverride: custom headers may replace auth headers (RFC-270 D3)`);let h=gu(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=>mu(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 yu(e,t,n,r,i){let a={registered:[],rejected:[]},o=n.authStore.oauth;return _u(e,t,o,lu(t),new Map((t.contributes?.providers??[]).filter(e=>e.oauthRef&&e.name).map(e=>[e.oauthRef,e.name])),a,r),vu(e,t,n,o,a,i),a}async function bu(e,t,n,r,i){let a=n.authStore.oauth,o=lu(t),s=t.contributes?.oauth;if(s?.length&&a)for(let t of s){let n=o.has(t.id)?t.id:V(e,t.id);r?.has(n)||a.unregister(n)}let c=t.contributes?.providers;if(c?.length){for(let t of c){let r=t.preserveProviderId===!0?t.id:V(e,t.id);pe(r),t.envKey&&!t.oauthRef&&n.authStore.unregisterEnvKey(r)}await n.providerRegistry.unregisterBySource(e,i),n.modelRegistry.unregisterBySource(e)}}var xu=class{axisName=`oauthProviderFactories`;oauthIdsByPlugin=new Map;constructor(e,t){this.authStore=e,this.logger=t}register(e){let t=e.loaded.module.oauthProviderFactories;if(!t||!this.authStore)return;if(!e.plugin.manifest.capabilities?.includes(`provider`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares oauthProviderFactories but not capabilities:["provider"], skipped (fail-closed)`);return}if(e.verdict.pendingCapabilities.includes(`provider`)){this.logger.warn({pluginId:e.plugin.id},`plugin capability "provider" not yet granted, skipping oauthProviderFactories (fail-closed)`);return}let n=new Set((e.plugin.manifest.contributes?.providers??[]).filter(e=>e.preserveProviderId===!0&&e.oauthRef).map(e=>e.oauthRef));for(let[r,i]of Object.entries(t)){let t=_c(e.plugin.id,i);if(!t)continue;let a=n.has(r)?r:V(e.plugin.id,r);if(t.id!==a){this.logger.warn({pluginId:e.plugin.id,name:r,expectedId:a,actualId:t.id},`plugin oauth provider id mismatch with manifest oauthRef/preserveProviderId, skipped`);continue}if(this.authStore.oauth.register(t,e.plugin.id)){let n=this.oauthIdsByPlugin.get(e.plugin.id)??new Set;n.add(t.id),this.oauthIdsByPlugin.set(e.plugin.id,n)}else this.logger.warn({pluginId:e.plugin.id,oauthId:t.id},`plugin oauthProviderFactory rejected (reserved or claimed)`)}}unregister(e){if(!this.authStore)return;let t=this.oauthIdsByPlugin.get(e);if(t){for(let e of t)this.authStore.oauth.unregister(e);this.oauthIdsByPlugin.delete(e)}}unregisterAll(){for(let e of[...this.oauthIdsByPlugin.keys()])this.unregister(e)}},Su=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=fu(e.plugin.id,i,e.plugin.manifest);if(!this.providerRegistry.registerPluginProvider(t,gc(e.plugin.id,a),pu(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:hu(o,t,t)},pu(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=>mu(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(pu(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)}},Cu=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)}},wu=class{axisName=`tools`;toolSourcePluginIds=new Set;constructor(e,t){this.toolRegistry=e,this.logger=t}register(e){let t=e.loaded.module.tools;if(!t?.length||!this.toolRegistry)return;if(!e.plugin.manifest.capabilities?.includes(`tools`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares tools but not capabilities:["tools"], skipped (fail-closed)`);return}if(e.verdict.pendingCapabilities.includes(`tools`)){this.logger.warn({pluginId:e.plugin.id},`plugin capability "tools" declared but not yet granted, skipping tools (fail-closed, RFC-124 C2)`);return}let n=this.toolRegistry,r={workspaceDir:e.workspaceDir,logger:{info:t=>this.logger.info({pluginId:e.plugin.id},t),warn:t=>this.logger.warn({pluginId:e.plugin.id},t),error:t=>this.logger.error({pluginId:e.plugin.id},t)},host:e.host,storage:e.storage},i=t.map(t=>yc(e.plugin.id,t,r)).filter(e=>e!==null).filter(t=>n.has(t.name)?(this.logger.warn({pluginId:e.plugin.id,tool:t.name},`plugin tool name collides with an existing tool, rejected (R3, no silent override)`),!1):!0);i.length>0&&(n.register(i,{preset:`full`,source:e.plugin.id}),this.toolSourcePluginIds.add(e.plugin.id))}unregister(e){!this.toolRegistry||!this.toolSourcePluginIds.has(e)||(this.toolRegistry.unregisterBySource(e),this.toolSourcePluginIds.delete(e))}unregisterAll(){for(let e of[...this.toolSourcePluginIds])this.unregister(e)}};const Tu=`[plugin]`;function Eu(e,t,n){let r=n.name?.trim()||n.key;return`${Tu} ${e}:${t}:${n.key} — ${r}`}function Du(e,t,n){let r=e.subscriber;return!r||r.kind!==`plugin-service`||r.pluginId!==t||r.serviceId!==n?!1:e.name.startsWith(Tu)}function Ou(e,t,n){let r=`${Tu} ${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 ku(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(!Du(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=Eu(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 Au(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(Tu)&&t.remove(e.id)&&(r+=1)}return r}var ju=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=ku({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&&ku({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=Au({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=ku({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 Mu=/^[a-z0-9]+(?:-[a-z0-9]+)*$/,Nu=x(n,`plugin-state`);function Pu(e){let t=Fu(e);try{return Xr(t,{recursive:!0,force:!0}),{removed:!D(t),dir:t}}catch{return{removed:!1,dir:t}}}function Fu(e){if(!Mu.test(e))throw Error(`invalid pluginId for scoped storage: ${e} (must be kebab-case)`);return x(Nu,e)}var Iu=class{persistence;baseDir;pluginId;workspaceKey;constructor(e,t){if(this.pluginId=e,this.workspaceKey=t,!Mu.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(Fu(e),t));O(n,{recursive:!0});let r=Jr(n),i=Jr(Nu);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 Lu(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 Ru(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 Sl(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 zu=new WeakMap;function Bu(e){if(e.capabilityQuota)return e.capabilityQuota;let t=zu.get(e);return t||(t=new Ec,zu.set(e,t)),t}const Vu=new Map([[`oauthProviderFactories`,`provider`],[`providerFactories`,`provider`],[`wireProtocols`,`wire-protocol`]]);function Hu(e){let t=e.manifest.contributes;return!t||typeof t!=`object`?[]:Object.keys(t)}var Uu=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 Jl(e.hookRegistry),this.monitorsAxis=new Yl(e.hookRegistry,e.logger),this.feedbackAxis=new Xl(e.feedbackRegistry,e.logger),this.sigilAxis=new iu(e.sigilResolverRegistry,e.pluginInput,e.logger),this.computedCommandsAxis=new au,this.computedAgentsAxis=new ou,this.computedSkillsAxis=new su(e.skillRegistry),this.oauthProviderAxis=new xu(e.authStore,e.logger),this.codeProviderAxis=new Su(e.providerRegistry,e.modelRegistry,e.logger),this.wireProtocolAxis=new Cu(e.wireProtocolRegistry,e.logger),this.toolsAxis=new wu(e.toolRegistry,e.logger),this.servicesAxis=new ju({pool:e.servicePool??gl(),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=Ru(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=Ru(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 Iu(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=Vu.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=E(e),n=`${t.gated?`gated`:`ok`}:${[...t.pendingCapabilities].sort().join(`,`)}`,r=`nofile`;for(let t of[`plugin.ts`,`plugin.tsx`])try{let n=Zr(x(e.dir,t));r=`${t}:${n.mtimeMs}:${n.size}`;break}catch{}return`${JSON.stringify(e.manifest)}|${n}|${r}`}async reload(e){let t=this.deps.activePlugins(),n=new Map(t.map(e=>[e.id,e])),r=new Map(t.map(e=>[e.id,this.pluginSignature(e)])),i=[],a=new Set,o=new Set;for(let[e,t]of this.loadedModules)n.get(e)?r.get(e)!==t.signature&&(t.module.module.onDeactivate&&i.push({pluginId:e,onDeactivate:t.module.module.onDeactivate}),o.add(e)):(t.module.module.onDeactivate&&i.push({pluginId:e,onDeactivate:t.module.module.onDeactivate}),a.add(e));for(let{pluginId:e,onDeactivate:t}of i)await this.callOnDeactivate(e,t);for(let e of a)await this.unregisterPluginAxes(e,void 0),this.loadedModules.delete(e);for(let e of o)await this.unregisterPluginAxes(e,n.get(e));this.computedAgentsAxis.setExistingAgentNames(e);let s=new Set;for(let e of this.deps.activePlugins()){if(!ql(ir(e.manifest),this.firedEvents)){s.add(e.id);continue}if(this.loadedModules.get(e.id)&&!o.has(e.id))continue;let t={pluginId:e.id,pluginDir:e.dir,workspaceDir:this.deps.workspaceDir,callMcpTool:(e,t,n)=>this.deps.callMcpTool(e,t,n),logger:{debug:t=>{this.deps.logger.debug({pluginId:e.id},t)},info:t=>{this.deps.logger.info({pluginId:e.id},t),sc(e.id,`info`,t)},warn:t=>{this.deps.logger.warn({pluginId:e.id},t),sc(e.id,`warn`,t)},error:t=>{this.deps.logger.error({pluginId:e.id},t),sc(e.id,`error`,t)}},getWireProtocol:e=>this.deps.wireProtocolRegistry?.get(e),resolveProviderCredential:(()=>{let t=Lu(e);return e=>t(e)?this.deps.providerRegistry?.resolveAccessKey(e)??Promise.resolve(null):Promise.resolve(null)})(),resolveProviderAuth:(()=>{let t=Lu(e);return e=>t(e)?this.deps.providerRegistry?.resolveAuth(e)??Promise.resolve(null):Promise.resolve(null)})(),host:Ru(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)??Hu(e)}))},n=this.deps.useIsolatedLoading!==!1&&Wl(e)?await Kl(e,t,void 0,this.deps.onPluginLoadError):await sl(e,t,this.deps.onPluginLoadError);if(!n)continue;let i=E(e);if(i.gated){this.deps.logger.warn({pluginId:e.id},`project plugin not trusted, skipping code axes (fail-closed, RFC-124 C1)`);continue}let a;if(e.manifest.capabilities?.includes(`storage`))try{let t=this.deps.getWorkspaceKey?.()??Si;a=new Iu(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:Ru(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,Hu(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=C(`@x-otto/coding:panel-compiler`);function Gu(e){let t=x(e,`panels`);if(!D(t))return{compiled:[],errors:[],skipped:!0};let n;try{n=Kr(t).filter(e=>e.endsWith(`.tsx`))}catch{return{compiled:[],errors:[],skipped:!0}}if(n.length===0)return{compiled:[],errors:[],skipped:!0};let r=x(e,`panels-dist`);O(r,{recursive:!0});let i=Wr(x(Be(),`otto-panel-shims-`)),a=x(i,`react-shim.js`),o=x(i,`ink-shim.js`),s=x(i,`tui-shim.js`);A(a,`const R = globalThis.React
|
|
366
|
+
if (msg.type === '${R.stop}') { toolExecutors.clear(); pluginInstance = null; process.exit(0) }
|
|
367
|
+
})`}`}var Dl=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===R.loaded){let t=this.settlePending(`__load__`);t&&t.resolve(e.module);return}if(e.type===R.error){let t=this.settlePending(`__load__`);t&&t.reject(Error(e.error??this.adapter.loadFailedMessage?.()??`plugin isolated transport load failed`));return}if(e.type===R.toolResult){let t=this.settlePending(e.id);t&&t.resolve({result:e.result,error:e.error});return}if(e.type===R.sigilResult){let t=this.settlePending(e.id);t&&t.resolve({result:e.result,error:e.error});return}if(e.type===R.activated||e.type===R.deactivated){let t=this.settlePending(e.id);t&&t.resolve({error:e.error});return}if(e.type===R.hostCall){let t=this.boundPluginId,n=this.hostCallDispatcher,r=t=>{try{this.adapter.send({type:R.hostResult,id:e.id,...t})}catch{}};if(!n){r({error:`host call dispatcher not installed (plugin host capabilities unavailable)`});return}n(t,e.method??``,e.args??[]).then(e=>r({result:e})).catch(e=>r({error:e instanceof Error?e.message:String(e)}));return}}),this.adapter.onError(e=>{this.adapter.onErrorLog?.(e),this.rejectAllPending(e)}),this.adapter.onExit(e=>{if(this.pending.size===0)return;this.adapter.onExitLog?.(e);let t=this.adapter.exitErrorMessage?.(e)??`plugin isolated transport exited unexpectedly (code ${e})`;this.rejectAllPending(Error(t))})}rejectAllPending(e){for(let[,t]of this.pending)t.type===`load`?t.reject(e):t.resolve({error:e.message});this.pending.clear(),this.adapter.unref()}syncRefState(){this.pending.size>0?this.adapter.ref():this.adapter.unref()}trackPending(e,t){this.pending.set(e,t),this.syncRefState()}settlePending(e){let t=this.pending.get(e);return t&&(this.pending.delete(e),this.syncRefState()),t}async load(e,t,n){if(this.pending.has(`__load__`))throw Error(this.adapter.alreadyLoadingMessage?.(e)??`plugin isolated transport already loading ${e}`);return this.boundPluginId=e,new Promise((r,i)=>{this.trackPending(`__load__`,{type:`load`,resolve:r,reject:i}),this.adapter.send({type:R.load,pluginId:e,compiledPath:t,ctx:n,...n.hostMethods?{hostMethods:n.hostMethods}:{},...n.hostExternals?{hostExternals:n.hostExternals}:{}})})}async executeTool(e,t,n){let r=`tool-${++this.idCounter}`,i=n?.timeoutMs??6e4,a=n?.signal;return a?.aborted?{error:`plugin tool execution aborted`}:new Promise(n=>{let o,s,c=()=>{o!==void 0&&clearTimeout(o),s&&a&&a.removeEventListener(`abort`,s)};this.trackPending(r,{type:`tool`,resolve:e=>{c(),n(e)}});let l=e=>{let t=this.settlePending(r);if(t){try{this.adapter.send({type:R.toolCancel,id:r})}catch{}t.resolve({error:e})}};i>0&&(o=setTimeout(()=>{this.adapter.onToolTimeout?.(e,i),l(`plugin tool "${e}" timed out after ${i}ms`)},i),o.unref?.()),a&&(s=()=>l(`plugin tool execution aborted`),a.addEventListener(`abort`,s,{once:!0})),this.adapter.send({type:R.toolExecute,id:r,name:e,params:t})})}async resolveSigil(e,t,n,r){let i=`sigil-${++this.idCounter}`,a=r?.timeoutMs??6e4;return new Promise(r=>{let o;this.trackPending(i,{type:`sigil`,resolve:e=>{o!==void 0&&clearTimeout(o),r(e)}}),a>0&&(o=setTimeout(()=>{let t=this.settlePending(i);t&&t.resolve({error:`sigil resolver "${e}" timed out after ${a}ms`})},a),o.unref?.()),this.adapter.send({type:R.sigilResolve,id:i,name:e,param:t,ctx:n})})}async activate(){let e=`lifecycle-${++this.idCounter}`;return new Promise(t=>{this.trackPending(e,{type:`lifecycle`,resolve:t}),this.adapter.send({type:R.onActivate,id:e})})}async deactivate(){let e=`lifecycle-${++this.idCounter}`;return new Promise(t=>{this.trackPending(e,{type:`lifecycle`,resolve:t}),this.adapter.send({type:R.onDeactivate,id:e})})}clearPending(){this.pending.clear()}};const Ol=C(`@x-otto/coding:plugin-worker-pool`);let kl=null,Al=null;function jl(){return Al||(kl||=qr(x(Ve(),`otto-plugin-worker-`)),Al=x(kl,`worker-entry.cjs`),k(Al,El(`worker`)),Al)}var Ml=class extends Dl{worker;constructor(){let e=new Li(jl());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)=>{Ol.warn({tool:e,timeoutMs:t},`plugin tool execution timed out`)},onErrorLog:e=>{Ol.warn({err:String(e)},`plugin worker error`)},onExitLog:e=>{Ol.warn({code:e},`plugin worker exited unexpectedly with pending requests`)},exitErrorMessage:e=>`plugin worker exited unexpectedly (code ${e})`,loadFailedMessage:()=>`plugin worker load failed`,alreadyLoadingMessage:e=>`plugin worker already loading ${e}`}),this.worker=e}async stop(){try{this.worker.postMessage({type:R.stop}),await this.worker.terminate()}catch{}this.clearPending(),this.worker.unref()}},Nl=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 Ml;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(),kl){try{$r(kl,{recursive:!0,force:!0})}catch{}kl=null,Al=null}await Promise.all(e.map(e=>e.stop().catch(()=>{})))}get size(){return this.workers.size}};const Pl=C(`@x-otto/coding:plugin-process-pool`);let Fl=null,Il=null;function Ll(){return Il||(Fl||=qr(x(Ve(),`otto-plugin-process-`)),Il=x(Fl,`process-entry.cjs`),k(Il,El(`process`)),Il)}var Rl=class extends Dl{child;sandboxToDispose;constructor(e){let t=Ll(),n=process.execPath,r=[t],i=n,a=r,o;if(ze()){let t=Ie({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 Pl.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=ji(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)=>{Pl.warn({tool:e,timeoutMs:t},`plugin tool execution timed out (isolated process)`)},onErrorLog:e=>{Pl.warn({err:String(e)},`plugin process error`)},onExitLog:e=>{Pl.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=>{Pl.warn({stderr:e.toString().slice(0,500)},`plugin process stderr output`)}),this.child.on(`exit`,()=>{this.sandboxToDispose?.dispose().catch(()=>void 0),this.sandboxToDispose=void 0})}async stop(){try{this.child.send({type:R.stop})}catch{}try{this.child.kill()}catch{}this.clearPending()}},zl=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 Rl(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{$r(Fl,{recursive:!0,force:!0})}catch{}Fl=null,Il=null}await Promise.all(e.map(e=>e.stop().catch(()=>{})))}get size(){return this.processes.size}};const z=C(`@x-otto/coding:plugin-module-loader-isolated`);let Bl=null;function Vl(){return Bl||=new Nl,Bl}let Hl=null;function Ul(){return Hl||=new zl,Hl}async function Wl(){await Promise.all([Bl?.dispose()??Promise.resolve(),Hl?.dispose()??Promise.resolve()])}function Gl(e){return e===`project`||e===`repository`?Ul():Vl()}function Kl(e){return!!e.manifest.capabilities?.includes(`tools`)}function ql(e,t,n){let r={};if(t.contributions&&(r.contributions=t.contributions),t.tools.length>0&&(r.tools=t.tools.map(t=>({name:t.name,description:t.description||t.name,parameters:{safeParse(e){return t.hasParameters?{success:!0,data:e}:{success:!0,data:{}}},...t.parametersSchema===void 0?{}:{toJSONSchema:()=>t.parametersSchema}},async execute(r,i){let{result:a,error:o}=await n.executeTool(e,t.name,r,{signal:i?.signal});if(o)throw Error(o);return a&&typeof a==`object`&&Array.isArray(a.content)?a:{content:[{type:`text`,text:typeof a==`string`?a:JSON.stringify(a??null)}]}}}))),t.hasSigilProviders&&z.warn({pluginId:e},`plugin declares sigilProviders but is loaded via the isolated path (tools capability) — dynamic @ search providers are not proxied over RPC and will be inactive; declare input.resolver without tools to use the in-process path, or use static sigilEntries`),t.sigilResolvers?.length>0){r.sigilResolvers={};for(let i of t.sigilResolvers)r.sigilResolvers[i.name]={resolve:(t,r)=>n.resolveSigil(e,i.name,t,r,{timeoutMs:i.timeoutMs}).then(e=>{if(e.error)throw Error(e.error);return e.result??``}),timeoutMs:i.timeoutMs,uiHostOnly:i.uiHostOnly}}return t.hasOnActivate&&(r.onActivate=async()=>{let{error:t}=await n.activate(e);if(t)throw Error(t)}),t.hasOnDeactivate&&(r.onDeactivate=async()=>{let{error:t}=await n.deactivate(e);if(t)throw Error(t)}),r}async function Jl(e,t,n,r){if((e.scope===`project`||e.scope===`repository`)&&!$n(e.dir))return z.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 z.warn({pluginId:e.id,pendingCapabilities:i.pendingCapabilities},`plugin declares high-risk capabilities not yet granted, skipping isolated code module before worker execution (fail-closed, RFC-140 D3)`),null;let a=n??Gl(e.scope),o=ll(e.dir);try{o?z.info({pluginId:e.id,compiledPath:o},`using prebuilt plugin module (isolated path, RFC-150 D5)`):o=await tl(e.dir)}catch(t){let n=String(t);return z.warn({pluginId:e.id,err:n},`plugin.ts compile failed (isolated path)`),r?.(e.id,`compile failed: ${n}`),null}if(!o)return null;let s=[...Object.keys(t.host??{}),`listActivePlugins`];if(t.host&&Object.keys(t.host).length>0||t.listActivePlugins){let e=t.host;a.setHostCallDispatcher?.(async(n,r,i)=>{if(r===`listActivePlugins`)return t.listActivePlugins?t.listActivePlugins():[];if(!e||typeof e[r]!=`function`)throw Error(`host method '${r}' not available (not declared or not granted)`);if(!(r in e))throw Error(`host method '${r}' not in whitelist`);let a=e[r];return a(...i)})}try{let n=await a.load(e.id,o,{pluginId:t.pluginId,pluginDir:t.pluginDir,workspaceDir:t.workspaceDir,hostMethods:s,listActivePlugins:!0,hostExternals:Qc()});if(n===null){if(e.scope===`project`||e.scope===`repository`){let t=`plugin process pool exhausted (project/repository scope requires isolated execution, refusing to downgrade to in-process)`;return z.warn({pluginId:e.id},t),r?.(e.id,t),null}return z.info({pluginId:e.id},`plugin worker pool exhausted, falling back to in-process load`),ul(e,t,r)}return{pluginId:e.id,module:ql(e.id,n,a),compiledPath:o}}catch(t){let n=String(t);return z.warn({pluginId:e.id,err:n},`plugin.ts worker load failed`),r?.(e.id,`worker load failed: ${n}`),null}}function Yl(e,t){return e.includes(`onStartup`)?!0:e.some(e=>t.has(e))}var Xl=class{axisName=`hooks`;hookNamesByPlugin=new Map;constructor(e){this.hookRegistry=e}register(e){let t=e.loaded.module.hooks;if(t){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)}}unregister(e){let t=this.hookNamesByPlugin.get(e);if(t){for(let e of t)this.hookRegistry.unregister(e);this.hookNamesByPlugin.delete(e)}}unregisterAll(){for(let e of[...this.hookNamesByPlugin.keys()])this.unregister(e)}},Zl=class{axisName=`monitors`;hookNamesByPlugin=new Map;monitorsByPlugin=new Map;constructor(e,t){this.hookRegistry=e,this.logger=t}register(e){let t=e.loaded.module.monitors;if(!t?.length)return;if(!e.plugin.manifest.capabilities?.includes(`monitor`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares monitors but not capabilities:["monitor"], skipped (fail-closed)`);return}let n=Cc(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()]}},Ql=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 $l=C(`@x-otto/coding:plugin-sigil-loader`);function eu(e){return e.startsWith(`!`)||e.startsWith(`#`)}function tu(e){let t=[];for(let n of e){let e=n.manifest.contributes?.sigilEntries;if(e?.length){if(E(n).gated){$l.warn({pluginId:n.id},`plugin gated (untrusted), sigilEntries skipped`);continue}for(let r of e){if(eu(r.value)){$l.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 nu(e){for(let t of e)t.manifest.contributes?.inputEntries&&$l.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 ru(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}):$l.warn({pluginId:e,name:r},`sigilResolvers entry is neither function nor {resolve}, skipped`)}return n}function iu(e,t){return t.map(t=>async(n,r)=>(await t(n,r)).filter(e=>!eu(e.value)).map(t=>({...t,source:e})))}function au(e,t){for(let n of e)n.resolverId&&!t(n.resolverId)&&$l.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 ou=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=ru(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 iu(e.plugin.id,n))t.push(this.pluginInput.registerProvider(`@`,r));this.sigilProviderUnsubsByPlugin.set(e.plugin.id,t)}if(this.sigilResolverRegistry){let t=this.sigilResolverRegistry;au(tu([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)}},su=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(...hc(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()}},cu=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(...gc(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}},lu=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 _c(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 uu(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 du(e){return new Set([...(e.contributes?.providers??[]).filter(e=>e.preserveProviderId===!0&&e.oauthRef).map(e=>e.oauthRef),...e.codeProviderIds??[]])}function fu(e,t){let n=du(t);return new Set((t.contributes?.oauth??[]).map(t=>n.has(t.id)?t.id:V(e,t.id)))}function pu(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 mu(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 hu(e){return`code:${e}`}function gu(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 _u(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 vu(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:uu(a)})}}function yu(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`?Vi({...t,id:s,name:c,tokenExchangeEncoding:t.tokenExchangeEncoding??`form`,assumesLoopbackAlways:t.assumesLoopbackAlways??!1,subscriptionScoped:t.subscriptionScoped??!1}):Bi({...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 bu(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(oe(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(!ue({id:l,name:t.name,env:t.oauthRef?void 0:t.envKey,requiresIntranet:t.requiresIntranet===!0},e)){i.rejected.push({id:t.id,reason:`provider descriptor id already claimed`}),t.envKey&&n.authStore.unregisterEnvKey(l);continue}if(t.models?.length){let r=t.models.map(e=>gu(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?_u(t.modelsEndpoint,l,c,t.baseUrl,t.headers):void 0,m=()=>{t.oauthRef&&r&&!s.has(u)&&r.unregister(u)};if(!ue({id:l,name:t.name,env:t.oauthRef?void 0:t.envKey,buildModelsRequest:p,requiresIntranet:t.requiresIntranet===!0},e)){i.rejected.push({id:t.id,reason:`provider descriptor id already claimed by another plugin`}),t.envKey&&!t.oauthRef&&n.authStore.unregisterEnvKey(l),m();continue}t.allowAuthHeaderOverride&&B.warn({pluginId:e,providerId:t.id},`provider declares allowAuthHeaderOverride: custom headers may replace auth headers (RFC-270 D3)`);let h=vu(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`}),me(l),t.envKey&&!t.oauthRef&&n.authStore.unregisterEnvKey(l),m();continue}if(t.models?.length){let r=t.models.map(e=>gu(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 xu(e,t,n,r,i){let a={registered:[],rejected:[]},o=n.authStore.oauth;return yu(e,t,o,du(t),new Map((t.contributes?.providers??[]).filter(e=>e.oauthRef&&e.name).map(e=>[e.oauthRef,e.name])),a,r),bu(e,t,n,o,a,i),a}async function Su(e,t,n,r,i){let a=n.authStore.oauth,o=du(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);me(r),t.envKey&&!t.oauthRef&&n.authStore.unregisterEnvKey(r)}await n.providerRegistry.unregisterBySource(e,i),n.modelRegistry.unregisterBySource(e)}}var Cu=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=bc(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)}},wu=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=mu(e.plugin.id,i,e.plugin.manifest);if(!this.providerRegistry.registerPluginProvider(t,yc(e.plugin.id,a),hu(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(ue({id:t,buildModelsRequest:_u(o,t,t)},hu(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=>gu(e,t,t,s.baseUrl,s.imageConstraints,s.supportsTools,s.responseBodyPolicy)),r=this.modelRegistry.registerWithSource(n,hu(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(hu(e)),this.providerSourcePluginIds.delete(e)),this.modelRegistry&&this.modelSourcePluginIds.has(e)&&(this.modelRegistry.unregisterBySource(hu(e)),this.modelSourcePluginIds.delete(e));let t=this.descriptorIdsByPlugin.get(e);if(t){for(let e of t)me(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){le(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)pe(e);this.cacheReportingApisByPlugin.delete(e)}}unregisterAll(){let e=new Set([...this.wireProtocolSourcePluginIds,...this.cacheReportingApisByPlugin.keys()]);for(let t of e)this.unregister(t)}},Eu=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=>Sc(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 Du=`[plugin]`;function Ou(e,t,n){let r=n.name?.trim()||n.key;return`${Du} ${e}:${t}:${n.key} — ${r}`}function ku(e,t,n){let r=e.subscriber;return!r||r.kind!==`plugin-service`||r.pluginId!==t||r.serviceId!==n?!1:e.name.startsWith(Du)}function Au(e,t,n){let r=`${Du} ${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 ju(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(!ku(e,r,i))continue;let t=Au(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 Mu(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(Du)&&t.remove(e.id)&&(r+=1)}return r}var Nu=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=ju({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&&ju({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=Mu({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=ju({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 Pu=/^[a-z0-9]+(?:-[a-z0-9]+)*$/,Fu=x(n,`plugin-state`);function Iu(e){let t=Lu(e);try{return $r(t,{recursive:!0,force:!0}),{removed:!D(t),dir:t}}catch{return{removed:!1,dir:t}}}function Lu(e){if(!Pu.test(e))throw Error(`invalid pluginId for scoped storage: ${e} (must be kebab-case)`);return x(Fu,e)}var Ru=class{persistence;baseDir;pluginId;workspaceKey;constructor(e,t){if(this.pluginId=e,this.workspaceKey=t,!Pu.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=ln({type:`memory`});return}let n=S(x(Lu(e),t));Kr(n,{recursive:!0});let r=Zr(n),i=Zr(Fu);if(r!==i&&!r.startsWith(i+`/`))throw Error(`scoped storage path escapes plugin-state root: ${r}`);this.baseDir=n,this.persistence=ln({type:`file`,baseDir:n})}async save(e,t){await this.persistence.save({id:e,data:t,version:1,metadata:{}})}async load(e){let t=await this.persistence.load(e);return t?t.data:null}delete(e){return this.persistence.delete(e)}list(){return this.persistence.list()}};function zu(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 Bu(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=Hu(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 Tl(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 Vu=new WeakMap;function Hu(e){if(e.capabilityQuota)return e.capabilityQuota;let t=Vu.get(e);return t||(t=new kc,Vu.set(e,t)),t}const Uu=new Map([[`oauthProviderFactories`,`provider`],[`providerFactories`,`provider`],[`wireProtocols`,`wire-protocol`]]);function Wu(e){let t=e.manifest.contributes;return!t||typeof t!=`object`?[]:Object.keys(t)}var Gu=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;dirtyPluginIds=new Set;loadedModules=new Map;constructor(e){this.deps=e,this.hooksAxis=new Xl(e.hookRegistry),this.monitorsAxis=new Zl(e.hookRegistry,e.logger),this.feedbackAxis=new Ql(e.feedbackRegistry,e.logger),this.sigilAxis=new ou(e.sigilResolverRegistry,e.pluginInput,e.logger),this.computedCommandsAxis=new su,this.computedAgentsAxis=new cu,this.computedSkillsAxis=new lu(e.skillRegistry),this.oauthProviderAxis=new Cu(e.authStore,e.logger),this.codeProviderAxis=new wu(e.providerRegistry,e.modelRegistry,e.logger),this.wireProtocolAxis=new Tu(e.wireProtocolRegistry,e.logger),this.toolsAxis=new Eu(e.toolRegistry,e.logger),this.servicesAxis=new Nu({pool:e.servicePool??yl(),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=Bu(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=Bu(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 Ru(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,n){let r=[],i=t?E(t):void 0;for(let n of this.axisHandlers){let a=Uu.get(n.axisName);if(!(a!==void 0&&t!==void 0&&i!==void 0&&t.manifest.capabilities?.some(e=>e===a)&&!i.gated&&!i.pendingCapabilities.includes(a)))try{await n.unregister(e)}catch(t){r.push(n.axisName),this.deps.logger.warn({pluginId:e,axis:n.axisName,err:t instanceof Error?t.message:String(t)},`plugin axis unregister failed (continuing with remaining axes; plugin marked dirty for full reload next round)`)}}Hu(this.deps).reset(e),r.length>0&&(this.dirtyPluginIds.add(e),n?.add(e),this.deps.logger.warn({pluginId:e,failedAxes:r},`plugin marked dirty due to axis unregister failures; next reload will force a full reinstall of this plugin`))}pluginSignature(e){let t=E(e),n=`${t.gated?`gated`:`ok`}:${[...t.pendingCapabilities].sort().join(`,`)}`,r=`nofile`;for(let t of[`plugin.ts`,`plugin.tsx`])try{let n=ei(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||this.dirtyPluginIds.has(e))&&(t.module.module.onDeactivate&&i.push({pluginId:e,onDeactivate:t.module.module.onDeactivate}),o.add(e)):(t.module.module.onDeactivate&&i.push({pluginId:e,onDeactivate:t.module.module.onDeactivate}),a.add(e));for(let{pluginId:e,onDeactivate:t}of i)await this.callOnDeactivate(e,t);let s=new Set;for(let e of a)await this.unregisterPluginAxes(e,void 0,s),this.loadedModules.delete(e);for(let e of o)await this.unregisterPluginAxes(e,n.get(e),s);this.computedAgentsAxis.setExistingAgentNames(e);let c=new Set;for(let e of this.deps.activePlugins()){if(!Yl(or(e.manifest),this.firedEvents)){c.add(e.id);continue}if(this.loadedModules.get(e.id)&&!o.has(e.id))continue;let t={pluginId:e.id,pluginDir:e.dir,workspaceDir:this.deps.workspaceDir,callMcpTool:(e,t,n)=>this.deps.callMcpTool(e,t,n),logger:{debug:t=>{this.deps.logger.debug({pluginId:e.id},t)},info:t=>{this.deps.logger.info({pluginId:e.id},t),uc(e.id,`info`,t)},warn:t=>{this.deps.logger.warn({pluginId:e.id},t),uc(e.id,`warn`,t)},error:t=>{this.deps.logger.error({pluginId:e.id},t),uc(e.id,`error`,t)}},getWireProtocol:e=>this.deps.wireProtocolRegistry?.get(e),resolveProviderCredential:(()=>{let t=zu(e);return e=>t(e)?this.deps.providerRegistry?.resolveAccessKey(e)??Promise.resolve(null):Promise.resolve(null)})(),resolveProviderAuth:(()=>{let t=zu(e);return e=>t(e)?this.deps.providerRegistry?.resolveAuth(e)??Promise.resolve(null):Promise.resolve(null)})(),host:Bu(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)??Wu(e)}))},n=this.deps.useIsolatedLoading!==!1&&Kl(e)?await Jl(e,t,void 0,this.deps.onPluginLoadError):await ul(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?.()??Ti;a=new Ru(e.id,t)}catch(t){this.deps.logger.warn({pluginId:e.id,err:String(t)},`failed to construct scoped storage for plugin, storage capability unavailable`)}let l={plugin:e,verdict:i,loaded:n,host:Bu(e,i,this.deps),workspaceDir:this.deps.workspaceDir,storage:a};for(let e of this.axisHandlers)await e.register(l);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,Wu(e)),this.loadedModules.set(e.id,{module:n,manifest:e.manifest,signature:r.get(e.id)??this.pluginSignature(e)}),s.has(e.id)||this.dirtyPluginIds.delete(e.id)}return this.deferredIds=c,this.computedAgentsAxis.getAppendedAgents()}async cleanup(){for(let[e,t]of this.loadedModules)t.module.module.onDeactivate&&await this.callOnDeactivate(e,t.module.module.onDeactivate);this.loadedModules.clear(),await this.unregisterAllAxes();let e=Hu(this.deps);for(let t of this.deps.activePlugins())e.reset(t.id);this.firedEvents.clear()}};const Ku=C(`@x-otto/coding:panel-compiler`);function qu(e){let t=x(e,`panels`);if(!D(t))return{compiled:[],errors:[],skipped:!0};let n;try{n=Yr(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`);Kr(r,{recursive:!0});let i=qr(x(Ve(),`otto-panel-shims-`)),a=x(i,`react-shim.js`),o=x(i,`ink-shim.js`),s=x(i,`tui-shim.js`);k(a,`const R = globalThis.React
|
|
368
368
|
if (!R) throw new Error('otto panel: globalThis.React 未注入(TUI 须在加载面板前 import panel-globals)')
|
|
369
369
|
export default R
|
|
370
370
|
export const useState = R.useState, useEffect = R.useEffect, useCallback = R.useCallback,
|
|
@@ -372,13 +372,13 @@ export const useState = R.useState, useEffect = R.useEffect, useCallback = R.use
|
|
|
372
372
|
useLayoutEffect = R.useLayoutEffect, createElement = R.createElement, Fragment = R.Fragment,
|
|
373
373
|
memo = R.memo, forwardRef = R.forwardRef, createContext = R.createContext, Children = R.Children,
|
|
374
374
|
cloneElement = R.cloneElement, isValidElement = R.isValidElement
|
|
375
|
-
`),
|
|
375
|
+
`),k(o,`const I = globalThis.__ottoPanelInk
|
|
376
376
|
if (!I) throw new Error('otto panel: globalThis.__ottoPanelInk 未注入(TUI 须在加载面板前 import panel-globals)')
|
|
377
377
|
export const Box = I.Box, Text = I.Text, Newline = I.Newline, Spacer = I.Spacer, Static = I.Static,
|
|
378
378
|
Transform = I.Transform, useApp = I.useApp, useInput = I.useInput, useStdin = I.useStdin,
|
|
379
379
|
useStdout = I.useStdout, useStderr = I.useStderr, useFocus = I.useFocus,
|
|
380
380
|
useFocusManager = I.useFocusManager, measureElement = I.measureElement, render = I.render
|
|
381
|
-
`),
|
|
381
|
+
`),k(s,`const T = globalThis.__ottoPanelTui
|
|
382
382
|
if (!T) throw new Error('otto panel: globalThis.__ottoPanelTui 未注入(TUI 须在加载面板前 import panel-globals)')
|
|
383
383
|
export const Tabs = T.Tabs
|
|
384
384
|
export const DataList = T.DataList
|
|
@@ -389,26 +389,26 @@ export const ScrollIndicatorBelow = T.ScrollIndicatorBelow
|
|
|
389
389
|
export const Tabable = T.Tabable
|
|
390
390
|
export const useTabable = T.useTabable
|
|
391
391
|
export const TabScope = T.TabScope
|
|
392
|
-
`);let c=[],l=[],{buildSync:u}=
|
|
393
|
-
`)){let t=e.trim();if(t.startsWith(`packages:`)){r=!0;continue}if(r){let e=t.match(/^-\s*['"]?([^'"]+)['"]?(?:\s+#.*)?$/);if(e?.[1]){n.push(e[1]);continue}t.length>0&&!t.startsWith(`-`)&&(r=!1)}}return n}function Xu(e,t){let n=S(e,t.endsWith(`/*`)?t.slice(0,-2):t);if(!n.startsWith(e.endsWith(`/`)?e:e+`/`)&&n!==e)return[];if(!t.endsWith(`/*`))return D(n)?[n]:[];if(!D(n))return[];try{return Kr(n,{withFileTypes:!0}).filter(e=>e.isDirectory()).map(e=>x(n,e.name))}catch{return[]}}function Zu(e,t){let n=a(t);if(!n)return;let r=Yu(x(n,`pnpm-workspace.yaml`));for(let t of r)for(let r of Xu(n,t)){let t=x(r,`package.json`);if(!D(t))continue;try{if(JSON.parse(k(t,`utf8`)).name===e)return r}catch{}let n=x(r,T);if(D(n))try{if($n(k(n,`utf8`),n)?.id===e)return r}catch{}}}function Qu(t,n=process.cwd()){let r=[Ii(x(n,`__resolve__.js`)).href,import.meta.url];for(let n of r)try{return b(e(n).resolve(`${t}/package.json`))}catch{}return Zu(t,b(Fi(import.meta.url)))??Zu(t,n)}async function $u(e){let t=Qu(e.pkg,e.cwd);if(!t)throw Error(`无法解析包 ${e.pkg}(未安装或不可从当前位置解析)。`);let r=x(t,T);if(!D(r))throw Error(`${e.pkg} 不是 otto 插件:缺 ${T}(RFC-044 自描述)。`);let i=$n(k(r,`utf8`),r);if(!i)throw Error(`${e.pkg} 的 ${T} 非法(需合法 kebab-case id)。`);let a=e.ottoDir??n,o=x(a,`plugins`,i.id);O(x(a,`plugins`),{recursive:!0});let s=S(t);if(Ju(o)){try{if(S(qr(o))===s){let e=await qu(t);return{id:i.id,packageDir:t,dir:o,created:!1,compileWarnings:e,version:i.version}}}catch{}$r(o)}else if(D(o))if((D(x(o,T))?$n(k(x(o,T),`utf8`),o):null)?.id===i.id)Xr(o,{recursive:!0,force:!0});else throw Error(`目标已存在且非本插件,拒绝覆盖:${o}`);Qr(s,o);let c=await qu(t);return{id:i.id,packageDir:t,dir:o,created:!0,compileWarnings:c,version:i.version}}async function ed(e){let t=x(e,T);if(!D(t))throw Error(`${e} 不是 otto 插件:缺 ${T}`);let r=$n(k(t,`utf8`),t);if(!r)throw Error(`${e} 的 ${T} 非法。`);let i=x(n,`plugins`,r.id);O(x(n,`plugins`),{recursive:!0});let a=S(e);if(Ju(i)){try{if(S(qr(i))===a){let t=await qu(e);return{id:r.id,packageDir:e,dir:i,created:!1,compileWarnings:t,version:r.version}}}catch{}$r(i)}else if(D(i))if((D(x(i,T))?$n(k(x(i,T),`utf8`),i):null)?.id===r.id)Xr(i,{recursive:!0,force:!0});else throw Error(`目标已存在且非本插件,拒绝覆盖:${i}`);Qr(a,i);let o=await qu(e);return{id:r.id,packageDir:e,dir:i,created:!0,compileWarnings:o,version:r.version}}function td(e,t){return[...e.filter(e=>e.id!==t.id),t]}function nd(e,t){return e.filter(e=>e.id!==t)}async function rd(e,t,n=()=>Date.now()){let r=td(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 id(e,t){let n={},r=!1,i=e.get(`installed_plugins`)??[];i.some(e=>e.id===t)&&(n.installed_plugins=nd(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 ad(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 od=class{lastTopoSort;lastEngineIncompatible=new Map;warnedTopoIssues=new Set;warnedEngineIncompatible=new Set;resolve(e){let{compatible:t,incompatible:n}=Kn(Vn({cwd:e.workspaceDir,homedir:e.homedir??ze(),disabled:e.disabledPlugins,bundledDirs:e.bundledDirs}));this.lastEngineIncompatible=n;let r=or(t);return this.lastTopoSort=r,r.ordered}async diagnose(e,t){for(let[t,n]of this.lastEngineIncompatible)this.warnedEngineIncompatible.has(t)||e.warn({pluginId:t,requiredRange:n,hostApiVersion:On},`plugin engines.otto not satisfied by host, skipping plugin (fail-closed, RFC-148 M0)`);this.warnedEngineIncompatible=new Set(this.lastEngineIncompatible.keys());let n=this.lastTopoSort;if(!n)return;let r=new Set([...n.cyclic.keys(),...n.missingDeps.keys()]);for(let[t,r]of n.cyclic)this.warnedTopoIssues.has(t)||e.warn({pluginId:t,cyclePath:r},`plugin dependency cycle detected, skipping cyclic plugin (fail-closed, RFC-132 D5)`);for(let[r,i]of n.missingDeps)if(!this.warnedTopoIssues.has(r)){e.warn({pluginId:r,missingDeps:i},`plugin dependencies missing, skipping plugin (fail-closed, RFC-132 D5)`);for(let n of i)try{let i=await $u({pkg:n});t&&await rd(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 sd(e,t){let{model:n,authStore:r,modelRegistry:i,providerRegistry:a}=e,o=r??_(),s=i??ee(),c=a??re({authStore:o,modelRegistry:s}),l=ie(),u=new Fo(s,o),d=e.modelId,f=n??(d?s.tryResolve(d):void 0);return{authStore:o,modelRegistry:s,providerRegistry:c,wireProtocolRegistry:l,modelCatalogManager:u,defaultModel:f,resolveEffectiveModel:()=>{if(f)return f;if(d){let e=s.tryResolve(d);if(e)return e}let e=t().get(`model`);return(e?s.tryResolve(e)??s.find(e):void 0)??s.getAll().find(e=>e.id!==`__otto_setup__`)}}}function cd(e,t){if(typeof e==`object`&&e){let t=e;if(t.listable===!1||t.transient===!0||typeof t.depth==`number`&&t.depth>0)return!0}return ld(t)}function ld(e){let t=e?.trim().toLowerCase();return t?t===`reply with: ok`||t===`say ok and nothing else`||t.startsWith(`reply with only your model name/identifier`)||t.startsWith(`output exactly the word: probe_ok`)||t.startsWith(`you are a trajectory analyst for an ai coding assistant.`)||t.startsWith(`you are drafting a reusable skill for this project`)||t.startsWith(`you are responsible for completing parent task item`):!1}function ud(e,t,n){let r=(e,r)=>{let i=(r?t.modelRegistry.find(r):void 0)??n();if(!i)throw Error(`configProvider: 无法解析恢复模型(modelId="${r??``}" 未命中、且无默认/settings/注册表模型)`);let a=t.getTools(),o=ba(new Set(a.map(e=>e.name)));return{model:i,systemPrompt:``,tools:a,thinkingLevel:`medium`,maxToolTurns:t.maxToolTurns,promptRefresh:e?lo(t.promptManager,t.getDeclarativeAgentProfiles(),e,a):()=>t.promptManager.assemblePreset({preset:`main`},o),workspaceDir:t.workspaceDir}},i=e.storage?.session;if(i&&`dir`in i&&process.env.OTTO_SESSION_BLOB!==`1`){let n=s(),a=new ii({dbPath:n?`:memory:`:x(i.dir,`sessions.db`)});t.repoRef&&(t.repoRef.current=a);let o=n?ai():oi({lockDir:x(i.dir,`locks`)}),c=new ni({repo:a,workspaceKey:t.getWorkspaceKey??(()=>Si),maxLoadEntries:ln,canStartHistory:e=>e.role!==`tool_result`,writeLease:o,stripInactiveReplacements:!0}),l=async e=>(await a.listSessions(e).catch(()=>[])).filter(e=>!cd(e.config,e.title)).map(e=>({id:e.id,title:e.title?.trim()||e.id.slice(0,8),messageCount:0,createdAt:new Date(e.createdAt),updatedAt:new Date(e.lastActiveAt),status:e.archived?`archived`:`idle`,pinned:e.pinned,pinGroup:e.pinGroup,writeLocked:o.peekLockedByOther(e.id),entryCount:e.entryCount})),u=e=>o.peekLockedByOther(e),d=e=>o.inspect(e),f=e=>o.forceRelease(e);return Tt({providerRegistry:t.providerRegistry,hookRegistry:t.hookRegistry,logger:t.logger,workspaceDir:t.workspaceDir,clock:t.clock,traceStore:t.traceStore,checkpointStore:t.checkpointStore,memory:t.memory,maxSessions:e.maxSessions,devtools:t.devtools,configProvider:r,residencyGovernor:t.residencyGovernor,getResidencyConfig:t.getResidencyConfig,storage:{kind:`custom`,persistence:c,autoPersist:!0,...n?{panelStatePersistence:rn(),pasteStatePersistence:an()}:{panelStateDir:x(i.dir,`panel-state`)},listColdSessionsOverride:l,isSessionWriteLocked:u,inspectSessionWriteLease:d,forceReleaseSessionWriteLease:f,onDispose:()=>{o.close(),a.close()}}})}i&&`dir`in i&&process.env.OTTO_SESSION_BLOB===`1`&&C(`@x-otto/coding:session-pool-factory`).warn(`OTTO_SESSION_BLOB=1 — blob session persistence is deprecated (M63). Relational append (sessions.db) is the default since M60. The blob escape hatch will be removed when the relational path has proven stable in production.`);let a=i?`dir`in i?{kind:`disk`,sessionDir:i.dir}:`url`in i?(()=>{let n=fa(e.storage,`session`);return{kind:`remote`,sessionUrl:i.url,fetch:n.fetch??globalThis.fetch,getAuth:n.getAuth,timeoutMs:n.timeoutMs,userId:e.userIdentity?.userId,wsKey:t.getWorkspaceKey}})():void 0:void 0;return Tt({providerRegistry:t.providerRegistry,hookRegistry:t.hookRegistry,logger:t.logger,workspaceDir:t.workspaceDir,clock:t.clock,traceStore:t.traceStore,checkpointStore:t.checkpointStore,memory:t.memory,maxSessions:e.maxSessions,storage:a,devtools:t.devtools,configProvider:r,residencyGovernor:t.residencyGovernor})}function dd(e){return e.map(e=>({name:e.name,description:typeof e.description==`function`?e.description({projectRoot:``}):e.description,parameters:e.parameters}))}function fd(e,t,n){if(e.length===0)return[];if(!n.getTools)return n.logger.warn(`Swarm member "%s" requested %d tools but leaf has no tool directory (getTools not injected); all hidden (fail closed)`,t,e.length),[];let r=yn(n.getDeclarativeAgentProfiles?.()??[],t),i=r?no(r.defaultTools):void 0,a=oo(n.getTools,void 0,i),o=new Map(a.map(e=>[e.name,e])),s=[],c=new Set;for(let r of e){if(c.has(r.name))continue;c.add(r.name);let e=o.get(r.name);if(!e){n.logger.warn(`Swarm member "%s" tool "%s" not resolvable at leaf (missing from directory or denied by profile allowlist); hidden from model`,t,r.name);continue}s.push(e)}return s}function pd(e,t,n,r){let i=[],a=new Set;for(let o of e){if(a.has(o.name)){n.warn(`Swarm member "%s" duplicate core descriptor "%s"; ignored`,t,o.name);continue}if(o.name!==`handoff_to_agent`){n.warn(`Swarm member "%s" received unknown core tool descriptor "%s"; hidden (fail closed)`,t,o.name);continue}if(o.context.from!==t){n.warn(`Swarm member "%s" handoff descriptor origin mismatch (from="%s"); hidden (fail closed)`,t,o.context.from);continue}if(o.context.allowedTargets.length===0){n.warn(`Swarm member "%s" handoff descriptor has no allowed targets; hidden`,t);continue}a.add(o.name),i.push(li(o.context.from,o.context.allowedTargets,r))}return i}function md(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=fd(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=pd(t.coreTools??[],t.agentId,e.logger,e=>{a||=e}),s=new Set(o.map(e=>e.name)),c=[...o,...i.filter(e=>!s.has(e.name))],l={model:r,systemPrompt:t.systemPrompt??``,messages:[],tools:c,thinkingLevel:t.thinkingLevel??`medium`,maxTokens:t.maxTokens,temperature:t.temperature};l.messages.push({role:`user`,content:[{type:`text`,text:t.prompt}],timestamp:Date.now()});let u=t.sessionId??`swarm:${t.agentId}`,d=t.depth??0,f=new hi({stream:e.stream,logger:e.logger,agentName:t.agentId,maxToolTurns:t.maxToolTurns,toolHookExecutor:jt({hookRegistry:e.hookRegistry,agentName:t.agentId,sessionId:u}),depth:d}),p=()=>f.abort();t.signal?.aborted?f.abort():t.signal?.addEventListener(`abort`,p,{once:!0});let m=`${u}:${t.agentId}`,h=St(f,{id:m,agentName:t.agentId,title:t.agentId,prompt:t.prompt,model:t.model??r.id,origin:`main`,depth:d,abort:()=>f.abort(),messages:l.messages}),g;try{g=await f.run(l)}finally{t.signal?.removeEventListener(`abort`,p),h(),zt.markEnded(m)}return{agentId:t.agentId,messages:l.messages,handoff:t.signal?.aborted?void 0:a,text:g.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
|
|
394
|
-
`),tokenUsage:{input:g.usage.inputTokens,output:g.usage.outputTokens,cacheRead:g.usage.cacheReadTokens},durationMs:Date.now()-n}}}function
|
|
392
|
+
`);let c=[],l=[],{buildSync:u}=Lc();Rc();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}),Ku.warn({pluginDir:e,entry:i,err:String(t)},`panel compile failed`)}}return Ku.info({pluginDir:e,compiled:c.length,errors:l.length},`compiled plugin panels`),{compiled:c,errors:l,skipped:!1}}const Ju=C(`@x-otto/coding:plugin-install`);function Yu(e){let t=[];return(async()=>{try{let t=await tl(e);t&&Ju.info({pluginDir:e,outfile:t},`plugin code module compiled at install time`)}catch(n){let r=n instanceof Error?n.message:String(n);Ju.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}=qu(e);if(!r&&n.length>0)for(let r of n)Ju.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);Ju.warn({pluginDir:e,err:r},`plugin panel compilation crashed unexpectedly at install time`),t.push(`面板编译异常:${r}`)}})().then(()=>t)}function Xu(e){try{return Gr(e).isSymbolicLink()}catch{return!1}}function Zu(e){let t=O(e,`utf8`),n=[],r=!1;for(let e of t.split(`
|
|
393
|
+
`)){let t=e.trim();if(t.startsWith(`packages:`)){r=!0;continue}if(r){let e=t.match(/^-\s*['"]?([^'"]+)['"]?(?:\s+#.*)?$/);if(e?.[1]){n.push(e[1]);continue}t.length>0&&!t.startsWith(`-`)&&(r=!1)}}return n}function Qu(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 Yr(n,{withFileTypes:!0}).filter(e=>e.isDirectory()).map(e=>x(n,e.name))}catch{return[]}}function $u(e,t){let n=a(t);if(!n)return;let r=Zu(x(n,`pnpm-workspace.yaml`));for(let t of r)for(let r of Qu(n,t)){let t=x(r,`package.json`);if(!D(t))continue;try{if(JSON.parse(O(t,`utf8`)).name===e)return r}catch{}let n=x(r,T);if(D(n))try{if(tr(O(n,`utf8`),n)?.id===e)return r}catch{}}}function ed(t,n=process.cwd()){let r=[zi(x(n,`__resolve__.js`)).href,import.meta.url];for(let n of r)try{return b(e(n).resolve(`${t}/package.json`))}catch{}return $u(t,b(Ri(import.meta.url)))??$u(t,n)}async function td(e){let t=ed(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=tr(O(r,`utf8`),r);if(!i)throw Error(`${e.pkg} 的 ${T} 非法(需合法 kebab-case id)。`);let a=e.ottoDir??n,o=x(a,`plugins`,i.id);Kr(x(a,`plugins`),{recursive:!0});let s=S(t);if(Xu(o)){try{if(S(Xr(o))===s){let e=await Yu(t);return{id:i.id,packageDir:t,dir:o,created:!1,compileWarnings:e,version:i.version}}}catch{}ni(o)}else if(D(o))if((D(x(o,T))?tr(O(x(o,T),`utf8`),o):null)?.id===i.id)$r(o,{recursive:!0,force:!0});else throw Error(`目标已存在且非本插件,拒绝覆盖:${o}`);ti(s,o);let c=await Yu(t);return{id:i.id,packageDir:t,dir:o,created:!0,compileWarnings:c,version:i.version}}async function nd(e){let t=x(e,T);if(!D(t))throw Error(`${e} 不是 otto 插件:缺 ${T}`);let r=tr(O(t,`utf8`),t);if(!r)throw Error(`${e} 的 ${T} 非法。`);let i=x(n,`plugins`,r.id);Kr(x(n,`plugins`),{recursive:!0});let a=S(e);if(Xu(i)){try{if(S(Xr(i))===a){let t=await Yu(e);return{id:r.id,packageDir:e,dir:i,created:!1,compileWarnings:t,version:r.version}}}catch{}ni(i)}else if(D(i))if((D(x(i,T))?tr(O(x(i,T),`utf8`),i):null)?.id===r.id)$r(i,{recursive:!0,force:!0});else throw Error(`目标已存在且非本插件,拒绝覆盖:${i}`);ti(a,i);let o=await Yu(e);return{id:r.id,packageDir:e,dir:i,created:!0,compileWarnings:o,version:r.version}}function rd(e,t){return[...e.filter(e=>e.id!==t.id),t]}function id(e,t){return e.filter(e=>e.id!==t)}async function ad(e,t,n=()=>Date.now()){let r=rd(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 od(e,t){let n={},r=!1,i=e.get(`installed_plugins`)??[];i.some(e=>e.id===t)&&(n.installed_plugins=id(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 sd(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 cd=class{lastTopoSort;lastEngineIncompatible=new Map;warnedTopoIssues=new Set;warnedEngineIncompatible=new Set;resolve(e){let{compatible:t,incompatible:n}=Jn(Un({cwd:e.workspaceDir,homedir:e.homedir??Be(),disabled:e.disabledPlugins,bundledDirs:e.bundledDirs}));this.lastEngineIncompatible=n;let r=cr(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:An},`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 td({pkg:n});t&&await ad(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 ld(e,t){let{model:n,authStore:r,modelRegistry:i,providerRegistry:a}=e,o=r??ee(),s=i??te(),c=a??ie({authStore:o,modelRegistry:s}),l=v(),u=new Ro(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 ud(e,t){if(typeof e==`object`&&e){let t=e;if(t.listable===!1||t.transient===!0||typeof t.depth==`number`&&t.depth>0)return!0}return dd(t)}function dd(e){let t=e?.trim().toLowerCase();return t?t===`reply with: ok`||t===`say ok and nothing else`||t.startsWith(`reply with only your model name/identifier`)||t.startsWith(`output exactly the word: probe_ok`)||t.startsWith(`you are a trajectory analyst for an ai coding assistant.`)||t.startsWith(`you are drafting a reusable skill for this project`)||t.startsWith(`you are responsible for completing parent task item`):!1}function fd(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=Ca(new Set(a.map(e=>e.name)));return{model:i,systemPrompt:``,tools:a,thinkingLevel:`medium`,maxToolTurns:t.maxToolTurns,promptRefresh:e?po(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 si({dbPath:n?`:memory:`:x(i.dir,`sessions.db`)});t.repoRef&&(t.repoRef.current=a);let o=n?ci():li({lockDir:x(i.dir,`locks`)}),c=new ai({repo:a,workspaceKey:t.getWorkspaceKey??(()=>Ti),maxLoadEntries:dn,canStartHistory:e=>e.role!==`tool_result`,writeLease:o,stripInactiveReplacements:!0}),l=async e=>(await a.listSessions(e).catch(()=>[])).filter(e=>!ud(e.config,e.title)).map(e=>({id:e.id,title:e.title?.trim()||e.id.slice(0,8),messageCount:0,createdAt:new Date(e.createdAt),updatedAt:new Date(e.lastActiveAt),status:e.archived?`archived`:`idle`,pinned:e.pinned,pinGroup:e.pinGroup,writeLocked:o.peekLockedByOther(e.id),entryCount:e.entryCount})),u=e=>o.peekLockedByOther(e),d=e=>o.inspect(e),f=e=>o.forceRelease(e);return Dt({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:on(),pasteStatePersistence:sn()}:{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=ha(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 Dt({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 pd(e){return e.map(e=>({name:e.name,description:typeof e.description==`function`?e.description({projectRoot:``}):e.description,parameters:e.parameters}))}function md(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=xn(n.getDeclarativeAgentProfiles?.()??[],t),i=r?ao(r.defaultTools):void 0,a=lo(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 hd(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(fi(o.context.from,o.context.allowedTargets,r))}return i}function gd(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=md(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=hd(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 vi({stream:e.stream,logger:e.logger,agentName:t.agentId,maxToolTurns:t.maxToolTurns,toolHookExecutor:Nt({hookRegistry:e.hookRegistry,agentName:t.agentId,sessionId:u}),depth:d,parentTaskId:t.parentTaskId}),p=()=>f.abort();t.signal?.aborted?f.abort():t.signal?.addEventListener(`abort`,p,{once:!0});let m=`${u}:${t.agentId}`,h=wt(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(),Vt.markEnded(m)}return{agentId:t.agentId,messages:l.messages,handoff:t.signal?.aborted?void 0:a,text:g.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
|
|
394
|
+
`),tokenUsage:{input:g.usage.inputTokens,output:g.usage.outputTokens,cacheRead:g.usage.cacheReadTokens},durationMs:Date.now()-n}}}function _d(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??gd(t)}}function vd(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=vd(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=_d(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 pi(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=xn(o,c);if(!l){s.push({kind:`agent`,id:c,name:c,description:c,systemPrompt:vn(c),tools:pd(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:pd(t.resolveTools(void 0,ao(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 yd(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=vd(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 pi(_d(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 bd=`You are describing an image for a text-only AI assistant that cannot see images itself. Produce a concise structured description (aim for well under 500 tokens) covering, when applicable:
|
|
395
395
|
- Overall layout (columns/sections, relative position and proportions)
|
|
396
396
|
- Color palette (primary/secondary colors as hex codes)
|
|
397
397
|
- Text content and font-size hierarchy (headings vs body)
|
|
398
398
|
- Interactive component inventory (buttons, inputs, nav items, etc.)
|
|
399
399
|
- Key size ratios/dimensions
|
|
400
400
|
|
|
401
|
-
If the image is not a UI/design screenshot, give a normal concise description instead. Do not speculate beyond what's visible.`;var
|
|
402
|
-
`),c=Math.max(1,n);if(c>s.length)return null;let l=Math.min(s.length,r>0?r:n);return
|
|
403
|
-
`))}function
|
|
404
|
-
`)[0]??``);if(!a)return null;let o=parseInt(a[2],10);return Kd(e,a[1],o,o+r)}function Jd(e){let t=e?.gitRunner??Wd;return[{id:`file-range`,resolve:(e,t)=>{let n=/^([\w./\-]+):(\d+)(?:-(\d+))?$/.exec(e);if(!n)return``;let r=Kd(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=qd(n.workspaceDir,e,t);return r===null?``:`\n\n@def:${e}:\n\`\`\`\n${r}\n\`\`\`\n`}}]}function Yd(e){return{sandbox:new Ca(e.logger),memoryGovernor:new ht({logger:e.logger}),residencyGovernor:new _t,fleetMonitor:new mt({logger:e.logger}),permissionSync:new Sa({logger:e.logger,getToolRegistry:e.getToolRegistry,getPermissionRegistry:e.getPermissionRegistry}),hookRegistry:e.hookRegistry??Te({preset:`default`,onHookTimeout:e.onHookTimeout})}}function Xd(e){let t=Id(e.inspect,e.loggerName),n=t.devtools,r=t.logSubscription,i=new fi({workspaceDir:e.workspaceDir,projectConfigPath:e.projectConfigPath,projectConfigTrusted:()=>Ir(e.workspaceDir,{interactive:e.interactive})});return i.on(`change`,t=>{e.onSettingsApplied(t),e.permissionSync.sync(t),e.sandbox.applySetting(e.sandbox.resolveConfig(t));let n=t.proxy,r=n?.enabled!==!1&&n?.url?n.url:void 0;$e(r),Xe(r),e.getI18nRegistry().setLocale(Pd(t.language))}),{devtools:n,logSubscription:r,settings:i}}function Zd(e){let t=new yd({getModelRegistry:e.getModelRegistry,providerRegistry:e.providerRegistry,getVisionSlotCandidates:()=>bd(e.getSettings().get(`model_slots`)),isModelUsable:e.isModelUsable,logger:e.logger});return{visionDelegateService:t,sessionConfigResolver:new uo({settings:e.getSettings(),promptManager:e.promptManager,getModelRegistry:e.getModelRegistry,getTools:e.getTools,getDeclarativeAgentProfiles:e.getDeclarativeAgentProfiles,defaultModel:e.defaultModel,explicitModelSpec:e.explicitModelId,hasCredential:t=>e.providerRegistry.hasCredential(t),isModelUsable:e.isModelUsable,maxToolTurns:e.maxToolTurns,maxToolTurnExtensions:e.maxToolTurnExtensions,promptOutputTokenBudget:e.promptOutputTokenBudget,promptWallClockBudgetMs:e.promptWallClockBudgetMs,sessionCostBudgetUSD:e.sessionCostBudgetUSD,stallDetection:e.stallDetection,workspaceDir:e.workspaceDir,getWorkspaceId:()=>e.getWorkspaceRef()?.id??e.workspaceId,logger:e.logger,describeImages:t.describeImages,getResilienceConfig:e.getResilienceConfig})}}function Qd(e){let t=ud(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:md({hookRegistry:e.hookRegistry,stream:n.stream,logger:e.logger,defaultModel:e.defaultModel,getTools:e.getTools,getDeclarativeAgentProfiles:e.getDeclarativeAgentProfiles}),defaultModel:e.defaultModel}}function $d(e){let{runSession:t,abortTask:n}=Mo({logger:e.logger,getSession:e.getSession,createSession:e.createSession,removeSession:e.removeSession}),r=new ci({hookRegistry:e.hookRegistry,runSession:t,abortTask:n,runAgentTurn:e.swarmAgentRunner,workflowConfig:e.workflowConfig});return{orchestrator:r,runSession:t,runTeam:_d({logger:e.logger,providerRegistry:e.providerRegistry,hookRegistry:e.hookRegistry,stream:e.stream,defaultModel:e.defaultModel,getDeclarativeTeams:e.getDeclarativeTeams,getDeclarativeAgentProfiles:e.getDeclarativeAgentProfiles,resolveTools:(t,n)=>e.sessionConfigResolver.resolveTools(t,n),runAgentTurn:e=>r.runAgentTurn(e)}),writeTodos:zi()}}function ef(e){Td(e.callMcpTool);let t=new nc({mcpController:e.mcpController,getActivePlugins:e.getActivePlugins});return Md({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 tf(e){let t=new Uu({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(Hs(e.activePlugins())),{pluginModuleManager:t,pluginProviderManager:n,capabilityReloader:new ec(e.settings,e.mcpController,e.skillRegistryForReloader,t,n,e.toolRegistry,e.modelCatalogManager,e.workspaceDir,e.getActivePluginsForReloader,e.i18nRegistry)}}function nf(e){return{toolsSyncCoordinator:new ds({sessionConfigResolver:e.sessionConfigResolver,getSession:e.getSession,listSessionIds:e.listSessionIds,logger:e.logger}),pluginContributionsFacade:new Es({getWorkspaceDir:()=>e.workspaceDir,settings:e.settings,getActivePlugins:e.getActivePlugins,pluginModuleManager:e.pluginModuleManager,mcpController:e.mcpController})}}function rf(e){let t=new Set(e.hookRegistry.getRegistered().map(e=>e.name)),n=new Ld(e.toolRegistry,e.hookRegistry),r=new ka(e.settings,e.toolRegistry,e.logger,e.workspaceDir,e.getResilienceConfig);return{permissionRegistry:n.registry,auditLog:n.auditLog,mcpController:r,preExistingHooks:t}}function af(e){return new Pa({settings:e.settings,mcp:e.mcpController,skills:e.skillRegistry,getAgentProfiles:()=>e.declarativeAgentProfiles,getPlugins:()=>Vn({cwd:e.workspaceDir,homedir:e.pluginHomedir,bundledDirs:e.pluginBundledDirs}),processRuntime:Vt,onPluginToggle:e.onPluginToggle})}function of(e){e.pluginInput.register(Pn()),e.pluginInput.registerProvider(`@`,In({cwd:e.workspaceDir})),e.sigilResolvers.register(Jd(),`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=$l(e.activePlugins());t.length>0&&e.pluginInput.register(t),eu(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:Hd({hasSession:t=>!!e.codingSessionPoolGet(t),emitHook:(t,n)=>e.hookRegistry.emit(t,n),logger:e.logger,repoRoot:e.workspaceDir})}}async function sf(e,t,n){t()||(await e.load(),n(!0))}function cf(e){for(let t of e)try{t.apply()}catch(e){throw Error(`deferred config step "${t.label}" failed: ${e.message}`,{cause:e})}}function lf(e,t,n,r){return{workspaceDir:t,processOwner:e.processOwnerId,orchestrator:e.orchestrator,writeTodos:e.writeTodos,skillProvider:n,enableLsp:r,sandbox:e.sandbox,autoMemory:e.autoMemory,reloadMemory:e.reloadMemory,archiveRecall:e.archiveRecall,runTeam:e.runTeam,runSession:e.runSession,fileStateManager:e.fileStateManager,learningStore:e.learningStore,localLearningStore:e.localLearningStore,sessions:e.sessions,listModels:e.listModels,startJob:e.startJob,schedule:Ki(e.getScheduleService),searchEcosystem:e.searchEcosystem}}function uf(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 df(e,t){return y({name:`tool-guidance-injection`,timing:`system.prompt.transform`,priority:vt.toolGuidance.priority,handle:async(n,r)=>{let i=e.buildToolGuidance(t());i&&(r.systemPrompt=`${r.systemPrompt}\n\n${i}`)}})}const ff=x(process.cwd(),`docs/rfc/RFC-284-core-pack/content.txt`),pf=x(process.cwd(),`docs/rfc/RFC-284-governance-plan.json`);function mf(){if(!D(ff))return;let e=k(ff,`utf8`).trim();return e.length>0?e:void 0}function hf(){if(!D(pf))return new Map;let e=JSON.parse(k(pf,`utf8`));return new Map((e.decisions??[]).map(e=>[e.key,e]))}function gf(e){return new Set(e.toLowerCase().split(/[^\p{L}\p{N}._/-]+/u).filter(e=>e.length>=3))}function _f(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 vf(e,t){let n=gf(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=gf(`${e.trigger} ${e.insight}`);for(let e of n)a.has(e)&&(r+=1);return r}function yf(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=vf(e,n);if(a<=0)return;let o=`[${e.tags.join(`, `)}] ${e.trigger} → ${e.insight}`;return{lesson:e,score:a,text:o,tokens:_f(o)}}).filter(e=>!!e).sort((e,t)=>t.score-e.score||e.tokens-t.tokens||e.lesson.id.localeCompare(t.lesson.id)),i=[],a=0;for(let e of r)if(!(a+e.tokens>1024)&&(i.push(e),a+=e.tokens,i.length>=3))break;if(i.length!==0)return{text:[`### Relevant Lesson Hints`,`Query-specific volatile hints selected from RFC-284 fact lessons:`,...i.map((e,t)=>`${t+1}. workspace:${e.lesson.id} score=${e.score} ${e.text}`)].join(`
|
|
405
|
-
`),hitIds:i.map(e=>e.lesson.id)}}function
|
|
401
|
+
If the image is not a UI/design screenshot, give a normal concise description instead. Do not speculate beyond what's visible.`;var xd=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?`${bd}\n\nContext: ${t.contextHint}`:bd},{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 _(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 gi(`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 Sd(e){let t=e?.slots?.vision;if(t)return Array.isArray(t)?t:[t]}function Cd(e,t){globalThis[e]||Object.defineProperty(globalThis,e,{value:Object.freeze(t()),writable:!1,configurable:!1})}var wd=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,Cd(`__ottoPanelRuntime`,()=>({callMcpTool:(e,t,n)=>this.callMcpTool(e,t,n),usePluginData:Td(this)}))}};function Td(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 Ed=new wd;function Dd(e){Ed.install(e)}const Od=`backend/`;function kd(e){return e.startsWith(Od)?e:`${Od}${e}`}var Ad=class{fns=null;get(){return this.fns}install(e){this.fns=e,Cd(`__ottoPanelBackendRuntime`,()=>({usePanelBackend:Md(this)}))}};function jd(){return globalThis.__ottoCurrentPanelPluginId}function Md(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=jd(),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,kd(e),t,i)},[n]),cancel:t.useCallback(e=>{!n||!r||r.cancel(n,e)},[n]),state:i,status:o}}}const Nd=new Ad;function Pd(e){Nd.install(e)}function Fd(){let e=process.env.LC_ALL||process.env.LC_MESSAGES||process.env.LANG||``;return/zh/i.test(e)?`zh`:`en`}function Id(e){return!e||e===`auto`?Fd():e}var Ld=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=fu(e.id,e.manifest),r=fu(e.id,t),i=new Set([...n].filter(e=>r.has(e)));i.size>0&&o.set(e.id,i);let a=pu(e.id,e.manifest),c=pu(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 Su(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=xu(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 Su(e,t,this.deps);this.previousSnapshot=[],this.loadedPluginIds=[]}};function Rd(e,n){if(!e)return{devtools:null,logSubscription:null};let r=new t;return{devtools:r,logSubscription:Je(e=>{if(typeof e==`object`&&e&&`name`in e&&`level`in e&&`msg`in e){let t=e;t.name===n&&r.sendLog(t)}})}}var zd=class{registry;auditLog;constructor(e,t){let n=je(e.getAll());this.auditLog=new _e,this.registry=Ae({toolSets:n}),t.register(Oe(this.registry,this.auditLog))}};const Bd=C(`@x-otto/coding:plugin-context-sources`),Vd=64*1024;function Hd(e,t,n){let r=S(t,n);if(!Vs(r,t)){Bd.warn({pluginId:e,file:n},`contextSources.content.file resolves outside plugin dir, skipped`);return}try{let e=O(r,`utf8`);return Buffer.byteLength(e,`utf8`)>Vd?`${e.slice(0,Vd)}\n<!-- truncated -->`:e}catch(t){Bd.warn({pluginId:e,file:n,err:String(t)},`contextSources.content.file read failed, skipped`);return}}function Ud(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`)){Bd.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:Hd(n.id,n.dir,r.content.file);if(e!=null)return`<!-- plugin:${n.id} -->\n${e}`}})}}return t}function Wd(e){Kt(),Gt(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 Gd=2e4,Kd=(e,t)=>{let n=Mi(`git`,[...e],{cwd:t,timeout:1e4,encoding:`utf-8`,maxBuffer:4194304});return n.error||n.status!==0?null:n.stdout??``};function qd(e){return e.length<=Gd?e:`${e.slice(0,Gd)}\n[...truncated ${e.length-Gd} chars...]`}function Jd(e,t,n,r){let i=S(e),a=Ue(t)?t:S(i,t);if(a!==i&&!a.startsWith(`${i}/`)||!D(a)||!ei(a).isFile())return null;let o;try{o=O(a,`utf-8`)}catch{return null}if(o.includes(`\0`))return null;let s=o.split(`
|
|
402
|
+
`),c=Math.max(1,n);if(c>s.length)return null;let l=Math.min(s.length,r>0?r:n);return qd(s.slice(c-1,l).join(`
|
|
403
|
+
`))}function Yd(e,t,n,r=14){let i=n([`grep`,`-nE`,`(function|class|interface|type|enum|const|let|var|def|fn|struct|func)[[:space:]]+${t.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}`],e);if(i===null||!i.trim())return null;let a=/^(.+?):(\d+):/.exec(i.split(`
|
|
404
|
+
`)[0]??``);if(!a)return null;let o=parseInt(a[2],10);return Jd(e,a[1],o,o+r)}function Xd(e){let t=e?.gitRunner??Kd;return[{id:`file-range`,resolve:(e,t)=>{let n=/^([\w./\-]+):(\d+)(?:-(\d+))?$/.exec(e);if(!n)return``;let r=Jd(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=Yd(n.workspaceDir,e,t);return r===null?``:`\n\n@def:${e}:\n\`\`\`\n${r}\n\`\`\`\n`}}]}function Zd(e){return{sandbox:new Ea(e.logger),memoryGovernor:new gt({logger:e.logger}),residencyGovernor:new vt,fleetMonitor:new ht({logger:e.logger}),permissionSync:new Ta({logger:e.logger,getToolRegistry:e.getToolRegistry,getPermissionRegistry:e.getPermissionRegistry}),hookRegistry:e.hookRegistry??Ee({preset:`default`,onHookTimeout:e.onHookTimeout})}}function Qd(e){let t=Rd(e.inspect,e.loggerName),n=t.devtools,r=t.logSubscription,i=new hi({workspaceDir:e.workspaceDir,projectConfigPath:e.projectConfigPath,projectConfigTrusted:()=>Rr(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(Id(t.language))}),{devtools:n,logSubscription:r,settings:i}}function $d(e){let t=new xd({getModelRegistry:e.getModelRegistry,providerRegistry:e.providerRegistry,getVisionSlotCandidates:()=>Sd(e.getSettings().get(`model_slots`)),isModelUsable:e.isModelUsable,logger:e.logger});return{visionDelegateService:t,sessionConfigResolver:new mo({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 ef(e){let t=fd(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:gd({hookRegistry:e.hookRegistry,stream:n.stream,logger:e.logger,defaultModel:e.defaultModel,getTools:e.getTools,getDeclarativeAgentProfiles:e.getDeclarativeAgentProfiles}),defaultModel:e.defaultModel}}function tf(e){let{runSession:t,abortTask:n}=Fo({logger:e.logger,getSession:e.getSession,createSession:e.createSession,removeSession:e.removeSession}),r=new di({hookRegistry:e.hookRegistry,runSession:t,abortTask:n,runAgentTurn:e.swarmAgentRunner,workflowConfig:e.workflowConfig});return{orchestrator:r,runSession:t,runTeam:yd({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:Hi()}}function nf(e){Dd(e.callMcpTool);let t=new ac({mcpController:e.mcpController,getActivePlugins:e.getActivePlugins});return Pd({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 rf(e){let t=new Gu({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 Ld({providerRegistry:e.providerRegistry,authStore:e.authStore,modelRegistry:e.modelRegistry,wireProtocolRegistry:e.wireProtocolRegistry,activePlugins:e.activePlugins,logger:e.logger});return e.i18nRegistry.register(Gs(e.activePlugins())),{pluginModuleManager:t,pluginProviderManager:n,capabilityReloader:new rc(e.settings,e.mcpController,e.skillRegistryForReloader,t,n,e.toolRegistry,e.modelCatalogManager,e.workspaceDir,e.getActivePluginsForReloader,e.i18nRegistry)}}function af(e){return{toolsSyncCoordinator:new ms({sessionConfigResolver:e.sessionConfigResolver,getSession:e.getSession,listSessionIds:e.listSessionIds,logger:e.logger}),pluginContributionsFacade:new ks({getWorkspaceDir:()=>e.workspaceDir,settings:e.settings,getActivePlugins:e.getActivePlugins,pluginModuleManager:e.pluginModuleManager,mcpController:e.mcpController})}}function of(e){let t=new Set(e.hookRegistry.getRegistered().map(e=>e.name)),n=new zd(e.toolRegistry,e.hookRegistry),r=new Ma(e.settings,e.toolRegistry,e.logger,e.workspaceDir,e.getResilienceConfig);return{permissionRegistry:n.registry,auditLog:n.auditLog,mcpController:r,preExistingHooks:t}}function sf(e){return new La({settings:e.settings,mcp:e.mcpController,skills:e.skillRegistry,getAgentProfiles:()=>e.declarativeAgentProfiles,getPlugins:()=>Un({cwd:e.workspaceDir,homedir:e.pluginHomedir,bundledDirs:e.pluginBundledDirs}),processRuntime:Ut,onPluginToggle:e.onPluginToggle})}function cf(e){e.pluginInput.register(In()),e.pluginInput.registerProvider(`@`,Rn({cwd:e.workspaceDir})),e.sigilResolvers.register(Xd(),`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=tu(e.activePlugins());t.length>0&&e.pluginInput.register(t),nu(e.activePlugins());for(let t of Ud(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:Wd({hasSession:t=>!!e.codingSessionPoolGet(t),emitHook:(t,n)=>e.hookRegistry.emit(t,n),logger:e.logger,repoRoot:e.workspaceDir})}}async function lf(e,t,n){t()||(await e.load(),n(!0))}function uf(e){for(let t of e)try{t.apply()}catch(e){throw Error(`deferred config step "${t.label}" failed: ${e.message}`,{cause:e})}}function df(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:Yi(e.getScheduleService),searchEcosystem:e.searchEcosystem}}function ff(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 pf(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());if(i){let e=Ct(`tool-guidance-injection`,i);r.systemPrompt=`${r.systemPrompt}\n\n${e}`}}})}const mf=x(process.cwd(),`docs/rfc/RFC-284-core-pack/content.txt`),hf=x(process.cwd(),`docs/rfc/RFC-284-governance-plan.json`);function gf(){if(!D(mf))return;let e=O(mf,`utf8`).trim();return e.length>0?e:void 0}function _f(){if(!D(hf))return new Map;let e=JSON.parse(O(hf,`utf8`));return new Map((e.decisions??[]).map(e=>[e.key,e]))}function vf(e){return new Set(e.toLowerCase().split(/[^\p{L}\p{N}._/-]+/u).filter(e=>e.length>=3))}function yf(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 bf(e,t){let n=vf(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=vf(`${e.trigger} ${e.insight}`);for(let e of n)a.has(e)&&(r+=1);return r}function xf(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=bf(e,n);if(a<=0)return;let o=`[${e.tags.join(`, `)}] ${e.trigger} → ${e.insight}`;return{lesson:e,score:a,text:o,tokens:yf(o)}}).filter(e=>!!e).sort((e,t)=>t.score-e.score||e.tokens-t.tokens||e.lesson.id.localeCompare(t.lesson.id)),i=[],a=0;for(let e of r)if(!(a+e.tokens>1024)&&(i.push(e),a+=e.tokens,i.length>=3))break;if(i.length!==0)return{text:[`### Relevant Lesson Hints`,`Query-specific volatile hints selected from RFC-284 fact lessons:`,...i.map((e,t)=>`${t+1}. workspace:${e.lesson.id} score=${e.score} ${e.text}`)].join(`
|
|
405
|
+
`),hitIds:i.map(e=>e.lesson.id)}}function Sf(e,t,n){let r=jt({name:`lesson-injection`,priority:yt.lesson.priority,compute:async()=>{let r=gf(),i=r?Ct(`lesson-injection`,r):void 0,a=n?await n.list():[];if(i){let e=a.length>0?await t.loadRuntimeLessonsTemplate()??void 0:void 0;return[i,a.length>0?yn(a,e):``].filter(e=>e.length>0).join(`
|
|
406
406
|
|
|
407
|
-
`)||void 0}let
|
|
408
|
-
`),a=n.messages.length-1,o=n.messages[a];if(o&&o.role===`user`&&Array.isArray(o.content)){n.messages[a]={...o,content:[...o.content,{type:`text`,text:i}]};return}n.messages.push({role:`user`,timestamp:Date.now(),content:[{type:`text`,text:i}]})}function
|
|
409
|
-
`)}function If(){return`暂不生成。技能固化应由你在看到具体流程后主动决定;无人应答时默认跳过,稍后同类任务再出现会重新征询。`}function Lf(){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 Rf=class extends Error{constructor(){super(`Encountered Promise during synchronous parse. Use .parseAsync() instead.`)}},zf=class extends Error{constructor(e){super(`Encountered unidirectional transform during encode: ${e}`),this.name=`ZodEncodeError`}};const Bf={};function Vf(e){return e&&Object.assign(Bf,e),Bf}function Hf(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 Uf(e,t){return typeof t==`bigint`?t.toString():t}function Wf(e){return{get value(){{let t=e();return Object.defineProperty(this,`value`,{value:t}),t}throw Error(`cached value already set`)}}}function Gf(e){return e==null}function Kf(e){let t=e.startsWith(`^`)?1:0,n=e.endsWith(`$`)?e.length-1:e.length;return e.slice(t,n)}function qf(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 Jf=Symbol(`evaluating`);function U(e,t,n){let r;Object.defineProperty(e,t,{get(){if(r!==Jf)return r===void 0&&(r=Jf,r=n()),r},set(n){Object.defineProperty(e,t,{value:n})},configurable:!0})}function Yf(e,t,n){Object.defineProperty(e,t,{value:n,writable:!0,enumerable:!0,configurable:!0})}function Xf(...e){let t={};for(let n of e)Object.assign(t,Object.getOwnPropertyDescriptors(n));return Object.defineProperties({},t)}function Zf(e){return JSON.stringify(e)}function Qf(e){return e.toLowerCase().trim().replace(/[^\w\s-]/g,``).replace(/[\s_-]+/g,`-`).replace(/^-+|-+$/g,``)}const $f=`captureStackTrace`in Error?Error.captureStackTrace:(...e)=>{};function ep(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const tp=Wf(()=>{if(typeof navigator<`u`&&navigator?.userAgent?.includes(`Cloudflare`))return!1;try{return Function(``),!0}catch{return!1}});function np(e){if(ep(e)===!1)return!1;let t=e.constructor;if(t===void 0||typeof t!=`function`)return!0;let n=t.prototype;return!(ep(n)===!1||Object.prototype.hasOwnProperty.call(n,`isPrototypeOf`)===!1)}function rp(e){return np(e)?{...e}:Array.isArray(e)?[...e]:e}const ip=new Set([`string`,`number`,`symbol`]);function ap(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function op(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 sp(e){return Object.keys(e).filter(t=>e[t]._zod.optin===`optional`&&e[t]._zod.optout===`optional`)}const cp={safeint:[-(2**53-1),2**53-1],int32:[-2147483648,2147483647],uint32:[0,4294967295],float32:[-34028234663852886e22,34028234663852886e22],float64:[-Number.MAX_VALUE,Number.MAX_VALUE]};function lp(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 op(e,Xf(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 Yf(this,`shape`,e),e},checks:[]}))}function up(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 op(e,Xf(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 Yf(this,`shape`,r),r},checks:[]}))}function dp(e,t){if(!np(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 op(e,Xf(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t};return Yf(this,`shape`,n),n}}))}function fp(e,t){if(!np(t))throw Error(`Invalid input to safeExtend: expected a plain object`);return op(e,Xf(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t};return Yf(this,`shape`,n),n}}))}function pp(e,t){return op(e,Xf(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t._zod.def.shape};return Yf(this,`shape`,n),n},get catchall(){return t._zod.def.catchall},checks:[]}))}function mp(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 op(t,Xf(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 Yf(this,`shape`,i),i},checks:[]}))}function hp(e,t,n){return op(t,Xf(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 Yf(this,`shape`,i),i}}))}function gp(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 _p(e,t){return t.map(t=>{var n;return(n=t).path??(n.path=[]),t.path.unshift(e),t})}function vp(e){return typeof e==`string`?e:e?.message}function yp(e,t,n){let r={...e,path:e.path??[]};return e.message||(r.message=vp(e.inst?._zod.def?.error?.(e))??vp(t?.error?.(e))??vp(n.customError?.(e))??vp(n.localeError?.(e))??`Invalid input`),delete r.inst,delete r.continue,t?.reportInput||delete r.input,r}function bp(e){return Array.isArray(e)?`array`:typeof e==`string`?`string`:`unknown`}function xp(...e){let[t,n,r]=e;return typeof t==`string`?{message:t,code:`custom`,input:n,inst:r}:{...t}}const Sp=(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,Uf,2),Object.defineProperty(e,`toString`,{value:()=>e.message,enumerable:!1})},Cp=H(`$ZodError`,Sp),wp=H(`$ZodError`,Sp,{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 Ep(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 Dp=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 Rf;if(o.issues.length){let t=new(i?.Err??e)(o.issues.map(e=>yp(e,a,Vf())));throw $f(t,i?.callee),t}return o.value},Op=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=>yp(e,a,Vf())));throw $f(t,i?.callee),t}return o.value},kp=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 Rf;return a.issues.length?{success:!1,error:new(e??Cp)(a.issues.map(e=>yp(e,i,Vf())))}:{success:!0,data:a.value}},Ap=kp(wp),jp=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=>yp(e,i,Vf())))}:{success:!0,data:a.value}},Mp=jp(wp),Np=e=>(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return Dp(e)(t,n,i)},Pp=e=>(t,n,r)=>Dp(e)(t,n,r),Fp=e=>async(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return Op(e)(t,n,i)},Ip=e=>async(t,n,r)=>Op(e)(t,n,r),Lp=e=>(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return kp(e)(t,n,i)},Rp=e=>(t,n,r)=>kp(e)(t,n,r),zp=e=>async(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return jp(e)(t,n,i)},Bp=e=>async(t,n,r)=>jp(e)(t,n,r),Vp=/^[cC][^\s-]{8,}$/,Hp=/^[0-9a-z]+$/,Up=/^[0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{26}$/,Wp=/^[0-9a-vA-V]{20}$/,Gp=/^[A-Za-z0-9]{27}$/,Kp=/^[a-zA-Z0-9_-]{21}$/,qp=/^P(?:(\d+W)|(?!.*W)(?=\d|T\d)(\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+([.,]\d+)?S)?)?)$/,Jp=/^([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})$/,Yp=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)$/,Xp=/^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$/;function Zp(){return RegExp(`^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$`,`u`)}const Qp=/^(?:(?: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])$/,$p=/^(([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}|:))$/,em=/^((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])$/,tm=/^(([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])$/,nm=/^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$/,rm=/^[A-Za-z0-9_-]*$/,im=/^\+[1-9]\d{6,14}$/,am=`(?:(?:\\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])))`,om=RegExp(`^${am}$`);function sm(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 cm(e){return RegExp(`^${sm(e)}$`)}function lm(e){let t=sm({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(`^${am}T(?:${r})$`)}const um=e=>{let t=e?`[\\s\\S]{${e?.minimum??0},${e?.maximum??``}}`:`[\\s\\S]*`;return RegExp(`^${t}$`)},dm=/^-?\d+$/,fm=/^-?\d+(?:\.\d+)?$/,pm=/^[^A-Z]*$/,mm=/^[^a-z]*$/,G=H(`$ZodCheck`,(e,t)=>{var n;e._zod??={},e._zod.def=t,(n=e._zod).onattach??(n.onattach=[])}),hm={number:`number`,bigint:`bigint`,object:`date`},gm=H(`$ZodCheckLessThan`,(e,t)=>{G.init(e,t);let n=hm[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})}}),_m=H(`$ZodCheckGreaterThan`,(e,t)=>{G.init(e,t);let n=hm[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})}}),vm=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):qf(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})}}),ym=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]=cp[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=dm)}),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})}}),bm=H(`$ZodCheckMaxLength`,(e,t)=>{var n;G.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!Gf(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=bp(r);n.issues.push({origin:i,code:`too_big`,maximum:t.maximum,inclusive:!0,input:r,inst:e,continue:!t.abort})}}),xm=H(`$ZodCheckMinLength`,(e,t)=>{var n;G.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!Gf(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=bp(r);n.issues.push({origin:i,code:`too_small`,minimum:t.minimum,inclusive:!0,input:r,inst:e,continue:!t.abort})}}),Sm=H(`$ZodCheckLengthEquals`,(e,t)=>{var n;G.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!Gf(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=bp(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})}}),Cm=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=()=>{})}),wm=H(`$ZodCheckRegex`,(e,t)=>{Cm.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??=pm,Cm.init(e,t)}),Em=H(`$ZodCheckUpperCase`,(e,t)=>{t.pattern??=mm,Cm.init(e,t)}),Dm=H(`$ZodCheckIncludes`,(e,t)=>{G.init(e,t);let n=ap(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})}}),Om=H(`$ZodCheckStartsWith`,(e,t)=>{G.init(e,t);let n=RegExp(`^${ap(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})}}),km=H(`$ZodCheckEndsWith`,(e,t)=>{G.init(e,t);let n=RegExp(`.*${ap(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})}}),Am=H(`$ZodCheckOverwrite`,(e,t)=>{G.init(e,t),e._zod.check=e=>{e.value=t.tx(e.value)}});var jm=class{constructor(e=[]){this.content=[],this.indent=0,this&&(this.args=e)}indented(e){this.indent+=1,e(this),--this.indent}write(e){if(typeof e==`function`){e(this,{execution:`sync`}),e(this,{execution:`async`});return}let t=e.split(`
|
|
407
|
+
`)||void 0}let o=[...await e.list(),...a];if(o.length!==0)return yn(o,await t.loadRuntimeLessonsTemplate()??void 0)||void 0}}),i=y({name:`lesson-relevant-hints`,timing:`system.prompt.transform`,priority:yt.lesson.priority+1,handle:async(t,n)=>{if(!t.userText)return;let r=_f();if(r.size===0)return;let i=xf(await e.list(),r,t.userText);i&&(await e.recordRelevantHits(i.hitIds),n.systemTail=[...n.systemTail??[],i.text])}});return[...r,i]}function Cf(e){return jt({name:`skill-catalog-injection`,priority:yt.skillCatalog.priority,compute:()=>{let t=e.buildCatalog();if(t)return Ct(`skill-catalog-injection`,`${t}\n\nUse the skill tool with a skill name to load its full instructions.`)}})}function wf(e,t,n){let r=e.get(t.sessionId);if(!r||r.length===0)return;e.delete(t.sessionId);let i=r.join(`
|
|
408
|
+
`),a=n.messages.length-1,o=n.messages[a];if(o&&o.role===`user`&&Array.isArray(o.content)){n.messages[a]={...o,content:[...o.content,{type:`text`,text:i}]};return}n.messages.push({role:`user`,timestamp:Date.now(),content:[{type:`text`,text:i}]})}function Tf(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 Ef(){let e=new Map;return[y({name:`background-process-exit-collector`,timing:`process.exited`,handle:t=>{let n=e.get(t.sessionId)??[];n.push(Tf(t)),e.set(t.sessionId,n)}}),y({name:`background-process-exit-injector`,timing:`messages.transform`,priority:25,handle:(t,n)=>{wf(e,t,n)}}),y({name:`background-process-notification-cleanup`,timing:`session.deleted`,handle:t=>{e.delete(t.sessionId)}})]}function Df(e){return y({name:`background-process-session-kill`,timing:`session.deleted`,handle:t=>{let n=t.metadata.reason;n===`idle`||n===`evicted`||e(t.sessionId)}})}function Of(e){return[y({name:`session-permission-restore-hydrate`,timing:`session.restored`,handle:t=>{let n=e.getPersistedAllow(t.sessionId);n.length>0&&e.registry.setSessionAlwaysAllow(t.sessionId,n)}}),y({name:`session-permission-cleanup`,timing:`session.deleted`,handle:t=>{e.registry.clearSessionAlwaysAllow(t.sessionId)}})]}function kf(e){return e.role===`user`||e.role===`assistant`||e.role===`tool_result`}function Af(e,t,n={}){let r=n.minMessages??6;return[y({name:`memory-auto-extract`,timing:`session.idle`,handle:async i=>{if(n.isEnabled&&!n.isEnabled())return;let a=e(i.sessionId);if(!a)return;let o=a.session.messages();o.length<r||await t.onIdle(i.sessionId,o.filter(kf))}}),y({name:`memory-auto-extract-cleanup`,timing:`session.deleted`,handle:e=>{t.reset(e.sessionId)}})]}function jf(e){return jt({name:yt.skillLoopGuidance.name,priority:yt.skillLoopGuidance.priority,compute:()=>e.isEnabled()?Ct(`skill-loop-guidance-injection`,gn):void 0})}const Mf=336*60*60*1e3;function Nf(e){return typeof e!=`number`||!Number.isFinite(e)?Mf:Math.max(864e5,Math.round(e*24*60*60*1e3))}function Pf(e,t,n=Mf){return e.filter(e=>e.dismissedAt===void 0||t-e.dismissedAt>=n)}function Ff(e){return new Date(e).toISOString().slice(0,10)}function If(e){return`你重复做过同一类任务 ${e.size} 次,要把它的执行流程固化成一个可复用的 skill 吗?`}function Lf(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}`,`时间跨度:${Ff(e.firstAt)} ~ ${Ff(e.lastAt)}`,``,`若同意,otto 会据这些会话的执行路径起草一份 SKILL.md 交你审阅——生成物仍需你显式 apply 才会生效。`,`完整候选数据可用 read 工具查看插件状态目录下的 candidates.json。`].join(`
|
|
409
|
+
`)}function Rf(){return`暂不生成。技能固化应由你在看到具体流程后主动决定;无人应答时默认跳过,稍后同类任务再出现会重新征询。`}function zf(){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 Bf=class extends Error{constructor(){super(`Encountered Promise during synchronous parse. Use .parseAsync() instead.`)}},Vf=class extends Error{constructor(e){super(`Encountered unidirectional transform during encode: ${e}`),this.name=`ZodEncodeError`}};const Hf={};function Uf(e){return e&&Object.assign(Hf,e),Hf}function Wf(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 Gf(e,t){return typeof t==`bigint`?t.toString():t}function Kf(e){return{get value(){{let t=e();return Object.defineProperty(this,`value`,{value:t}),t}throw Error(`cached value already set`)}}}function qf(e){return e==null}function Jf(e){let t=e.startsWith(`^`)?1:0,n=e.endsWith(`$`)?e.length-1:e.length;return e.slice(t,n)}function Yf(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 Xf=Symbol(`evaluating`);function U(e,t,n){let r;Object.defineProperty(e,t,{get(){if(r!==Xf)return r===void 0&&(r=Xf,r=n()),r},set(n){Object.defineProperty(e,t,{value:n})},configurable:!0})}function Zf(e,t,n){Object.defineProperty(e,t,{value:n,writable:!0,enumerable:!0,configurable:!0})}function Qf(...e){let t={};for(let n of e)Object.assign(t,Object.getOwnPropertyDescriptors(n));return Object.defineProperties({},t)}function $f(e){return JSON.stringify(e)}function ep(e){return e.toLowerCase().trim().replace(/[^\w\s-]/g,``).replace(/[\s_-]+/g,`-`).replace(/^-+|-+$/g,``)}const tp=`captureStackTrace`in Error?Error.captureStackTrace:(...e)=>{};function np(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const rp=Kf(()=>{if(typeof navigator<`u`&&navigator?.userAgent?.includes(`Cloudflare`))return!1;try{return Function(``),!0}catch{return!1}});function ip(e){if(np(e)===!1)return!1;let t=e.constructor;if(t===void 0||typeof t!=`function`)return!0;let n=t.prototype;return!(np(n)===!1||Object.prototype.hasOwnProperty.call(n,`isPrototypeOf`)===!1)}function ap(e){return ip(e)?{...e}:Array.isArray(e)?[...e]:e}const op=new Set([`string`,`number`,`symbol`]);function sp(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function cp(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 lp(e){return Object.keys(e).filter(t=>e[t]._zod.optin===`optional`&&e[t]._zod.optout===`optional`)}const up={safeint:[-(2**53-1),2**53-1],int32:[-2147483648,2147483647],uint32:[0,4294967295],float32:[-34028234663852886e22,34028234663852886e22],float64:[-Number.MAX_VALUE,Number.MAX_VALUE]};function dp(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 cp(e,Qf(e._zod.def,{get shape(){let e={};for(let r in t){if(!(r in n.shape))throw Error(`Unrecognized key: "${r}"`);t[r]&&(e[r]=n.shape[r])}return Zf(this,`shape`,e),e},checks:[]}))}function fp(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 cp(e,Qf(e._zod.def,{get shape(){let r={...e._zod.def.shape};for(let e in t){if(!(e in n.shape))throw Error(`Unrecognized key: "${e}"`);t[e]&&delete r[e]}return Zf(this,`shape`,r),r},checks:[]}))}function pp(e,t){if(!ip(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 cp(e,Qf(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t};return Zf(this,`shape`,n),n}}))}function mp(e,t){if(!ip(t))throw Error(`Invalid input to safeExtend: expected a plain object`);return cp(e,Qf(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t};return Zf(this,`shape`,n),n}}))}function hp(e,t){return cp(e,Qf(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t._zod.def.shape};return Zf(this,`shape`,n),n},get catchall(){return t._zod.def.catchall},checks:[]}))}function gp(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 cp(t,Qf(t._zod.def,{get shape(){let r=t._zod.def.shape,i={...r};if(n)for(let t in n){if(!(t in r))throw Error(`Unrecognized key: "${t}"`);n[t]&&(i[t]=e?new e({type:`optional`,innerType:r[t]}):r[t])}else for(let t in r)i[t]=e?new e({type:`optional`,innerType:r[t]}):r[t];return Zf(this,`shape`,i),i},checks:[]}))}function _p(e,t,n){return cp(t,Qf(t._zod.def,{get shape(){let r=t._zod.def.shape,i={...r};if(n)for(let t in n){if(!(t in i))throw Error(`Unrecognized key: "${t}"`);n[t]&&(i[t]=new e({type:`nonoptional`,innerType:r[t]}))}else for(let t in r)i[t]=new e({type:`nonoptional`,innerType:r[t]});return Zf(this,`shape`,i),i}}))}function vp(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 yp(e,t){return t.map(t=>{var n;return(n=t).path??(n.path=[]),t.path.unshift(e),t})}function bp(e){return typeof e==`string`?e:e?.message}function xp(e,t,n){let r={...e,path:e.path??[]};return e.message||(r.message=bp(e.inst?._zod.def?.error?.(e))??bp(t?.error?.(e))??bp(n.customError?.(e))??bp(n.localeError?.(e))??`Invalid input`),delete r.inst,delete r.continue,t?.reportInput||delete r.input,r}function Sp(e){return Array.isArray(e)?`array`:typeof e==`string`?`string`:`unknown`}function Cp(...e){let[t,n,r]=e;return typeof t==`string`?{message:t,code:`custom`,input:n,inst:r}:{...t}}const wp=(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,Gf,2),Object.defineProperty(e,`toString`,{value:()=>e.message,enumerable:!1})},Tp=H(`$ZodError`,wp),Ep=H(`$ZodError`,wp,{Parent:Error});function Dp(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 Op(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 kp=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 Bf;if(o.issues.length){let t=new(i?.Err??e)(o.issues.map(e=>xp(e,a,Uf())));throw tp(t,i?.callee),t}return o.value},Ap=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=>xp(e,a,Uf())));throw tp(t,i?.callee),t}return o.value},jp=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 Bf;return a.issues.length?{success:!1,error:new(e??Tp)(a.issues.map(e=>xp(e,i,Uf())))}:{success:!0,data:a.value}},Mp=jp(Ep),Np=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=>xp(e,i,Uf())))}:{success:!0,data:a.value}},Pp=Np(Ep),Fp=e=>(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return kp(e)(t,n,i)},Ip=e=>(t,n,r)=>kp(e)(t,n,r),Lp=e=>async(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return Ap(e)(t,n,i)},Rp=e=>async(t,n,r)=>Ap(e)(t,n,r),zp=e=>(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return jp(e)(t,n,i)},Bp=e=>(t,n,r)=>jp(e)(t,n,r),Vp=e=>async(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return Np(e)(t,n,i)},Hp=e=>async(t,n,r)=>Np(e)(t,n,r),Up=/^[cC][^\s-]{8,}$/,Wp=/^[0-9a-z]+$/,Gp=/^[0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{26}$/,Kp=/^[0-9a-vA-V]{20}$/,qp=/^[A-Za-z0-9]{27}$/,Jp=/^[a-zA-Z0-9_-]{21}$/,Yp=/^P(?:(\d+W)|(?!.*W)(?=\d|T\d)(\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+([.,]\d+)?S)?)?)$/,Xp=/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$/,Zp=e=>e?RegExp(`^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-${e}[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$`):/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/,Qp=/^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$/;function $p(){return RegExp(`^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$`,`u`)}const em=/^(?:(?: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])$/,tm=/^(([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}|:))$/,nm=/^((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])$/,rm=/^(([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])$/,im=/^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$/,am=/^[A-Za-z0-9_-]*$/,om=/^\+[1-9]\d{6,14}$/,sm=`(?:(?:\\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])))`,cm=RegExp(`^${sm}$`);function lm(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 um(e){return RegExp(`^${lm(e)}$`)}function dm(e){let t=lm({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(`^${sm}T(?:${r})$`)}const fm=e=>{let t=e?`[\\s\\S]{${e?.minimum??0},${e?.maximum??``}}`:`[\\s\\S]*`;return RegExp(`^${t}$`)},pm=/^-?\d+$/,mm=/^-?\d+(?:\.\d+)?$/,hm=/^[^A-Z]*$/,gm=/^[^a-z]*$/,G=H(`$ZodCheck`,(e,t)=>{var n;e._zod??={},e._zod.def=t,(n=e._zod).onattach??(n.onattach=[])}),_m={number:`number`,bigint:`bigint`,object:`date`},vm=H(`$ZodCheckLessThan`,(e,t)=>{G.init(e,t);let n=_m[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})}}),ym=H(`$ZodCheckGreaterThan`,(e,t)=>{G.init(e,t);let n=_m[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})}}),bm=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):Yf(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})}}),xm=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]=up[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=pm)}),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})}}),Sm=H(`$ZodCheckMaxLength`,(e,t)=>{var n;G.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!qf(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=Sp(r);n.issues.push({origin:i,code:`too_big`,maximum:t.maximum,inclusive:!0,input:r,inst:e,continue:!t.abort})}}),Cm=H(`$ZodCheckMinLength`,(e,t)=>{var n;G.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!qf(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=Sp(r);n.issues.push({origin:i,code:`too_small`,minimum:t.minimum,inclusive:!0,input:r,inst:e,continue:!t.abort})}}),wm=H(`$ZodCheckLengthEquals`,(e,t)=>{var n;G.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!qf(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=Sp(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})}}),Tm=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)=>{Tm.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})}}),Dm=H(`$ZodCheckLowerCase`,(e,t)=>{t.pattern??=hm,Tm.init(e,t)}),Om=H(`$ZodCheckUpperCase`,(e,t)=>{t.pattern??=gm,Tm.init(e,t)}),km=H(`$ZodCheckIncludes`,(e,t)=>{G.init(e,t);let n=sp(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})}}),Am=H(`$ZodCheckStartsWith`,(e,t)=>{G.init(e,t);let n=RegExp(`^${sp(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})}}),jm=H(`$ZodCheckEndsWith`,(e,t)=>{G.init(e,t);let n=RegExp(`.*${sp(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})}}),Mm=H(`$ZodCheckOverwrite`,(e,t)=>{G.init(e,t),e._zod.check=e=>{e.value=t.tx(e.value)}});var Nm=class{constructor(e=[]){this.content=[],this.indent=0,this&&(this.args=e)}indented(e){this.indent+=1,e(this),--this.indent}write(e){if(typeof e==`function`){e(this,{execution:`sync`}),e(this,{execution:`async`});return}let t=e.split(`
|
|
410
410
|
`).filter(e=>e),n=Math.min(...t.map(e=>e.length-e.trimStart().length)),r=t.map(e=>e.slice(n)).map(e=>` `.repeat(this.indent*2)+e);for(let e of r)this.content.push(e)}compile(){let e=Function,t=this?.args,n=[...(this?.content??[``]).map(e=>` ${e}`)];return new e(...t,n.join(`
|
|
411
|
-
`))}};const
|
|
411
|
+
`))}};const Pm={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=Pm;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=vp(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 Bf;if(i||o instanceof Promise)i=(i??Promise.resolve()).then(async()=>{await o,e.issues.length!==t&&(r||=vp(e,t))});else{if(e.issues.length===t)continue;r||=vp(e,t)}}return i?i.then(()=>e):e},n=(n,i,a)=>{if(vp(n))return n.aborted=!0,n;let o=t(i,r,a);if(o instanceof Promise){if(a.async===!1)throw new Bf;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 Bf;return o.then(e=>t(e,r,a))}return t(o,r,a)}}U(e,`~standard`,()=>({validate:t=>{try{let n=Mp(e,t);return n.success?{value:n.data}:{issues:n.error?.issues}}catch{return Pp(e,t).then(e=>e.success?{value:e.data}:{issues:e.error?.issues})}},vendor:`zod`,version:1}))}),Fm=H(`$ZodString`,(e,t)=>{K.init(e,t),e._zod.pattern=[...e?._zod.bag?.patterns??[]].pop()??fm(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)=>{Tm.init(e,t),Fm.init(e,t)}),Im=H(`$ZodGUID`,(e,t)=>{t.pattern??=Xp,q.init(e,t)}),Lm=H(`$ZodUUID`,(e,t)=>{if(t.version){let e={v1:1,v2:2,v3:3,v4:4,v5:5,v6:6,v7:7,v8:8}[t.version];if(e===void 0)throw Error(`Invalid UUID version: "${t.version}"`);t.pattern??=Zp(e)}else t.pattern??=Zp();q.init(e,t)}),Rm=H(`$ZodEmail`,(e,t)=>{t.pattern??=Qp,q.init(e,t)}),zm=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})}}}),Bm=H(`$ZodEmoji`,(e,t)=>{t.pattern??=$p(),q.init(e,t)}),Vm=H(`$ZodNanoID`,(e,t)=>{t.pattern??=Jp,q.init(e,t)}),Hm=H(`$ZodCUID`,(e,t)=>{t.pattern??=Up,q.init(e,t)}),Um=H(`$ZodCUID2`,(e,t)=>{t.pattern??=Wp,q.init(e,t)}),Wm=H(`$ZodULID`,(e,t)=>{t.pattern??=Gp,q.init(e,t)}),Gm=H(`$ZodXID`,(e,t)=>{t.pattern??=Kp,q.init(e,t)}),Km=H(`$ZodKSUID`,(e,t)=>{t.pattern??=qp,q.init(e,t)}),qm=H(`$ZodISODateTime`,(e,t)=>{t.pattern??=dm(t),q.init(e,t)}),Jm=H(`$ZodISODate`,(e,t)=>{t.pattern??=cm,q.init(e,t)}),Ym=H(`$ZodISOTime`,(e,t)=>{t.pattern??=um(t),q.init(e,t)}),Xm=H(`$ZodISODuration`,(e,t)=>{t.pattern??=Yp,q.init(e,t)}),Zm=H(`$ZodIPv4`,(e,t)=>{t.pattern??=em,q.init(e,t),e._zod.bag.format=`ipv4`}),Qm=H(`$ZodIPv6`,(e,t)=>{t.pattern??=tm,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})}}}),$m=H(`$ZodCIDRv4`,(e,t)=>{t.pattern??=nm,q.init(e,t)}),eh=H(`$ZodCIDRv6`,(e,t)=>{t.pattern??=rm,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 th(e){if(e===``)return!0;if(e.length%4!=0)return!1;try{return atob(e),!0}catch{return!1}}const nh=H(`$ZodBase64`,(e,t)=>{t.pattern??=im,q.init(e,t),e._zod.bag.contentEncoding=`base64`,e._zod.check=n=>{th(n.value)||n.issues.push({code:`invalid_format`,format:`base64`,input:n.value,inst:e,continue:!t.abort})}});function rh(e){if(!am.test(e))return!1;let t=e.replace(/[-_]/g,e=>e===`-`?`+`:`/`);return th(t.padEnd(Math.ceil(t.length/4)*4,`=`))}const ih=H(`$ZodBase64URL`,(e,t)=>{t.pattern??=am,q.init(e,t),e._zod.bag.contentEncoding=`base64url`,e._zod.check=n=>{rh(n.value)||n.issues.push({code:`invalid_format`,format:`base64url`,input:n.value,inst:e,continue:!t.abort})}}),ah=H(`$ZodE164`,(e,t)=>{t.pattern??=om,q.init(e,t)});function oh(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 sh=H(`$ZodJWT`,(e,t)=>{q.init(e,t),e._zod.check=n=>{oh(n.value,t.alg)||n.issues.push({code:`invalid_format`,format:`jwt`,input:n.value,inst:e,continue:!t.abort})}}),ch=H(`$ZodNumber`,(e,t)=>{K.init(e,t),e._zod.pattern=e._zod.bag.pattern??mm,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}}),lh=H(`$ZodNumberFormat`,(e,t)=>{xm.init(e,t),ch.init(e,t)}),uh=H(`$ZodUnknown`,(e,t)=>{K.init(e,t),e._zod.parse=e=>e}),dh=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 fh(e,t,n){e.issues.length&&t.issues.push(...yp(n,e.issues)),t.value[n]=e.value}const ph=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=>fh(t,n,e))):fh(s,n,e)}return a.length?Promise.all(a).then(()=>n):n}});function mh(e,t,n,r,i){if(e.issues.length){if(i&&!(n in r))return;t.issues.push(...yp(n,e.issues))}e.value===void 0?n in r&&(t.value[n]=void 0):t.value[n]=e.value}function hh(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=lp(e.shape);return{...e,keys:t,keySet:new Set(t),numKeys:t.length,optionalKeys:new Set(n)}}function gh(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=>mh(e,n,i,t,u))):mh(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 _h=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=Kf(()=>hh(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=np,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=>mh(n,t,e,s,r))):mh(i,t,e,s,r)}return i?gh(c,s,t,o,n.value,e):c.length?Promise.all(c).then(()=>t):t}}),vh=H(`$ZodObjectJIT`,(e,t)=>{_h.init(e,t);let n=e._zod.parse,r=Kf(()=>hh(t)),i=e=>{let t=new Nm([`shape`,`payload`,`ctx`]),n=r.value,i=e=>{let t=$f(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=$f(r),s=e[r]?._zod?.optout===`optional`;t.write(`const ${n} = ${i(r)};`),s?t.write(`
|
|
412
412
|
if (${n}.issues.length) {
|
|
413
413
|
if (${o} in input) {
|
|
414
414
|
payload.issues = payload.issues.concat(${n}.issues.map(iss => ({
|
|
@@ -442,13 +442,13 @@ If the image is not a UI/design screenshot, give a normal concise description in
|
|
|
442
442
|
newResult[${o}] = ${n}.value;
|
|
443
443
|
}
|
|
444
444
|
|
|
445
|
-
`)}t.write(`payload.value = newResult;`),t.write(`return payload;`);let s=t.compile();return(t,n)=>s(e,t,n)},a,o=ep,s=!Bf.jitless,c=s&&tp.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?mh([],p,d,f,u,e):d):n(d,f):(d.issues.push({expected:`object`,code:`invalid_type`,input:p,inst:e}),d)}});function _h(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=>!gp(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=>yp(e,r,Vf())))}),t)}const vh=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=>Kf(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=>_h(t,i,e,a)):_h(s,i,e,a)}}),yh=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])=>xh(e,t,n)):xh(e,i,a)}});function bh(e,t){if(e===t||e instanceof Date&&t instanceof Date&&+e==+t)return{valid:!0,data:e};if(np(e)&&np(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=bh(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=bh(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 xh(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}),gp(e))return e;let o=bh(t.value,n.value);if(!o.valid)throw Error(`Unmergable intersection. Error path: ${JSON.stringify(o.mergeErrorPath)}`);return e.value=o.data,e}const Sh=H(`$ZodEnum`,(e,t)=>{K.init(e,t);let n=Hf(t.entries),r=new Set(n);e._zod.values=r,e._zod.pattern=RegExp(`^(${n.filter(e=>ip.has(typeof e)).map(e=>typeof e==`string`?ap(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}}),Ch=H(`$ZodTransform`,(e,t)=>{K.init(e,t),e._zod.parse=(n,r)=>{if(r.direction===`backward`)throw new zf(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 Rf;return n.value=i,n}});function wh(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(`^(${Kf(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=>wh(t,e.value)):wh(r,e.value)}return e.value===void 0?e:t.innerType._zod.run(e,n)}}),Eh=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)}),Dh=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(`^(${Kf(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)}),Oh=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=>kh(e,t)):kh(r,t)}});function kh(e,t){return e.value===void 0&&(e.value=t.defaultValue),e}const Ah=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))}),jh=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=>Mh(t,e)):Mh(i,e)}});function Mh(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 Nh=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=>yp(e,n,Vf()))},input:e.value}),e.issues=[]),e)):(e.value=r.value,r.issues.length&&(e.value=t.catchValue({...e,error:{issues:r.issues.map(e=>yp(e,n,Vf()))},input:e.value}),e.issues=[]),e)}}),Ph=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=>Fh(e,t.in,n)):Fh(r,t.in,n)}let r=t.in._zod.run(e,n);return r instanceof Promise?r.then(e=>Fh(e,t.out,n)):Fh(r,t.out,n)}});function Fh(e,t,n){return e.issues.length?(e.aborted=!0,e):t._zod.run({value:e.value,issues:e.issues},n)}const Ih=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(Lh):Lh(r)}});function Lh(e){return e.value=Object.freeze(e.value),e}const Rh=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=>zh(t,n,r,e));zh(i,n,r,e)}});function zh(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(xp(e))}}var Bh,Vh=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 Hh(){return new Vh}(Bh=globalThis).__zod_globalRegistry??(Bh.__zod_globalRegistry=Hh());const Uh=globalThis.__zod_globalRegistry;function Wh(e,t){return new e({type:`string`,...W(t)})}function Gh(e,t){return new e({type:`string`,format:`email`,check:`string_format`,abort:!1,...W(t)})}function Kh(e,t){return new e({type:`string`,format:`guid`,check:`string_format`,abort:!1,...W(t)})}function qh(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,...W(t)})}function Jh(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,version:`v4`,...W(t)})}function Yh(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,version:`v6`,...W(t)})}function Xh(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,version:`v7`,...W(t)})}function Zh(e,t){return new e({type:`string`,format:`url`,check:`string_format`,abort:!1,...W(t)})}function Qh(e,t){return new e({type:`string`,format:`emoji`,check:`string_format`,abort:!1,...W(t)})}function $h(e,t){return new e({type:`string`,format:`nanoid`,check:`string_format`,abort:!1,...W(t)})}function eg(e,t){return new e({type:`string`,format:`cuid`,check:`string_format`,abort:!1,...W(t)})}function tg(e,t){return new e({type:`string`,format:`cuid2`,check:`string_format`,abort:!1,...W(t)})}function ng(e,t){return new e({type:`string`,format:`ulid`,check:`string_format`,abort:!1,...W(t)})}function rg(e,t){return new e({type:`string`,format:`xid`,check:`string_format`,abort:!1,...W(t)})}function ig(e,t){return new e({type:`string`,format:`ksuid`,check:`string_format`,abort:!1,...W(t)})}function ag(e,t){return new e({type:`string`,format:`ipv4`,check:`string_format`,abort:!1,...W(t)})}function og(e,t){return new e({type:`string`,format:`ipv6`,check:`string_format`,abort:!1,...W(t)})}function sg(e,t){return new e({type:`string`,format:`cidrv4`,check:`string_format`,abort:!1,...W(t)})}function cg(e,t){return new e({type:`string`,format:`cidrv6`,check:`string_format`,abort:!1,...W(t)})}function lg(e,t){return new e({type:`string`,format:`base64`,check:`string_format`,abort:!1,...W(t)})}function ug(e,t){return new e({type:`string`,format:`base64url`,check:`string_format`,abort:!1,...W(t)})}function dg(e,t){return new e({type:`string`,format:`e164`,check:`string_format`,abort:!1,...W(t)})}function fg(e,t){return new e({type:`string`,format:`jwt`,check:`string_format`,abort:!1,...W(t)})}function pg(e,t){return new e({type:`string`,format:`datetime`,check:`string_format`,offset:!1,local:!1,precision:null,...W(t)})}function mg(e,t){return new e({type:`string`,format:`date`,check:`string_format`,...W(t)})}function hg(e,t){return new e({type:`string`,format:`time`,check:`string_format`,precision:null,...W(t)})}function gg(e,t){return new e({type:`string`,format:`duration`,check:`string_format`,...W(t)})}function _g(e,t){return new e({type:`number`,checks:[],...W(t)})}function vg(e,t){return new e({type:`number`,check:`number_format`,abort:!1,format:`safeint`,...W(t)})}function yg(e){return new e({type:`unknown`})}function bg(e,t){return new e({type:`never`,...W(t)})}function xg(e,t){return new gm({check:`less_than`,...W(t),value:e,inclusive:!1})}function Sg(e,t){return new gm({check:`less_than`,...W(t),value:e,inclusive:!0})}function Cg(e,t){return new _m({check:`greater_than`,...W(t),value:e,inclusive:!1})}function wg(e,t){return new _m({check:`greater_than`,...W(t),value:e,inclusive:!0})}function Tg(e,t){return new vm({check:`multiple_of`,...W(t),value:e})}function Eg(e,t){return new bm({check:`max_length`,...W(t),maximum:e})}function Dg(e,t){return new xm({check:`min_length`,...W(t),minimum:e})}function Og(e,t){return new Sm({check:`length_equals`,...W(t),length:e})}function kg(e,t){return new wm({check:`string_format`,format:`regex`,...W(t),pattern:e})}function Ag(e){return new Tm({check:`string_format`,format:`lowercase`,...W(e)})}function jg(e){return new Em({check:`string_format`,format:`uppercase`,...W(e)})}function Mg(e,t){return new Dm({check:`string_format`,format:`includes`,...W(t),includes:e})}function Ng(e,t){return new Om({check:`string_format`,format:`starts_with`,...W(t),prefix:e})}function Pg(e,t){return new km({check:`string_format`,format:`ends_with`,...W(t),suffix:e})}function Fg(e){return new Am({check:`overwrite`,tx:e})}function Ig(e){return Fg(t=>t.normalize(e))}function Lg(){return Fg(e=>e.trim())}function Rg(){return Fg(e=>e.toLowerCase())}function zg(){return Fg(e=>e.toUpperCase())}function Bg(){return Fg(e=>Qf(e))}function Vg(e,t,n){return new e({type:`array`,element:t,...W(n)})}function Hg(e,t,n){return new e({type:`custom`,check:`custom`,fn:t,...W(n)})}function Ug(e){let t=Wg(n=>(n.addIssue=e=>{if(typeof e==`string`)n.issues.push(xp(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(xp(r))}},e(n.value,n)));return t}function Wg(e,t){let n=new G({check:`custom`,...W(t)});return n._zod.check=e,n}function Gg(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??Uh,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 Kg(e,t){let n=e.seen.get(t);if(!n)throw Error(`Unprocessed schema. This is a bug in Zod.`);let r=new Map;for(let t of e.seen.entries()){let n=e.metadataRegistry.get(t[0])?.id;if(n){let e=r.get(n);if(e&&e!==t[0])throw Error(`Duplicate schema id "${n}" detected during JSON Schema conversion. Two different schemas cannot share the same id when converted together.`);r.set(n,t[0])}}let i=t=>{let r=e.target===`draft-2020-12`?`$defs`:`definitions`;if(e.external){let n=e.external.registry.get(t[0])?.id,i=e.external.uri??(e=>e);if(n)return{ref:i(n)};let a=t[1].defId??t[1].schema.id??`schema${e.counter++}`;return t[1].defId=a,{defId:a,ref:`${i(`__shared`)}#/${r}/${a}`}}if(t[1]===n)return{ref:`#`};let i=`#/${r}/`,a=t[1].schema.id??`__schema${e.counter++}`;return{defId:a,ref:i+a}},a=e=>{if(e[1].schema.$ref)return;let t=e[1],{ref:n,defId:r}=i(e);t.def={...t.schema},r&&(t.defId=r);let a=t.schema;for(let e in a)delete a[e];a.$ref=n};if(e.cycles===`throw`)for(let t of e.seen.entries()){let e=t[1];if(e.cycle)throw Error(`Cycle detected: #/${e.cycle?.join(`/`)}/<root>
|
|
445
|
+
`)}t.write(`payload.value = newResult;`),t.write(`return payload;`);let s=t.compile();return(t,n)=>s(e,t,n)},a,o=np,s=!Hf.jitless,c=s&&rp.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?gh([],p,d,f,u,e):d):n(d,f):(d.issues.push({expected:`object`,code:`invalid_type`,input:p,inst:e}),d)}});function yh(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=>!vp(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=>xp(e,r,Uf())))}),t)}const bh=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=>Jf(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=>yh(t,i,e,a)):yh(s,i,e,a)}}),xh=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])=>Ch(e,t,n)):Ch(e,i,a)}});function Sh(e,t){if(e===t||e instanceof Date&&t instanceof Date&&+e==+t)return{valid:!0,data:e};if(ip(e)&&ip(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=Sh(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=Sh(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 Ch(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}),vp(e))return e;let o=Sh(t.value,n.value);if(!o.valid)throw Error(`Unmergable intersection. Error path: ${JSON.stringify(o.mergeErrorPath)}`);return e.value=o.data,e}const wh=H(`$ZodEnum`,(e,t)=>{K.init(e,t);let n=Wf(t.entries),r=new Set(n);e._zod.values=r,e._zod.pattern=RegExp(`^(${n.filter(e=>op.has(typeof e)).map(e=>typeof e==`string`?sp(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}}),Th=H(`$ZodTransform`,(e,t)=>{K.init(e,t),e._zod.parse=(n,r)=>{if(r.direction===`backward`)throw new Vf(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 Bf;return n.value=i,n}});function Eh(e,t){return e.issues.length&&t===void 0?{issues:[],value:void 0}:e}const Dh=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(`^(${Jf(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)}}),Oh=H(`$ZodExactOptional`,(e,t)=>{Dh.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)}),kh=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(`^(${Jf(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)}),Ah=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=>jh(e,t)):jh(r,t)}});function jh(e,t){return e.value===void 0&&(e.value=t.defaultValue),e}const Mh=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))}),Nh=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=>Ph(t,e)):Ph(i,e)}});function Ph(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 Fh=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=>xp(e,n,Uf()))},input:e.value}),e.issues=[]),e)):(e.value=r.value,r.issues.length&&(e.value=t.catchValue({...e,error:{issues:r.issues.map(e=>xp(e,n,Uf()))},input:e.value}),e.issues=[]),e)}}),Ih=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=>Lh(e,t.in,n)):Lh(r,t.in,n)}let r=t.in._zod.run(e,n);return r instanceof Promise?r.then(e=>Lh(e,t.out,n)):Lh(r,t.out,n)}});function Lh(e,t,n){return e.issues.length?(e.aborted=!0,e):t._zod.run({value:e.value,issues:e.issues},n)}const Rh=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(zh):zh(r)}});function zh(e){return e.value=Object.freeze(e.value),e}const Bh=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=>Vh(t,n,r,e));Vh(i,n,r,e)}});function Vh(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(Cp(e))}}var Hh,Uh=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 Wh(){return new Uh}(Hh=globalThis).__zod_globalRegistry??(Hh.__zod_globalRegistry=Wh());const Gh=globalThis.__zod_globalRegistry;function Kh(e,t){return new e({type:`string`,...W(t)})}function qh(e,t){return new e({type:`string`,format:`email`,check:`string_format`,abort:!1,...W(t)})}function Jh(e,t){return new e({type:`string`,format:`guid`,check:`string_format`,abort:!1,...W(t)})}function Yh(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,...W(t)})}function Xh(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,version:`v4`,...W(t)})}function Zh(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,version:`v6`,...W(t)})}function Qh(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,version:`v7`,...W(t)})}function $h(e,t){return new e({type:`string`,format:`url`,check:`string_format`,abort:!1,...W(t)})}function eg(e,t){return new e({type:`string`,format:`emoji`,check:`string_format`,abort:!1,...W(t)})}function tg(e,t){return new e({type:`string`,format:`nanoid`,check:`string_format`,abort:!1,...W(t)})}function ng(e,t){return new e({type:`string`,format:`cuid`,check:`string_format`,abort:!1,...W(t)})}function rg(e,t){return new e({type:`string`,format:`cuid2`,check:`string_format`,abort:!1,...W(t)})}function ig(e,t){return new e({type:`string`,format:`ulid`,check:`string_format`,abort:!1,...W(t)})}function ag(e,t){return new e({type:`string`,format:`xid`,check:`string_format`,abort:!1,...W(t)})}function og(e,t){return new e({type:`string`,format:`ksuid`,check:`string_format`,abort:!1,...W(t)})}function sg(e,t){return new e({type:`string`,format:`ipv4`,check:`string_format`,abort:!1,...W(t)})}function cg(e,t){return new e({type:`string`,format:`ipv6`,check:`string_format`,abort:!1,...W(t)})}function lg(e,t){return new e({type:`string`,format:`cidrv4`,check:`string_format`,abort:!1,...W(t)})}function ug(e,t){return new e({type:`string`,format:`cidrv6`,check:`string_format`,abort:!1,...W(t)})}function dg(e,t){return new e({type:`string`,format:`base64`,check:`string_format`,abort:!1,...W(t)})}function fg(e,t){return new e({type:`string`,format:`base64url`,check:`string_format`,abort:!1,...W(t)})}function pg(e,t){return new e({type:`string`,format:`e164`,check:`string_format`,abort:!1,...W(t)})}function mg(e,t){return new e({type:`string`,format:`jwt`,check:`string_format`,abort:!1,...W(t)})}function hg(e,t){return new e({type:`string`,format:`datetime`,check:`string_format`,offset:!1,local:!1,precision:null,...W(t)})}function gg(e,t){return new e({type:`string`,format:`date`,check:`string_format`,...W(t)})}function _g(e,t){return new e({type:`string`,format:`time`,check:`string_format`,precision:null,...W(t)})}function vg(e,t){return new e({type:`string`,format:`duration`,check:`string_format`,...W(t)})}function yg(e,t){return new e({type:`number`,checks:[],...W(t)})}function bg(e,t){return new e({type:`number`,check:`number_format`,abort:!1,format:`safeint`,...W(t)})}function xg(e){return new e({type:`unknown`})}function Sg(e,t){return new e({type:`never`,...W(t)})}function Cg(e,t){return new vm({check:`less_than`,...W(t),value:e,inclusive:!1})}function wg(e,t){return new vm({check:`less_than`,...W(t),value:e,inclusive:!0})}function Tg(e,t){return new ym({check:`greater_than`,...W(t),value:e,inclusive:!1})}function Eg(e,t){return new ym({check:`greater_than`,...W(t),value:e,inclusive:!0})}function Dg(e,t){return new bm({check:`multiple_of`,...W(t),value:e})}function Og(e,t){return new Sm({check:`max_length`,...W(t),maximum:e})}function kg(e,t){return new Cm({check:`min_length`,...W(t),minimum:e})}function Ag(e,t){return new wm({check:`length_equals`,...W(t),length:e})}function jg(e,t){return new Em({check:`string_format`,format:`regex`,...W(t),pattern:e})}function Mg(e){return new Dm({check:`string_format`,format:`lowercase`,...W(e)})}function Ng(e){return new Om({check:`string_format`,format:`uppercase`,...W(e)})}function Pg(e,t){return new km({check:`string_format`,format:`includes`,...W(t),includes:e})}function Fg(e,t){return new Am({check:`string_format`,format:`starts_with`,...W(t),prefix:e})}function Ig(e,t){return new jm({check:`string_format`,format:`ends_with`,...W(t),suffix:e})}function Lg(e){return new Mm({check:`overwrite`,tx:e})}function Rg(e){return Lg(t=>t.normalize(e))}function zg(){return Lg(e=>e.trim())}function Bg(){return Lg(e=>e.toLowerCase())}function Vg(){return Lg(e=>e.toUpperCase())}function Hg(){return Lg(e=>ep(e))}function Ug(e,t,n){return new e({type:`array`,element:t,...W(n)})}function Wg(e,t,n){return new e({type:`custom`,check:`custom`,fn:t,...W(n)})}function Gg(e){let t=Kg(n=>(n.addIssue=e=>{if(typeof e==`string`)n.issues.push(Cp(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(Cp(r))}},e(n.value,n)));return t}function Kg(e,t){let n=new G({check:`custom`,...W(t)});return n._zod.check=e,n}function qg(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??Gh,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 Jg(e,t){let n=e.seen.get(t);if(!n)throw Error(`Unprocessed schema. This is a bug in Zod.`);let r=new Map;for(let t of e.seen.entries()){let n=e.metadataRegistry.get(t[0])?.id;if(n){let e=r.get(n);if(e&&e!==t[0])throw Error(`Duplicate schema id "${n}" detected during JSON Schema conversion. Two different schemas cannot share the same id when converted together.`);r.set(n,t[0])}}let i=t=>{let r=e.target===`draft-2020-12`?`$defs`:`definitions`;if(e.external){let n=e.external.registry.get(t[0])?.id,i=e.external.uri??(e=>e);if(n)return{ref:i(n)};let a=t[1].defId??t[1].schema.id??`schema${e.counter++}`;return t[1].defId=a,{defId:a,ref:`${i(`__shared`)}#/${r}/${a}`}}if(t[1]===n)return{ref:`#`};let i=`#/${r}/`,a=t[1].schema.id??`__schema${e.counter++}`;return{defId:a,ref:i+a}},a=e=>{if(e[1].schema.$ref)return;let t=e[1],{ref:n,defId:r}=i(e);t.def={...t.schema},r&&(t.defId=r);let a=t.schema;for(let e in a)delete a[e];a.$ref=n};if(e.cycles===`throw`)for(let t of e.seen.entries()){let e=t[1];if(e.cycle)throw Error(`Cycle detected: #/${e.cycle?.join(`/`)}/<root>
|
|
446
446
|
|
|
447
|
-
Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.`)}for(let n of e.seen.entries()){let r=n[1];if(t===n[0]){a(n);continue}if(e.external){let r=e.external.registry.get(n[0])?.id;if(t!==n[0]&&r){a(n);continue}}if(e.metadataRegistry.get(n[0])?.id){a(n);continue}if(r.cycle){a(n);continue}if(r.count>1&&e.reused===`ref`){a(n);continue}}}function qg(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:Yg(t,`input`,e.processors),output:Yg(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 Jg=(e,t={})=>n=>{let r=Gg({...n,processors:t});return J(e,r),Kg(r,e),qg(r,e)},Yg=(e,t,n={})=>r=>{let{libraryOptions:i,target:a}=r??{},o=Gg({...i??{},target:a,io:t,processors:n});return J(e,o),Kg(o,e),qg(o,e)},Xg={guid:`uuid`,url:`uri`,datetime:`date-time`,json_string:`json-string`,regex:``},Zg=(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=Xg[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}))])}},Qg=(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)},$g=(e,t,n,r)=>{n.not={}},e_=(e,t,n,r)=>{let i=e._zod.def,a=Hf(i.entries);a.every(e=>typeof e==`number`)&&(n.type=`number`),a.every(e=>typeof e==`string`)&&(n.type=`string`),n.enum=a},t_=(e,t,n,r)=>{if(t.unrepresentable===`throw`)throw Error(`Custom types cannot be represented in JSON Schema`)},n_=(e,t,n,r)=>{if(t.unrepresentable===`throw`)throw Error(`Transforms cannot be represented in JSON Schema`)},r_=(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`]})},i_=(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)},a_=(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},o_=(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]]},s_=(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`}]},c_=(e,t,n,r)=>{let i=e._zod.def;J(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},l_=(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))},u_=(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)))},d_=(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},f_=(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},p_=(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},m_=(e,t,n,r)=>{let i=e._zod.def;J(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},h_=H(`ZodISODateTime`,(e,t)=>{Gm.init(e,t),$.init(e,t)});function g_(e){return pg(h_,e)}const __=H(`ZodISODate`,(e,t)=>{Km.init(e,t),$.init(e,t)});function v_(e){return mg(__,e)}const y_=H(`ZodISOTime`,(e,t)=>{qm.init(e,t),$.init(e,t)});function b_(e){return hg(y_,e)}const x_=H(`ZodISODuration`,(e,t)=>{Jm.init(e,t),$.init(e,t)});function S_(e){return gg(x_,e)}const C_=(e,t)=>{Cp.init(e,t),e.name=`ZodError`,Object.defineProperties(e,{format:{value:t=>Ep(e,t)},flatten:{value:t=>Tp(e,t)},addIssue:{value:t=>{e.issues.push(t),e.message=JSON.stringify(e.issues,Uf,2)}},addIssues:{value:t=>{e.issues.push(...t),e.message=JSON.stringify(e.issues,Uf,2)}},isEmpty:{get(){return e.issues.length===0}}})};H(`ZodError`,C_);const X=H(`ZodError`,C_,{Parent:Error}),w_=Dp(X),T_=Op(X),E_=kp(X),D_=jp(X),O_=Np(X),k_=Pp(X),A_=Fp(X),j_=Ip(X),M_=Lp(X),N_=Rp(X),P_=zp(X),F_=Bp(X),Z=H(`ZodType`,(e,t)=>(K.init(e,t),Object.assign(e[`~standard`],{jsonSchema:{input:Yg(e,`input`),output:Yg(e,`output`)}}),e.toJSONSchema=Jg(e,{}),e.def=t,e.type=t.type,Object.defineProperty(e,`_def`,{value:t}),e.check=(...n)=>e.clone(Xf(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)=>op(e,t,n),e.brand=()=>e,e.register=((t,n)=>(t.add(e,n),e)),e.parse=(t,n)=>w_(e,t,n,{callee:e.parse}),e.safeParse=(t,n)=>E_(e,t,n),e.parseAsync=async(t,n)=>T_(e,t,n,{callee:e.parseAsync}),e.safeParseAsync=async(t,n)=>D_(e,t,n),e.spa=e.safeParseAsync,e.encode=(t,n)=>O_(e,t,n),e.decode=(t,n)=>k_(e,t,n),e.encodeAsync=async(t,n)=>A_(e,t,n),e.decodeAsync=async(t,n)=>j_(e,t,n),e.safeEncode=(t,n)=>M_(e,t,n),e.safeDecode=(t,n)=>N_(e,t,n),e.safeEncodeAsync=async(t,n)=>P_(e,t,n),e.safeDecodeAsync=async(t,n)=>F_(e,t,n),e.refine=(t,n)=>e.check(Hv(t,n)),e.superRefine=t=>e.check(Uv(t)),e.overwrite=t=>e.check(Fg(t)),e.optional=()=>wv(e),e.exactOptional=()=>Ev(e),e.nullable=()=>Ov(e),e.nullish=()=>wv(Ov(e)),e.nonoptional=t=>Pv(e,t),e.array=()=>fv(e),e.or=t=>gv([e,t]),e.and=t=>vv(e,t),e.transform=t=>Rv(e,Sv(t)),e.default=t=>Av(e,t),e.prefault=t=>Mv(e,t),e.catch=t=>Iv(e,t),e.pipe=t=>Rv(e,t),e.readonly=()=>Bv(e),e.describe=t=>{let n=e.clone();return Uh.add(n,{description:t}),n},Object.defineProperty(e,`description`,{get(){return Uh.get(e)?.description},configurable:!0}),e.meta=(...t)=>{if(t.length===0)return Uh.get(e);let n=e.clone();return Uh.add(n,t[0]),n},e.isOptional=()=>e.safeParse(void 0).success,e.isNullable=()=>e.safeParse(null).success,e.apply=t=>t(e),e)),I_=H(`_ZodString`,(e,t)=>{Nm.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Zg(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(kg(...t)),e.includes=(...t)=>e.check(Mg(...t)),e.startsWith=(...t)=>e.check(Ng(...t)),e.endsWith=(...t)=>e.check(Pg(...t)),e.min=(...t)=>e.check(Dg(...t)),e.max=(...t)=>e.check(Eg(...t)),e.length=(...t)=>e.check(Og(...t)),e.nonempty=(...t)=>e.check(Dg(1,...t)),e.lowercase=t=>e.check(Ag(t)),e.uppercase=t=>e.check(jg(t)),e.trim=()=>e.check(Lg()),e.normalize=(...t)=>e.check(Ig(...t)),e.toLowerCase=()=>e.check(Rg()),e.toUpperCase=()=>e.check(zg()),e.slugify=()=>e.check(Bg())}),L_=H(`ZodString`,(e,t)=>{Nm.init(e,t),I_.init(e,t),e.email=t=>e.check(Gh(R_,t)),e.url=t=>e.check(Zh(V_,t)),e.jwt=t=>e.check(fg(nv,t)),e.emoji=t=>e.check(Qh(H_,t)),e.guid=t=>e.check(Kh(z_,t)),e.uuid=t=>e.check(qh(B_,t)),e.uuidv4=t=>e.check(Jh(B_,t)),e.uuidv6=t=>e.check(Yh(B_,t)),e.uuidv7=t=>e.check(Xh(B_,t)),e.nanoid=t=>e.check($h(U_,t)),e.guid=t=>e.check(Kh(z_,t)),e.cuid=t=>e.check(eg(W_,t)),e.cuid2=t=>e.check(tg(G_,t)),e.ulid=t=>e.check(ng(K_,t)),e.base64=t=>e.check(lg($_,t)),e.base64url=t=>e.check(ug(ev,t)),e.xid=t=>e.check(rg(q_,t)),e.ksuid=t=>e.check(ig(J_,t)),e.ipv4=t=>e.check(ag(Y_,t)),e.ipv6=t=>e.check(og(X_,t)),e.cidrv4=t=>e.check(sg(Z_,t)),e.cidrv6=t=>e.check(cg(Q_,t)),e.e164=t=>e.check(dg(tv,t)),e.datetime=t=>e.check(g_(t)),e.date=t=>e.check(v_(t)),e.time=t=>e.check(b_(t)),e.duration=t=>e.check(S_(t))});function Q(e){return Wh(L_,e)}const $=H(`ZodStringFormat`,(e,t)=>{q.init(e,t),I_.init(e,t)}),R_=H(`ZodEmail`,(e,t)=>{Im.init(e,t),$.init(e,t)}),z_=H(`ZodGUID`,(e,t)=>{Pm.init(e,t),$.init(e,t)}),B_=H(`ZodUUID`,(e,t)=>{Fm.init(e,t),$.init(e,t)}),V_=H(`ZodURL`,(e,t)=>{Lm.init(e,t),$.init(e,t)}),H_=H(`ZodEmoji`,(e,t)=>{Rm.init(e,t),$.init(e,t)}),U_=H(`ZodNanoID`,(e,t)=>{zm.init(e,t),$.init(e,t)}),W_=H(`ZodCUID`,(e,t)=>{Bm.init(e,t),$.init(e,t)}),G_=H(`ZodCUID2`,(e,t)=>{Vm.init(e,t),$.init(e,t)}),K_=H(`ZodULID`,(e,t)=>{Hm.init(e,t),$.init(e,t)}),q_=H(`ZodXID`,(e,t)=>{Um.init(e,t),$.init(e,t)}),J_=H(`ZodKSUID`,(e,t)=>{Wm.init(e,t),$.init(e,t)}),Y_=H(`ZodIPv4`,(e,t)=>{Ym.init(e,t),$.init(e,t)}),X_=H(`ZodIPv6`,(e,t)=>{Xm.init(e,t),$.init(e,t)}),Z_=H(`ZodCIDRv4`,(e,t)=>{Zm.init(e,t),$.init(e,t)}),Q_=H(`ZodCIDRv6`,(e,t)=>{Qm.init(e,t),$.init(e,t)}),$_=H(`ZodBase64`,(e,t)=>{eh.init(e,t),$.init(e,t)}),ev=H(`ZodBase64URL`,(e,t)=>{nh.init(e,t),$.init(e,t)}),tv=H(`ZodE164`,(e,t)=>{rh.init(e,t),$.init(e,t)}),nv=H(`ZodJWT`,(e,t)=>{ah.init(e,t),$.init(e,t)}),rv=H(`ZodNumber`,(e,t)=>{oh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Qg(e,t,n,r),e.gt=(t,n)=>e.check(Cg(t,n)),e.gte=(t,n)=>e.check(wg(t,n)),e.min=(t,n)=>e.check(wg(t,n)),e.lt=(t,n)=>e.check(xg(t,n)),e.lte=(t,n)=>e.check(Sg(t,n)),e.max=(t,n)=>e.check(Sg(t,n)),e.int=t=>e.check(ov(t)),e.safe=t=>e.check(ov(t)),e.positive=t=>e.check(Cg(0,t)),e.nonnegative=t=>e.check(wg(0,t)),e.negative=t=>e.check(xg(0,t)),e.nonpositive=t=>e.check(Sg(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 iv(e){return _g(rv,e)}const av=H(`ZodNumberFormat`,(e,t)=>{sh.init(e,t),rv.init(e,t)});function ov(e){return vg(av,e)}const sv=H(`ZodUnknown`,(e,t)=>{ch.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(e,t,n)=>void 0});function cv(){return yg(sv)}const lv=H(`ZodNever`,(e,t)=>{lh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>$g(e,t,n,r)});function uv(e){return bg(lv,e)}const dv=H(`ZodArray`,(e,t)=>{dh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>r_(e,t,n,r),e.element=t.element,e.min=(t,n)=>e.check(Dg(t,n)),e.nonempty=t=>e.check(Dg(1,t)),e.max=(t,n)=>e.check(Eg(t,n)),e.length=(t,n)=>e.check(Og(t,n)),e.unwrap=()=>e.element});function fv(e,t){return Vg(dv,e,t)}const pv=H(`ZodObject`,(e,t)=>{gh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>i_(e,t,n,r),U(e,`shape`,()=>t.shape),e.keyof=()=>bv(Object.keys(e._zod.def.shape)),e.catchall=t=>e.clone({...e._zod.def,catchall:t}),e.passthrough=()=>e.clone({...e._zod.def,catchall:cv()}),e.loose=()=>e.clone({...e._zod.def,catchall:cv()}),e.strict=()=>e.clone({...e._zod.def,catchall:uv()}),e.strip=()=>e.clone({...e._zod.def,catchall:void 0}),e.extend=t=>dp(e,t),e.safeExtend=t=>fp(e,t),e.merge=t=>pp(e,t),e.pick=t=>lp(e,t),e.omit=t=>up(e,t),e.partial=(...t)=>mp(Cv,e,t[0]),e.required=(...t)=>hp(Nv,e,t[0])});function mv(e,t){return new pv({type:`object`,shape:e??{},...W(t)})}const hv=H(`ZodUnion`,(e,t)=>{vh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>a_(e,t,n,r),e.options=t.options});function gv(e,t){return new hv({type:`union`,options:e,...W(t)})}const _v=H(`ZodIntersection`,(e,t)=>{yh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>o_(e,t,n,r)});function vv(e,t){return new _v({type:`intersection`,left:e,right:t})}const yv=H(`ZodEnum`,(e,t)=>{Sh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>e_(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 yv({...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 yv({...t,checks:[],...W(r),entries:i})}});function bv(e,t){return new yv({type:`enum`,entries:Array.isArray(e)?Object.fromEntries(e.map(e=>[e,e])):e,...W(t)})}const xv=H(`ZodTransform`,(e,t)=>{Ch.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>n_(e,t,n,r),e._zod.parse=(n,r)=>{if(r.direction===`backward`)throw new zf(e.constructor.name);n.addIssue=r=>{if(typeof r==`string`)n.issues.push(xp(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(xp(t))}};let i=t.transform(n.value,n);return i instanceof Promise?i.then(e=>(n.value=e,n)):(n.value=i,n)}});function Sv(e){return new xv({type:`transform`,transform:e})}const Cv=H(`ZodOptional`,(e,t)=>{Th.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>m_(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function wv(e){return new Cv({type:`optional`,innerType:e})}const Tv=H(`ZodExactOptional`,(e,t)=>{Eh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>m_(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Ev(e){return new Tv({type:`optional`,innerType:e})}const Dv=H(`ZodNullable`,(e,t)=>{Dh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>s_(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Ov(e){return new Dv({type:`nullable`,innerType:e})}const kv=H(`ZodDefault`,(e,t)=>{Oh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>l_(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeDefault=e.unwrap});function Av(e,t){return new kv({type:`default`,innerType:e,get defaultValue(){return typeof t==`function`?t():rp(t)}})}const jv=H(`ZodPrefault`,(e,t)=>{Ah.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>u_(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Mv(e,t){return new jv({type:`prefault`,innerType:e,get defaultValue(){return typeof t==`function`?t():rp(t)}})}const Nv=H(`ZodNonOptional`,(e,t)=>{jh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>c_(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Pv(e,t){return new Nv({type:`nonoptional`,innerType:e,...W(t)})}const Fv=H(`ZodCatch`,(e,t)=>{Nh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>d_(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeCatch=e.unwrap});function Iv(e,t){return new Fv({type:`catch`,innerType:e,catchValue:typeof t==`function`?t:()=>t})}const Lv=H(`ZodPipe`,(e,t)=>{Ph.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>f_(e,t,n,r),e.in=t.in,e.out=t.out});function Rv(e,t){return new Lv({type:`pipe`,in:e,out:t})}const zv=H(`ZodReadonly`,(e,t)=>{Ih.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>p_(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Bv(e){return new zv({type:`readonly`,innerType:e})}const Vv=H(`ZodCustom`,(e,t)=>{Rh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>t_(e,t,n,r)});function Hv(e,t={}){return Hg(Vv,e,t)}function Uv(e){return Ug(e)}const Wv=[`plugin-skill-inductor`],Gv=mv({id:Q().min(1).max(64),taskSignature:Q().min(1).max(200),tags:fv(Q().max(32)).max(5),sessionIds:fv(Q().max(64)).max(50),size:iv().int().min(1).max(1e3),firstAt:iv().int().nonnegative(),lastAt:iv().int().nonnegative(),dismissedAt:iv().int().nonnegative().optional()});function Kv(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(Fu(e),t,`candidates.json`)}function qv(e){if(!Wv.includes(e.pluginId))return[];let t;try{let n=Kv(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=Gv.safeParse(e);t.success&&r.push(t.data)}return r}function Jv(e){return(e.selectedOptionLabels??[]).includes(`起草 SKILL.md 给我看`)}async function Yv(e){let t;try{t=await e.requestGrill({header:`技能沉淀提议`,question:Pf(e.brief),background:Ff(e.brief),recommendation:If(),options:Lf(),askedBy:`skill-loop`})}catch(t){return e.logger?.warn(`skill-loop proposal failed: ${t instanceof Error?t.message:String(t)}`),`error`}return Jv(t)?`accepted`:Xv(e)?`dismissed`:(e.logger?.warn(`skill-loop: failed to persist dismissal, candidate may resurface`),`error`)}function Xv(e){if(s())return!0;let t=Kv(e.pluginId,e.workspaceKey),n=`${t}.host.tmp`;try{let r=JSON.parse(k(t,`utf8`)),i=r?.data?.items;if(!Array.isArray(i))return!1;let a=i.find(t=>t?.id===e.brief.id);return a?(a.dismissedAt=e.now,A(n,JSON.stringify(r)),Yr(n,t),!0):!1}catch{try{$r(n)}catch{}return!1}}const Zv=Wv[0],Qv=Si;async function $v(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=Mf(qv({pluginId:Zv,workspaceKey:e.getWorkspaceKey()??Si}),n,jf(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 Yv({requestGrill:i,brief:a,pluginId:Zv,workspaceKey:e.getWorkspaceKey()??Si,now:n,logger:{warn:t=>e.logger.warn(t)}});return o===`accepted`&&(e.logger.info({sessionId:t,candidateId:a.id},`skill-loop: user accepted candidate`),e.onAccepted?.({sessionId:t,brief:a})),o}function ey(e){return[y({name:`skill-loop`,timing:`session.idle`,handle:async t=>{try{await $v(e,t.sessionId)}catch(t){e.logger.warn({err:String(t)},`skill-loop: unexpected failure`)}}})]}const ty=`[sandbox-escalation]`;function ny(e){return y({name:`sandbox-guard`,timing:`tool.execute.before`,priority:6,enabled:!0,handle:(t,n)=>{if(n.cancelled)return;let r=e.getContext();if(!r||t.readonly)return;let i=t.args,a=t.paths?[...t.paths]:[],o=i?.command;if(typeof o==`string`&&a.push(...Me(o)),a.length===0)return;let s=typeof i?.targetDir==`string`?i.targetDir:`.`,c=S(r.projectRoot,s),l=_e({writePaths:a.map(e=>S(c,e))},r);if(l.verdict===`deny`){n.cancelled=!0,n.decision=`deny`,n.decisionReason=l.reason??`sandbox policy`,n.cancelReason=`Sandbox denied: ${n.decisionReason}`;return}if(l.verdict===`ask`){if(r.autoAllowBashIfSandboxed===!0&&t.toolName===`bash`&&n.decision!==`deny`&&n.decision!==`ask`)return;n.decision!==`deny`&&(n.decision=`ask`,n.decisionReason=`${ty} ${l.reason??`requires approval`}`)}}})}function ry(e){let t=[`id: ${e.jobId}`,`title: ${e.title}`,`status: ${e.status}`];return e.summary&&t.push(`summary: ${e.summary}`),e.outputPath&&t.push(`output_file: ${e.outputPath}`),e.worktree&&(t.push(`worktree_path: ${e.worktree.path}`),e.worktree.branch&&t.push(`worktree_branch: ${e.worktree.branch}`)),`<delegate-notification>\n${t.join(`
|
|
448
|
-
`)}\n</delegate-notification>`}function
|
|
447
|
+
Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.`)}for(let n of e.seen.entries()){let r=n[1];if(t===n[0]){a(n);continue}if(e.external){let r=e.external.registry.get(n[0])?.id;if(t!==n[0]&&r){a(n);continue}}if(e.metadataRegistry.get(n[0])?.id){a(n);continue}if(r.cycle){a(n);continue}if(r.count>1&&e.reused===`ref`){a(n);continue}}}function Yg(e,t){let n=e.seen.get(t);if(!n)throw Error(`Unprocessed schema. This is a bug in Zod.`);let r=t=>{let n=e.seen.get(t);if(n.ref===null)return;let i=n.def??n.schema,a={...i},o=n.ref;if(n.ref=null,o){r(o);let n=e.seen.get(o),s=n.schema;if(s.$ref&&(e.target===`draft-07`||e.target===`draft-04`||e.target===`openapi-3.0`)?(i.allOf=i.allOf??[],i.allOf.push(s)):Object.assign(i,s),Object.assign(i,a),t._zod.parent===o)for(let e in i)e===`$ref`||e===`allOf`||e in a||delete i[e];if(s.$ref&&n.def)for(let e in i)e===`$ref`||e===`allOf`||e in n.def&&JSON.stringify(i[e])===JSON.stringify(n.def[e])&&delete i[e]}let s=t._zod.parent;if(s&&s!==o){r(s);let t=e.seen.get(s);if(t?.schema.$ref&&(i.$ref=t.schema.$ref,t.def))for(let e in i)e===`$ref`||e===`allOf`||e in t.def&&JSON.stringify(i[e])===JSON.stringify(t.def[e])&&delete i[e]}e.override({zodSchema:t,jsonSchema:i,path:n.path??[]})};for(let t of[...e.seen.entries()].reverse())r(t[0]);let i={};if(e.target===`draft-2020-12`?i.$schema=`https://json-schema.org/draft/2020-12/schema`:e.target===`draft-07`?i.$schema=`http://json-schema.org/draft-07/schema#`:e.target===`draft-04`?i.$schema=`http://json-schema.org/draft-04/schema#`:e.target,e.external?.uri){let n=e.external.registry.get(t)?.id;if(!n)throw Error("Schema is missing an `id` property");i.$id=e.external.uri(n)}Object.assign(i,n.def??n.schema);let a=e.external?.defs??{};for(let t of e.seen.entries()){let e=t[1];e.def&&e.defId&&(a[e.defId]=e.def)}e.external||Object.keys(a).length>0&&(e.target===`draft-2020-12`?i.$defs=a:i.definitions=a);try{let n=JSON.parse(JSON.stringify(i));return Object.defineProperty(n,`~standard`,{value:{...t[`~standard`],jsonSchema:{input:Zg(t,`input`,e.processors),output:Zg(t,`output`,e.processors)}},enumerable:!1,writable:!1}),n}catch{throw Error(`Error converting schema to JSON.`)}}function Y(e,t){let n=t??{seen:new Set};if(n.seen.has(e))return!1;n.seen.add(e);let r=e._zod.def;if(r.type===`transform`)return!0;if(r.type===`array`)return Y(r.element,n);if(r.type===`set`)return Y(r.valueType,n);if(r.type===`lazy`)return Y(r.getter(),n);if(r.type===`promise`||r.type===`optional`||r.type===`nonoptional`||r.type===`nullable`||r.type===`readonly`||r.type===`default`||r.type===`prefault`)return Y(r.innerType,n);if(r.type===`intersection`)return Y(r.left,n)||Y(r.right,n);if(r.type===`record`||r.type===`map`)return Y(r.keyType,n)||Y(r.valueType,n);if(r.type===`pipe`)return Y(r.in,n)||Y(r.out,n);if(r.type===`object`){for(let e in r.shape)if(Y(r.shape[e],n))return!0;return!1}if(r.type===`union`){for(let e of r.options)if(Y(e,n))return!0;return!1}if(r.type===`tuple`){for(let e of r.items)if(Y(e,n))return!0;return!!(r.rest&&Y(r.rest,n))}return!1}const Xg=(e,t={})=>n=>{let r=qg({...n,processors:t});return J(e,r),Jg(r,e),Yg(r,e)},Zg=(e,t,n={})=>r=>{let{libraryOptions:i,target:a}=r??{},o=qg({...i??{},target:a,io:t,processors:n});return J(e,o),Jg(o,e),Yg(o,e)},Qg={guid:`uuid`,url:`uri`,datetime:`date-time`,json_string:`json-string`,regex:``},$g=(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=Qg[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}))])}},e_=(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)},t_=(e,t,n,r)=>{n.not={}},n_=(e,t,n,r)=>{let i=e._zod.def,a=Wf(i.entries);a.every(e=>typeof e==`number`)&&(n.type=`number`),a.every(e=>typeof e==`string`)&&(n.type=`string`),n.enum=a},r_=(e,t,n,r)=>{if(t.unrepresentable===`throw`)throw Error(`Custom types cannot be represented in JSON Schema`)},i_=(e,t,n,r)=>{if(t.unrepresentable===`throw`)throw Error(`Transforms cannot be represented in JSON Schema`)},a_=(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`]})},o_=(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)},s_=(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},c_=(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]]},l_=(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`}]},u_=(e,t,n,r)=>{let i=e._zod.def;J(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},d_=(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))},f_=(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)))},p_=(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},m_=(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},h_=(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},g_=(e,t,n,r)=>{let i=e._zod.def;J(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},__=H(`ZodISODateTime`,(e,t)=>{qm.init(e,t),$.init(e,t)});function v_(e){return hg(__,e)}const y_=H(`ZodISODate`,(e,t)=>{Jm.init(e,t),$.init(e,t)});function b_(e){return gg(y_,e)}const x_=H(`ZodISOTime`,(e,t)=>{Ym.init(e,t),$.init(e,t)});function S_(e){return _g(x_,e)}const C_=H(`ZodISODuration`,(e,t)=>{Xm.init(e,t),$.init(e,t)});function w_(e){return vg(C_,e)}const T_=(e,t)=>{Tp.init(e,t),e.name=`ZodError`,Object.defineProperties(e,{format:{value:t=>Op(e,t)},flatten:{value:t=>Dp(e,t)},addIssue:{value:t=>{e.issues.push(t),e.message=JSON.stringify(e.issues,Gf,2)}},addIssues:{value:t=>{e.issues.push(...t),e.message=JSON.stringify(e.issues,Gf,2)}},isEmpty:{get(){return e.issues.length===0}}})};H(`ZodError`,T_);const X=H(`ZodError`,T_,{Parent:Error}),E_=kp(X),D_=Ap(X),O_=jp(X),k_=Np(X),A_=Fp(X),j_=Ip(X),M_=Lp(X),N_=Rp(X),P_=zp(X),F_=Bp(X),I_=Vp(X),L_=Hp(X),Z=H(`ZodType`,(e,t)=>(K.init(e,t),Object.assign(e[`~standard`],{jsonSchema:{input:Zg(e,`input`),output:Zg(e,`output`)}}),e.toJSONSchema=Xg(e,{}),e.def=t,e.type=t.type,Object.defineProperty(e,`_def`,{value:t}),e.check=(...n)=>e.clone(Qf(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)=>cp(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)=>O_(e,t,n),e.parseAsync=async(t,n)=>D_(e,t,n,{callee:e.parseAsync}),e.safeParseAsync=async(t,n)=>k_(e,t,n),e.spa=e.safeParseAsync,e.encode=(t,n)=>A_(e,t,n),e.decode=(t,n)=>j_(e,t,n),e.encodeAsync=async(t,n)=>M_(e,t,n),e.decodeAsync=async(t,n)=>N_(e,t,n),e.safeEncode=(t,n)=>P_(e,t,n),e.safeDecode=(t,n)=>F_(e,t,n),e.safeEncodeAsync=async(t,n)=>I_(e,t,n),e.safeDecodeAsync=async(t,n)=>L_(e,t,n),e.refine=(t,n)=>e.check(Wv(t,n)),e.superRefine=t=>e.check(Gv(t)),e.overwrite=t=>e.check(Lg(t)),e.optional=()=>Ev(e),e.exactOptional=()=>Ov(e),e.nullable=()=>Av(e),e.nullish=()=>Ev(Av(e)),e.nonoptional=t=>Iv(e,t),e.array=()=>mv(e),e.or=t=>vv([e,t]),e.and=t=>bv(e,t),e.transform=t=>Bv(e,wv(t)),e.default=t=>Mv(e,t),e.prefault=t=>Pv(e,t),e.catch=t=>Rv(e,t),e.pipe=t=>Bv(e,t),e.readonly=()=>Hv(e),e.describe=t=>{let n=e.clone();return Gh.add(n,{description:t}),n},Object.defineProperty(e,`description`,{get(){return Gh.get(e)?.description},configurable:!0}),e.meta=(...t)=>{if(t.length===0)return Gh.get(e);let n=e.clone();return Gh.add(n,t[0]),n},e.isOptional=()=>e.safeParse(void 0).success,e.isNullable=()=>e.safeParse(null).success,e.apply=t=>t(e),e)),R_=H(`_ZodString`,(e,t)=>{Fm.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>$g(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(jg(...t)),e.includes=(...t)=>e.check(Pg(...t)),e.startsWith=(...t)=>e.check(Fg(...t)),e.endsWith=(...t)=>e.check(Ig(...t)),e.min=(...t)=>e.check(kg(...t)),e.max=(...t)=>e.check(Og(...t)),e.length=(...t)=>e.check(Ag(...t)),e.nonempty=(...t)=>e.check(kg(1,...t)),e.lowercase=t=>e.check(Mg(t)),e.uppercase=t=>e.check(Ng(t)),e.trim=()=>e.check(zg()),e.normalize=(...t)=>e.check(Rg(...t)),e.toLowerCase=()=>e.check(Bg()),e.toUpperCase=()=>e.check(Vg()),e.slugify=()=>e.check(Hg())}),z_=H(`ZodString`,(e,t)=>{Fm.init(e,t),R_.init(e,t),e.email=t=>e.check(qh(B_,t)),e.url=t=>e.check($h(U_,t)),e.jwt=t=>e.check(mg(iv,t)),e.emoji=t=>e.check(eg(W_,t)),e.guid=t=>e.check(Jh(V_,t)),e.uuid=t=>e.check(Yh(H_,t)),e.uuidv4=t=>e.check(Xh(H_,t)),e.uuidv6=t=>e.check(Zh(H_,t)),e.uuidv7=t=>e.check(Qh(H_,t)),e.nanoid=t=>e.check(tg(G_,t)),e.guid=t=>e.check(Jh(V_,t)),e.cuid=t=>e.check(ng(K_,t)),e.cuid2=t=>e.check(rg(q_,t)),e.ulid=t=>e.check(ig(J_,t)),e.base64=t=>e.check(dg(tv,t)),e.base64url=t=>e.check(fg(nv,t)),e.xid=t=>e.check(ag(Y_,t)),e.ksuid=t=>e.check(og(X_,t)),e.ipv4=t=>e.check(sg(Z_,t)),e.ipv6=t=>e.check(cg(Q_,t)),e.cidrv4=t=>e.check(lg($_,t)),e.cidrv6=t=>e.check(ug(ev,t)),e.e164=t=>e.check(pg(rv,t)),e.datetime=t=>e.check(v_(t)),e.date=t=>e.check(b_(t)),e.time=t=>e.check(S_(t)),e.duration=t=>e.check(w_(t))});function Q(e){return Kh(z_,e)}const $=H(`ZodStringFormat`,(e,t)=>{q.init(e,t),R_.init(e,t)}),B_=H(`ZodEmail`,(e,t)=>{Rm.init(e,t),$.init(e,t)}),V_=H(`ZodGUID`,(e,t)=>{Im.init(e,t),$.init(e,t)}),H_=H(`ZodUUID`,(e,t)=>{Lm.init(e,t),$.init(e,t)}),U_=H(`ZodURL`,(e,t)=>{zm.init(e,t),$.init(e,t)}),W_=H(`ZodEmoji`,(e,t)=>{Bm.init(e,t),$.init(e,t)}),G_=H(`ZodNanoID`,(e,t)=>{Vm.init(e,t),$.init(e,t)}),K_=H(`ZodCUID`,(e,t)=>{Hm.init(e,t),$.init(e,t)}),q_=H(`ZodCUID2`,(e,t)=>{Um.init(e,t),$.init(e,t)}),J_=H(`ZodULID`,(e,t)=>{Wm.init(e,t),$.init(e,t)}),Y_=H(`ZodXID`,(e,t)=>{Gm.init(e,t),$.init(e,t)}),X_=H(`ZodKSUID`,(e,t)=>{Km.init(e,t),$.init(e,t)}),Z_=H(`ZodIPv4`,(e,t)=>{Zm.init(e,t),$.init(e,t)}),Q_=H(`ZodIPv6`,(e,t)=>{Qm.init(e,t),$.init(e,t)}),$_=H(`ZodCIDRv4`,(e,t)=>{$m.init(e,t),$.init(e,t)}),ev=H(`ZodCIDRv6`,(e,t)=>{eh.init(e,t),$.init(e,t)}),tv=H(`ZodBase64`,(e,t)=>{nh.init(e,t),$.init(e,t)}),nv=H(`ZodBase64URL`,(e,t)=>{ih.init(e,t),$.init(e,t)}),rv=H(`ZodE164`,(e,t)=>{ah.init(e,t),$.init(e,t)}),iv=H(`ZodJWT`,(e,t)=>{sh.init(e,t),$.init(e,t)}),av=H(`ZodNumber`,(e,t)=>{ch.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>e_(e,t,n,r),e.gt=(t,n)=>e.check(Tg(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(Cg(t,n)),e.lte=(t,n)=>e.check(wg(t,n)),e.max=(t,n)=>e.check(wg(t,n)),e.int=t=>e.check(cv(t)),e.safe=t=>e.check(cv(t)),e.positive=t=>e.check(Tg(0,t)),e.nonnegative=t=>e.check(Eg(0,t)),e.negative=t=>e.check(Cg(0,t)),e.nonpositive=t=>e.check(wg(0,t)),e.multipleOf=(t,n)=>e.check(Dg(t,n)),e.step=(t,n)=>e.check(Dg(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 ov(e){return yg(av,e)}const sv=H(`ZodNumberFormat`,(e,t)=>{lh.init(e,t),av.init(e,t)});function cv(e){return bg(sv,e)}const lv=H(`ZodUnknown`,(e,t)=>{uh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(e,t,n)=>void 0});function uv(){return xg(lv)}const dv=H(`ZodNever`,(e,t)=>{dh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>t_(e,t,n,r)});function fv(e){return Sg(dv,e)}const pv=H(`ZodArray`,(e,t)=>{ph.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>a_(e,t,n,r),e.element=t.element,e.min=(t,n)=>e.check(kg(t,n)),e.nonempty=t=>e.check(kg(1,t)),e.max=(t,n)=>e.check(Og(t,n)),e.length=(t,n)=>e.check(Ag(t,n)),e.unwrap=()=>e.element});function mv(e,t){return Ug(pv,e,t)}const hv=H(`ZodObject`,(e,t)=>{vh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>o_(e,t,n,r),U(e,`shape`,()=>t.shape),e.keyof=()=>Sv(Object.keys(e._zod.def.shape)),e.catchall=t=>e.clone({...e._zod.def,catchall:t}),e.passthrough=()=>e.clone({...e._zod.def,catchall:uv()}),e.loose=()=>e.clone({...e._zod.def,catchall:uv()}),e.strict=()=>e.clone({...e._zod.def,catchall:fv()}),e.strip=()=>e.clone({...e._zod.def,catchall:void 0}),e.extend=t=>pp(e,t),e.safeExtend=t=>mp(e,t),e.merge=t=>hp(e,t),e.pick=t=>dp(e,t),e.omit=t=>fp(e,t),e.partial=(...t)=>gp(Tv,e,t[0]),e.required=(...t)=>_p(Fv,e,t[0])});function gv(e,t){return new hv({type:`object`,shape:e??{},...W(t)})}const _v=H(`ZodUnion`,(e,t)=>{bh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>s_(e,t,n,r),e.options=t.options});function vv(e,t){return new _v({type:`union`,options:e,...W(t)})}const yv=H(`ZodIntersection`,(e,t)=>{xh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>c_(e,t,n,r)});function bv(e,t){return new yv({type:`intersection`,left:e,right:t})}const xv=H(`ZodEnum`,(e,t)=>{wh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>n_(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 xv({...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 xv({...t,checks:[],...W(r),entries:i})}});function Sv(e,t){return new xv({type:`enum`,entries:Array.isArray(e)?Object.fromEntries(e.map(e=>[e,e])):e,...W(t)})}const Cv=H(`ZodTransform`,(e,t)=>{Th.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>i_(e,t,n,r),e._zod.parse=(n,r)=>{if(r.direction===`backward`)throw new Vf(e.constructor.name);n.addIssue=r=>{if(typeof r==`string`)n.issues.push(Cp(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(Cp(t))}};let i=t.transform(n.value,n);return i instanceof Promise?i.then(e=>(n.value=e,n)):(n.value=i,n)}});function wv(e){return new Cv({type:`transform`,transform:e})}const Tv=H(`ZodOptional`,(e,t)=>{Dh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>g_(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Ev(e){return new Tv({type:`optional`,innerType:e})}const Dv=H(`ZodExactOptional`,(e,t)=>{Oh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>g_(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Ov(e){return new Dv({type:`optional`,innerType:e})}const kv=H(`ZodNullable`,(e,t)=>{kh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>l_(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Av(e){return new kv({type:`nullable`,innerType:e})}const jv=H(`ZodDefault`,(e,t)=>{Ah.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>d_(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeDefault=e.unwrap});function Mv(e,t){return new jv({type:`default`,innerType:e,get defaultValue(){return typeof t==`function`?t():ap(t)}})}const Nv=H(`ZodPrefault`,(e,t)=>{Mh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>f_(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Pv(e,t){return new Nv({type:`prefault`,innerType:e,get defaultValue(){return typeof t==`function`?t():ap(t)}})}const Fv=H(`ZodNonOptional`,(e,t)=>{Nh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>u_(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Iv(e,t){return new Fv({type:`nonoptional`,innerType:e,...W(t)})}const Lv=H(`ZodCatch`,(e,t)=>{Fh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>p_(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeCatch=e.unwrap});function Rv(e,t){return new Lv({type:`catch`,innerType:e,catchValue:typeof t==`function`?t:()=>t})}const zv=H(`ZodPipe`,(e,t)=>{Ih.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>m_(e,t,n,r),e.in=t.in,e.out=t.out});function Bv(e,t){return new zv({type:`pipe`,in:e,out:t})}const Vv=H(`ZodReadonly`,(e,t)=>{Rh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>h_(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Hv(e){return new Vv({type:`readonly`,innerType:e})}const Uv=H(`ZodCustom`,(e,t)=>{Bh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>r_(e,t,n,r)});function Wv(e,t={}){return Wg(Uv,e,t)}function Gv(e){return Gg(e)}const Kv=[`plugin-skill-inductor`],qv=gv({id:Q().min(1).max(64),taskSignature:Q().min(1).max(200),tags:mv(Q().max(32)).max(5),sessionIds:mv(Q().max(64)).max(50),size:ov().int().min(1).max(1e3),firstAt:ov().int().nonnegative(),lastAt:ov().int().nonnegative(),dismissedAt:ov().int().nonnegative().optional()});function Jv(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(Lu(e),t,`candidates.json`)}function Yv(e){if(!Kv.includes(e.pluginId))return[];let t;try{let n=Jv(e.pluginId,e.workspaceKey);if(!D(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=qv.safeParse(e);t.success&&r.push(t.data)}return r}function Xv(e){return(e.selectedOptionLabels??[]).includes(`起草 SKILL.md 给我看`)}async function Zv(e){let t;try{t=await e.requestGrill({header:`技能沉淀提议`,question:If(e.brief),background:Lf(e.brief),recommendation:Rf(),options:zf(),askedBy:`skill-loop`})}catch(t){return e.logger?.warn(`skill-loop proposal failed: ${t instanceof Error?t.message:String(t)}`),`error`}return Xv(t)?`accepted`:Qv(e)?`dismissed`:(e.logger?.warn(`skill-loop: failed to persist dismissal, candidate may resurface`),`error`)}function Qv(e){if(s())return!0;let t=Jv(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)),Qr(n,t),!0):!1}catch{try{ni(n)}catch{}return!1}}const $v=Kv[0],ey=Ti;async function ty(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=Pf(Yv({pluginId:$v,workspaceKey:e.getWorkspaceKey()??Ti}),n,Nf(e.getCooldownDays?.()))}catch(t){return e.logger.warn({err:String(t)},`skill-loop: reading candidates failed`),`no-candidates`}if(r.length===0)return`no-candidates`;let i=e.getRequestGrill(t);if(!i)return`no-session`;let a=r[0];if(!a)return`no-candidates`;let o=await Zv({requestGrill:i,brief:a,pluginId:$v,workspaceKey:e.getWorkspaceKey()??Ti,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 ny(e){return[y({name:`skill-loop`,timing:`session.idle`,handle:async t=>{try{await ty(e,t.sessionId)}catch(t){e.logger.warn({err:String(t)},`skill-loop: unexpected failure`)}}})]}const ry=`[sandbox-escalation]`;function iy(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(...Ne(o)),a.length===0)return;let s=typeof i?.targetDir==`string`?i.targetDir:`.`,c=S(r.projectRoot,s),l=ve({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=`${ry} ${l.reason??`requires approval`}`)}}})}function ay(e){let t=[`id: ${e.jobId}`,`title: ${e.title}`,`status: ${e.status}`];return e.summary&&t.push(`summary: ${e.summary}`),e.outputPath&&t.push(`output_file: ${e.outputPath}`),e.worktree&&(t.push(`worktree_path: ${e.worktree.path}`),e.worktree.branch&&t.push(`worktree_branch: ${e.worktree.branch}`)),`<delegate-notification>\n${t.join(`
|
|
448
|
+
`)}\n</delegate-notification>`}function oy(){let e=new Map,t=new Set;return{hooks:[y({name:`agent-job-notification-injector`,timing:`messages.transform`,priority:25,handle:(t,n)=>{wf(e,t,n)}}),y({name:`agent-job-notification-cleanup`,timing:`session.deleted`,handle:n=>{if(e.delete(n.sessionId),t.add(n.sessionId),t.size>200){let e=t.values().next().value;e!==void 0&&t.delete(e)}}})],notify:(n,r)=>{if(t.has(n))return;let i=e.get(n)??[];i.push(ay(r)),e.set(n,i)}}}const sy=gv({taskSignature:Q().min(1).max(200),outcome:Sv([`success`,`partial`,`failure`]),at:ov().int().nonnegative(),steps:mv(gv({tool:Q().max(64)})).max(20)});function cy(e,t){return x(Lu(e),t,`episodes.json`)}function ly(e,t){let n;try{let r=cy(e,t);if(!D(r))return{total:0,success:0,recent:[]};n=O(r,`utf8`)}catch{return{total:0,success:0,recent:[]}}let r;try{r=JSON.parse(n)?.data?.items}catch{return{total:0,success:0,recent:[]}}if(!Array.isArray(r))return{total:0,success:0,recent:[]};let i=0,a=[];for(let e of r){let t=sy.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 uy(e){let t=Kv[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=ly(t,e.workspaceKey),i=Yv({pluginId:t,workspaceKey:e.workspaceKey}),a=Nf(e.cooldownDays),o=Pf(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:dy({pending:o.length,success:r.success,minClusterSize:e.minClusterSize??3})}}function dy(e){return e.pending>0?null:e.success===0?`no-episodes`:e.success<e.minClusterSize?`not-enough-successes`:`no-cluster-yet`}const fy=gv({tool:Q().min(1).max(64),intent:Q().max(160)}),py=gv({taskSignature:Q().min(1).max(200),steps:mv(fy).max(20),outcome:Sv([`success`,`partial`,`failure`]),sessionId:Q().max(64),at:ov().int().nonnegative()});function my(e){let t=e.limit??8,n;try{let t=x(Lu(e.pluginId),e.workspaceKey,`episodes.json`);if(!D(t))return[];n=O(t,`utf8`)}catch{return[]}let r;try{r=JSON.parse(n)?.data?.items}catch{return[]}if(!Array.isArray(r))return[];let i=new Set(e.sessionIds),a=[];for(let e of r){let n=py.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 hy(e){return e.length===0?`(No recorded execution paths are available for these sessions.)`:e.map((e,t)=>{let n=e.steps.map((e,t)=>` ${t+1}. ${e.tool} — ${e.intent}`).join(`
|
|
449
449
|
`);return`Run ${t+1} (session ${e.sessionId}):\n${n||` (no steps recorded)`}`}).join(`
|
|
450
450
|
|
|
451
|
-
`)}function
|
|
451
|
+
`)}function gy(e,t=[]){let n=e.sessionIds.join(`, `);return`You are drafting a reusable skill for this project, based on a recurring task pattern that otto observed.
|
|
452
452
|
|
|
453
453
|
## The pattern
|
|
454
454
|
|
|
@@ -462,7 +462,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
462
462
|
These are the actual tool sequences otto observed for this task type. They are your evidence —
|
|
463
463
|
you do not need to (and cannot) go looking for the original sessions.
|
|
464
464
|
|
|
465
|
-
${
|
|
465
|
+
${hy(t)}
|
|
466
466
|
|
|
467
467
|
## What to do
|
|
468
468
|
|
|
@@ -500,7 +500,7 @@ If the recorded paths turn out to be too varied, too thin, or not actually the s
|
|
|
500
500
|
library permanently; skipping costs nothing — otto will offer again if the pattern recurs.
|
|
501
501
|
|
|
502
502
|
The draft you produce is a proposal: it will be reviewed as a diff and only takes effect if the
|
|
503
|
-
user explicitly applies it.`}function hy(e){return`Draft skill: ${e.taskSignature.length>60?`${e.taskSignature.slice(0,60)}…`:e.taskSignature}`}function gy(e){try{let t=fy({pluginId:e.pluginId,workspaceKey:e.workspaceKey,sessionIds:e.brief.sessionIds});return{jobId:e.startJob({title:hy(e.brief),prompt:my(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 _y(e){e.hookRegistry.register(df(e.toolRegistry,e.getDefaultToolPreset)),e.hookRegistry.register(we(e.failureSignals)),e.hookRegistry.register(Ee(e.failureSignals)),e.hookRegistry.registerAll(e.contextSourcesBuildHooks(e.workspaceDir,e.memory)),e.memory&&e.hookRegistry.registerAll(Dt(e.memory)),e.hookRegistry.registerAll(At({getTodoList:t=>e.getSession(t)?.session.getTodoList()}));let t=/-milestone\.md$/,n=/^Status:\s*Done\b/m;e.hookRegistry.registerAll(Et({isDocSyncTrigger:e=>{let r=typeof e.args.path==`string`?e.args.path:``;if(!t.test(r))return!1;let i=typeof e.args.newContent==`string`?e.args.newContent:typeof e.args.content==`string`?e.args.content:``;return n.test(i)}})),e.hookRegistry.registerAll(bf(e.learningStore,e.promptManager,e.localLearningStore)),e.skillRegistry&&e.hookRegistry.registerAll(xf(e.skillRegistry)),e.hookRegistry.registerAll(pr({workspaceDir:e.workspaceDir})),e.hookRegistry.registerAll(wf()),e.hookRegistry.on(`session.deleted`,`rfc047-notification-detach`,t=>e.notificationDispatcher.detach(t.sessionId));let r=iy();e.hookRegistry.registerAll(r.hooks),e.hookRegistry.register(Tf(e=>{w.killAllForSession(e)})),e.hookRegistry.registerAll(Ef({registry:e.permissionRegistry,getPersistedAllow:t=>e.codingSessionPool.getSessionPermissionAllow(t)})),e.hookRegistry.register(ny({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(kf({isEnabled:i})),e.hookRegistry.registerAll(ey({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})=>{gy({startJob:t=>e.startSkillDraftJob({...t,origin:`user`}),brief:n,sessionId:t,pluginId:Zv,workspaceKey:e.getWorkspaceKey()??Qv,logger:{warn:t=>e.logger.warn(t)}})},logger:e.logger})),e.hookRegistry.register(Se({getOnFileEdited:e.getEditFileCallback,dedupCache:e.editFilesDedup})),{agentJobNotify:r.notify}}function vy(e,t,n,r){return lf({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 yy(e,t){return Ie(t,uf(vy(e,t,e.skillRegistry?un(e.skillRegistry,t):void 0,!1))).getAvailable(e.defaultToolPreset)}function by(e){return e.toolRegistry.getAvailable(e.defaultToolPreset).filter(e=>e.name.startsWith(`mcp__`))}function xy(e,t){let n=t.skillProvider??(e.skillRegistry?un(e.skillRegistry,e.workspaceDir):void 0);t.sandbox&&e.sandbox.pin(t.sandbox);let r={registerChild(e,t){return{pid:Vt.registerChild(e,t).pid??0}}};return Ie(e.workspaceDir,{...uf(vy(e,e.workspaceDir,n,t.lsp===!0)),processTracker:r})}function Sy(e){e.agentJobNotify=_y({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 Cy(e){return{async readFile(e){try{return await Mi(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return null;throw e}},async writeFile(e,t){await Ai(b(e),{recursive:!0}),await tn(e,t)},async writeFileExclusive(e,t){await Ai(b(e),{recursive:!0});try{let n=await ji(e,`wx`);try{await n.writeFile(t,`utf8`)}finally{await n.close()}return!0}catch(e){if(e.code===`EEXIST`)return!1;throw e}},genId:e?.genId??wi,now:e?.now??(()=>new Date().toISOString()),...e?.confirmTrust?{confirmTrust:e.confirmTrust}:{}}}async function wy(e){if(e.ensureNotDisposed(),await e.ensureSettingsLoaded(),!e.workspaceRef&&!e.pendingWorkspaceInit&&!e.parentWorkspaceExisted)try{let t=Ci(Cy()),n=e._workspaceId?{id:e._workspaceId}:void 0,r=await t.resolveLocal(e.workspaceDir,{...n,autoCreate:!(e._interactive&&!n)});`kind`in r&&r.kind===`uninitialized`?e.pendingWorkspaceInit={root:r.root}:`kind`in r&&r.kind===`parentWorkspaceExisted`?e.parentWorkspaceExisted={parentRoot:r.parentRoot,currentRoot:r.currentRoot,marker:r.marker}:e.workspaceRef=r}catch(t){e.logger.warn({err:t,workspaceDir:e.workspaceDir},`Workspace resolution failed; continuing without workspace identity. Sessions previously saved under a workspace key will not be restored.`)}e.storage.autoMemory&&await e.storage.autoMemory.load(),await tt(`skills/agents/teams discovery + plugin module load`,async()=>{if(e.skillRegistry){await e.skillRegistry.discover();for(let t of e.settings.get(`disabled_skills`)??[])e.skillRegistry.disable(t);let t=new Set(e.settings.get(`disabled_plugins`)??[]);if(t.size>0)for(let[n,r]of e.skillRegistry.getAll())r.source?.type===`plugin`&&r.source.id&&t.has(r.source.id)&&e.skillRegistry.disable(n)}e.declarativeAgentProfiles=await Ks(e.workspaceDir,{plugins:e.activePlugins()}),e.declarativeTeams=await Qs(e.workspaceDir);let t=await e.pluginModuleManager.reload(new Set(e.declarativeAgentProfiles.map(e=>e.name)));e.declarativeAgentProfiles.push(...t),e._pendingProviderCapabilities=(await e.pluginProviderManager.reload()).pendingCapabilityPluginIds,await e.diagnoseTopoSortIssues()});let t=()=>tt(`mcpController.start()`,()=>e.mcpController.start()).then(t=>(e.syncSessionTools(),e.onMcpStartupSettled?e.onMcpStartupSettled(t):e.pendingMcpStartupResult=t,t)).catch(t=>(e.logger.warn({err:t instanceof Error?t.message:String(t)},`mcpController.start() failed unexpectedly (non-blocking path)`),{connected:0,failed:0}));e._interactive?t():await t(),e.pendingWorkspaceInit?e.logger.info({workspaceDir:e.workspaceDir},`Workspace identity pending trust confirmation; session restore deferred`):e.parentWorkspaceExisted?e.logger.info({workspaceDir:e.workspaceDir,parentRoot:e.parentWorkspaceExisted.parentRoot},`Parent workspace detected; waiting for user choice (adopt parent or create new)`):e._interactive?await tt(`completeWorkspaceDependentStartup (session restoreAll)`,()=>Ty(e)):tt(`sweepOrphanTraceFiles (headless)`,()=>My(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`&&Ny(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)}}}My(e)}function Ey(e){return!!e.pendingWorkspaceInit}function Dy(e){return!!e.parentWorkspaceExisted}async function Oy(e){let t=e.parentWorkspaceExisted;if(!t)return e.workspaceRef;e.parentWorkspaceExisted=void 0;try{return e.workspaceRef=await Ci(Cy()).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 ky(e){let t=e.parentWorkspaceExisted;if(!t)return e.workspaceRef;e.parentWorkspaceExisted=void 0;try{return e.workspaceRef=await Ci(Cy()).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 Ay(e){let t=e.pendingWorkspaceInit;if(!t)return e.workspaceRef;e.pendingWorkspaceInit=void 0;try{return e.workspaceRef=await Ci(Cy()).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 jy(e,t){let n=e.workspaceRef?.root;if(!n)return!1;let r=Cy(),i=await Ti(n,r);if(!i)return!1;if(!t&&i.memorySyncEnabled){try{await e.storage.autoMemory?.load()}catch{}try{await e.learningStore.refresh()}catch{}}let a=t?{...i,memorySyncEnabled:!0}:{id:i.id,name:i.name,createdAt:i.createdAt,...i.remote?{remote:i.remote}:{}};return await Di(n,a,r),e.workspaceRef={key:Ei(a.id),id:a.id,backend:e.workspaceRef.backend,root:n,...a.remote?{remote:a.remote}:{},...a.memorySyncEnabled?{memorySyncEnabled:!0}:{}},!0}async function My(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 Ny(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`,()=>Hl()),await n(`pluginServices`,()=>_l()),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 Py(e,t,n){let r=n.current;if(!r)throw Error(`导出归档仅支持关系化 SQLite 后端(sessions.db)。当前后端不支持。`);let i=await si(e,r);if(!i)throw Error(`会话 ${e.slice(0,8)} 不存在或无法加载`);let a=JSON.stringify(i,null,2),o=pi(`sha256`).update(a,`utf-8`).digest(`hex`);await Ai(b(t),{recursive:!0}),await Ni(t,a,`utf-8`);let s=await Mi(t,`utf-8`),c=pi(`sha256`).update(s,`utf-8`).digest(`hex`);if(o!==c)throw Error(`Checksum 校验失败:写入前 sha256=${o.slice(0,16)},读回 sha256=${c.slice(0,16)}。导出文件 ${t} 可能已损坏,操作整体失败。`);return{entryCount:i.entries.length,checksum:o,path:t}}async function Fy(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 Iy=0;function Ly(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 Ry=class{processOwnerId=`app-${++Iy}`;get processOwner(){return this.processOwnerId}settings;toolRegistry;hookRegistry;providerRegistry;wireProtocolRegistry;agentRuntime;codingSessionPool;permissionRegistry;auditLog;logger;sessionRepoRef;sessionStorageDir;get workspaceDir(){return this.workspaceRef?.root??this._workspaceDir}_workspaceDir;_workspaceId;_interactive;_shadow;_pluginHomedir;_pluginBundledDirs;workspaceRef;pendingWorkspaceInit;parentWorkspaceExisted;maxSessions;maxToolTurns;maxToolTurnExtensions;promptOutputTokenBudget;promptWallClockBudgetMs;sessionCostBudgetUSD;stallDetection;devtools=null;editFileCallback=void 0;_editFilesDedup=new Set;storage;userMemory=new nt({store:(()=>{let e=new at(ze());return s()?dt(e):e})()});completeText;clock;fileStateManager;learningStore;localLearningStore;memoryAutoExtractor;promptManager;orchestrator;runSession;writeTodos;sessionConfigResolver;runTeam;skillRegistry;i18nRegistry;_pendingProviderCapabilities=[];get pendingProviderCapabilities(){return this._pendingProviderCapabilities}declarativeAgentProfiles=[];extensions;pluginInput=Rn();sigilResolvers=new Ia;expandSigilChips(e,t){return Ga(e,this.sigilResolvers,{workspaceDir:this.workspaceDir},{...t,lookupResolverId:e=>{for(let t of this.pluginInput.getAll())if(t.value===e&&t.resolverId)return t.resolverId}})}feedbackRegistry=new Fa;getShortcuts(){return this.settings.get(`shortcuts`)??[]}async saveShortcut(e,t,n){let r=e.trim();if(!r||!/^[A-Za-z0-9_-]+$/.test(r))throw Error(`invalid shortcut name: ${JSON.stringify(e)}`);if(!t.trim())throw Error(`shortcut text cannot be empty`);let i=this.getShortcuts();if(i.some(e=>e.name===r&&e.name!==n))throw Error(`shortcut name already exists: ${r}`);let a=[...n?i.filter(e=>e.name!==n):i,{name:r,text:t}];await this.settings.persist({shortcuts:a},`project`)}async deleteShortcut(e){let t=this.getShortcuts(),n=t.filter(t=>t.name!==e);n.length!==t.length&&await this.settings.persist({shortcuts:n},`project`)}declarativeTeams=[];mcpController;panelBackendController;get mcpManager(){return this.mcpController.manager}disposed=!1;ownedHookNames=[];failureSignals=new he;diagnoser=new me(this.failureSignals);pluginHealthTracker=Cc();pluginCapabilityQuota=new Ec;inquiryCenter=new Oc;userAskRenderer;userAskSeq=0;processRegistryUnsubs=[];settingsLoaded=!1;lastSettingsConfig=null;_resilienceOverride;_resilienceConfig;defaultToolPreset=`full`;permissionSync;sandbox;_memoryGovernor;_residencyGovernor;_fleetMonitor;get tools(){return this.toolRegistry.getAvailable(this.defaultToolPreset)}agentJobNotify;agentJobServiceInstance;scheduleServiceInstance;searchEcosystem;notificationDispatcher;presenceTracker;followUpPendingProbe;toolsSyncCoordinator;onMcpStartupSettled;pendingMcpStartupResult;setMcpStartupCallback(e){this.onMcpStartupSettled=e,this.pendingMcpStartupResult&&=(e(this.pendingMcpStartupResult),void 0)}pluginContributionsFacade;buildToolsForWorkspace(e){return yy(this,e)}connectorTools(){return by(this)}get agentJobs(){return this.agentJobServiceInstance||=Oo({workspaceDir:this.workspaceDir,agentJobNotify:this.agentJobNotify,buildToolsForWorkspace:e=>this.buildToolsForWorkspace(e),connectorTools:()=>this.connectorTools(),settings:this.settings,modelRegistry:this.modelRegistry,stream:this.codingSessionPool.stream,logger:this.logger,hookRegistry:this.hookRegistry}),this.agentJobServiceInstance}setScheduleService(e){this.scheduleServiceInstance=e,this.pluginModuleManager?.reconcileServiceSchedules()}setEcosystemSearch(e){this.searchEcosystem!==e&&(this.searchEcosystem=e,this.reloadCapabilities().catch(e=>{this.logger.warn({err:e instanceof Error?e.message:String(e)},`Failed to refresh capability_gap after ecosystem search injection`)}))}get memoryGovernor(){return this._memoryGovernor}get fleetMonitor(){return this._fleetMonitor}get modelRegistry(){return this._modelRegistry}get authStore(){return this._authStore}modelCatalogManager;_modelRegistry;_authStore;getAllModels(){return Io(this)}resolveModel(e){return Lo(this,e)}listProviders(){return Ro(this)}registerHook(e){zo(this,e)}unregisterHook(e){return Bo(this,e)}async hydrateModelCache(){return Vo(this)}getSessionAvailableModels(e){return Ho(this,e)}async refreshModels(){return Wo(this)}async reloadCapabilities(){let e=await Fy({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 od;pluginModuleManager;pluginProviderManager;capabilityReloader;computedPluginCommands(){return this.pluginContributionsFacade.computedPluginCommands()}get sessionManager(){return this.codingSessionPool}getResidencyDiagnostics(){return this.codingSessionPool.getResidencyDiagnostics()}globalLogSubscription=null;constructor(e){let{inspect:t,logger:n,projectConfigPath:r,maxSessions:i,maxToolTurns:a,maxToolTurnExtensions:o,promptOutputTokenBudget:c,promptWallClockBudgetMs:l,sessionCostBudgetUSD:u,stallDetection:d,workspaceDir:f,workspaceId:p,pluginHomedir:m,pluginBundledDirs:h}=e;this.maxSessions=i??ri,this.maxToolTurns=a??gt.maxToolTurns,this.maxToolTurnExtensions=o,this.promptOutputTokenBudget=c,this.promptWallClockBudgetMs=l,this.sessionCostBudgetUSD=u,this.stallDetection=d,this._workspaceDir=f??process.cwd(),this._workspaceId=p,this._interactive=e.interactive??!1,this._shadow=e.shadow??s(),this._pluginHomedir=m??ze(),this._pluginBundledDirs=h??[],this._resilienceOverride=e.resilience,this.logger=C(n.name,{level:n.level,destination:n.destination});let g={};this.sessionRepoRef=g,this.sessionStorageDir=e.storage?.session&&`dir`in e.storage.session?e.storage.session.dir:void 0;let _=Yd({logger:this.logger,hookRegistry:e.hookRegistry,getToolRegistry:()=>this.toolRegistry,getPermissionRegistry:()=>this.permissionRegistry,onHookTimeout:({hookName:e,timeoutMs:t})=>{let n=lc(e);n&&this.pluginHealthTracker.recordHookTimeout(n,e)}});this.sandbox=_.sandbox,this._memoryGovernor=_.memoryGovernor,this._residencyGovernor=_.residencyGovernor,this._fleetMonitor=_.fleetMonitor,this.permissionSync=_.permissionSync,this.hookRegistry=_.hookRegistry;let ee=sd(e,()=>this.settings);this._authStore=ee.authStore,this._modelRegistry=ee.modelRegistry,this.providerRegistry=ee.providerRegistry,this.wireProtocolRegistry=ee.wireProtocolRegistry,this.modelCatalogManager=ee.modelCatalogManager;let te=ee.defaultModel,re=ee.resolveEffectiveModel,ie=e.modelId,v=_a({options:e,workspaceDir:this.workspaceDir,providerRegistry:this.providerRegistry,defaultModel:te,resolveEffectiveModel:re,repoRef:g,getWorkspaceRef:()=>this.workspaceRef,onMemoryConflict:e.onMemoryConflict,getActiveSessionBytes:()=>{let e=this.codingSessionPool?.active?.session;return e instanceof ti?e.estimatedContentBytes:void 0},getEffectiveMaxBytes:()=>{let e=this.codingSessionPool;if(e)return e.getResidencyDiagnostics().maxBytesPerSession},getCoverageThresholds:()=>{let e=this.settings.get(`residency`),t=(e,t)=>t!=null&&process.env[e]===void 0?t:void 0;return{warn:t(`OTTO_MEMORY_COVERAGE_WARN_THRESHOLD`,e?.coverage_warn_threshold),error:t(`OTTO_MEMORY_COVERAGE_ERROR_THRESHOLD`,e?.coverage_error_threshold),floor:t(`OTTO_MEMORY_COVERAGE_FLOOR_THRESHOLD`,e?.coverage_floor_threshold)}}});this.storage={storageHost:v.storageHost,autoMemory:v.autoMemory,memory:v.memory,traceStore:v.traceStore,traceLive:v.traceLive,checkpointStore:v.checkpointStore,remoteMemoryConfigured:!!(e.storage?.remote?.getAuth&&e.storage?.session&&`url`in e.storage.session),remoteSessionConfigured:!!(e.storage?.session&&`url`in e.storage.session)},this.clock=v.clock;let ae=Xd({inspect:t,loggerName:n.name,workspaceDir:this.workspaceDir,projectConfigPath:r,interactive:this._interactive,permissionSync:this.permissionSync,sandbox:this.sandbox,onSettingsApplied:e=>{this.settingsLoaded=!0,e.tool_preset&&(this.defaultToolPreset=e.tool_preset)},getI18nRegistry:()=>this.i18nRegistry});this.devtools=ae.devtools,this.globalLogSubscription=ae.logSubscription,this.settings=ae.settings;let oe=No({getConfig:()=>this.settings.get(`notification`),getCwd:()=>this.workspaceDir,isFollowUpPending:()=>this.followUpPendingProbe?.()??!1,emitHookNotification:e=>void this.hookRegistry.emit(`notification`,e)});this.notificationDispatcher=oe.dispatcher,this.presenceTracker=oe.presenceTracker;let se=this.settings,ce=xa({skillProvider:e.skillProvider,workspaceDir:this.workspaceDir,activePlugins:()=>this.activePlugins(),resolveEffectiveModel:re,providerRegistry:this.providerRegistry,prompt:e.prompt,memoryStore:v.memoryStore,memoryAutoExtractConfig:{enabled:!0,get everyNTurns(){return se.get(`memory_auto_extract`)?.every_n_turns},get maxLessons(){return se.get(`memory_auto_extract`)?.max_lessons},get similarityThreshold(){return se.get(`memory_auto_extract`)?.similarity_threshold}}});this.skillRegistry=ce.skillRegistry,this.fileStateManager=ce.fileStateManager,this.learningStore=ce.learningStore,this.localLearningStore=ce.localLearningStore,this.memoryAutoExtractor=ce.memoryAutoExtractor,this.completeText=ce.completeText,this.promptManager=ce.promptManager;let le=ne(this._authStore,`delegation`),ue=Zd({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=Qd({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,Ly(this);let pe=fe.swarmAgentRunner,me=$d({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=rf({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=af({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=ef({mcpController:this.mcpController,callMcpTool:(e,t,n)=>this.callMcpTool(e,t,n),getActivePlugins:()=>this.activePlugins()}).panelBackendController;let _e=of({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=tf({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=nf({sessionConfigResolver:this.sessionConfigResolver,getSession:e=>this.codingSessionPool.getSession(e),listSessionIds:()=>this.codingSessionPool.listSessions().map(e=>e.id),logger:this.logger,workspaceDir:this.workspaceDir,settings:this.settings,pluginModuleManager:this.pluginModuleManager,mcpController:this.mcpController,getActivePlugins:()=>this.activePlugins()});this.toolsSyncCoordinator=ye.toolsSyncCoordinator,this.pluginContributionsFacade=ye.pluginContributionsFacade}deferredConfigSteps(){return[{label:`resilience-config`,apply:()=>{this.freezeResilienceConfig()}},{label:`residency-config`,apply:()=>{this.freezeResidencyConfig()}},{label:`memory-governor-thresholds`,apply:()=>{let e=this.settings.get(`residency`);e&&this._memoryGovernor.updateThresholds({warnThresholdPct:e.warn_threshold_pct,hardThresholdPct:e.hard_threshold_pct})}},{label:`auth-store-lock-timeout`,apply:()=>{this._authStore.setRefreshLockTimeoutMs(this.getResilienceConfig().oauth.refreshLockTimeoutMs)}}]}async ensureSettingsLoaded(){await sf(this.settings,()=>this.settingsLoaded,e=>{this.settingsLoaded=e}),cf(this.deferredConfigSteps())}freezeResilienceConfig(){this._resilienceConfig===void 0&&(this._resilienceConfig=l(this._resilienceOverride,this.settings.get(`resilience`)))}_residencyConfig;freezeResidencyConfig(){if(this._residencyConfig!==void 0)return;let e=this.settings.get(`residency`),t=(e,t)=>t!=null&&process.env[e]===void 0?t:void 0;this._residencyConfig={totalBytes:t(`OTTO_SESSION_TOTAL_RESIDENCY_BUDGET`,e?.total_bytes),minPerSessionBytes:t(`OTTO_SESSION_MIN_PER_SESSION_BYTES`,e?.min_per_session_bytes),maxPerSessionBytes:t(`OTTO_SESSION_MAX_PER_SESSION_BYTES`,e?.max_per_session_bytes),maxContentBytes:t(`OTTO_SESSION_MAX_CONTENT_BYTES`,e?.max_content_bytes),maxHistoryMessages:t(`OTTO_SESSION_MAX_HISTORY_MESSAGES`,e?.max_history_messages),resumeWindowMessages:t(`OTTO_SESSION_RESUME_WINDOW_MESSAGES`,e?.resume_window_messages),compactionTimeoutMs:t(`OTTO_SESSION_COMPACTION_TIMEOUT_MS`,e?.compaction_timeout_ms)}}getResidencyConfig(){return this._residencyConfig}getResilienceConfig(){if(this._resilienceConfig===void 0)throw Error(`getResilienceConfig() called before settings are loaded — call after ensureSettingsLoaded()/start()`);return this._resilienceConfig}async allowToolAlways(e,t){return Xo(this,e,t)}getPermissionMode(){return Zo(this)}async setPermissionMode(e){return Qo(this,e)}getSessionAlwaysAllow(e){return $o(this,e)}bashAlwaysAllowPrefix(e){return ve(e)}isWellFormedAllowEntry(e){return Ne(e)}async disallowToolAlways(e){return es(this,e)}clearSessionAlwaysAllow(e){ts(this,e)}activePlugins(){return this.pluginTopology.resolve({workspaceDir:this.workspaceDir,disabledPlugins:this.settings.get(`disabled_plugins`)??[],homedir:this._pluginHomedir,bundledDirs:this._pluginBundledDirs})}async diagnoseTopoSortIssues(){await this.pluginTopology.diagnose(this.logger,this.settings)}listFileCommands(){return this.pluginContributionsFacade.listFileCommands()}async callMcpTool(e,t,n){return this.pluginContributionsFacade.callMcpTool(e,t,n)}getPluginPanelRegistrations(){return this.pluginContributionsFacade.getPluginPanelRegistrations()}getPluginStatusItems(){return this.pluginContributionsFacade.getPluginStatusItems()}getGlobalMenuItems(){return this.pluginContributionsFacade.getGlobalMenuItems()}getPluginRenderers(){return this.pluginContributionsFacade.getPluginRenderers()}getPluginStatusWidgets(){return this.pluginContributionsFacade.getPluginStatusWidgets()}getPluginFileViewers(){return this.pluginContributionsFacade.getPluginFileViewers()}isFeedbackAvailable(){return this.feedbackRegistry.get()!==void 0}getPulseSurveyConfig(){return this.settings.get(`pulse_survey`)??{}}recordPulseSurvey(e){this.feedbackRegistry.get()?.recordPulseSurvey?.(e)}buildFeedbackIssueUrl(e){return this.feedbackRegistry.get()?.buildIssueUrl?.(e)}updateSettings(e){return this.settings.update(e)}resolveA2uiRendererPayload(e){return eo(Za(this.activePlugins()),e)}getPluginRegistrations(){return this.pluginContributionsFacade.getPluginRegistrations()}async firePluginActivationEvent(e){await this.pluginModuleManager.activateOn(e,new Set(this.declarativeAgentProfiles.map(e=>e.name)))}async start(){return wy(this)}async completeWorkspaceDependentStartup(){return Ty(this)}needsWorkspaceInit(){return Ey(this)}async confirmWorkspaceInit(){return Ay(this)}hasParentWorkspace(){return Dy(this)}async adoptParentWorkspace(){return Oy(this)}async createLocalWorkspace(){return ky(this)}async setWorkspaceMemorySyncEnabled(e){return jy(this,e)}async sweepOrphanTraceFiles(){return My(this)}async stop(){return Ny(this)}async createSession(e={}){return ns(this,e)}registerNotificationChannel(e){Ko(this,e)}registerInAppNotificationChannel(e){qo(this,e)}setUserAskRenderer(e){this.userAskRenderer=e}async askPluginUser(e,t){let n={...By(t),id:`plugin_ask_${++this.userAskSeq}`,askedBy:`plugin:${e}`},r=this.userAskRenderer;if(!this._interactive||!r)return zy();let i=this.inquiryCenter.enqueue({id:n.id,origin:{kind:`plugin`,pluginId:e},question:n});if(!i.accepted)return zy();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,zy()),e}}notifyUserInteraction(){Jo(this)}setTerminalFocus(e){Yo(this,e)}setFollowUpPendingProbe(e){this.followUpPendingProbe=e}notifyPluginServices(e){let t=gl(),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)?gl().notify(e.pluginId,e.serviceId,{type:`schedule.tick`,scheduleId:t.scheduleId,occurrenceId:t.occurrenceId,occurredAt:t.occurredAt}):!1}getSession(e){return rs(this,e)}async shareSession(e,t){return is(this,e,t)}getActiveSession(){return as(this)}listSessions(e){return os(this,e)}async listAllSessions(e){return ss(this,e)}async removeSession(e){return cs(this,e)}async exportSessionArchive(e,t){return Py(e,t,this.sessionRepoRef??{})}archiveSession(e){return ls(this,e)}async forkSession(e,t){return us(this,e,t)}getEnabledAgentProfiles(){let e=new Set(this.settings.get(`disabled_agents`)??[]);return e.size===0?this.declarativeAgentProfiles:this.declarativeAgentProfiles.filter(t=>!e.has(t.name))}initToolRegistry(e){return xy(this,e)}async buildModelCatalog(e){return Go(this,e)}setSessionAvailableModels(e,t){Uo(this,e,t)}registerHooks(){Sy(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 zy(){return{answer:``,acceptedRecommendation:!1,resolvedBy:`human`}}function By(e){return{header:Vy(e.header,160),question:Vy(e.question,2e3),background:Vy(e.background,4e3),recommendation:Vy(e.recommendation,1e3),...e.options?{options:e.options.slice(0,8).map(e=>({label:Vy(e.label,120),rationale:Vy(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=>Vy(e,1e3))}:{}}}function Vy(e,t){return String(e??``).replace(/[----]/g,` `).slice(0,t)}function Hy(e){return new Ry(e)}function Uy(e){return{get id(){return e.id},get title(){return e.title},get agentName(){return e.agentName},get model(){return{id:e.model.id,name:e.model.name,provider:e.model.provider}},get isBusy(){return e.isBusy},messageCount:()=>e.session.messages().length,lastAssistantText:()=>ko(e.session.messages()),prompt:(t,n)=>e.prompt(t,n),subscribe:((t,n)=>e.subscribe(t,n)),resolveApproval:(t,n)=>e.resolveApproval(t,n),resolveAskUser:(t,n)=>e.resolveAskUser(t,n),clearContext:()=>e.clearContext(),compactNow:()=>e.compactNow(),renameSession:t=>e.renameSession(t),abort:()=>e.abort(),dispose:()=>e.dispose()}}function Wy(e){return{createSession:async t=>Uy(await e.createSession(t)),jobs:Lt,models:{getAll:()=>e.modelRegistry.getAll().map(e=>({id:e.id,name:e.name,provider:e.provider})),switchModel:async(t,n)=>{let r=e.getSession(t);if(!r)return`会话未找到`;if(r.isBusy)return`当前有正在执行的对话,请等待完成后重试。`;let i=e.modelRegistry.find(n);return i?(r.model=i,null):`未知模型 \`${n}\`。`},refresh:async()=>(await e.refreshModels()).map(e=>({provider:e.provider,status:e.status,added:e.added,kept:e.kept,total:e.total,reason:e.reason}))},permission:{getMode:()=>e.getPermissionMode(),setMode:t=>e.setPermissionMode(t)},auth:{getAuthSource:t=>e.authStore.getAuthSource(t)},i18n:{t:(t,n)=>e.i18nRegistry.t(t,n)},reloadCapabilities:()=>e.reloadCapabilities(),workspaceDir:e.workspaceDir}}const Gy=new Set(`assert.async_hooks.buffer.child_process.cluster.console.constants.crypto.dgram.diagnostics_channel.dns.domain.events.fs.http.http2.https.inspector.module.net.os.path.perf_hooks.process.punycode.querystring.readline.repl.sqlite.stream.string_decoder.timers.tls.trace_events.tty.url.util.v8.vm.wasi.worker_threads.zlib`.split(`.`));function Ky(e){return e.absolutePaths.length>0||e.bareSpecifiers.length>0}function qy(e){let t=[],n=[];for(let r of e.matchAll(/require\("([^"]+)"\)/g)){let e=r[1];if(e.startsWith(`/`)){t.includes(e)||t.push(e);continue}e.startsWith(`.`)||e.startsWith(`node:`)||Gy.has(e)||n.includes(e)||n.push(e)}return{absolutePaths:t,bareSpecifiers:n}}function Jy(e,t){let n=qy(t);if(!Ky(n))return;let r=[`${e}: 产物不可分发(RFC-365 R1/R2)`];throw n.absolutePaths.length>0&&r.push(` 编译机绝对路径 require(R1)——发布机路径在用户机器不存在:`,...n.absolutePaths.map(e=>` ${e}`)),n.bareSpecifiers.length>0&&r.push(` 裸模块名 require(R2)——假设运行机有 node_modules,在 ~/.otto/plugins/<id>/ 必然 MODULE_NOT_FOUND:`,...n.bareSpecifiers.map(e=>` ${e}`)),Error(r.join(`
|
|
504
|
-
`))}function
|
|
505
|
-
`).filter(e=>e.trim().length>0).slice(-t),a=[];for(let e of i)try{a.push(JSON.parse(e))}catch{}return a}function
|
|
503
|
+
user explicitly applies it.`}function _y(e){return`Draft skill: ${e.taskSignature.length>60?`${e.taskSignature.slice(0,60)}…`:e.taskSignature}`}function vy(e){try{let t=my({pluginId:e.pluginId,workspaceKey:e.workspaceKey,sessionIds:e.brief.sessionIds});return{jobId:e.startJob({title:_y(e.brief),prompt:gy(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 yy(e){e.hookRegistry.register(pf(e.toolRegistry,e.getDefaultToolPreset)),e.hookRegistry.register(Te(e.failureSignals)),e.hookRegistry.register(De(e.failureSignals)),e.hookRegistry.registerAll(e.contextSourcesBuildHooks(e.workspaceDir,e.memory)),e.memory&&e.hookRegistry.registerAll(kt(e.memory)),e.hookRegistry.registerAll(Mt({getTodoList:t=>e.getSession(t)?.session.getTodoList()}));let t=/-milestone\.md$/,n=/^Status:\s*Done\b/m;e.hookRegistry.registerAll(Ot({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(Sf(e.learningStore,e.promptManager,e.localLearningStore)),e.skillRegistry&&e.hookRegistry.registerAll(Cf(e.skillRegistry)),e.hookRegistry.registerAll(hr({workspaceDir:e.workspaceDir})),e.hookRegistry.registerAll(Ef()),e.hookRegistry.on(`session.deleted`,`rfc047-notification-detach`,t=>e.notificationDispatcher.detach(t.sessionId));let r=oy();e.hookRegistry.registerAll(r.hooks),e.hookRegistry.register(Df(e=>{w.killAllForSession(e)})),e.hookRegistry.registerAll(Of({registry:e.permissionRegistry,getPersistedAllow:t=>e.codingSessionPool.getSessionPermissionAllow(t)})),e.hookRegistry.register(iy({getContext:()=>{let t=Me(e.workspaceDir,Be());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:xe(n,e.workspaceDir,Ve(),e.sandbox.writablePaths),deniedRoots:t,networkAllowed:e.sandbox.isNetworkAllowed,autoAllowBashIfSandboxed:e.sandbox.autoAllowBashIfSandboxed}}})),e.hookRegistry.registerAll(Af(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(jf({isEnabled:i})),e.hookRegistry.registerAll(ny({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})=>{vy({startJob:t=>e.startSkillDraftJob({...t,origin:`user`}),brief:n,sessionId:t,pluginId:$v,workspaceKey:e.getWorkspaceKey()??ey,logger:{warn:t=>e.logger.warn(t)}})},logger:e.logger})),e.hookRegistry.register(Ce({getOnFileEdited:e.getEditFileCallback,dedupCache:e.editFilesDedup})),{agentJobNotify:r.notify}}function by(e,t,n,r){return df({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 xy(e,t){return Le(t,ff(by(e,t,e.skillRegistry?fn(e.skillRegistry,t):void 0,!1))).getAvailable(e.defaultToolPreset)}function Sy(e){return e.toolRegistry.getAvailable(e.defaultToolPreset).filter(e=>e.name.startsWith(`mcp__`))}function Cy(e,t){let n=t.skillProvider??(e.skillRegistry?fn(e.skillRegistry,e.workspaceDir):void 0);t.sandbox&&e.sandbox.pin(t.sandbox);let r={registerChild(e,t){return{pid:Ut.registerChild(e,t).pid??0}}};return Le(e.workspaceDir,{...ff(by(e,e.workspaceDir,n,t.lsp===!0)),processTracker:r})}function wy(e){e.agentJobNotify=yy({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 Ty(e){return{async readFile(e){try{return await Fi(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return null;throw e}},async writeFile(e,t){await Ni(b(e),{recursive:!0}),await rn(e,t)},async writeFileExclusive(e,t){await Ni(b(e),{recursive:!0});try{let n=await Pi(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??Di,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=Ei(Ty()),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 Ys(e.workspaceDir,{plugins:e.activePlugins()}),e.declarativeTeams=await tc(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)`,()=>Dy(e)):nt(`sweepOrphanTraceFiles (headless)`,()=>Py(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`&&Fy(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 Dy(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)}}}Py(e)}function Oy(e){return!!e.pendingWorkspaceInit}function ky(e){return!!e.parentWorkspaceExisted}async function Ay(e){let t=e.parentWorkspaceExisted;if(!t)return e.workspaceRef;e.parentWorkspaceExisted=void 0;try{return e.workspaceRef=await Ei(Ty()).resolveLocal(t.parentRoot),await Dy(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 jy(e){let t=e.parentWorkspaceExisted;if(!t)return e.workspaceRef;e.parentWorkspaceExisted=void 0;try{return e.workspaceRef=await Ei(Ty()).createLocal(t.currentRoot),await Dy(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 My(e){let t=e.pendingWorkspaceInit;if(!t)return e.workspaceRef;e.pendingWorkspaceInit=void 0;try{return e.workspaceRef=await Ei(Ty()).createLocal(t.root),await Dy(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 Ny(e,t){let n=e.workspaceRef?.root;if(!n)return!1;let r=Ty(),i=await Oi(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 Ai(n,a,r),e.workspaceRef={key:ki(a.id),id:a.id,backend:e.workspaceRef.backend,root:n,...a.remote?{remote:a.remote}:{},...a.memorySyncEnabled?{memorySyncEnabled:!0}:{}},!0}async function Py(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 Fy(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`,()=>Ut.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`,()=>Wl()),await n(`pluginServices`,()=>bl()),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 Iy(e,t,n){let r=n.current;if(!r)throw Error(`导出归档仅支持关系化 SQLite 后端(sessions.db)。当前后端不支持。`);let i=await ui(e,r);if(!i)throw Error(`会话 ${e.slice(0,8)} 不存在或无法加载`);let a=JSON.stringify(i,null,2),o=gi(`sha256`).update(a,`utf-8`).digest(`hex`);await Ni(b(t),{recursive:!0}),await Ii(t,a,`utf-8`);let s=await Fi(t,`utf-8`),c=gi(`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 Ly(e){let t=await e.capabilityReloader.reload();return e.applyResults({agentProfiles:t.agentProfiles,teamDeclarations:t.teamDeclarations,pendingProviderCapabilities:t.pendingProviderCapabilities}),await e.diagnoseTopoSortIssues(),e.syncSessionTools(),e.panelBackendController.notifyReload(),{mcpTools:t.mcpTools,models:t.models,agents:t.agents,teams:t.teamCount,pendingProviderCapabilities:t.pendingProviderCapabilities,i18nEntries:t.i18nEntries,agentProfiles:t.agentProfiles,teamDeclarations:t.teamDeclarations,...t.reloadFailures?{reloadFailures:t.reloadFailures}:{}}}let Ry=0;function zy(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 By=class{processOwnerId=`app-${++Ry}`;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(Be());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=Bn();sigilResolvers=new za;expandSigilChips(e,t){return Ja(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 Ra;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 ge;diagnoser=new he(this.failureSignals);pluginHealthTracker=Ec();pluginCapabilityQuota=new kc;inquiryCenter=new jc;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 xy(this,e)}connectorTools(){return Sy(this)}get agentJobs(){return this.agentJobServiceInstance||=jo({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 zo(this)}resolveModel(e){return Bo(this,e)}listProviders(){return Vo(this)}registerHook(e){Ho(this,e)}unregisterHook(e){return Uo(this,e)}async hydrateModelCache(){return Wo(this)}getSessionAvailableModels(e){return Go(this,e)}async refreshModels(){return qo(this)}async reloadCapabilities(){let{agentProfiles:e,teamDeclarations:t,...n}=await Ly({capabilityReloader:this.capabilityReloader,applyResults:e=>{this.declarativeAgentProfiles=e.agentProfiles,this.declarativeTeams=e.teamDeclarations,this._pendingProviderCapabilities=e.pendingProviderCapabilities},diagnoseTopoSortIssues:()=>this.diagnoseTopoSortIssues(),syncSessionTools:()=>this.syncSessionTools(),panelBackendController:this.panelBackendController});return n}syncSessionTools(){return this.toolsSyncCoordinator.resync()}syncSessionToolsFor(e){return this.toolsSyncCoordinator.resyncOne(e)}pluginTopology=new cd;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??oi,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??Be(),this._pluginBundledDirs=h??[],this._resilienceOverride=e.resilience,this.logger=C(n.name,{level:n.level,destination:n.destination});let g={};this.sessionRepoRef=g,this.sessionStorageDir=e.storage?.session&&`dir`in e.storage.session?e.storage.session.dir:void 0;let _=Zd({logger:this.logger,hookRegistry:e.hookRegistry,getToolRegistry:()=>this.toolRegistry,getPermissionRegistry:()=>this.permissionRegistry,onHookTimeout:({hookName:e,timeoutMs:t})=>{let n=fc(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=ld(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,ne=ee.resolveEffectiveModel,ie=e.modelId,v=ba({options:e,workspaceDir:this.workspaceDir,providerRegistry:this.providerRegistry,defaultModel:te,resolveEffectiveModel:ne,repoRef:g,getWorkspaceRef:()=>this.workspaceRef,onMemoryConflict:e.onMemoryConflict,getActiveSessionBytes:()=>{let e=this.codingSessionPool?.active?.session;return e instanceof ii?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=Qd({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=Io({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=wa({skillProvider:e.skillProvider,workspaceDir:this.workspaceDir,activePlugins:()=>this.activePlugins(),resolveEffectiveModel:ne,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=re(this._authStore,`delegation`),ue=$d({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=ef({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:ne,defaultModel:te});this.agentRuntime=fe.agentRuntime,this.codingSessionPool=fe.codingSessionPool,zy(this);let pe=fe.swarmAgentRunner,me=tf({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=of({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=sf({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=nf({mcpController:this.mcpController,callMcpTool:(e,t,n)=>this.callMcpTool(e,t,n),getActivePlugins:()=>this.activePlugins()}).panelBackendController;let _e=cf({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 Nn;let ve=rf({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=af({sessionConfigResolver:this.sessionConfigResolver,getSession:e=>this.codingSessionPool.getSession(e),listSessionIds:()=>this.codingSessionPool.listSessions().map(e=>e.id),logger:this.logger,workspaceDir:this.workspaceDir,settings:this.settings,pluginModuleManager:this.pluginModuleManager,mcpController:this.mcpController,getActivePlugins:()=>this.activePlugins()});this.toolsSyncCoordinator=ye.toolsSyncCoordinator,this.pluginContributionsFacade=ye.pluginContributionsFacade}deferredConfigSteps(){return[{label:`resilience-config`,apply:()=>{this.freezeResilienceConfig()}},{label:`residency-config`,apply:()=>{this.freezeResidencyConfig()}},{label:`memory-governor-thresholds`,apply:()=>{let e=this.settings.get(`residency`);e&&this._memoryGovernor.updateThresholds({warnThresholdPct:e.warn_threshold_pct,hardThresholdPct:e.hard_threshold_pct})}},{label:`auth-store-lock-timeout`,apply:()=>{this._authStore.setRefreshLockTimeoutMs(this.getResilienceConfig().oauth.refreshLockTimeoutMs)}}]}async ensureSettingsLoaded(){await lf(this.settings,()=>this.settingsLoaded,e=>{this.settingsLoaded=e}),uf(this.deferredConfigSteps())}freezeResilienceConfig(){this._resilienceConfig===void 0&&(this._resilienceConfig=l(this._resilienceOverride,this.settings.get(`resilience`)))}_residencyConfig;freezeResidencyConfig(){if(this._residencyConfig!==void 0)return;let e=this.settings.get(`residency`),t=(e,t)=>t!=null&&process.env[e]===void 0?t:void 0;this._residencyConfig={totalBytes:t(`OTTO_SESSION_TOTAL_RESIDENCY_BUDGET`,e?.total_bytes),minPerSessionBytes:t(`OTTO_SESSION_MIN_PER_SESSION_BYTES`,e?.min_per_session_bytes),maxPerSessionBytes:t(`OTTO_SESSION_MAX_PER_SESSION_BYTES`,e?.max_per_session_bytes),maxContentBytes:t(`OTTO_SESSION_MAX_CONTENT_BYTES`,e?.max_content_bytes),maxHistoryMessages:t(`OTTO_SESSION_MAX_HISTORY_MESSAGES`,e?.max_history_messages),resumeWindowMessages:t(`OTTO_SESSION_RESUME_WINDOW_MESSAGES`,e?.resume_window_messages),compactionTimeoutMs:t(`OTTO_SESSION_COMPACTION_TIMEOUT_MS`,e?.compaction_timeout_ms)}}getResidencyConfig(){return this._residencyConfig}getResilienceConfig(){if(this._resilienceConfig===void 0)throw Error(`getResilienceConfig() called before settings are loaded — call after ensureSettingsLoaded()/start()`);return this._resilienceConfig}async allowToolAlways(e,t){return $o(this,e,t)}getPermissionMode(){return es(this)}async setPermissionMode(e){return ts(this,e)}getSessionAlwaysAllow(e){return ns(this,e)}bashAlwaysAllowPrefix(e){return ye(e)}isWellFormedAllowEntry(e){return Pe(e)}async disallowToolAlways(e){return rs(this,e)}clearSessionAlwaysAllow(e){is(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 ro(eo(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 Dy(this)}needsWorkspaceInit(){return Oy(this)}async confirmWorkspaceInit(){return My(this)}hasParentWorkspace(){return ky(this)}async adoptParentWorkspace(){return Ay(this)}async createLocalWorkspace(){return jy(this)}async setWorkspaceMemorySyncEnabled(e){return Ny(this,e)}async sweepOrphanTraceFiles(){return Py(this)}async stop(){return Fy(this)}async createSession(e={}){return as(this,e)}registerNotificationChannel(e){Yo(this,e)}registerInAppNotificationChannel(e){Xo(this,e)}setUserAskRenderer(e){this.userAskRenderer=e}async askPluginUser(e,t){let n={...Hy(t),id:`plugin_ask_${++this.userAskSeq}`,askedBy:`plugin:${e}`},r=this.userAskRenderer;if(!this._interactive||!r)return Vy();let i=this.inquiryCenter.enqueue({id:n.id,origin:{kind:`plugin`,pluginId:e},question:n});if(!i.accepted)return Vy();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,Vy()),e}}notifyUserInteraction(){Zo(this)}setTerminalFocus(e){Qo(this,e)}setFollowUpPendingProbe(e){this.followUpPendingProbe=e}notifyPluginServices(e){let t=yl(),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)?yl().notify(e.pluginId,e.serviceId,{type:`schedule.tick`,scheduleId:t.scheduleId,occurrenceId:t.occurrenceId,occurredAt:t.occurredAt}):!1}getSession(e){return os(this,e)}async shareSession(e,t){return ss(this,e,t)}getActiveSession(){return cs(this)}listSessions(e){return ls(this,e)}async listAllSessions(e){return us(this,e)}async removeSession(e){return ds(this,e)}async exportSessionArchive(e,t){return Iy(e,t,this.sessionRepoRef??{})}archiveSession(e){return fs(this,e)}async forkSession(e,t){return ps(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 Cy(this,e)}async buildModelCatalog(e){return Jo(this,e)}setSessionAvailableModels(e,t){Ko(this,e,t)}registerHooks(){wy(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 Vy(){return{answer:``,acceptedRecommendation:!1,resolvedBy:`human`}}function Hy(e){return{header:Uy(e.header,160),question:Uy(e.question,2e3),background:Uy(e.background,4e3),recommendation:Uy(e.recommendation,1e3),...e.options?{options:e.options.slice(0,8).map(e=>({label:Uy(e.label,120),rationale:Uy(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=>Uy(e,1e3))}:{}}}function Uy(e,t){return String(e??``).replace(/[----]/g,` `).slice(0,t)}function Wy(e){return new By(e)}function Gy(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:()=>Mo(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 Ky(e){return{createSession:async t=>Gy(await e.createSession(t)),jobs:zt,models:{getAll:()=>e.modelRegistry.getAll().map(e=>({id:e.id,name:e.name,provider:e.provider})),switchModel:async(t,n)=>{let r=e.getSession(t);if(!r)return`会话未找到`;if(r.isBusy)return`当前有正在执行的对话,请等待完成后重试。`;let i=e.modelRegistry.find(n);return i?(r.model=i,null):`未知模型 \`${n}\`。`},refresh:async()=>(await e.refreshModels()).map(e=>({provider:e.provider,status:e.status,added:e.added,kept:e.kept,total:e.total,reason:e.reason}))},permission:{getMode:()=>e.getPermissionMode(),setMode:t=>e.setPermissionMode(t)},auth:{getAuthSource:t=>e.authStore.getAuthSource(t)},i18n:{t:(t,n)=>e.i18nRegistry.t(t,n)},reloadCapabilities:()=>e.reloadCapabilities(),workspaceDir:e.workspaceDir}}const qy=new Set(`assert.async_hooks.buffer.child_process.cluster.console.constants.crypto.dgram.diagnostics_channel.dns.domain.events.fs.http.http2.https.inspector.module.net.os.path.perf_hooks.process.punycode.querystring.readline.repl.sqlite.stream.string_decoder.timers.tls.trace_events.tty.url.util.v8.vm.wasi.worker_threads.zlib`.split(`.`));function Jy(e){return e.absolutePaths.length>0||e.bareSpecifiers.length>0}function Yy(e){let t=[],n=[];for(let r of e.matchAll(/require\("([^"]+)"\)/g)){let e=r[1];if(e.startsWith(`/`)){t.includes(e)||t.push(e);continue}e.startsWith(`.`)||e.startsWith(`node:`)||qy.has(e)||n.includes(e)||n.push(e)}return{absolutePaths:t,bareSpecifiers:n}}function Xy(e,t){let n=Yy(t);if(!Jy(n))return;let r=[`${e}: 产物不可分发(RFC-365 R1/R2)`];throw n.absolutePaths.length>0&&r.push(` 编译机绝对路径 require(R1)——发布机路径在用户机器不存在:`,...n.absolutePaths.map(e=>` ${e}`)),n.bareSpecifiers.length>0&&r.push(` 裸模块名 require(R2)——假设运行机有 node_modules,在 ~/.otto/plugins/<id>/ 必然 MODULE_NOT_FOUND:`,...n.bareSpecifiers.map(e=>` ${e}`)),Error(r.join(`
|
|
504
|
+
`))}function Zy(e,t){return new Promise((n,r)=>{let i=setTimeout(()=>r(Error(`timeout`)),t);i.unref?.(),e.then(e=>{clearTimeout(i),n(e)},e=>{clearTimeout(i),r(e)})})}function Qy(e,t=E){let n=t(e);return n.gated||!(e.manifest.capabilities?.includes(`tools`)??!1)?!1:!n.pendingCapabilities.includes(`tools`)}async function $y(e,t,n){let r=[];for(let i of e){if(!Qy(i,t))continue;let e=i.manifest.contributes?.perfMetrics;if(!e?.length)continue;let a=Gl(i.scope);for(let t of e){let e=(async()=>{try{let{result:e,error:n}=await Zy(a.executeTool(i.id,t.toolRef,{}),5e3);return n?{id:t.id,label:t.label,error:n}:{id:t.id,label:t.label,value:e}}catch(e){let r=e instanceof Error?e.message:String(e);return r===`timeout`&&n?.(i.id),{id:t.id,label:t.label,error:r}}})();r.push(e)}}return(await Promise.allSettled(r)).map((e,t)=>e.status===`fulfilled`?e.value:{id:`unknown-${t}`,label:`unknown`,error:String(e.reason)})}const eb=20;function tb(e,t=20){let n=cc(e);if(!n||!D(n))return[];let r;try{r=O(n,`utf8`)}catch{return[]}let i=r.split(`
|
|
505
|
+
`).filter(e=>e.trim().length>0).slice(-t),a=[];for(let e of i)try{a.push(JSON.parse(e))}catch{}return a}function nb(e,t,n){let r=e?.manifest.contributes?.contextKeys;return{...t,...Gn(r,n)}}function rb(e,t){let n=e.manifest.scripts?.[t];if(!n)return Promise.reject(Error(`plugin ${e.id} 无脚本「${t}」`));let r=Xe(n);return r.safe?new Promise((r,i)=>{let a=ji(n,{shell:!0,cwd:e.dir,stdio:`ignore`,env:Ye()});a.on(`error`,i),a.on(`exit`,e=>e===0?r():i(Error(`脚本「${t}」退出码 ${e}`)))}):Promise.reject(Error(`脚本「${t}」被安全检查拦截:${r.reason}`))}function ib(e){let t=e.startsWith(`chrome://`);process.platform===`darwin`?ji(`open`,t?[`-a`,`Google Chrome`,e]:[e],{detached:!0,stdio:`ignore`}).unref():process.platform===`win32`?ji(`cmd`,[`/c`,`start`,``,e],{detached:!0,stdio:`ignore`}).unref():ji(t?`google-chrome`:`xdg-open`,[e],{detached:!0,stdio:`ignore`}).unref()}const ab=C(`@x-otto/coding:plugin-cli-passthrough`);function ob(e){let t=e.manifest.contributes?.cli?.bin,n=t?x(e.dir,t):sb(e.dir);if(n)return cb(n,e.dir)}function sb(e){let t=x(e,`package.json`);if(D(t))try{let n=JSON.parse(O(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 cb(e,t){if(!D(e))return;let n,r;try{n=Zr(e),r=Zr(t)}catch{return}let i=r.endsWith(`/`)?r:`${r}/`;if(!n.startsWith(i)&&n!==r){ab.warn({candidate:e,pluginDir:t},`Plugin CLI bin resolves outside plugin directory (symlink escape rejected)`);return}try{if(!ei(n).isFile())return}catch{return}return n}function lb(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)){ab.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 ub(e,t){let n=lb(e,t),r=new Map;for(let[e,t]of n){if(t.length===1){r.set(e,t[0]);continue}ab.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 db(e,t,n){let r=lb(e,t).get(n);return r&&r.length>=2?r.map(e=>e.id):void 0}function fb(e,t,n,r=6e4){return new Promise((i,a)=>{let o=ji(e,t,{stdio:`inherit`,cwd:n,env:Ye()}),s=setTimeout(()=>{o.kill(`SIGTERM`),a(Error(`插件 CLI 执行超时(${r}ms),已终止子进程`))},r);s.unref(),o.on(`error`,e=>{clearTimeout(s),a(e)}),o.on(`exit`,(e,t)=>{clearTimeout(s),i(e??(t?1:0))})})}function pb(e,t={}){return Un({cwd:t.workspaceDir??process.cwd(),homedir:t.homedir??Be(),bundledDirs:t.bundledDirs}).find(t=>t.id===e)}function mb(e,t,n={}){let r=pb(e,n);if(!r)return{ok:!1,reason:`plugin-not-found`,granted:[],pending:[],message:`Plugin "${e}" not found. Install it first, or check workspaceDir/homedir options.`};let i=(r.manifest?.capabilities??[]).filter(e=>Cn.includes(e)),a=t??[],o=a.filter(e=>!Cn.includes(e));if(o.length>0)return{ok:!1,reason:`unknown-capability`,granted:[],pending:i,message:`Unknown capability: ${o.join(`, `)}. Valid high-risk capabilities: ${Cn.join(`, `)}.`};let s=a.filter(e=>!i.includes(e));if(s.length>0)return{ok:!1,reason:`capability-not-declared`,granted:[],pending:i,message:`Plugin "${e}" does not declare capability: ${s.join(`, `)}. Declared: ${i.length?i.join(`, `):`(none)`}.`};ur(r.dir),a.length>0&&Xn(r.dir,a);let c=E(r);return{ok:!0,granted:[...a],pending:c.pendingCapabilities}}function hb(e,t={}){let n=pb(e,t);if(!n)return{found:!1,trusted:!1,gated:!1,declared:[],granted:[],pending:[]};let r=E(n),i=(n.manifest?.capabilities??[]).filter(e=>Cn.includes(e));return{found:!0,trusted:r.trusted,gated:r.gated,declared:[...i],granted:[...r.grantedCapabilities],pending:[...r.pendingCapabilities]}}function gb(e,t={}){let n=pb(e,t);return n?(fr(n.dir),!0):!1}const _b=C(`@x-otto/coding:plugin-theme-preset-loader`),vb=new Set([`dark`,`light`,`system`,`builtin`]);function yb(e){let t=[];for(let n of e){let e=n.manifest.contributes?.themePresets;if(!e?.length)continue;if(E(n).gated){_b.warn({pluginId:n.id},`plugin gated (untrusted), themePresets skipped`);continue}let r=e;r.length>kn&&(_b.warn({pluginId:n.id,declared:r.length,limit:kn},`plugin declares more theme presets than the per-plugin limit, truncated`),r=r.slice(0,kn));for(let e of r){if(vb.has(e.localId)){_b.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{So as AgentJobService,mt as AgentSession,By as App,xt as CodingSessionPool,ey as DEFAULT_WORKSPACE_KEY,La as ExtensionManager,Sn as HIGH_RISK_CAPABILITIES,$v as INDUCTOR_PLUGIN_ID,Zi as InstallManager,eb as PLUGIN_LOG_TAIL_LINES,jn as PLUGIN_MANIFEST_FILENAME,Mn as POINT,Qi as RegistryClient,ry as SANDBOX_ESCALATION_MARKER,Ui as SCHEDULE_LEASE_MIGRATIONS,bt as SandboxUnavailableError,Wi as ScheduleRegistry,Gi as SchedulerService,za as SigilResolverRegistry,m as apiCredentialId,Xy as assertPortableArtifact,mb as authorizePlugin,nb as buildExtensionContext,ga as buildMemoryStore,ub as buildPluginCliRegistry,$i as builtinOfficialSource,Et as captureFiles,ea as checkArchiveBomb,ta as checkGitUpgrades,sd as checkPluginConsistency,na as checkUpgrades,pr as claudeTrustStorePath,ra as cleanTempDir,$y as collectPluginPerfMetrics,yb as collectPluginThemePresets,tl as compilePluginModule,qu as compilePluginPanels,il as computeSourceHash,Wy as createApp,ia as createArchive,Fn as createBuiltinHashtags,Xd as createBuiltinResolvers,mr as createClaudeHookBridgeHooks,Ln as createFileProvider,Ky as createFrontendPort,Sf as createLessonInjectionHooks,Ki as createLocalFireOwnership,zn as createPluginInputRegistry,qi as createRemoteFireOwnership,Ji as createRemoteScheduleStore,Xi as createScheduleStore,At as createSessionStableInjectionHooks,Cf as createSkillCatalogInjectionHooks,aa as createTempDir,pf as createToolGuidanceHook,gr as defaultHookRunner,Ft as defaultMaxToolTurnExtensions,Ps as defaultPostInstallExecutor,Lt as deriveSessionTitle,_r as detectClaudeExecutableSurface,Vn as detectPluginExecutableSurface,vr as detectProjectConfigGating,oa as detectUninstallTarget,yr as discoverFileCommands,Hn as discoverPlugins,Wn as dispatch,xr as evaluateClaudeTrust,Kn as evaluatePluginTrust,Cr as evaluateWorkspaceTrustPrompt,wr as expandCommandBody,Ja as expandSigilChips,sa as extractArchive,db as findPluginCliNameConflict,Yy as findPortabilityViolations,i as findWorkspaceRoot,Lc as getEsbuildModule,No as getIncompleteSubagentReason,Mo as getLastAssistantText,Rt as globalAgentJobRegistry,Bt as globalAgentObservability,Ht as globalProcessRegistry,Yn as grantPluginCapabilities,Zn as grantedPluginCapabilities,Jy as hasPortabilityViolations,hb as inspectPluginAuthorization,Bc as installEsbuildExitHook,Hc as installEsbuildSignalBridges,nd as installPluginFromDir,td as installPluginFromPackage,$c as installPluginHostExternals,Tr as interpretPreToolUse,ud as isInternalDelegatedSession,Qn as isPluginTrusted,Er as isProjectTrusted,Or as isStrictProjectConfigEnabled,ca as listInstalledItems,kr as loadClaudeHooksConfig,ul as loadPluginModule,Rc as markEsbuildStarted,jr as matchesHookMatcher,qt as messagesFromSnapshot,ib as openTarget,Mr as parseClaudeHooks,Nr as parseDotMcpJson,er as parsePluginManifest,la as parseRegistry,nr as pluginTrustStorePath,Iu as purgePluginState,rr as readHighRiskCapabilities,tb as readPluginLogTail,uy as readSkillLoopStatus,yo as readTaskOutputTail,Jt as reconstructMessages,ad as recordPluginInstalled,od as recordPluginUninstalled,id as removeInstalledPluginEntry,ir as resolveActions,Fr as resolveClaudeMcpServers,Qc as resolveHostExternalPaths,ed as resolvePackageDir,ob as resolvePluginCliBin,ka as resolvePluginMcpServers,Lr as resolveProjectConfigTrusted,Xt as resolveSessionTitle,Qt as restoreFiles,gb as revokePluginAuthorization,ol as rewriteArtifactSourceHash,rb as runPluginScript,ua as scanInstalledVersions,sr as sigilOf,fb as spawnPluginCli,zc as stopEsbuildService,lr as trustPlugin,zr as trustProject,da as uninstall,dr as untrustPlugin,Br as untrustProject,rd as upsertInstalledPluginEntry,fa as validateExtractedPaths,Uc as withBuildTimeout};
|
|
506
506
|
//# sourceMappingURL=index.js.map
|