@x-otto/coding 0.0.1-alpha.10 → 0.0.1-alpha.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -9,7 +9,7 @@ GIT binary patch`)){r++;continue}for(let r of e.split(`
9
9
  `))r.startsWith(`+`)&&!r.startsWith(`+++`)?t++:r.startsWith(`-`)&&!r.startsWith(`---`)&&n++}let a=r>0?`, ${r} binary file${r===1?``:`s`}`:``;return`+${t}/-${n}${a}`}const So=/^[a-zA-Z0-9_-]+$/;function Co(e){return{save(t,n){if(!So.test(t))throw Error(`Invalid jobId for applied diff store: ${t}`);O(e,{recursive:!0}),A(x(e,`${t}.patch`),n,`utf-8`)},load(t){let n=x(e,`${t}.patch`);if(D(n))return k(n,`utf-8`)},delete(t){let n=x(e,`${t}.patch`);D(n)&&$r(n)},loadAll(){return D(e)?Kr(e).filter(e=>Ve(e)===`.patch`).map(t=>({jobId:t.slice(0,-6),diff:k(x(e,t),`utf-8`)})):[]}}}const wo=[`delegate_job`];function To(e){return e.filter(e=>!wo.includes(e.name))}function Eo(){return`job_${mi().replace(/-/g,``).slice(0,8)}`}function Do(e){let t=e.outputDir??x(Be(),`otto-jobs`);return e.registry.setWorktreeCleanupErrorHandler((t,n,r)=>e.logger.warn({jobId:t,op:n,err:r instanceof Error?r.message:String(r)},`Failed to clean up agent job worktree`)),new yo({repoRoot:e.repoRoot,registry:e.registry,notify:e.notify,onWorktreeCleanupError:(t,n)=>{e.logger.warn({op:t,err:n instanceof Error?n.message:String(n)},`Failed to clean up agent job worktree`)},appliedDiffStore:e.appliedDiffDir?Co(e.appliedDiffDir):void 0,spawnRun:({runId:t,prompt:n,outputPath:r,workspaceDir:i,onAwaitingInput:a})=>vo({runId:t,prompt:n,outputPath:r,model:e.getModel(),systemPrompt:e.systemPrompt,tools:[...To(e.buildTools(i)),...e.mcpTools?.()??[]],maxToolTurns:e.maxToolTurns,stream:e.stream,logger:e.logger,hookRegistry:e.hookRegistry,onAwaitingInput:a}),buildOutputPath:e=>(O(t,{recursive:!0}),x(t,`agent-job-${e}.log`)),newJobId:e.newJobId??Eo})}function Oo(e){return Do({repoRoot:e.workspaceDir,registry:Lt,notify:(t,n)=>e.agentJobNotify?.(t,n),buildTools:t=>e.buildToolsForWorkspace(t),mcpTools:()=>e.connectorTools(),getModel:()=>{let t=e.settings.get(`model`),n=(t?e.modelRegistry.find(t):void 0)??e.modelRegistry.getAll().find(e=>e.id!==`__otto_setup__`);if(!n)throw Error(`No model available — configure a model or run /model first.`);return n},stream:e.stream,logger:e.logger,hookRegistry:e.hookRegistry,appliedDiffDir:s()?void 0:x(n,`jobs`,`applied`)})}function ko(e){for(let t=e.length-1;t>=0;t--){let n=e[t];if(n?.role!==`assistant`)continue;let r=(n.content??[]).filter(e=>e.type===`text`&&typeof e.text==`string`).map(e=>e.text).join(`
10
10
  `).trim();if(r.length>0)return r}return``}function Ao(e){for(let t=e.length-1;t>=0;t--){let n=e[t];if(n?.role!==`assistant`)continue;let r=n.stopReason;return r===`refusal`||r===`max_tokens`?r:null}return null}function jo(e){let t=Error(e);return t.name=`AbortError`,t}function Mo(e){let t=new Map;return{runSession:async n=>{let r=Date.now(),i=new AbortController;n.taskId&&t.set(n.taskId,i);let a=n.signal,o=()=>i.abort();a&&(a.aborted?i.abort():a.addEventListener(`abort`,o,{once:!0}));let s;s=n.sessionMode===`sticky`&&n.sessionId?e.getSession(n.sessionId)||await e.createSession({id:n.sessionId,agentName:n.agentName,slot:n.slot,modelId:n.model,category:n.category,delegated:!0,promptContext:n.promptContext??(n.agentName?{taskDescription:n.prompt}:void 0),depth:n.depth,readOnly:n.readOnly}):await e.createSession({agentName:n.agentName,slot:n.slot,modelId:n.model,category:n.category,delegated:!0,promptContext:n.promptContext??(n.agentName?{taskDescription:n.prompt}:void 0),depth:n.depth,transient:!0,readOnly:n.readOnly});let c=s.id,l=St(s.coreAgent,{id:c,agentName:n.agentName??`agent`,title:n.agentName??n.prompt.replace(/\s+/g,` `).slice(0,48),prompt:n.prompt,model:n.model??s.model.id,modelDecidedBy:s.modelResolution?.decidedBy,origin:`main`,depth:n.depth??0,abort:()=>s.abort(),messages:()=>s.session.messages()});try{if(i.signal.aborted)throw jo(`Task cancelled before the session started`);let e=n.agentName?`<agent-guardrails>\n${hn}\n</agent-guardrails>\n\n<task>\n${n.prompt}\n</task>`:n.prompt,t=s.prompt(e);t.catch(()=>{}),await Promise.race([t,new Promise((e,t)=>{i.signal.addEventListener(`abort`,()=>{s.abort(),t(jo(`Task cancelled`))})})]);let a=s.session.messages(),o=ko(a),c=Ao(a);return c&&(o=`${o}\n\n[⚠ subagent did not complete cleanly (stop reason: ${c}) — the output above may be partial or unreliable; verify before relying on it]`),{text:o,sessionId:s.id,durationMs:Date.now()-r}}finally{zt.setMessages(c,s.session.messages()),l(),zt.markEnded(c),a?.removeEventListener(`abort`,o),n.taskId&&t.delete(n.taskId),n.sessionMode===`ephemeral`&&await e.removeSession(s.id).catch(t=>{e.logger.warn(`Failed to remove ephemeral session %s: %s`,s.id,t)})}},abortTask:e=>{t.get(e)?.abort()}}}function No(e){let t=new yi({focusTracking:process.env.OTTO_TUI_FOCUS===`1`}),n=new vi({getConfig:e.getConfig,getCwd:e.getCwd,onInteraction:()=>t.recordInteraction(),isFollowUpPending:e.isFollowUpPending,gate:new xi({getCondition:()=>e.getConfig()?.condition,getIdleThresholdMs:()=>e.getConfig()?.idle_threshold_ms,state:t})});return n.registerChannel(new bi({getConfig:e.getConfig})),n.registerChannel(new gi(`hook`,()=>!0,t=>e.emitHookNotification({sessionId:t.sessionId,message:t.message,title:t.title,notification_type:t.type}))),n.registerChannel(new _i({getConfig:e.getConfig,isTrusted:()=>Tr(e.getCwd())})),{dispatcher:n,presenceTracker:t}}function Po(e,t){if(!t||t.length===0)return e;let n=t.map(e=>RegExp(`^`+e.replace(/[.+^${}()|[\]\\]/g,`\\$&`).replace(/\*/g,`.*`)+`$`,`i`));return e.filter(e=>!n.some(t=>t.test(e)))}var Fo=class{catalog;derivedModelIds=new Map;constructor(e,t,n){this.modelRegistry=e,this.authStore=t,this.catalog=n??new d}async hydrate(){let e=new Set,t=await this.catalog.load();if(!t)return e;for(let n of Object.values(t.providers)){let t=oe(this.modelRegistry,n.mergeProvider,n.modelIds,{templateApi:n.modelApi});for(let n of t.availableIds)e.add(n);let r=this.derivedModelIds.get(n.mergeProvider)??new Set;for(let e of t.derivedIds)r.add(e);this.derivedModelIds.set(n.mergeProvider,r)}return e}refreshInFlight=null;async refresh(){return this.refreshInFlight||=this.doRefresh().finally(()=>{this.refreshInFlight=null}),this.refreshInFlight}async doRefresh(){let e=this.modelRegistry,t=this.authStore,n=t.listProviders(),r=await Promise.all(n.map(e=>t.getAuthSource(e).catch(()=>null))),i=[];for(let a=0;a<n.length;a++){let o=n[a];if(!r[a]){i.push({provider:o,status:`skipped`,reason:`not authenticated`});continue}let s=await t.resolveAuth(o).catch(()=>null);if(!s?.token){let e=r[a]===`oauth`&&!t.oauth.has(o)?`provider capability not granted — trust the plugin in /extension`:`credential expired or refresh failed — re-login`;i.push({provider:o,status:`skipped`,reason:e});continue}let c=ue(o,s.token,{mode:s.mode,beta:s.beta});if(!c){let t=e.getByProvider(o);if(t.length>0){let e=t.map(e=>e.id);await this.catalog.put(o,{fetchedAt:Date.now(),mergeProvider:o,modelIds:e}).catch(()=>{}),i.push({provider:o,status:`ok`,added:0,kept:e.length,total:e.length,availableIds:e})}else i.push({provider:o,status:`skipped`,reason:`no live models endpoint`});continue}try{let t=Po(await v(c),c.modelIdExclude),n=oe(e,c.mergeProvider,t,{templateApi:c.modelApi}),r=new Set(n.availableIds),a=this.derivedModelIds.get(c.mergeProvider)??new Set;for(let t of a)r.has(t)||e.unregister(t);this.derivedModelIds.set(c.mergeProvider,new Set([...[...a].filter(e=>r.has(e)),...n.derivedIds])),await this.catalog.put(o,{fetchedAt:Date.now(),mergeProvider:c.mergeProvider,modelApi:c.modelApi,modelIds:t}).catch(()=>{}),i.push({provider:o,status:`ok`,added:n.added,kept:n.kept,total:n.total,availableIds:n.availableIds})}catch(e){i.push({provider:o,status:`failed`,reason:e instanceof Error?e.message:String(e)})}}return i}};function Io(e){return e.modelRegistry.getAll()}function Lo(e,t){return e.modelRegistry.resolve(t)}function Ro(e){return e.providerRegistry.list()}function zo(e,t){e.hookRegistry.register(t)}function Bo(e,t){return e.hookRegistry.unregister(t)}async function Vo(e){return e.modelCatalogManager.hydrate()}function Ho(e,t){return e.codingSessionPool.getSessionAvailableModels(t)}function Uo(e,t,n){e.codingSessionPool.setSessionAvailableModels(t,n)}async function Wo(e){return e.modelCatalogManager.refresh()}async function Go(e,t){let n=new Set(t?e.codingSessionPool.getSessionAvailableModels(t):[]),r=ne(e.authStore,`delegation`);return Promise.all(e.modelRegistry.getAll().filter(e=>e.id!==`__otto_setup__`).map(async e=>{let t=await r(e);return{id:e.id,provider:e.provider,strengths:e.strengths??[],available:n.has(e.id),usable:t.usable,...t.reason?{unusableReason:t.reason}:{}}}))}function Ko(e,t){e.notificationDispatcher.registerChannel(t)}function qo(e,t){e.notificationDispatcher.registerChannel(new gi(`inapp`,()=>!0,e=>t(e.title??`otto`,e.message,e.type)))}function Jo(e){e.presenceTracker.recordInteraction()}function Yo(e,t){e.presenceTracker.setFocus(t)}async function Xo(e,t,n){if(!t)return;if(n){e.permissionRegistry.addSessionAlwaysAllow(n,t),e.codingSessionPool.setSessionPermissionAllow(n,e.permissionRegistry.getSessionAlwaysAllow(n)),e.logger.info({tool:t,sessionId:n},`Tool added to session always-allow list`);return}let r=e.settings.get(`permission_always_allow`)??[];r.includes(t)||(e.permissionRegistry.addAlwaysAllow(t),await e.settings.persist({permission_always_allow:[...r,t]}),e.logger.info({tool:t},`Tool added to project always-allow list`))}function Zo(e){return e.settings.get(`permission_mode`)??`auto`}async function Qo(e,t){let n=Zo(e);await e.settings.update({permission_mode:t}),e.settings.persist({permission_mode:t}).catch(n=>e.logger.warn({err:n instanceof Error?n.message:String(n),mode:t},`Failed to persist permission mode`)),e.logger.info({from:n,to:t},`Permission mode set`)}function $o(e,t){return e.permissionRegistry.getSessionAlwaysAllow(t)}async function es(e,t){if(!t)return!1;let n=e.settings.get(`permission_always_allow`)??[];if(!n.includes(t))return!1;let r=n.filter(e=>e!==t);return e.permissionRegistry.setAlwaysAllow(r),await e.settings.persist({permission_always_allow:r}),e.logger.info({tool:t},`Tool removed from project always-allow list`),!0}function ts(e,t){t&&(e.permissionRegistry.clearSessionAlwaysAllow(t),e.codingSessionPool.setSessionPermissionAllow(t,[]),e.logger.info({sessionId:t},`Session always-allow list cleared`))}async function ns(e,t={}){e.ensureNotDisposed(),await e.ensureSettingsLoaded();let n=await e.sessionConfigResolver.resolve(t),r=await e.agentRuntime.createSession(n);return e.notificationDispatcher.attach(r),e.toolsSyncCoordinator?.record(r.id,{agentName:t.agentName,promptPreset:t.promptPreset??(t.agentName?`subagent`:`main`),readOnly:t.readOnly,hasExplicitTools:t.tools!==void 0}),e.logger.info({sessionId:r.id},`Session created`),r}function rs(e,t){return e.codingSessionPool.getSession(t)}async function is(e,t,n){if(!e.storage.storageHost)throw Error(`shareSession requires a configured storage.host`);await e.storage.storageHost.host.updateMetadata(`sessions`,e.workspaceRef?.key,t,{visibility:n.visibility},void 0),e.logger.info({sessionId:t,visibility:n.visibility},`Session visibility changed`)}function as(e){return e.codingSessionPool.active}function os(e,t){return e.codingSessionPool.listSessions(t)}async function ss(e,t){let n=os(e,t).filter(t=>{let n=e.codingSessionPool.getSession(t.id);return n?!(n.transient===!0||n.depth>0||n.listable===!1):!0}),r;try{r=t?.workspaceId===void 0?e.workspaceRef?.key:Ei(t.workspaceId)}catch{r=void 0}if(!r)return n;let i=await e.codingSessionPool.listAllPersistedSessions({workspaceKey:r}).catch(()=>[]),a=t?.workspaceId??e.workspaceRef?.id,o=new Set(n.map(e=>e.id)),s=i.filter(e=>!o.has(e.id)).map(e=>({...e,workspaceId:a})),c=[...n,...s];return c.sort((e,t)=>{let n=e.updatedAt?.getTime()??e.createdAt.getTime();return(t.updatedAt?.getTime()??t.createdAt.getTime())-n}),c}async function cs(e,t){e.notificationDispatcher.detach(t);let n=await e.codingSessionPool.removeSession(t);return n&&(e.toolsSyncCoordinator?.forget(t),e.logger.info({sessionId:t},`Session removed`)),n}async function ls(e,t){let n=await e.codingSessionPool.archiveSession(t);return n&&e.logger.info({sessionId:t},`Session archived`),n}async function us(e,t,n){let r=await e.codingSessionPool.forkSession(t,n);return r&&e.notificationDispatcher.attach(r),r}var ds=class{contexts=new Map;constructor(e){this.deps=e}record(e,t){t.hasExplicitTools||this.contexts.set(e,{agentName:t.agentName,promptPreset:t.promptPreset,readOnly:t.readOnly})}forget(e){this.contexts.delete(e)}resyncOne(e){let t=this.contexts.get(e);return t?this.resyncSession(e,t):!1}resync(){let e=new Set(this.deps.listSessionIds());for(let t of this.contexts.keys())e.has(t)||this.contexts.delete(t);let t=0;for(let[e,n]of this.contexts)this.resyncSession(e,n)&&t++;return t}resyncSession(e,t){let n=this.deps.getSession(e);if(!n)return!1;try{let e=this.deps.sessionConfigResolver.resolveToolsForResync(t.agentName,t.promptPreset,t.readOnly);return n.model.supportsTools===!1&&(e=[]),n.tools=e,!0}catch(t){return this.deps.logger.warn({sessionId:e,err:t instanceof Error?t.message:String(t)},`[session-tools-sync] resync failed for session, skipping (fail-soft)`),!1}}};const fs=C(`@x-otto/coding:plugin-panel-manager`);function ps(e){let t=e.plugins??Vn({cwd:e.workspaceDir,homedir:e.homedir,disabled:e.disabledPlugins}),n=[];for(let e of t){let t=e.manifest.contributes?.panels;if(!t||t.length===0)continue;let r=E(e);if(!r.gated){if(!e.manifest.capabilities?.includes(`tui.renderer`)){fs.warn({pluginId:e.id},`plugin declares contributes.panels but not capabilities:["tui.renderer"], skipped (fail-closed)`);continue}if(r.pendingCapabilities.includes(`tui.renderer`)){fs.warn({pluginId:e.id},`plugin capability "tui.renderer" declared but not yet granted, skipping panels (fail-closed)`);continue}for(let r of t){let t=x(e.dir,r.entry);if(!D(t)){fs.warn({pluginId:e.id,panelId:r.id,modulePath:t},`panel entry not found — postinstall build may not have run`);continue}n.push({id:`${e.id}:${r.id}`,pluginId:e.id,title:r.title,modulePath:t,exportName:r.export??`default`})}}}return n}function ms(e){let t=[];for(let n of e){if(E(n).gated)continue;let e=n.manifest.contributes?.statusItems;if(!e?.length)continue;let r=Un(n.manifest.contributes?.contextKeys);for(let i of e){if((i.point??Mn.statuslineItem)!==Mn.statuslineItem||!Gn(i.when,r))continue;let e=r[i.dataSource.contextKey];e!=null&&t.push({item:{id:`${n.id}:${i.id}`,text:e},order:i.order??0})}}return t.sort((e,t)=>e.order-t.order).map(e=>e.item)}function hs(e){let t=[];for(let n of e){if(E(n).gated)continue;let e=n.manifest.contributes;if(!e?.menus?.length)continue;let r=Un(e.contextKeys);t.push(...rr(Mn.menuItem,e.menus,e.actions,r))}return t}const gs={capability:`tui.renderer`,axis:`renderers`,noun:`renderer`,pendingNote:`RFC-140 D3`,logger:C(`@x-otto/coding:plugin-renderer-loader`),entries:e=>e.manifest.contributes?.renderers,entryPath:e=>e.entry,exportName:e=>e.export,idLogFields:e=>({rendererId:e.id}),logTypeofOnNotFunction:!0,build:(e,t,n)=>({id:`${e.id}:${t.id}`,pluginId:e.id,matcher:t.matcher,render:n}),successLogFields:e=>({rendererId:e.id,matcher:e.matcher})};function _s(e){return Ja(e,gs)}const vs=C(`@x-otto/coding:plugin-a2ui-component-loader`),ys=new Set([`Text`,`Card`,`List`,`Progress`,`Chip`,`Button`]),bs={capability:`a2ui.component`,axis:`a2uiComponents`,noun:`a2ui component`,pendingNote:`RFC-140 D3 pattern`,logger:vs,entries:e=>e.manifest.contributes?.a2uiComponents,entryPath:e=>e.entry,exportName:e=>e.export,idLogFields:e=>({type:e.type}),logTypeofOnNotFunction:!1,preCheck:(e,t)=>ys.has(t.type)?(vs.warn({pluginId:e.id,type:t.type},`plugin a2ui component type collides with builtin reserved type, rejected (R4)`),!1):!0,build:(e,t,n)=>({type:t.type,pluginId:e.id,render:n})};function xs(e){return Ja(e,bs,{key:e=>e.type,onConflict:(e,t)=>{vs.warn({pluginId:e.pluginId,type:e.type,existingOwner:t},`a2ui component type already registered by another plugin, rejected (first-registered wins)`)}})}const Ss={capability:`tui.renderer`,axis:`statusWidgets`,noun:`status widget`,pendingNote:`RFC-140 D3 pattern`,logger:C(`@x-otto/coding:plugin-status-widget-loader`),entries:e=>e.manifest.contributes?.statusWidgets,entryPath:e=>e.entry,exportName:e=>e.export,idLogFields:e=>({widgetId:e.id}),logTypeofOnNotFunction:!0,build:(e,t,n)=>({id:`${e.id}:${t.id}`,pluginId:e.id,render:n,tickMs:t.tickMs,order:t.order}),successLogFields:e=>({widgetId:e.id})};function Cs(e){return Ja(e,Ss)}const ws={capability:`tui.renderer`,axis:`fileViewers`,noun:`file viewer`,pendingNote:`RFC-140 D3 pattern`,logger:C(`@x-otto/coding:plugin-file-viewer-loader`),entries:e=>e.manifest.contributes?.fileViewers,entryPath:e=>e.entry,exportName:e=>e.export,idLogFields:e=>({viewerId:e.id}),logTypeofOnNotFunction:!0,build:(e,t,n)=>({id:`${e.id}:${t.id}`,pluginId:e.id,label:t.label,matcher:t.matcher,render:n,order:t.order}),successLogFields:e=>({viewerId:e.id,matcher:e.matcher})};function Ts(e){return Ja(e,ws)}var Es=class{constructor(e){this.deps=e}listFileCommands(){return[...vr(this.deps.getWorkspaceDir(),this.deps.getActivePlugins()),...this.deps.pluginModuleManager.commands]}computedPluginCommands(){return this.deps.pluginModuleManager.commands}async callMcpTool(e,t,n){let r=this.deps.mcpController.getMcpClient(e);if(!r)throw Error(`MCP server "${e}" not connected or not found`);let i=await r.callTool({name:t,arguments:n});return{content:i.content,isError:i.isError}}getPluginPanelRegistrations(){return ps({workspaceDir:this.deps.getWorkspaceDir(),homedir:ze(),disabledPlugins:this.deps.settings.get(`disabled_plugins`),plugins:this.deps.getActivePlugins()})}getPluginStatusItems(){return ms(this.deps.getActivePlugins())}getGlobalMenuItems(){return hs(this.deps.getActivePlugins())}getPluginRenderers(){return _s(this.deps.getActivePlugins())}getPluginA2uiComponents(){return xs(this.deps.getActivePlugins())}getPluginStatusWidgets(){return Cs(this.deps.getActivePlugins())}getPluginFileViewers(){return Ts(this.deps.getActivePlugins())}getPluginRegistrations(){let e=new Map,t=t=>{let n=e.get(t);return n||(n={pluginId:t},e.set(t,n)),n};for(let e of this.getPluginRenderers()){let n=t(e.pluginId);(n.renderers??=[]).push(e)}for(let e of this.getPluginStatusItems()){let n=t(e.id.split(`:`)[0]??e.id);(n.statusItems??=[]).push(e)}for(let e of this.getPluginPanelRegistrations()){let n=t(e.pluginId);(n.panels??=[]).push(e)}for(let e of this.getPluginA2uiComponents()){let n=t(e.pluginId);(n.a2uiComponents??=[]).push(e)}for(let e of this.getPluginStatusWidgets()){let n=t(e.pluginId);(n.statusWidgets??=[]).push(e)}for(let e of this.getPluginFileViewers()){let n=t(e.pluginId);(n.fileViewers??=[]).push(e)}return[...e.values()]}};const j=C(`@x-otto/coding:plugin-hooks`),Ds=4096;function Os(e,t){let n=Je();return n.OTTO_PLUGIN_DIR=e.pluginDir,n.OTTO_PLUGIN_ID=e.pluginId,e.workspaceDir&&(n.OTTO_WORKSPACE_DIR=e.workspaceDir),t&&Object.assign(n,t),n}function ks(e){let t=Ye(e);return t.safe?null:{success:!1,hook:`pre-check`,command:e,error:`Dangerous command blocked: ${t.reason}`}}function As(e,t){let n=!1,r,i;if(e?.length){let t=typeof e==`string`?e:e.toString(`utf-8`);r=t.slice(0,Ds),n=t.length>Ds}if(t?.length){let e=typeof t==`string`?t:t.toString(`utf-8`);i=e.slice(0,Ds),n||=e.length>Ds}return{stdout:r,stderr:i,truncated:n}}async function js(e,t){return ks(t)||(j.info({pluginId:e.pluginId,command:t},`Executing postinstall hook`),new Promise(n=>{let r=Oi(t,{cwd:e.pluginDir,env:Os(e),shell:!0,stdio:`pipe`}),i=[],a=[];r.stdout?.on(`data`,e=>{i.push(e)}),r.stderr?.on(`data`,e=>{a.push(e)});let o=!1,s=setTimeout(()=>{o=!0,r.kill()},3e4);r.on(`close`,(r,c)=>{clearTimeout(s);let{stdout:l,stderr:u,truncated:d}=As(Buffer.concat(i),Buffer.concat(a)),f={success:!o&&r===0&&c===null,hook:`postinstall`,command:t,exitCode:r,signal:c??void 0,stdout:l,stderr:u,truncated:d||void 0};o&&(f.timeout=!0,f.error=`postinstall hook timed out (30s)`),f.success||j.warn({pluginId:e.pluginId,result:f},`Postinstall hook failed`),n(f)}),r.on(`error`,e=>{clearTimeout(s),n({success:!1,hook:`postinstall`,command:t,error:e.message})})}))}function Ms(e,t,n,r,i){let a=ks(t);if(a){j.warn({pluginId:e.pluginId,command:t},`Setup hook blocked by safety check`),n?.(a);return}if(j.info({pluginId:e.pluginId,command:t},`Executing setup hook (async)`),r){let a=r.spawn({command:t,args:[],options:{shell:!0},owner:{type:`plugin-hook`,id:e.pluginId},category:`plugin`,label:`${e.pluginId}:setup`,lifecycle:`evictable`,killGraceMs:5e3,cwd:e.pluginDir,env:Os(e),signal:i}),o=setTimeout(()=>{j.warn({pluginId:e.pluginId},`Setup hook exceeded 60s — killing`),a.kill({reason:`setup timeout (60s)`})},6e4);o.unref?.();let s=``,c=``;a.onStdoutLine(e=>{s+=e+`
11
11
  `}),a.onStderrLine(e=>{c+=e+`
12
- `}),a.onExit(r=>{clearTimeout(o);let{stdout:i,stderr:a,truncated:l}=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(`
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=[],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 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
13
  `,n);A(e,r>=0?t.slice(r+1):t.slice(n))}catch(t){rc.warn({path:e,err:String(t)},`plugin log truncation failed (fail-soft)`)}}function sc(e,t,n){if(!s())try{let r=ac(e);if(!r)return;let i=ic();D(i)||O(i,{recursive:!0}),oc(r),Br(r,`${JSON.stringify({ts:Date.now(),level:t,pluginId:e,msg:n})}\n`)}catch(t){rc.warn({pluginId:e,err:String(t)},`plugin log append failed (fail-soft)`)}}const cc=C(`@x-otto/coding:plugin-tool-wiring`);function N(e,t){return`plugin:${e}:${t}`}function lc(e){let t=e.split(`:`);return t.length<3||t[0]!==`plugin`?null:t[1]||null}function uc(e){let t=e?.content;return typeof t==`string`?t:Array.isArray(t)?t.map(e=>e&&typeof e==`object`&&`text`in e?String(e.text):``).join(``):``}const P={preToolUse:`tool.execute.before`,postToolUse:`tool.execute.after`,userPromptSubmit:`chat.message.before`,sessionStart:`session.created`,stop:`stream.end`,sessionRestored:`session.restored`,sessionDeleted:`session.deleted`,sessionIdle:`session.idle`,sessionError:`session.error`,streamStart:`stream.start`,compactionPending:`compaction.before`,compactionOccurred:`compaction.after`,taskCreated:`task.created`,taskStarted:`task.started`,taskCompleted:`task.completed`,taskFailed:`task.failed`};function dc(e,t){let n=[];if(t.preToolUse){let r=t.preToolUse;n.push(y({name:N(e,`preToolUse`),timing:P.preToolUse,handle:async(t,n)=>{let i=await r({toolName:t.toolName,input:t.args});i&&(i.decision===`deny`?(n.decision=`deny`,n.cancelled=!0,n.cancelReason=i.reason??`denied by plugin ${e}`):i.decision===`ask`&&(n.decision=`ask`,n.decisionReason=i.reason??`requires approval (plugin ${e})`))}}))}if(t.postToolUse){let r=t.postToolUse;n.push(y({name:N(e,`postToolUse`),timing:P.postToolUse,handle:async e=>{await r({toolName:e.toolName,input:e.args,result:e.result})}}))}if(t.userPromptSubmit){let r=t.userPromptSubmit;n.push(y({name:N(e,`userPromptSubmit`),timing:P.userPromptSubmit,handle:async e=>{await r({prompt:uc(e.message)})}}))}if(t.sessionStart){let r=t.sessionStart;n.push(y({name:N(e,`sessionStart`),timing:P.sessionStart,handle:async()=>{await r()}}))}if(t.stop){let r=t.stop;n.push(y({name:N(e,`stop`),timing:P.stop,handle:async()=>{await r()}}))}if(t.sessionRestored){let r=t.sessionRestored;n.push(y({name:N(e,`sessionRestored`),timing:P.sessionRestored,handle:async e=>{await r({sessionId:e.sessionId})}}))}if(t.sessionDeleted){let r=t.sessionDeleted;n.push(y({name:N(e,`sessionDeleted`),timing:P.sessionDeleted,handle:async e=>{await r({sessionId:e.sessionId})}}))}if(t.sessionIdle){let r=t.sessionIdle;n.push(y({name:N(e,`sessionIdle`),timing:P.sessionIdle,handle:async e=>{await r({sessionId:e.sessionId})}}))}if(t.sessionError){let r=t.sessionError;n.push(y({name:N(e,`sessionError`),timing:P.sessionError,handle:async e=>{await r({sessionId:e.sessionId,error:e.error})}}))}if(t.streamStart){let r=t.streamStart;n.push(y({name:N(e,`streamStart`),timing:P.streamStart,handle:async e=>{await r({sessionId:e.sessionId,model:e.model})}}))}if(t.compactionPending){let r=t.compactionPending;n.push(y({name:N(e,`compactionPending`),timing:P.compactionPending,handle:async e=>{await r({sessionId:e.sessionId,messageCount:e.messageCount})}}))}if(t.compactionOccurred){let r=t.compactionOccurred;n.push(y({name:N(e,`compactionOccurred`),timing:P.compactionOccurred,handle:async e=>{await r({sessionId:e.sessionId,retainedCount:e.retainedCount})}}))}if(t.taskCreated){let r=t.taskCreated;n.push(y({name:N(e,`taskCreated`),timing:P.taskCreated,handle:async e=>{await r({taskId:e.task.id})}}))}if(t.taskStarted){let r=t.taskStarted;n.push(y({name:N(e,`taskStarted`),timing:P.taskStarted,handle:async e=>{await r({taskId:e.task.id,agent:e.agent})}}))}if(t.taskCompleted){let r=t.taskCompleted;n.push(y({name:N(e,`taskCompleted`),timing:P.taskCompleted,handle:async e=>{await r({taskId:e.task.id,status:e.task.status,durationMs:e.result.durationMs,tokenUsage:e.result.tokenUsage})}}))}if(t.taskFailed){let r=t.taskFailed;n.push(y({name:N(e,`taskFailed`),timing:P.taskFailed,handle:async e=>{await r({taskId:e.task.id,error:e.error.message})}}))}return n}function fc(e,t,n,r){return r.map(r=>({name:r.name,description:r.description,argumentHint:r.argumentHint,allowedTools:r.allowedTools,model:r.model,body:r.body,source:`plugin`,scope:t===`bundled`?`project`:t,pluginId:e,filePath:`${n}#computed:${r.name}`}))}function pc(e){return e.map(e=>({name:e.name,description:e.description,taskTypes:e.taskTypes??[],capabilities:e.capabilities??[],systemPromptTemplate:e.systemPromptTemplate,...e.promptMode?{promptMode:e.promptMode}:{},...e.defaultTools?{defaultTools:e.defaultTools}:{},...e.disallowedTools?{disallowedTools:e.disallowedTools}:{},...e.preferredModelTier?{preferredModelTier:e.preferredModelTier}:{},...e.allowSubagents===void 0?{}:{allowSubagents:e.allowSubagents}}))}function mc(e,t,n){return n.map(n=>({definition:{metadata:{name:n.name,description:n.description??``},body:n.body,directory:t,filePath:`${t}#computed:${n.name}`,supportingFiles:[]},source:{type:`plugin`,root:t,id:e}}))}function hc(e,t){return t instanceof Ge?t.pluginSource===void 0?new t.constructor(t.message,{code:t.code,cause:t.cause,status:t.status,headers:t.headers,errorType:t.errorType,pluginSource:e}):t:new Ke(t instanceof Error?t.message:String(t),{code:`PROVIDER_PLUGIN_ERROR`,cause:t instanceof Error?t:void 0,pluginSource:e})}function gc(e,t){return()=>{let n=t();return{...n,async*converse(t,r,i,a){try{for await(let o of n.converse(t,r,i,a))o.type===`error`?yield{type:`error`,error:hc(e,o.error)}:yield o}catch(t){throw hc(e,t)}}}}}function _c(e,t){try{return t()}catch(t){let n=String(t);return cc.warn({pluginId:e,err:n},`plugin oauthProviderFactory threw, skipped`),sc(e,`warn`,`oauthProviderFactory threw, skipped: ${n}`),null}}function vc(e){return e&&typeof e==`object`&&Array.isArray(e.content)?e:{content:[{type:`text`,text:typeof e==`string`?e:JSON.stringify(e??null)}]}}function yc(e,t,n){let r=t;if(!r||typeof r!=`object`)return cc.warn({pluginId:e},`plugin tool entry is not an object, skipped`),null;if(typeof r.name!=`string`||!r.name)return cc.warn({pluginId:e},`plugin tool missing valid name, skipped`),null;if(typeof r.execute!=`function`)return cc.warn({pluginId:e,tool:r.name},`plugin tool missing execute function, skipped`),null;if(!r.parameters||typeof r.parameters.safeParse!=`function`)return cc.warn({pluginId:e,tool:r.name},`plugin tool missing valid parameters.safeParse, skipped`),null;let i=r.name,a=r.description??``,o=r.parameters,s=r.execute;return{name:i,description:a,parameters:o,async execute(t){try{let r={pluginId:e,workspaceDir:n?.workspaceDir??``,logger:n?.logger??{info:()=>{},warn:()=>{},error:()=>{}},host:n?.host,signal:t.signal,storage:n?.storage},i=vc(await s(t.params,r));return i.isError?{...i,pluginSource:e}:i}catch(t){throw t instanceof Error&&Object.assign(t,{pluginSource:e}),t}}}}function bc(e,t){let n=[],r=async(t,n)=>{try{await t.onEvent(n)}catch(n){cc.warn({pluginId:e,monitorId:t.id,err:String(n)},`plugin monitor onEvent threw, isolated`)}};for(let i of t)n.push(y({name:N(e,`monitor:${i.id}:stream.end`),timing:`stream.end`,handle:async e=>{e.tokenUsage&&await r(i,{type:`turn.completed`,sessionId:e.sessionId,tokens:{input:e.tokenUsage.input,output:e.tokenUsage.output}})}})),n.push(y({name:N(e,`monitor:${i.id}:compaction.after`),timing:`compaction.after`,handle:async e=>{await r(i,{type:`compaction.occurred`,sessionId:e.sessionId})}})),n.push(y({name:N(e,`monitor:${i.id}:session.error`),timing:`session.error`,handle:async e=>{await r(i,{type:`error`,sessionId:e.sessionId,message:e.error})}}));return n}function xc(e){return{...e}}var Sc=class{stats=new Map;clock;constructor(e=()=>Date.now()){this.clock=e}ensure(e){let t=this.stats.get(e);return t||(t={pluginId:e,hookTimeouts:0,toolTimeouts:0},this.stats.set(e,t)),t}recordHookTimeout(e,t){let n=this.ensure(e);n.hookTimeouts++,n.lastTimeoutHook=t}recordToolTimeout(e){let t=this.ensure(e);t.toolTimeouts++}recordError(e,t){let n=this.ensure(e);n.lastError={message:t,timestamp:this.clock()}}query(e){let t=this.stats.get(e);return t?xc(t):{pluginId:e,hookTimeouts:0,toolTimeouts:0}}all(){return[...this.stats.values()].map(xc)}clear(){this.stats.clear()}};function Cc(e){return new Sc(e)}const wc=3600*1e3;function Tc(){return{authorizedSessionIds:new Set,readCountThisEpoch:0,llmCountThisEpoch:0,llmCallTimes:[],notifyTimes:[]}}var Ec=class{states=new Map;constructor(e=()=>Date.now()){this.now=e}stateOf(e){let t=this.states.get(e);return t||(t=Tc(),this.states.set(e,t)),t}onNotifyDelivered(e,t){let n=this.stateOf(e);n.authorizedSessionIds.add(t),n.readCountThisEpoch=0,n.llmCountThisEpoch=0}isSessionAuthorized(e,t){return this.stateOf(e).authorizedSessionIds.has(t)}tryConsumeRead(e){let t=this.stateOf(e);return t.readCountThisEpoch>=1?!1:(t.readCountThisEpoch+=1,!0)}tryConsumeLlm(e){let t=this.stateOf(e);if(t.llmCountThisEpoch>=2)return{ok:!1,reason:`epoch`};let n=this.now()-wc;return t.llmCallTimes=t.llmCallTimes.filter(e=>e>n),t.llmCallTimes.length>=30?{ok:!1,reason:`hourly`}:(t.llmCountThisEpoch+=1,t.llmCallTimes.push(this.now()),{ok:!0})}tryConsumeNotify(e){let t=this.stateOf(e),n=this.now()-wc;return t.notifyTimes=t.notifyTimes.filter(e=>e>n),t.notifyTimes.length>=20?!1:(t.notifyTimes.push(this.now()),!0)}reset(e){this.states.delete(e)}};function Dc(e){return e.kind===`session`?0:1}var Oc=class{queue=[];inFlightId=null;maxPending;maxPerPlugin;ttlMs;now;constructor(e={}){this.maxPending=e.maxPending??8,this.maxPerPlugin=e.maxPerPlugin??1,this.ttlMs=e.ttlMs??3e5,this.now=e.now??Date.now}enqueue(e){if(this.sweepExpired(),this.queue.length>=this.maxPending)return{accepted:!1,reason:`queue-full`};if(e.origin.kind===`plugin`){let t=e.origin.pluginId;if(this.queue.filter(e=>e.request.origin.kind===`plugin`&&e.request.origin.pluginId===t).length>=this.maxPerPlugin)return{accepted:!1,reason:`plugin-concurrency`}}let t,n=new Promise(e=>{t=e}),r={...e,enqueuedAt:this.now()};return this.queue.push({request:r,resolve:t,dispatched:!1}),this.queue.sort((e,t)=>Dc(e.request.origin)-Dc(t.request.origin)||e.request.enqueuedAt-t.request.enqueuedAt),{accepted:!0,answer:n}}async waitForTurn(e,t=25){for(;;){if(this.takeNext()?.id===e)return!0;if(!this.queue.some(t=>t.request.id===e))return!1;await new Promise(e=>setTimeout(e,t))}}takeNext(){if(this.sweepExpired(),this.inFlightId!==null)return;let e=this.queue.find(e=>!e.dispatched);if(e)return e.dispatched=!0,this.inFlightId=e.request.id,e.request}settle(e,t){let n=this.queue.findIndex(t=>t.request.id===e);if(n===-1)return!1;let[r]=this.queue.splice(n,1);return this.inFlightId===e&&(this.inFlightId=null),r.resolve(t),!0}release(e){let t=this.queue.findIndex(t=>t.request.id===e);return t===-1?!1:(this.queue.splice(t,1),this.inFlightId===e&&(this.inFlightId=null),!0)}get hasInFlight(){return this.inFlightId!==null}get size(){return this.queue.length}sweepExpired(){let e=this.now()-this.ttlMs;for(let t=this.queue.length-1;t>=0;t--){let n=this.queue[t];n.dispatched||n.request.enqueuedAt>e||(this.queue.splice(t,1),n.resolve(kc(n.request.question)))}}shutdown(){let e=this.queue.splice(0,this.queue.length);this.inFlightId=null;for(let t of e)t.resolve(kc(t.request.question))}};function kc(e){return{answer:``,acceptedRecommendation:!1,resolvedBy:`human`}}const F={start:`service.start`,started:`service.started`,stop:`service.stop`,stopped:`service.stopped`,hostCall:`service.hostCall`,hostResult:`service.hostResult`,crashed:`service.crashed`,notify:`service.notify`};function Ac(){return`const { parentPort, workerData } = require('worker_threads')
14
14
  const __send = (m) => parentPort.postMessage(m)
15
15
 
@@ -193,8 +193,8 @@ parentPort.on('message', async (msg) => {
193
193
  return
194
194
  }
195
195
  })
196
- `}const I=C(`@x-otto/coding:plugin-module-loader`),L=e(import.meta.url),jc=[`plugin.ts`,`plugin.tsx`];function Mc(e){for(let t of jc){let n=x(e,t);if(D(n))return n}return null}const Nc={name:`otto-plugin-sdk-shim`,setup(e){e.onResolve({filter:/^@(?:x-)?otto\/(plugin|extension)$/},()=>({path:`otto-plugin-sdk`,namespace:`otto-sdk-shim`})),e.onLoad({filter:/.*/,namespace:`otto-sdk-shim`},()=>({contents:`export const definePlugin = (f) => f;`,loader:`js`}))}};function Pc(){let e={};try{let t=import.meta.resolve(`@x-otto/shared`),n=b(Fi(t)),r=L.resolve(`pino`,{paths:[n]});e.pino=r,e[`thread-stream`]=L.resolve(`thread-stream`,{paths:[b(r)]}),e[`jsonc-parser`]=L.resolve(`jsonc-parser`,{paths:[n]}),e[`@x-otto/shared`]=t.startsWith(`file://`)?Fi(t):t;let i=import.meta.resolve(`@x-otto/provider`);e[`@x-otto/provider`]=i.startsWith(`file://`)?Fi(i):i;let a=import.meta.resolve(`@x-otto/interchange`);e[`@x-otto/interchange`]=a.startsWith(`file://`)?Fi(a):a;let o=import.meta.resolve(`@x-otto/env`);e[`@x-otto/env`]=o.startsWith(`file://`)?Fi(o):o}catch(e){I.warn({err:String(e)},`failed to pre-resolve pino/thread-stream/jsonc-parser/@x-otto absolute paths, falling back to bare-specifier external (pre-fix behavior)`)}return e}const Fc=[`pino`,`thread-stream`,`jsonc-parser`],Ic=`otto-host-external`,Lc=`__ottoPluginHostExternals`;function Rc(){let e=RegExp(`^(${Fc.join(`|`)})$`);return{name:`otto-plugin-host-slot`,setup(t){t.onResolve({filter:e},e=>({path:e.path,namespace:Ic})),t.onLoad({filter:/.*/,namespace:Ic},e=>({contents:`const __slot = globalThis[${JSON.stringify(Lc)}]\nif (!__slot || !__slot[${JSON.stringify(e.path)}]) {\n throw new Error('otto plugin: host external ${e.path} 未注入' +\n '(宿主须在加载插件产物前调用 installPluginHostExternals;隔离端见 RFC-365 R3)')\n}\nmodule.exports = __slot[${JSON.stringify(e.path)}]\n`,loader:`js`}))}}}function zc(){let e={};try{let t=b(Fi(import.meta.resolve(`@x-otto/shared`))),n=L.resolve(`pino`,{paths:[t]});e.pino=n,e[`thread-stream`]=L.resolve(`thread-stream`,{paths:[b(n)]}),e[`jsonc-parser`]=L.resolve(`jsonc-parser`,{paths:[t]})}catch(e){I.warn({err:String(e)},`failed to resolve host external paths (pino/thread-stream/jsonc-parser) — plugins compiled in portable mode will fail to load`)}return e}function Bc(){let e=globalThis,t=e[Lc]??={};for(let[e,n]of Object.entries(zc()))if(t[e]===void 0)try{t[e]=L(n)}catch(t){I.warn({module:e,path:n,err:String(t)},`failed to load host external into injection slot`)}}function Vc(e){let t=Object.keys(e);return{name:`otto-plugin-absolute-external`,setup(n){if(t.length===0)return;let r=RegExp(`^(${t.map(e=>e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)).join(`|`)})$`);n.onResolve({filter:r},t=>({path:e[t.path],external:!0}))}}}async function Hc(e,t){let n=Mc(e);if(!n)return null;let r=x(e,`plugin-dist`);O(r,{recursive:!0});let i=x(r,`plugin.cjs`),a=t?.portable?{}:Pc(),o=(t?.portable?[`react`,`ink`]:[`react`,`ink`,`jsonc-parser`,`pino`,`thread-stream`,`@x-otto/shared`,`@x-otto/provider`,`@x-otto/interchange`,`@x-otto/env`]).filter(e=>!(e in a)),{build:s}=L(`esbuild`);return await s({entryPoints:[n],outfile:i,bundle:!0,format:`cjs`,platform:`node`,external:o,jsx:`transform`,logLevel:`silent`,define:{"import.meta.url":`__otto_plugin_import_meta_url`},banner:{js:`const __otto_plugin_import_meta_url = require("url").pathToFileURL(__filename).href;`},plugins:[Nc,...t?.portable?[Rc()]:[Vc(a)]]}),Jc(r,e),i}const Uc=[`.ts`,`.tsx`,`.js`,`.jsx`,`.mjs`,`.cjs`,`.json`];function Wc(e){let t=[],n=r=>{let i;try{i=Kr(r,{withFileTypes:!0})}catch{return}for(let a of i){let i=a.name;if(i===`plugin-dist`||i===`panels-dist`||i===`node_modules`||i.startsWith(`.`))continue;let o=x(r,i);if(a.isDirectory())n(o);else if(a.isFile()){let n=i.lastIndexOf(`.`),r=n>=0?i.slice(n):``;Uc.includes(r)&&t.push(Ue(e,o))}}};return n(e),t.sort()}function Gc(e){let t=Wc(e),n=pi(`sha256`);for(let r of t){let t=r.split(We).join(`/`);n.update(t),n.update(`\0`);try{n.update(k(x(e,r)))}catch(e){n.update(`<unreadable:${e instanceof Error?e.message:String(e)}>`)}n.update(`\0`)}return n.digest(`hex`)}function Kc(e){return{apiVersion:On,compilerVersion:r,sourceHash:Gc(e)}}function qc(e,t=e){let n=x(e,`plugin-dist`,`meta.json`);if(D(n))try{let e=JSON.parse(k(n,`utf8`));e.sourceHash=Gc(t),A(n,JSON.stringify(e))}catch(t){I.warn({pluginDir:e,err:String(t)},`failed to rewrite artifact sourceHash`)}}function Jc(e,t){try{let n=x(e,`meta.json`),r=x(e,`.meta.json.tmp-${process.pid}`);A(r,JSON.stringify(Kc(t))),Yr(r,n)}catch(e){I.warn(`Failed to write plugin artifact meta: %s`,e instanceof Error?e.message:String(e))}}function Yc(e){try{let t=k(x(e,`plugin-dist`,`meta.json`),`utf8`),n=JSON.parse(t),r=Kc(e);return n.apiVersion===r.apiVersion&&n.compilerVersion===r.compilerVersion&&n.sourceHash===r.sourceHash}catch{return!1}}function Xc(e){let t=x(e,`plugin-dist`,`plugin.cjs`);return D(t)?Yc(e)?t:(I.info(`Plugin artifact at %s is stale (meta mismatch/missing) — recompiling`,t),null):null}async function Zc(e,t,n){if(!Mc(e.dir))return null;if((e.scope===`project`||e.scope===`repository`)&&!Zn(e.dir))return I.warn({pluginId:e.id},`project/repository plugin not trusted, skipping code module (fail-closed)`),null;let r=E(e);if(r.pendingCapabilities.length>0)return I.warn({pluginId:e.id,pendingCapabilities:r.pendingCapabilities},`plugin declares high-risk capabilities not yet granted, skipping code module entirely before factory execution (fail-closed, RFC-140 D3)`),null;let i=!1,a=Xc(e.dir);if(a)i=!0,I.info({pluginId:e.id,outfile:a},`using prebuilt plugin module (RFC-150 D5, skip compile)`);else try{a=await Hc(e.dir)}catch(t){let r=String(t);return I.warn({pluginId:e.id,err:r},`plugin.ts compile failed`),n?.(e.id,`compile failed: ${r}`),null}if(!a)return null;Bc();let o;try{delete L.cache[a];let e=L(a);o=e?.default??e}catch(t){if(i){I.warn({pluginId:e.id,outfile:a,err:String(t)},`prebuilt plugin module failed to load — recompiling for this machine`);try{a=await Hc(e.dir),delete L.cache[a];let t=L(a);o=t?.default??t}catch(t){let r=String(t);return I.warn({pluginId:e.id,err:r},`plugin.ts load failed (after recompile retry)`),n?.(e.id,`load failed: ${r}`),null}}else{let r=String(t);return I.warn({pluginId:e.id,err:r},`plugin.ts load failed`),n?.(e.id,`load failed: ${r}`),null}}if(typeof o!=`function`)return I.warn({pluginId:e.id},`plugin.ts default export is not a factory function`),n?.(e.id,`default export is not a factory function`),null;try{let n=await o(t);return{pluginId:e.id,module:n,compiledPath:a??void 0}}catch(t){let r=String(t);return I.warn({pluginId:e.id,err:r},`plugin factory threw`),n?.(e.id,`factory threw: ${r}`),null}}const R=C(`@x-otto/coding:plugin-service-pool`),Qc=5e3;function $c(e){return[`--experimental-permission`,`--allow-fs-read=*`,...e?[`--allow-fs-write=${e}`]:[]]}`${Be()}`;let el=null,tl=null;function nl(){return tl||(el||=Wr(x(Be(),`otto-plugin-service-`)),tl=x(el,`service-entry.cjs`),A(tl,Ac()),tl)}function rl(e,t){return`${e}:${t}`}var il=class{services=new Map;get runningKeys(){return[...this.services.entries()].filter(([,e])=>e.status===`running`).map(([e])=>e)}statusOf(e,t){return this.services.get(rl(e,t))?.status}restartsOf(e,t){return this.services.get(rl(e,t))?.restarts??0}notify(e,t,n){let r=this.services.get(rl(e,t));if(!r||r.status!==`running`)return!1;try{return r.worker.postMessage({type:F.notify,notification:n}),!0}catch{return!1}}runningServiceIds(e){let t=`${e}:`;return[...this.services.entries()].filter(([e,n])=>e.startsWith(t)&&n.status===`running`).map(([e])=>e.slice(t.length))}async start(e){let t=rl(e.pluginId,e.serviceId);return await this.stop(e.pluginId,e.serviceId),this.spawnAndStart(t,e,0)}spawnAndStart(e,t,n){return new Promise(r=>{let i;try{i=new Pi(nl(),{execArgv:[...$c(t.storageDir)]})}catch(t){R.error({key:e,err:String(t)},`failed to create service worker`),r({error:String(t)});return}i.unref();let a={worker:i,input:t,status:`starting`,restarts:n,stopping:!1};this.services.set(e,a);let o=!1,s=e=>{o||(o=!0,r(e))};i.on(`message`,t=>{this.onWorkerMessage(e,a,t,s)}),i.on(`error`,t=>{R.warn({key:e,err:String(t)},`service worker error`),a.status=`failed`,s({error:String(t)}),this.scheduleRestart(e,a)}),i.on(`exit`,()=>{a.stopping||(a.status!==`failed`&&(a.status=`failed`),s({error:`service worker exited unexpectedly`}),this.scheduleRestart(e,a))}),i.postMessage({type:F.start,compiledPath:t.compiledPath,hostExternals:zc(),serviceId:t.serviceId,factoryCtx:t.factoryCtx,serviceCtx:{pluginId:t.pluginId,workspaceDir:t.workspaceDir,workspaceKey:t.workspaceKey,hostCapabilities:t.hostCapabilities,storageDir:t.storageDir,hasStorageCapability:t.hasStorageCapability}})})}async onWorkerMessage(e,t,n,r){if(n.type===F.started){n.error?(t.status=`failed`,R.warn({key:e,err:n.error},`plugin service failed to start`),r({error:n.error}),this.scheduleRestart(e,t)):(t.status=`running`,R.info({key:e},`plugin service started`),r({}));return}if(n.type===F.crashed){R.warn({key:e,err:n.error},`plugin service crashed at runtime`),t.status=`failed`,this.scheduleRestart(e,t);return}if(n.type===F.hostCall){await this.dispatchHostCall(e,t,n);return}}async dispatchHostCall(e,t,n){let{callId:r,method:i,params:a}=n;if(i===`log.info`||i===`log.warn`||i===`log.error`){let e=a?.msg??``;R[i.slice(4)]({pluginId:t.input.pluginId,serviceId:t.input.serviceId},e);return}if(!r)return;let o=(e,n)=>{try{t.worker.postMessage({type:F.hostResult,callId:r,result:e,error:n})}catch{}};if(i===`startJob`){let e=t.input.bridge.startJob;if(!e){o(void 0,`capability not granted: agent.dispatch`);return}let n=a;try{o(await e({title:String(n?.title??``),prompt:String(n?.prompt??``)}))}catch(e){o(void 0,e instanceof Error?e.message:String(e))}return}if(i===`readTranscript`){let e=t.input.bridge.readTranscript;if(!e){o(void 0,`capability not granted: session.read`);return}let n=a;try{let t=typeof n?.sinceIndex==`number`?n.sinceIndex:void 0;o(await e({sessionId:String(n?.sessionId??``),sinceIndex:t}))}catch(e){o(void 0,e instanceof Error?e.message:String(e))}return}if(i===`notify`){let e=t.input.bridge.notify;if(!e){o(void 0,`capability not granted: user.notify`);return}let n=a,r=String(n?.level??`info`),i=r===`warning`||r===`error`?r:`info`;try{await e({level:i,code:String(n?.code??``),message:String(n?.message??``)}),o(void 0)}catch(e){o(void 0,e instanceof Error?e.message:String(e))}return}if(i===`ask`){o(void 0,`capability not granted: user.ask`);return}if(i===`complete`){let e=t.input.bridge.complete;if(!e){o(void 0,`capability not granted: llm.complete`);return}let n=a;try{let t=typeof n?.maxTokens==`number`?n.maxTokens:void 0;o(await e({prompt:String(n?.prompt??``),maxTokens:t}))}catch(e){o(void 0,e instanceof Error?e.message:String(e))}return}R.warn({key:e,method:i},`plugin service requested unknown host method (rejected)`),o(void 0,`unknown host method: ${String(i)}`)}scheduleRestart(e,t){if(t.stopping||t.restartTimer)return;if(t.restarts>=5){R.error({key:e,restarts:t.restarts},`plugin service exceeded restart limit, giving up (no further restarts)`),t.status=`failed`;return}let n=t.restarts+1,r=Math.min(1e3*2**(n-1),3e4);R.warn({key:e,attempt:n,delayMs:r},`restarting plugin service after crash`);let i=setTimeout(()=>{t.restartTimer=void 0;let r=this.services.get(e);!r||r.stopping||this.spawnAndStart(e,t.input,n)},r);i.unref?.(),t.restartTimer=i}async stop(e,t){let n=rl(e,t),r=this.services.get(n);if(!r)return;r.stopping=!0,r.restartTimer&&=(clearTimeout(r.restartTimer),void 0),this.services.delete(n);let i=new Promise(e=>{let t=n=>{n?.type===F.stopped&&(r.worker.off(`message`,t),e(!0))};r.worker.on(`message`,t);try{r.worker.postMessage({type:F.stop})}catch{e(!1)}}),a=new Promise(e=>{setTimeout(()=>e(!1),Qc).unref?.()});await Promise.race([i,a])||R.warn({key:n,timeoutMs:Qc},`plugin service did not stop gracefully, terminating (state may be lost)`),r.status=`stopped`;try{await r.worker.terminate()}catch{}}async stopPlugin(e){let t=`${e}:`,n=[...this.services.keys()].filter(e=>e.startsWith(t));for(let r of n){let n=r.slice(t.length);await this.stop(e,n)}}async dispose(){let e=[...this.services.keys()];for(let t of e){let e=t.indexOf(`:`);await this.stop(t.slice(0,e),t.slice(e+1))}if(el){try{Xr(el,{recursive:!0,force:!0})}catch{}el=null,tl=null}}};let al=null;function ol(){return al||=new il,al}async function sl(){await al?.dispose(),al=null}const cl=[/\bsk-[A-Za-z0-9_-]{16,}/g,/\bgh[pousr]_[A-Za-z0-9]{20,}/g,/\bAKIA[0-9A-Z]{16}\b/g,/\bxox[abposr]-[A-Za-z0-9-]{10,}/g,/\bBearer\s+[A-Za-z0-9._~+/-]{20,}=*/g,/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}/g];function ll(e){let t=e;for(let e of cl)t=t.replace(e,`***`);return t}function ul(e){if(typeof e==`string`)return e;if(!Array.isArray(e))return``;let t=[];for(let n of e){let e=n;e?.type===`text`&&typeof e.text==`string`&&t.push(e.text)}return t.join(`
197
- `)}function dl(e){if(e.role===`user`)return e.internal?null:{role:`user`,text:ll(ul(e.content))};if(e.role===`assistant`){let t=e.content.filter(e=>e.type===`tool_call`)[0]?.name,n={role:`assistant`,text:ll(ul(e.content))};return t&&(n.toolName=t),n}return e.role===`tool_result`?e.internal?null:{role:`tool_result`,text:ll(ul(e.content)),toolName:e.toolName}:null}function fl(e,t,n){let r=Math.max(0,Math.min(t,e.length)),i=e.slice(r),a=i.length>n?i.slice(i.length-n):i,o=[];for(let e of a){let t=dl(e);t&&o.push(t)}return{messages:o,nextIndex:e.length}}const z={load:`worker.load`,loaded:`worker.loaded`,error:`worker.error`,toolExecute:`tool.execute`,toolResult:`tool.result`,toolCancel:`tool.cancel`,sigilResolve:`sigil.resolve`,sigilResult:`sigil.result`,onActivate:`worker.onActivate`,activated:`worker.activated`,onDeactivate:`worker.onDeactivate`,deactivated:`worker.deactivated`,stop:`worker.stop`,hostCall:`host.call`,hostResult:`host.result`};function pl(e){return`${e===`worker`?`const { parentPort } = require('worker_threads')
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 xl(e){if(e.role===`user`)return e.internal?null:{role:`user`,text:yl(bl(e.content))};if(e.role===`assistant`){let t=e.content.filter(e=>e.type===`tool_call`)[0]?.name,n={role:`assistant`,text:yl(bl(e.content))};return t&&(n.toolName=t),n}return e.role===`tool_result`?e.internal?null:{role:`tool_result`,text:yl(bl(e.content)),toolName:e.toolName}:null}function Sl(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=xl(e);t&&o.push(t)}return{messages:o,nextIndex:e.length}}const z={load:`worker.load`,loaded:`worker.loaded`,error:`worker.error`,toolExecute:`tool.execute`,toolResult:`tool.result`,toolCancel:`tool.cancel`,sigilResolve:`sigil.resolve`,sigilResult:`sigil.result`,onActivate:`worker.onActivate`,activated:`worker.activated`,onDeactivate:`worker.onDeactivate`,deactivated:`worker.deactivated`,stop:`worker.stop`,hostCall:`host.call`,hostResult:`host.result`};function Cl(e){return`${e===`worker`?`const { parentPort } = require('worker_threads')
198
198
  const __send = (m) => parentPort.postMessage(m)
199
199
  const __onMessage = (fn) => parentPort.on('message', fn)`:`const __send = (m) => process.send(m)
200
200
  const __onMessage = (fn) => process.on('message', fn)`}\n${`// RFC-303 M4:工具执行上下文——host/logger 经反向 RPC 代理回宿主
@@ -364,7 +364,7 @@ __onMessage(async (msg) => {
364
364
  return
365
365
  }
366
366
  if (msg.type === '${z.stop}') { toolExecutors.clear(); pluginInstance = null; process.exit(0) }
367
- })`}`}var ml=class{pending=new Map;idCounter=0;boundPluginId=``;hostCallDispatcher=null;setHostCallDispatcher(e){this.hostCallDispatcher=e}constructor(e){this.adapter=e,this.adapter.onMessage(e=>{if(e.type===z.loaded){let t=this.settlePending(`__load__`);t&&t.resolve(e.module);return}if(e.type===z.error){let t=this.settlePending(`__load__`);t&&t.reject(Error(e.error??this.adapter.loadFailedMessage?.()??`plugin isolated transport load failed`));return}if(e.type===z.toolResult){let t=this.settlePending(e.id);t&&t.resolve({result:e.result,error:e.error});return}if(e.type===z.sigilResult){let t=this.settlePending(e.id);t&&t.resolve({result:e.result,error:e.error});return}if(e.type===z.activated||e.type===z.deactivated){let t=this.settlePending(e.id);t&&t.resolve({error:e.error});return}if(e.type===z.hostCall){let t=this.boundPluginId,n=this.hostCallDispatcher,r=t=>{try{this.adapter.send({type:z.hostResult,id:e.id,...t})}catch{}};if(!n){r({error:`host call dispatcher not installed (plugin host capabilities unavailable)`});return}n(t,e.method??``,e.args??[]).then(e=>r({result:e})).catch(e=>r({error:e instanceof Error?e.message:String(e)}));return}}),this.adapter.onError(e=>{this.adapter.onErrorLog?.(e),this.rejectAllPending(e)}),this.adapter.onExit(e=>{if(this.pending.size===0)return;this.adapter.onExitLog?.(e);let t=this.adapter.exitErrorMessage?.(e)??`plugin isolated transport exited unexpectedly (code ${e})`;this.rejectAllPending(Error(t))})}rejectAllPending(e){for(let[,t]of this.pending)t.type===`load`?t.reject(e):t.resolve({error:e.message});this.pending.clear(),this.adapter.unref()}syncRefState(){this.pending.size>0?this.adapter.ref():this.adapter.unref()}trackPending(e,t){this.pending.set(e,t),this.syncRefState()}settlePending(e){let t=this.pending.get(e);return t&&(this.pending.delete(e),this.syncRefState()),t}async load(e,t,n){if(this.pending.has(`__load__`))throw Error(this.adapter.alreadyLoadingMessage?.(e)??`plugin isolated transport already loading ${e}`);return this.boundPluginId=e,new Promise((r,i)=>{this.trackPending(`__load__`,{type:`load`,resolve:r,reject:i}),this.adapter.send({type:z.load,pluginId:e,compiledPath:t,ctx:n,...n.hostMethods?{hostMethods:n.hostMethods}:{},...n.hostExternals?{hostExternals:n.hostExternals}:{}})})}async executeTool(e,t,n){let r=`tool-${++this.idCounter}`,i=n?.timeoutMs??6e4,a=n?.signal;return a?.aborted?{error:`plugin tool execution aborted`}:new Promise(n=>{let o,s,c=()=>{o!==void 0&&clearTimeout(o),s&&a&&a.removeEventListener(`abort`,s)};this.trackPending(r,{type:`tool`,resolve:e=>{c(),n(e)}});let l=e=>{let t=this.settlePending(r);if(t){try{this.adapter.send({type:z.toolCancel,id:r})}catch{}t.resolve({error:e})}};i>0&&(o=setTimeout(()=>{this.adapter.onToolTimeout?.(e,i),l(`plugin tool "${e}" timed out after ${i}ms`)},i),o.unref?.()),a&&(s=()=>l(`plugin tool execution aborted`),a.addEventListener(`abort`,s,{once:!0})),this.adapter.send({type:z.toolExecute,id:r,name:e,params:t})})}async resolveSigil(e,t,n,r){let i=`sigil-${++this.idCounter}`,a=r?.timeoutMs??6e4;return new Promise(r=>{let o;this.trackPending(i,{type:`sigil`,resolve:e=>{o!==void 0&&clearTimeout(o),r(e)}}),a>0&&(o=setTimeout(()=>{let t=this.settlePending(i);t&&t.resolve({error:`sigil resolver "${e}" timed out after ${a}ms`})},a),o.unref?.()),this.adapter.send({type:z.sigilResolve,id:i,name:e,param:t,ctx:n})})}async activate(){let e=`lifecycle-${++this.idCounter}`;return new Promise(t=>{this.trackPending(e,{type:`lifecycle`,resolve:t}),this.adapter.send({type:z.onActivate,id:e})})}async deactivate(){let e=`lifecycle-${++this.idCounter}`;return new Promise(t=>{this.trackPending(e,{type:`lifecycle`,resolve:t}),this.adapter.send({type:z.onDeactivate,id:e})})}clearPending(){this.pending.clear()}};const hl=C(`@x-otto/coding:plugin-worker-pool`);let gl=null,_l=null;function vl(){return _l||(gl||=Wr(x(Be(),`otto-plugin-worker-`)),_l=x(gl,`worker-entry.cjs`),A(_l,pl(`worker`)),_l)}var yl=class extends ml{worker;constructor(){let e=new Pi(vl());e.unref(),super({send:t=>e.postMessage(t),onMessage:t=>e.on(`message`,e=>t(e)),onError:t=>e.on(`error`,e=>t(e)),onExit:t=>e.on(`exit`,t),ref:()=>e.ref(),unref:()=>e.unref(),onToolTimeout:(e,t)=>{hl.warn({tool:e,timeoutMs:t},`plugin tool execution timed out`)},onErrorLog:e=>{hl.warn({err:String(e)},`plugin worker error`)},onExitLog:e=>{hl.warn({code:e},`plugin worker exited unexpectedly with pending requests`)},exitErrorMessage:e=>`plugin worker exited unexpectedly (code ${e})`,loadFailedMessage:()=>`plugin worker load failed`,alreadyLoadingMessage:e=>`plugin worker already loading ${e}`}),this.worker=e}async stop(){try{this.worker.postMessage({type:z.stop}),await this.worker.terminate()}catch{}this.clearPending(),this.worker.unref()}},bl=class{workers=new Map;maxConcurrent;hostCallDispatcher=null;constructor(e=8){this.maxConcurrent=e}setHostCallDispatcher(e){this.hostCallDispatcher=e}async load(e,t,n){if(this.workers.size>=this.maxConcurrent)return null;await this.unload(e);let r=new yl;this.hostCallDispatcher&&r.setHostCallDispatcher(this.hostCallDispatcher),this.workers.set(e,r);try{return await r.load(e,t,n)}catch(t){throw this.workers.delete(e),r.stop().catch(()=>{}),t}}async executeTool(e,t,n,r){let i=this.workers.get(e);if(!i)throw Error(`no worker for plugin ${e}`);return i.executeTool(t,n,r)}async resolveSigil(e,t,n,r,i){let a=this.workers.get(e);if(!a)throw Error(`no worker for plugin ${e}`);return a.resolveSigil(t,n,r,i)}async activate(e){let t=this.workers.get(e);if(!t)throw Error(`no worker for plugin ${e}`);return t.activate()}async deactivate(e){let t=this.workers.get(e);if(!t)throw Error(`no worker for plugin ${e}`);return t.deactivate()}async unload(e){let t=this.workers.get(e);t&&(this.workers.delete(e),await t.stop())}async dispose(){let e=[...this.workers.values()];if(this.workers.clear(),gl){try{Xr(gl,{recursive:!0,force:!0})}catch{}gl=null,_l=null}await Promise.all(e.map(e=>e.stop().catch(()=>{})))}get size(){return this.workers.size}};const xl=C(`@x-otto/coding:plugin-process-pool`);let Sl=null,Cl=null;function wl(){return Cl||(Sl||=Wr(x(Be(),`otto-plugin-process-`)),Cl=x(Sl,`process-entry.cjs`),A(Cl,pl(`process`)),Cl)}var Tl=class extends ml{child;sandboxToDispose;constructor(e){let t=wl(),n=process.execPath,r=[t],i=n,a=r,o;if(Re()){let t=Fe({network:`deny`}),s=t.wrap({command:n,args:r,options:{timeout:0,cwd:e},projectRoot:e});i=s.command,a=s.args,o=t}else xl.warn(`No platform sandbox available for project/repository scope plugin isolation — falling back to plain child_process (still process-isolated, but without OS-level file/network constraints)`);let s=Oi(i,a,{cwd:e,stdio:[`ignore`,`ignore`,`pipe`,`ipc`]});s.unref(),super({send:e=>s.send(e),onMessage:e=>s.on(`message`,t=>e(t)),onError:e=>s.on(`error`,t=>e(t)),onExit:e=>s.on(`exit`,e),ref:()=>{s.channel?.ref(),s.stderr?.ref?.()},unref:()=>{s.channel?.unref(),s.stderr?.unref?.()},onToolTimeout:(e,t)=>{xl.warn({tool:e,timeoutMs:t},`plugin tool execution timed out (isolated process)`)},onErrorLog:e=>{xl.warn({err:String(e)},`plugin process error`)},onExitLog:e=>{xl.warn({code:e},`plugin process exited unexpectedly with pending requests`)},exitErrorMessage:e=>`plugin process exited unexpectedly (code ${e})`,loadFailedMessage:()=>`plugin process load failed`,alreadyLoadingMessage:e=>`plugin process already loading ${e}`}),this.child=s,this.sandboxToDispose=o,this.child.stderr?.on(`data`,e=>{xl.warn({stderr:e.toString().slice(0,500)},`plugin process stderr output`)}),this.child.on(`exit`,()=>{this.sandboxToDispose?.dispose().catch(()=>void 0),this.sandboxToDispose=void 0})}async stop(){try{this.child.send({type:z.stop})}catch{}try{this.child.kill()}catch{}this.clearPending()}},El=class{processes=new Map;maxConcurrent;hostCallDispatcher=null;constructor(e=4){this.maxConcurrent=e}setHostCallDispatcher(e){this.hostCallDispatcher=e}async load(e,t,n){if(this.processes.size>=this.maxConcurrent)return null;await this.unload(e);let r=new Tl(n.workspaceDir);this.hostCallDispatcher&&r.setHostCallDispatcher(this.hostCallDispatcher),this.processes.set(e,r);try{return await r.load(e,t,n)}catch(t){throw this.processes.delete(e),r.stop().catch(()=>{}),t}}async executeTool(e,t,n,r){let i=this.processes.get(e);if(!i)throw Error(`no process for plugin ${e}`);return i.executeTool(t,n,r)}async resolveSigil(e,t,n,r,i){let a=this.processes.get(e);if(!a)throw Error(`no process for plugin ${e}`);return a.resolveSigil(t,n,r,i)}async activate(e){let t=this.processes.get(e);if(!t)throw Error(`no process for plugin ${e}`);return t.activate()}async deactivate(e){let t=this.processes.get(e);if(!t)throw Error(`no process for plugin ${e}`);return t.deactivate()}async unload(e){let t=this.processes.get(e);t&&(this.processes.delete(e),await t.stop())}async dispose(){let e=[...this.processes.values()];if(this.processes.clear(),Sl){try{Xr(Sl,{recursive:!0,force:!0})}catch{}Sl=null,Cl=null}await Promise.all(e.map(e=>e.stop().catch(()=>{})))}get size(){return this.processes.size}};const Dl=C(`@x-otto/coding:plugin-module-loader-isolated`);let Ol=null;function kl(){return Ol||=new bl,Ol}let Al=null;function jl(){return Al||=new El,Al}async function Ml(){await Promise.all([Ol?.dispose()??Promise.resolve(),Al?.dispose()??Promise.resolve()])}function Nl(e){return e===`project`||e===`repository`?jl():kl()}function Pl(e){return!!e.manifest.capabilities?.includes(`tools`)}function Fl(e,t,n){let r={};if(t.contributions&&(r.contributions=t.contributions),t.tools.length>0&&(r.tools=t.tools.map(t=>({name:t.name,description:t.description||t.name,parameters:{safeParse(e){return t.hasParameters?{success:!0,data:e}:{success:!0,data:{}}},...t.parametersSchema===void 0?{}:{toJSONSchema:()=>t.parametersSchema}},async execute(r,i){let{result:a,error:o}=await n.executeTool(e,t.name,r,{signal:i?.signal});if(o)throw Error(o);return a&&typeof a==`object`&&Array.isArray(a.content)?a:{content:[{type:`text`,text:typeof a==`string`?a:JSON.stringify(a??null)}]}}}))),t.hasSigilProviders&&Dl.warn({pluginId:e},`plugin declares sigilProviders but is loaded via the isolated path (tools capability) — dynamic @ search providers are not proxied over RPC and will be inactive; declare input.resolver without tools to use the in-process path, or use static sigilEntries`),t.sigilResolvers?.length>0){r.sigilResolvers={};for(let i of t.sigilResolvers)r.sigilResolvers[i.name]={resolve:(t,r)=>n.resolveSigil(e,i.name,t,r,{timeoutMs:i.timeoutMs}).then(e=>{if(e.error)throw Error(e.error);return e.result??``}),timeoutMs:i.timeoutMs,uiHostOnly:i.uiHostOnly}}return t.hasOnActivate&&(r.onActivate=async()=>{let{error:t}=await n.activate(e);if(t)throw Error(t)}),t.hasOnDeactivate&&(r.onDeactivate=async()=>{let{error:t}=await n.deactivate(e);if(t)throw Error(t)}),r}async function Il(e,t,n,r){if((e.scope===`project`||e.scope===`repository`)&&!Zn(e.dir))return Dl.warn({pluginId:e.id},`project/repository plugin not trusted, skipping isolated code module (fail-closed)`),null;let i=E(e);if(i.pendingCapabilities.length>0)return Dl.warn({pluginId:e.id,pendingCapabilities:i.pendingCapabilities},`plugin declares high-risk capabilities not yet granted, skipping isolated code module before worker execution (fail-closed, RFC-140 D3)`),null;let a=n??Nl(e.scope),o=Xc(e.dir);try{o?Dl.info({pluginId:e.id,compiledPath:o},`using prebuilt plugin module (isolated path, RFC-150 D5)`):o=await Hc(e.dir)}catch(t){let n=String(t);return Dl.warn({pluginId:e.id,err:n},`plugin.ts compile failed (isolated path)`),r?.(e.id,`compile failed: ${n}`),null}if(!o)return null;let s=[...Object.keys(t.host??{}),`listActivePlugins`];if(t.host&&Object.keys(t.host).length>0||t.listActivePlugins){let e=t.host;a.setHostCallDispatcher?.(async(n,r,i)=>{if(r===`listActivePlugins`)return t.listActivePlugins?t.listActivePlugins():[];if(!e||typeof e[r]!=`function`)throw Error(`host method '${r}' not available (not declared or not granted)`);if(!(r in e))throw Error(`host method '${r}' not in whitelist`);let a=e[r];return a(...i)})}try{let n=await a.load(e.id,o,{pluginId:t.pluginId,pluginDir:t.pluginDir,workspaceDir:t.workspaceDir,hostMethods:s,listActivePlugins:!0,hostExternals:zc()});if(n===null){if(e.scope===`project`||e.scope===`repository`){let t=`plugin process pool exhausted (project/repository scope requires isolated execution, refusing to downgrade to in-process)`;return Dl.warn({pluginId:e.id},t),r?.(e.id,t),null}return Dl.info({pluginId:e.id},`plugin worker pool exhausted, falling back to in-process load`),Zc(e,t,r)}return{pluginId:e.id,module:Fl(e.id,n,a),compiledPath:o}}catch(t){let n=String(t);return Dl.warn({pluginId:e.id,err:n},`plugin.ts worker load failed`),r?.(e.id,`worker load failed: ${n}`),null}}function Ll(e,t){return e.includes(`onStartup`)?!0:e.some(e=>t.has(e))}var Rl=class{axisName=`hooks`;hookNamesByPlugin=new Map;constructor(e){this.hookRegistry=e}register(e){let t=e.loaded.module.hooks;if(t){let n=dc(e.plugin.id,t);this.hookRegistry.registerAll(n);let r=this.hookNamesByPlugin.get(e.plugin.id)??[];r.push(...n.map(e=>e.name)),this.hookNamesByPlugin.set(e.plugin.id,r)}}unregister(e){let t=this.hookNamesByPlugin.get(e);if(t){for(let e of t)this.hookRegistry.unregister(e);this.hookNamesByPlugin.delete(e)}}unregisterAll(){for(let e of[...this.hookNamesByPlugin.keys()])this.unregister(e)}},zl=class{axisName=`monitors`;hookNamesByPlugin=new Map;monitorsByPlugin=new Map;constructor(e,t){this.hookRegistry=e,this.logger=t}register(e){let t=e.loaded.module.monitors;if(!t?.length)return;if(!e.plugin.manifest.capabilities?.includes(`monitor`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares monitors but not capabilities:["monitor"], skipped (fail-closed)`);return}let n=bc(e.plugin.id,t);this.hookRegistry.registerAll(n);let r=this.hookNamesByPlugin.get(e.plugin.id)??[];r.push(...n.map(e=>e.name)),this.hookNamesByPlugin.set(e.plugin.id,r),this.monitorsByPlugin.set(e.plugin.id,t)}unregister(e){let t=this.hookNamesByPlugin.get(e);if(t){for(let e of t)this.hookRegistry.unregister(e);this.hookNamesByPlugin.delete(e)}this.monitorsByPlugin.delete(e)}unregisterAll(){for(let e of[...this.hookNamesByPlugin.keys()])this.unregister(e)}async dispatch(e){for(let[t,n]of this.monitorsByPlugin)for(let r of n)try{await r.onEvent(e)}catch(n){this.logger.warn({pluginId:t,monitorId:r.id,eventType:e.type,err:String(n)},`plugin monitor onEvent threw (host event), isolated`)}}get monitorPluginIds(){return[...this.monitorsByPlugin.keys()]}},Bl=class{axisName=`feedback`;feedbackRegisteredSources=new Set;constructor(e,t){this.feedbackRegistry=e,this.logger=t}register(e){let t=e.loaded.module.feedbackProviders;if(!(!t||!this.feedbackRegistry)){if(!e.plugin.manifest.capabilities?.includes(`feedback`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares feedbackProviders but not capabilities:["feedback"], skipped (fail-closed)`);return}this.feedbackRegistry.register(t,e.plugin.id)?this.feedbackRegisteredSources.add(e.plugin.id):this.logger.warn({pluginId:e.plugin.id},`plugin feedbackProviders rejected (already registered by a different plugin)`)}}unregister(e){!this.feedbackRegistry||!this.feedbackRegisteredSources.has(e)||(this.feedbackRegistry.unregister(e),this.feedbackRegisteredSources.delete(e))}unregisterAll(){for(let e of[...this.feedbackRegisteredSources])this.unregister(e)}};const Vl=C(`@x-otto/coding:plugin-sigil-loader`);function Hl(e){return e.startsWith(`!`)||e.startsWith(`#`)}function Ul(e){let t=[];for(let n of e){let e=n.manifest.contributes?.sigilEntries;if(e?.length){if(E(n).gated){Vl.warn({pluginId:n.id},`plugin gated (untrusted), sigilEntries skipped`);continue}for(let r of e){if(Hl(r.value)){Vl.warn({pluginId:n.id,label:r.label},`sigilEntries value starts with '!' or '#' (mode-prefix collision), skipped`);continue}t.push({label:r.label,value:r.value,kind:r.kind,description:r.description,source:n.id,resolverId:r.resolverId?`${n.id}:${r.resolverId}`:void 0})}}}return t}function Wl(e){for(let t of e)t.manifest.contributes?.inputEntries&&Vl.warn({pluginId:t.id},`contributes.inputEntries is deprecated (RFC-210); migrate to contributes.sigilEntries (inline array) — the file-path form is no longer loaded`)}function Gl(e,t){let n=[];for(let[r,i]of Object.entries(t)){let t=`${e}:${r}`;typeof i==`function`?n.push({id:t,resolve:i}):i&&typeof i.resolve==`function`?n.push({id:t,resolve:i.resolve,timeoutMs:i.timeoutMs,uiHostOnly:i.uiHostOnly}):Vl.warn({pluginId:e,name:r},`sigilResolvers entry is neither function nor {resolve}, skipped`)}return n}function Kl(e,t){return t.map(t=>async(n,r)=>(await t(n,r)).filter(e=>!Hl(e.value)).map(t=>({...t,source:e})))}function ql(e,t){for(let n of e)n.resolverId&&!t(n.resolverId)&&Vl.warn({label:n.label,resolverId:n.resolverId,source:n.source},`sigilEntries.resolverId has no matching resolver (declared sigilResolvers missing or capability not granted) — entry will pass through unexpanded at submit`)}var Jl=class{axisName=`sigil`;sigilResolverSourcePluginIds=new Set;sigilProviderUnsubsByPlugin=new Map;constructor(e,t,n){this.sigilResolverRegistry=e,this.pluginInput=t,this.logger=n}register(e){let t=e.loaded.module.sigilResolvers,n=e.loaded.module.sigilProviders;if(t&&Object.keys(t).length>0||n?.length){if(!e.plugin.manifest.capabilities?.includes(`input.resolver`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares sigilResolvers/sigilProviders but not capabilities:["input.resolver"], skipped (fail-closed)`);return}if(e.verdict.pendingCapabilities.includes(`input.resolver`)){this.logger.warn({pluginId:e.plugin.id},`plugin capability "input.resolver" declared but not yet granted, skipping sigil axes (fail-closed)`);return}if(t&&this.sigilResolverRegistry){let n=Gl(e.plugin.id,t);n.length>0&&(this.sigilResolverRegistry.register(n,e.plugin.id),this.sigilResolverSourcePluginIds.add(e.plugin.id))}if(n?.length&&this.pluginInput){let t=this.sigilProviderUnsubsByPlugin.get(e.plugin.id)??[];for(let r of Kl(e.plugin.id,n))t.push(this.pluginInput.registerProvider(`@`,r));this.sigilProviderUnsubsByPlugin.set(e.plugin.id,t)}if(this.sigilResolverRegistry){let t=this.sigilResolverRegistry;ql(Ul([e.plugin]),e=>t.get(e)!==void 0)}}}unregister(e){this.sigilResolverRegistry&&this.sigilResolverSourcePluginIds.has(e)&&(this.sigilResolverRegistry.unregisterBySource(e),this.sigilResolverSourcePluginIds.delete(e));let t=this.sigilProviderUnsubsByPlugin.get(e);if(t){for(let e of t)try{e()}catch{}this.sigilProviderUnsubsByPlugin.delete(e)}}unregisterAll(){let e=new Set([...this.sigilResolverSourcePluginIds,...this.sigilProviderUnsubsByPlugin.keys()]);for(let t of e)this.unregister(t)}},Yl=class{axisName=`computedCommands`;commandsByPlugin=new Map;register(e){let t=e.loaded.module.contributions?.commands;if(t?.length&&e.plugin.scope!==`builtin`){let n=this.commandsByPlugin.get(e.plugin.id)??[];n.push(...fc(e.plugin.id,e.plugin.scope,e.plugin.dir,t)),this.commandsByPlugin.set(e.plugin.id,n)}}unregister(e){this.commandsByPlugin.delete(e)}unregisterAll(){}resetForReload(){this.commandsByPlugin.clear()}getComputedCommands(){return[...this.commandsByPlugin.values()].flat()}},Xl=class{axisName=`computedAgents`;profilesByPlugin=new Map;existingAgentNames=new Set;register(e){let t=e.loaded.module.contributions?.agents;if(!t?.length)return;let n=this.profilesByPlugin.get(e.plugin.id)??[];n.push(...pc(t)),this.profilesByPlugin.set(e.plugin.id,n)}unregister(e){this.profilesByPlugin.delete(e)}unregisterAll(){}setExistingAgentNames(e){this.existingAgentNames=e}resetForReload(e){this.profilesByPlugin.clear(),this.existingAgentNames=e}getAppendedAgents(){let e=new Set(this.existingAgentNames),t=[];for(let n of this.profilesByPlugin.values())for(let r of n)e.has(r.name)||(e.add(r.name),t.push(r));return t}},Zl=class{axisName=`computedSkills`;skillNamesByPlugin=new Map;constructor(e){this.skillRegistry=e}register(e){let t=e.loaded.module.contributions?.skills;if(!t?.length||!this.skillRegistry)return;let n=this.skillNamesByPlugin.get(e.plugin.id)??[];for(let{definition:r,source:i}of mc(e.plugin.id,e.plugin.dir,t))this.skillRegistry.get(r.metadata.name)||(this.skillRegistry.register(r,i),n.push(r.metadata.name));n.length>0&&this.skillNamesByPlugin.set(e.plugin.id,n)}unregister(e){let t=this.skillNamesByPlugin.get(e);if(t){for(let e of t)this.skillRegistry?.unregister(e);this.skillNamesByPlugin.delete(e)}}unregisterAll(){for(let e of[...this.skillNamesByPlugin.keys()])this.unregister(e)}};const B=C(`@x-otto/coding:plugin-provider-loader`);function Ql(e){let t=C(`wire-protocol:${e}`),n=e=>(t,...n)=>e(t,...n);return{debug:n(t.debug.bind(t)),info:n(t.info.bind(t)),warn:n(t.warn.bind(t)),error:n(t.error.bind(t))}}function V(e,t){return`${e}:${t}`}function $l(e){return new Set([...(e.contributes?.providers??[]).filter(e=>e.preserveProviderId===!0&&e.oauthRef).map(e=>e.oauthRef),...e.codeProviderIds??[]])}function eu(e,t){let n=$l(t);return new Set((t.contributes?.oauth??[]).map(t=>n.has(t.id)?t.id:V(e,t.id)))}function tu(e,t){return new Set((t.contributes?.providers??[]).filter(e=>e.catalogOnly!==!0&&e.baseUrl&&e.wireApi).map(t=>t.preserveProviderId===!0?t.id:V(e,t.id)))}function nu(e,t,n){return new Set([...n.codeProviderIds??[],...(n.contributes?.providers??[]).filter(e=>e.preserveProviderId===!0).map(e=>e.id)]).has(t)?t:V(e,t)}function ru(e){return`code:${e}`}function iu(e,t,n,r,i,a,o){let s=e.id.indexOf(`/`),c=s>=0?e.id.slice(s+1):e.id;return{id:e.id,name:c,api:n,provider:t,baseUrl:r,reasoning:e.reasoning??!1,input:e.input??[`text`],cost:e.cost,contextWindow:e.contextWindow,maxOutputTokens:e.maxOutput,imageConstraints:i,supportsTools:a,strengths:e.strengths,thinkingLevels:e.thinkingLevels,thinkingMode:e.thinkingMode,responseBodyPolicy:o}}function au(e,t,n,r,i){return(a,o)=>{let s=e.url.replace(`{baseUrl}`,r??``).replace(`{clientVersion}`,process.env.OTTO_CODEX_CLIENT_VERSION||`1.0.0`),c=e.authScheme??`bearer`,l=c===`x-api-key`||c===`auto`&&o.mode!==`oauth`?{"x-api-key":a}:{authorization:`Bearer ${a}`};return c===`auto`&&o.mode===`oauth`&&o.beta&&e.betaHeaderName&&(l[e.betaHeaderName]=o.beta),{url:s,headers:{...i,...e.headers,...l},mergeProvider:t,modelApi:n,modelIdExclude:e.modelIdExclude}}}function ou(e,t,n,r,i,a){return()=>{let o=r.get(a);if(!o)throw new Ke(`wire protocol '${a}' is not registered — is its provider plugin installed and trusted? (RFC-148)`,{code:`WIRE_PROTOCOL_NOT_REGISTERED`});return o.create({resolveAuth:()=>t.resolveAuth(n).then(e=>e??void 0),resolveBaseUrl:async()=>i,headers:e.headers,tokenDerivedHeaders:e.tokenDerivedHeaders,allowAuthHeaderOverride:e.allowAuthHeaderOverride,logger:Ql(a)})}}function su(e,t,n,r,i,a,o){let s=t.contributes?.oauth;if(s?.length&&n)if(t.capabilities?.includes(`provider`))for(let t of s){let s=r.has(t.id)?t.id:V(e,t.id);if(f.includes(t.id)||n.isReservedId(t.id)){a.rejected.push({id:t.id,reason:`oauth id collides with builtin reserved OAuth provider`}),B.warn({pluginId:e,oauthId:t.id},`plugin oauth id collides with builtin reserved, rejected (R3)`);continue}let c=t.name??i.get(t.id)??t.id,l=t.kind===`pkce`?Ri({...t,id:s,name:c,tokenExchangeEncoding:t.tokenExchangeEncoding??`form`,assumesLoopbackAlways:t.assumesLoopbackAlways??!1,subscriptionScoped:t.subscriptionScoped??!1}):Li({...t,id:s,name:c,allowCustomDomain:t.allowCustomDomain??!1});if(o?.has(s))n.replace(l,e);else if(!n.register(l,e)){a.rejected.push({id:t.id,reason:`oauth registration rejected (id already claimed by another plugin or reserved)`});continue}}else{B.warn({pluginId:e},`plugin declares contributes.oauth but not capabilities:["provider"], skipped (fail-closed)`);for(let e of s)a.rejected.push({id:e.id,reason:`capability "provider" not declared`})}}function cu(e,t,n,r,i,a){let o=t.contributes?.providers;if(!o?.length)return;if(!t.capabilities?.includes(`provider`)){B.warn({pluginId:e},`plugin declares contributes.providers but not capabilities:["provider"], skipped (fail-closed)`);for(let e of o)i.rejected.push({id:e.id,reason:`capability "provider" not declared`});return}let s=new Set;for(let t of o){if(i.registered.includes(t.id)){i.rejected.push({id:t.id,reason:`duplicate provider id in manifest`}),B.warn({pluginId:e,providerId:t.id},`duplicate provider id in manifest, second entry rejected (review F5)`);continue}if(ae(t.id)){i.rejected.push({id:t.id,reason:`reserved builtin provider id`}),B.warn({pluginId:e,providerId:t.id},`plugin provider id collides with builtin, rejected (R3)`);continue}let o=t.preserveProviderId===!0,c=o?t.id:V(e,t.id),l=o?t.id:V(e,t.id);if(t.catalogOnly===!0){let a=l;if(t.oauthRef){let n=o?t.oauthRef:V(e,t.oauthRef);if(!r?.get(n)){i.rejected.push({id:t.id,reason:`oauthRef '${t.oauthRef}' not found in current plugin's oauth table (R7)`}),B.warn({pluginId:e,providerId:t.id,oauthRef:t.oauthRef},`catalog provider oauthRef not found, rejected (R7)`);continue}a=n}if(t.envKey&&!n.authStore.registerEnvKey(l,t.envKey,e)){i.rejected.push({id:t.id,reason:`envKey registration rejected (reserved or claimed)`});continue}if(!le({id:l,name:t.name,env:t.oauthRef?void 0:t.envKey,requiresIntranet:t.requiresIntranet===!0},e)){i.rejected.push({id:t.id,reason:`provider descriptor id already claimed`}),t.envKey&&n.authStore.unregisterEnvKey(l);continue}if(t.models?.length){let r=t.models.map(e=>iu(e,a,c,t.baseUrl??``,void 0,t.supportsTools,t.responseBodyPolicy)),i=n.modelRegistry.registerWithSource(r,e);for(let t of i)B.warn({pluginId:e,modelId:t},`plugin model id collides, rejected`)}i.registered.push(t.id);continue}let u=l;if(t.oauthRef){let n=o?t.oauthRef:V(e,t.oauthRef);if(!r?.get(n)){i.rejected.push({id:t.id,reason:`oauthRef '${t.oauthRef}' not found in current plugin's oauth table (R7: cross-plugin/invalid ref rejected)`}),B.warn({pluginId:e,providerId:t.id,oauthRef:t.oauthRef},`provider oauthRef not found in current plugin oauth table, rejected (R7)`);continue}u=n,t.envKey&&B.warn({pluginId:e,providerId:t.id},`provider declares both oauthRef and envKey; ignoring envKey (R2, oauth takes priority)`)}if(t.envKey&&!t.oauthRef&&!n.authStore.registerEnvKey(l,t.envKey,e)){i.rejected.push({id:t.id,reason:`envKey registration rejected (reserved or claimed by another plugin)`});continue}let d=t.baseUrl,f=t.wireApi;if(!d||!f){i.rejected.push({id:t.id,reason:`baseUrl and wireApi required for non-catalog providers`});continue}let p=t.modelsEndpoint?au(t.modelsEndpoint,l,c,t.baseUrl,t.headers):void 0,m=()=>{t.oauthRef&&r&&!s.has(u)&&r.unregister(u)};if(!le({id:l,name:t.name,env:t.oauthRef?void 0:t.envKey,buildModelsRequest:p,requiresIntranet:t.requiresIntranet===!0},e)){i.rejected.push({id:t.id,reason:`provider descriptor id already claimed by another plugin`}),t.envKey&&!t.oauthRef&&n.authStore.unregisterEnvKey(l),m();continue}t.allowAuthHeaderOverride&&B.warn({pluginId:e,providerId:t.id},`provider declares allowAuthHeaderOverride: custom headers may replace auth headers (RFC-270 D3)`);let h=ou(t,n.authStore,u,n.wireProtocolRegistry,d,f);if(!(a?.has(c)?n.providerRegistry.replacePluginProvider(c,h,e):n.providerRegistry.registerPluginProvider(c,h,e))){i.rejected.push({id:t.id,reason:`api already registered by another plugin or reserved`}),pe(l),t.envKey&&!t.oauthRef&&n.authStore.unregisterEnvKey(l),m();continue}if(t.models?.length){let r=t.models.map(e=>iu(e,u,c,d,t.imageConstraints,t.supportsTools,t.responseBodyPolicy)),i=n.modelRegistry.registerWithSource(r,e);for(let t of i)B.warn({pluginId:e,modelId:t},`plugin model id collides with an existing model, rejected (no silent override)`)}i.registered.push(t.id),t.oauthRef&&s.add(u)}}function lu(e,t,n,r,i){let a={registered:[],rejected:[]},o=n.authStore.oauth;return su(e,t,o,$l(t),new Map((t.contributes?.providers??[]).filter(e=>e.oauthRef&&e.name).map(e=>[e.oauthRef,e.name])),a,r),cu(e,t,n,o,a,i),a}async function uu(e,t,n,r,i){let a=n.authStore.oauth,o=$l(t),s=t.contributes?.oauth;if(s?.length&&a)for(let t of s){let n=o.has(t.id)?t.id:V(e,t.id);r?.has(n)||a.unregister(n)}let c=t.contributes?.providers;if(c?.length){for(let t of c){let r=t.preserveProviderId===!0?t.id:V(e,t.id);pe(r),t.envKey&&!t.oauthRef&&n.authStore.unregisterEnvKey(r)}await n.providerRegistry.unregisterBySource(e,i),n.modelRegistry.unregisterBySource(e)}}var du=class{axisName=`oauthProviderFactories`;oauthIdsByPlugin=new Map;constructor(e,t){this.authStore=e,this.logger=t}register(e){let t=e.loaded.module.oauthProviderFactories;if(!t||!this.authStore)return;if(!e.plugin.manifest.capabilities?.includes(`provider`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares oauthProviderFactories but not capabilities:["provider"], skipped (fail-closed)`);return}if(e.verdict.pendingCapabilities.includes(`provider`)){this.logger.warn({pluginId:e.plugin.id},`plugin capability "provider" not yet granted, skipping oauthProviderFactories (fail-closed)`);return}let n=new Set((e.plugin.manifest.contributes?.providers??[]).filter(e=>e.preserveProviderId===!0&&e.oauthRef).map(e=>e.oauthRef));for(let[r,i]of Object.entries(t)){let t=_c(e.plugin.id,i);if(!t)continue;let a=n.has(r)?r:V(e.plugin.id,r);if(t.id!==a){this.logger.warn({pluginId:e.plugin.id,name:r,expectedId:a,actualId:t.id},`plugin oauth provider id mismatch with manifest oauthRef/preserveProviderId, skipped`);continue}if(this.authStore.oauth.register(t,e.plugin.id)){let n=this.oauthIdsByPlugin.get(e.plugin.id)??new Set;n.add(t.id),this.oauthIdsByPlugin.set(e.plugin.id,n)}else this.logger.warn({pluginId:e.plugin.id,oauthId:t.id},`plugin oauthProviderFactory rejected (reserved or claimed)`)}}unregister(e){if(!this.authStore)return;let t=this.oauthIdsByPlugin.get(e);if(t){for(let e of t)this.authStore.oauth.unregister(e);this.oauthIdsByPlugin.delete(e)}}unregisterAll(){for(let e of[...this.oauthIdsByPlugin.keys()])this.unregister(e)}},fu=class{axisName=`providerFactories`;providerSourcePluginIds=new Set;modelSourcePluginIds=new Set;descriptorIdsByPlugin=new Map;constructor(e,t,n){this.providerRegistry=e,this.modelRegistry=t,this.logger=n}register(e){let t=e.loaded.module.providerFactories;if(!t||!this.providerRegistry)return;if(!e.plugin.manifest.capabilities?.includes(`provider`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares providerFactories but not capabilities:["provider"], skipped (fail-closed)`);return}if(e.verdict.pendingCapabilities.includes(`provider`)){this.logger.warn({pluginId:e.plugin.id},`plugin capability "provider" declared but not yet granted, skipping providerFactories (fail-closed, RFC-124 C2)`);return}let n=e.plugin.manifest.codeProviderModelsEndpoints??{},r=e.plugin.manifest.codeProviderModels??{};for(let[i,a]of Object.entries(t)){let t=nu(e.plugin.id,i,e.plugin.manifest);if(!this.providerRegistry.registerPluginProvider(t,gc(e.plugin.id,a),ru(e.plugin.id))){this.logger.warn({pluginId:e.plugin.id,api:t},`plugin providerFactory rejected (reserved builtin or claimed by another plugin)`);continue}this.providerSourcePluginIds.add(e.plugin.id);let o=n[i];if(o)if(le({id:t,buildModelsRequest:au(o,t,t)},ru(e.plugin.id))){let n=this.descriptorIdsByPlugin.get(e.plugin.id)??new Set;n.add(t),this.descriptorIdsByPlugin.set(e.plugin.id,n)}else this.logger.warn({pluginId:e.plugin.id,api:t},`plugin codeProviderModelsEndpoints descriptor rejected (reserved builtin or claimed by another plugin)`);let s=r[i];if(s?.models?.length&&this.modelRegistry){let n=s.models.map(e=>iu(e,t,t,s.baseUrl,s.imageConstraints,s.supportsTools,s.responseBodyPolicy)),r=this.modelRegistry.registerWithSource(n,e.plugin.id);this.modelSourcePluginIds.add(e.plugin.id),r.length>0&&this.logger.warn({pluginId:e.plugin.id,rejectedModelIds:r},`plugin codeProviderModels contains model ids already claimed by another source, rejected`)}}}async unregister(e){this.providerRegistry&&this.providerSourcePluginIds.has(e)&&(await this.providerRegistry.unregisterBySource(ru(e)),this.providerSourcePluginIds.delete(e)),this.modelRegistry&&this.modelSourcePluginIds.has(e)&&(this.modelRegistry.unregisterBySource(e),this.modelSourcePluginIds.delete(e));let t=this.descriptorIdsByPlugin.get(e);if(t){for(let e of t)pe(e);this.descriptorIdsByPlugin.delete(e)}}async unregisterAll(){let e=new Set([...this.providerSourcePluginIds,...this.modelSourcePluginIds,...this.descriptorIdsByPlugin.keys()]);for(let t of e)await this.unregister(t)}},pu=class{axisName=`wireProtocols`;wireProtocolSourcePluginIds=new Set;cacheReportingApisByPlugin=new Map;constructor(e,t){this.wireProtocolRegistry=e,this.logger=t}register(e){let t=e.loaded.module.wireProtocols;if(!(!t||!this.wireProtocolRegistry)){if(!e.plugin.manifest.capabilities?.includes(`wire-protocol`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares wireProtocols but not capabilities:["wire-protocol"], skipped (fail-closed)`);return}if(e.verdict.pendingCapabilities.includes(`wire-protocol`)){this.logger.warn({pluginId:e.plugin.id},`plugin capability "wire-protocol" declared but not yet granted, skipping wireProtocols (fail-closed, RFC-124 C2 pattern)`);return}for(let[n,r]of Object.entries(t))if(this.wireProtocolRegistry.register(n,r,e.plugin.id)){if(this.wireProtocolSourcePluginIds.add(e.plugin.id),r.meta?.reportsCacheTokens){ce(n);let t=this.cacheReportingApisByPlugin.get(e.plugin.id)??new Set;t.add(n),this.cacheReportingApisByPlugin.set(e.plugin.id,t)}}else this.logger.warn({pluginId:e.plugin.id,wireApi:n},`plugin wireProtocol rejected (already registered by another plugin, first-win)`)}}unregister(e){this.wireProtocolRegistry&&this.wireProtocolSourcePluginIds.has(e)&&(this.wireProtocolRegistry.unregisterBySource(e),this.wireProtocolSourcePluginIds.delete(e));let t=this.cacheReportingApisByPlugin.get(e);if(t){for(let e of t)fe(e);this.cacheReportingApisByPlugin.delete(e)}}unregisterAll(){let e=new Set([...this.wireProtocolSourcePluginIds,...this.cacheReportingApisByPlugin.keys()]);for(let t of e)this.unregister(t)}},mu=class{axisName=`tools`;toolSourcePluginIds=new Set;constructor(e,t){this.toolRegistry=e,this.logger=t}register(e){let t=e.loaded.module.tools;if(!t?.length||!this.toolRegistry)return;if(!e.plugin.manifest.capabilities?.includes(`tools`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares tools but not capabilities:["tools"], skipped (fail-closed)`);return}if(e.verdict.pendingCapabilities.includes(`tools`)){this.logger.warn({pluginId:e.plugin.id},`plugin capability "tools" declared but not yet granted, skipping tools (fail-closed, RFC-124 C2)`);return}let n=this.toolRegistry,r={workspaceDir:e.workspaceDir,logger:{info:t=>this.logger.info({pluginId:e.plugin.id},t),warn:t=>this.logger.warn({pluginId:e.plugin.id},t),error:t=>this.logger.error({pluginId:e.plugin.id},t)},host:e.host,storage:e.storage},i=t.map(t=>yc(e.plugin.id,t,r)).filter(e=>e!==null).filter(t=>n.has(t.name)?(this.logger.warn({pluginId:e.plugin.id,tool:t.name},`plugin tool name collides with an existing tool, rejected (R3, no silent override)`),!1):!0);i.length>0&&(n.register(i,{preset:`full`,source:e.plugin.id}),this.toolSourcePluginIds.add(e.plugin.id))}unregister(e){!this.toolRegistry||!this.toolSourcePluginIds.has(e)||(this.toolRegistry.unregisterBySource(e),this.toolSourcePluginIds.delete(e))}unregisterAll(){for(let e of[...this.toolSourcePluginIds])this.unregister(e)}};const hu=`[plugin]`;function gu(e,t,n){let r=n.name?.trim()||n.key;return`${hu} ${e}:${t}:${n.key} — ${r}`}function _u(e,t,n){let r=e.subscriber;return!r||r.kind!==`plugin-service`||r.pluginId!==t||r.serviceId!==n?!1:e.name.startsWith(hu)}function vu(e,t,n){let r=`${hu} ${t}:${n}:`;if(!e.name.startsWith(r))return;let i=e.name.slice(r.length),a=i.indexOf(` — `);if(!(a<=0))return i.slice(0,a)}function yu(e){let{port:t,logger:n,pluginId:r,serviceId:i}=e,a={added:0,updated:0,removed:0},o=new Map;for(let t of e.declared){let e=t?.key?.trim(),a=t?.cron?.trim();if(!e||!a){n.warn({pluginId:r,serviceId:i,key:t?.key},`plugin schedule subscription missing key or cron, skipped (RFC-327 D2)`);continue}if(o.has(e)){n.warn({pluginId:r,serviceId:i,key:e},`duplicate plugin schedule subscription key, later declaration ignored`);continue}o.set(e,{...t,key:e,cron:a})}let s=new Map;for(let e of t.list()){if(!_u(e,r,i))continue;let t=vu(e,r,i);t!==void 0&&s.set(t,e)}for(let[e,c]of o){let o=gu(r,i,c),l=s.get(e);if(!l){try{t.add({name:o,prompt:`plugin service subscription (${r}:${i}:${e})`,cronExpression:c.cron,recurring:!0,origin:`user`,subscriber:{kind:`plugin-service`,pluginId:r,serviceId:i}}),a.added+=1}catch(t){n.warn({pluginId:r,serviceId:i,key:e,err:t instanceof Error?t.message:String(t)},`failed to register plugin schedule subscription`)}continue}(l.cronExpression!==c.cron||l.name!==o)&&t.update(l.id,{cronExpression:c.cron,name:o})&&(a.updated+=1)}for(let[e,n]of s)o.has(e)||t.remove(n.id)&&(a.removed+=1);return a}function bu(e){let{port:t,pluginId:n}=e,r=0;for(let e of t.list()){let i=e.subscriber;!i||i.kind!==`plugin-service`||i.pluginId!==n||e.name.startsWith(hu)&&t.remove(e.id)&&(r+=1)}return r}var xu=class{axisName=`services`;startedByPlugin=new Map;scheduleDeclarations=new Map;constructor(e){this.deps=e}async register(e){let t=e.loaded.module.services;if(!t?.length)return;if(!e.plugin.manifest.capabilities?.includes(`service`)){this.deps.logger.warn({pluginId:e.plugin.id},`plugin declares services but not capabilities:["service"], skipped (fail-closed, RFC-287 D-M3-1)`);return}if(e.verdict.pendingCapabilities.includes(`service`)){this.deps.logger.warn({pluginId:e.plugin.id},`plugin capability "service" declared but not yet granted, skipping services (fail-closed)`);return}let n=e.loaded.compiledPath;if(!n){this.deps.logger.warn({pluginId:e.plugin.id},`plugin declares services but has no compiled entry path; services need a compiled module to run in the service worker (skipped)`);return}let r=this.startedByPlugin.get(e.plugin.id)??[];for(let i of t){if(!i?.id)continue;let t=this.deps.getWorkspaceKey(),a=this.deps.hasStorageCapability(e.plugin.id),{error:o}=await this.deps.pool.start({pluginId:e.plugin.id,serviceId:i.id,compiledPath:n,workspaceDir:this.deps.workspaceDir,workspaceKey:t,factoryCtx:{pluginId:e.plugin.id,pluginDir:e.plugin.dir,workspaceDir:this.deps.workspaceDir},hostCapabilities:this.deps.hostCapabilitiesFor(e.plugin.id),storageDir:a?this.deps.storageDirFor(e.plugin.id,t):``,hasStorageCapability:a,bridge:this.deps.bridgeFor(e.plugin.id)});o&&this.deps.logger.warn({pluginId:e.plugin.id,serviceId:i.id,err:o},`plugin service failed to start`),r.push(i.id),this.scheduleDeclarations.set(`${e.plugin.id}:${i.id}`,i.schedules??[]);let s=this.deps.getSchedulePort?.();if(i.schedules?.length){if(!s)this.deps.logger.debug({pluginId:e.plugin.id,serviceId:i.id,count:i.schedules.length},`plugin declares schedule subscriptions but no scheduler in this process, skipped (RFC-327 D2 boundary)`);else if(!o){let t=yu({port:s,logger:this.deps.logger,pluginId:e.plugin.id,serviceId:i.id,declared:i.schedules});(t.added||t.updated||t.removed)&&this.deps.logger.info({pluginId:e.plugin.id,serviceId:i.id,...t},`plugin schedule subscriptions reconciled`)}}else s&&yu({port:s,logger:this.deps.logger,pluginId:e.plugin.id,serviceId:i.id,declared:[]})}r.length>0&&this.startedByPlugin.set(e.plugin.id,r)}async unregister(e){if(!this.startedByPlugin.has(e))return;this.startedByPlugin.delete(e);for(let t of[...this.scheduleDeclarations.keys()])t.startsWith(`${e}:`)&&this.scheduleDeclarations.delete(t);let t=this.deps.getSchedulePort?.();if(t){let n=bu({port:t,pluginId:e});n>0&&this.deps.logger.info({pluginId:e,removed:n},`plugin schedule subscriptions revoked`)}await this.deps.pool.stopPlugin(e)}async unregisterAll(){for(let e of[...this.startedByPlugin.keys()])await this.unregister(e)}reconcileAllSchedules(){let e=this.deps.getSchedulePort?.();if(e)for(let[t,n]of this.startedByPlugin)for(let r of n){let n=this.scheduleDeclarations.get(`${t}:${r}`);if(n===void 0)continue;let i=yu({port:e,logger:this.deps.logger,pluginId:t,serviceId:r,declared:n});(i.added||i.updated||i.removed)&&this.deps.logger.info({pluginId:t,serviceId:r,...i,source:`scheduler-ready reconcile`},`plugin schedule subscriptions reconciled (M3 scheduler-ready)`)}}};const Su=/^[a-z0-9]+(?:-[a-z0-9]+)*$/,Cu=x(n,`plugin-state`);function wu(e){let t=Tu(e);try{return Xr(t,{recursive:!0,force:!0}),{removed:!D(t),dir:t}}catch{return{removed:!1,dir:t}}}function Tu(e){if(!Su.test(e))throw Error(`invalid pluginId for scoped storage: ${e} (must be kebab-case)`);return x(Cu,e)}var Eu=class{persistence;baseDir;pluginId;workspaceKey;constructor(e,t){if(this.pluginId=e,this.workspaceKey=t,!Su.test(e))throw Error(`invalid pluginId for scoped storage: ${e} (must be kebab-case)`);if(typeof t!=`string`||t.length===0||t.includes(`/`)||t.includes(`\\`)||t.includes(`..`))throw Error(`invalid workspaceKey for scoped storage: ${t}`);if(s()){this.baseDir=`:memory:/plugin-state/${e}/${t}`,this.persistence=sn({type:`memory`});return}let n=S(x(Tu(e),t));O(n,{recursive:!0});let r=Jr(n),i=Jr(Cu);if(r!==i&&!r.startsWith(i+`/`))throw Error(`scoped storage path escapes plugin-state root: ${r}`);this.baseDir=n,this.persistence=sn({type:`file`,baseDir:n})}async save(e,t){await this.persistence.save({id:e,data:t,version:1,metadata:{}})}async load(e){let t=await this.persistence.load(e);return t?t.data:null}delete(e){return this.persistence.delete(e)}list(){return this.persistence.list()}};function Du(e){let t=new Set([...e.manifest.codeProviderIds??[],...(e.manifest.contributes?.providers??[]).filter(e=>e.preserveProviderId===!0).map(e=>e.id)]),n=`${e.id}:`;return e=>t.has(e)||e.startsWith(n)}function Ou(e,t,n){let r=e.manifest.capabilities??[],i={},a=!1,o=n.startPluginJob;r.includes(`agent.dispatch`)&&!t.pendingCapabilities.includes(`agent.dispatch`)&&o?(i.startJob=async t=>{let r=n.getSessionId?.();if(!r)throw Error(`agent.dispatch unavailable: no active session to attach the job to`);return{jobId:o({pluginId:e.id,title:t.title,prompt:t.prompt,sessionId:r}).id}},a=!0):r.includes(`agent.dispatch`)&&n.logger.warn({pluginId:e.id,pending:t.pendingCapabilities.includes(`agent.dispatch`)},`plugin declares agent.dispatch but it is not available (not yet granted, or host provides no job dispatcher) — skipping (fail-closed, RFC-287 D2)`);let s=n.getSessionMessages,c=Au(n);r.includes(`session.read`)&&!t.pendingCapabilities.includes(`session.read`)&&s?(i.readTranscript=async t=>{if(!c.isSessionAuthorized(e.id,t.sessionId))throw Error(`session not authorized for this plugin`);let n=s(t.sessionId);if(!n)throw Error(`session not found`);if(!c.tryConsumeRead(e.id))throw Error(`readTranscript quota exceeded for this notification`);return fl(n,t.sinceIndex??0,500)},a=!0):r.includes(`session.read`)&&n.logger.warn({pluginId:e.id,pending:t.pendingCapabilities.includes(`session.read`)},`plugin declares session.read but it is not available (not yet granted, or host provides no transcript source) — skipping (fail-closed, RFC-318 D2)`);let l=n.completeText;r.includes(`llm.complete`)&&!t.pendingCapabilities.includes(`llm.complete`)&&l?(i.complete=async t=>{if(t.prompt.length>32e3)throw Error(`prompt exceeds 32000 chars limit`);let n=c.tryConsumeLlm(e.id);if(!n.ok)throw Error(`llm.complete quota exceeded (${n.reason})`);let r=Math.min(t.maxTokens??2048,2048);return l(t.prompt,{maxTokens:r})},a=!0):r.includes(`llm.complete`)&&n.logger.warn({pluginId:e.id,pending:t.pendingCapabilities.includes(`llm.complete`)},`plugin declares llm.complete but it is not available (not yet granted, or host provides no model caller) — skipping (fail-closed, RFC-318 D2)`);let u=n.askUser;r.includes(`user.ask`)&&!t.pendingCapabilities.includes(`user.ask`)&&u?(i.ask=async t=>u(e.id,{header:String(t.header??``),question:String(t.question??``),background:String(t.background??``),recommendation:String(t.recommendation??``),...Array.isArray(t.options)?{options:t.options}:{},...t.allowFreeform===void 0?{}:{allowFreeform:!!t.allowFreeform},...t.multiSelect===void 0?{}:{multiSelect:!!t.multiSelect},...Array.isArray(t.evidence)?{evidence:t.evidence.map(String)}:{}}),a=!0):r.includes(`user.ask`)&&n.logger.warn({pluginId:e.id,pending:t.pendingCapabilities.includes(`user.ask`)},`plugin declares user.ask but it is not available (not yet granted, or host provides no UI sink) — skipping (fail-closed, RFC-344 M3)`);let d=n.notifyUser;return r.includes(`user.notify`)&&!t.pendingCapabilities.includes(`user.notify`)&&d?(i.notify=async t=>{if(!c.tryConsumeNotify(e.id)){n.logger.debug({pluginId:e.id,code:t.code},`plugin user.notify dropped: rate limit exceeded (silent by design, RFC-327 D3)`);return}let r=t.message.replace(/[\u0000-\u001f\u007f-\u009f\u200e\u200f\u202a-\u202e\u2066-\u2069]/g,` `).slice(0,500);d({pluginId:e.id,level:t.level,code:t.code.slice(0,120),message:r})},a=!0):r.includes(`user.notify`)&&n.logger.warn({pluginId:e.id,pending:t.pendingCapabilities.includes(`user.notify`)},`plugin declares user.notify but it is not available (not yet granted, or host provides no UI sink) — skipping (fail-closed, RFC-327 D3)`),a?i:void 0}const ku=new WeakMap;function Au(e){if(e.capabilityQuota)return e.capabilityQuota;let t=ku.get(e);return t||(t=new Ec,ku.set(e,t)),t}const ju=new Map([[`oauthProviderFactories`,`provider`],[`providerFactories`,`provider`],[`wireProtocols`,`wire-protocol`]]);function Mu(e){let t=e.manifest.contributes;return!t||typeof t!=`object`?[]:Object.keys(t)}var Nu=class e{contributesSnapshot=new Map;static DEACTIVATE_TIMEOUT_MS=5e3;hooksAxis;monitorsAxis;feedbackAxis;sigilAxis;computedCommandsAxis;computedAgentsAxis;computedSkillsAxis;oauthProviderAxis;codeProviderAxis;wireProtocolAxis;toolsAxis;servicesAxis;axisHandlers;firedEvents=new Set;deferredIds=new Set;loadedModules=new Map;constructor(e){this.deps=e,this.hooksAxis=new Rl(e.hookRegistry),this.monitorsAxis=new zl(e.hookRegistry,e.logger),this.feedbackAxis=new Bl(e.feedbackRegistry,e.logger),this.sigilAxis=new Jl(e.sigilResolverRegistry,e.pluginInput,e.logger),this.computedCommandsAxis=new Yl,this.computedAgentsAxis=new Xl,this.computedSkillsAxis=new Zl(e.skillRegistry),this.oauthProviderAxis=new du(e.authStore,e.logger),this.codeProviderAxis=new fu(e.providerRegistry,e.modelRegistry,e.logger),this.wireProtocolAxis=new pu(e.wireProtocolRegistry,e.logger),this.toolsAxis=new mu(e.toolRegistry,e.logger),this.servicesAxis=new xu({pool:e.servicePool??ol(),logger:e.logger,workspaceDir:e.workspaceDir,getWorkspaceKey:()=>e.getWorkspaceKey?.()??`default`,bridgeFor:t=>{let n=e.activePlugins().find(e=>e.id===t);if(!n)return{};let r=Ou(n,E(n),e);if(!r)return{};let i={};return r.startJob&&(i.startJob=r.startJob),r.readTranscript&&(i.readTranscript=r.readTranscript),r.complete&&(i.complete=r.complete),r.notify&&(i.notify=r.notify),i},hostCapabilitiesFor:t=>{let n=e.activePlugins().find(e=>e.id===t);if(!n)return[];let r=Ou(n,E(n),e);if(!r)return[];let i=[];return r.startJob&&i.push(`startJob`),r.readTranscript&&i.push(`readTranscript`),r.complete&&i.push(`complete`),r.notify&&i.push(`notify`),i},storageDirFor:(e,t)=>new Eu(e,t).baseDir,hasStorageCapability:t=>!!e.activePlugins().find(e=>e.id===t)?.manifest.capabilities?.includes(`storage`),...e.getSchedulePort?{getSchedulePort:e.getSchedulePort}:{}}),this.axisHandlers=[this.hooksAxis,this.monitorsAxis,this.feedbackAxis,this.sigilAxis,this.computedCommandsAxis,this.computedAgentsAxis,this.computedSkillsAxis,this.oauthProviderAxis,this.codeProviderAxis,this.wireProtocolAxis,this.toolsAxis,this.servicesAxis]}get deferredPluginIds(){return this.deferredIds}emitMonitorEvent(e){return this.monitorsAxis.dispatch(e)}reconcileServiceSchedules(){this.servicesAxis.reconcileAllSchedules()}get monitorPluginIds(){return this.monitorsAxis.monitorPluginIds}async activateOn(e,t){return this.firedEvents.add(e),this.reload(t)}get commands(){return this.computedCommandsAxis.getComputedCommands()}async callOnDeactivate(t,n){let r;try{await Promise.race([n(),new Promise((n,i)=>{r=setTimeout(()=>{i(Error(`plugin "${t}" onDeactivate timed out after ${e.DEACTIVATE_TIMEOUT_MS}ms`))},e.DEACTIVATE_TIMEOUT_MS),r.unref?.()})])}catch(e){this.deps.logger.warn({pluginId:t,err:String(e)},`plugin onDeactivate failed or timed out`)}finally{r!==void 0&&clearTimeout(r)}}async unregisterAllAxes(){for(let e of this.axisHandlers)await e.unregisterAll()}async unregisterPluginAxes(e,t){let n=t?E(t):void 0;for(let r of this.axisHandlers){let i=ju.get(r.axisName);i!==void 0&&t!==void 0&&n!==void 0&&t.manifest.capabilities?.some(e=>e===i)&&!n.gated&&!n.pendingCapabilities.includes(i)||await r.unregister(e)}Au(this.deps).reset(e)}pluginSignature(e){let t=E(e),n=`${t.gated?`gated`:`ok`}:${[...t.pendingCapabilities].sort().join(`,`)}`,r=`nofile`;for(let t of[`plugin.ts`,`plugin.tsx`])try{let n=Zr(x(e.dir,t));r=`${t}:${n.mtimeMs}:${n.size}`;break}catch{}return`${JSON.stringify(e.manifest)}|${n}|${r}`}async reload(e){let t=this.deps.activePlugins(),n=new Map(t.map(e=>[e.id,e])),r=new Map(t.map(e=>[e.id,this.pluginSignature(e)])),i=[],a=new Set,o=new Set;for(let[e,t]of this.loadedModules)n.get(e)?r.get(e)!==t.signature&&(t.module.module.onDeactivate&&i.push({pluginId:e,onDeactivate:t.module.module.onDeactivate}),o.add(e)):(t.module.module.onDeactivate&&i.push({pluginId:e,onDeactivate:t.module.module.onDeactivate}),a.add(e));for(let{pluginId:e,onDeactivate:t}of i)await this.callOnDeactivate(e,t);for(let e of a)await this.unregisterPluginAxes(e,void 0),this.loadedModules.delete(e);for(let e of o)await this.unregisterPluginAxes(e,n.get(e));this.computedAgentsAxis.setExistingAgentNames(e);let s=new Set;for(let e of this.deps.activePlugins()){if(!Ll(ir(e.manifest),this.firedEvents)){s.add(e.id);continue}if(this.loadedModules.get(e.id)&&!o.has(e.id))continue;let t={pluginId:e.id,pluginDir:e.dir,workspaceDir:this.deps.workspaceDir,callMcpTool:(e,t,n)=>this.deps.callMcpTool(e,t,n),logger:{debug:t=>{this.deps.logger.debug({pluginId:e.id},t)},info:t=>{this.deps.logger.info({pluginId:e.id},t),sc(e.id,`info`,t)},warn:t=>{this.deps.logger.warn({pluginId:e.id},t),sc(e.id,`warn`,t)},error:t=>{this.deps.logger.error({pluginId:e.id},t),sc(e.id,`error`,t)}},getWireProtocol:e=>this.deps.wireProtocolRegistry?.get(e),resolveProviderCredential:(()=>{let t=Du(e);return e=>t(e)?this.deps.providerRegistry?.resolveAccessKey(e)??Promise.resolve(null):Promise.resolve(null)})(),resolveProviderAuth:(()=>{let t=Du(e);return e=>t(e)?this.deps.providerRegistry?.resolveAuth(e)??Promise.resolve(null):Promise.resolve(null)})(),host:Ou(e,E(e),this.deps),listActivePlugins:()=>this.deps.activePlugins().map(e=>({id:e.id,version:e.manifest.version,capabilities:e.manifest.capabilities??[],contributes:this.contributesSnapshot.get(e.id)??Mu(e)}))},n=this.deps.useIsolatedLoading!==!1&&Pl(e)?await Il(e,t,void 0,this.deps.onPluginLoadError):await Zc(e,t,this.deps.onPluginLoadError);if(!n)continue;let i=E(e);if(i.gated){this.deps.logger.warn({pluginId:e.id},`project plugin not trusted, skipping code axes (fail-closed, RFC-124 C1)`);continue}let a;if(e.manifest.capabilities?.includes(`storage`))try{let t=this.deps.getWorkspaceKey?.()??Si;a=new Eu(e.id,t)}catch(t){this.deps.logger.warn({pluginId:e.id,err:String(t)},`failed to construct scoped storage for plugin, storage capability unavailable`)}let c={plugin:e,verdict:i,loaded:n,host:Ou(e,i,this.deps),workspaceDir:this.deps.workspaceDir,storage:a};for(let e of this.axisHandlers)await e.register(c);if(n.module.onActivate)try{await n.module.onActivate()}catch(t){this.deps.logger.warn({pluginId:e.id,err:String(t)},`plugin onActivate threw`)}this.contributesSnapshot.set(e.id,Mu(e)),this.loadedModules.set(e.id,{module:n,manifest:e.manifest,signature:r.get(e.id)??this.pluginSignature(e)})}return this.deferredIds=s,this.computedAgentsAxis.getAppendedAgents()}async cleanup(){for(let[e,t]of this.loadedModules)t.module.module.onDeactivate&&await this.callOnDeactivate(e,t.module.module.onDeactivate);this.loadedModules.clear(),await this.unregisterAllAxes();let e=Au(this.deps);for(let t of this.deps.activePlugins())e.reset(t.id);this.firedEvents.clear()}};const Pu=C(`@x-otto/coding:panel-compiler`),Fu=e(import.meta.url);function Iu(e){let t=x(e,`panels`);if(!D(t))return{compiled:[],errors:[],skipped:!0};let n;try{n=Kr(t).filter(e=>e.endsWith(`.tsx`))}catch{return{compiled:[],errors:[],skipped:!0}}if(n.length===0)return{compiled:[],errors:[],skipped:!0};let r=x(e,`panels-dist`);O(r,{recursive:!0});let i=Wr(x(Be(),`otto-panel-shims-`)),a=x(i,`react-shim.js`),o=x(i,`ink-shim.js`),s=x(i,`tui-shim.js`);A(a,`const R = globalThis.React
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;dirtyPluginIds=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,n){let r=[],i=t?E(t):void 0;for(let n of this.axisHandlers){let a=Vu.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)`)}}Bu(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=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||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(!ql(ir(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),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 l={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(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,Hu(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=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
368
368
  if (!R) throw new Error('otto panel: globalThis.React 未注入(TUI 须在加载面板前 import panel-globals)')
369
369
  export default R
370
370
  export const useState = R.useState, useEffect = R.useEffect, useCallback = R.useCallback,
@@ -389,26 +389,26 @@ export const ScrollIndicatorBelow = T.ScrollIndicatorBelow
389
389
  export const Tabable = T.Tabable
390
390
  export const useTabable = T.useTabable
391
391
  export const TabScope = T.TabScope
392
- `);let c=[],l=[],{buildSync:u}=Fu(`esbuild`);for(let i of n){let n=i.replace(/\.tsx$/,`.mjs`);try{u({entryPoints:[x(t,i)],outfile:x(r,n),bundle:!0,format:`esm`,platform:`node`,alias:{react:a,ink:o,"@x-otto/tui":s},jsx:`transform`,banner:{js:`const { usePluginData } = globalThis.__ottoPanelRuntime || {};const { claim: claimPanelFocus, release: releasePanelFocus, usePanelFocusClaimed, requestClose: requestPanelClose, setHint: setPanelHint } = globalThis.__ottoPanelFocusBridge || { claim(){}, release(){}, usePanelFocusClaimed: () => true, requestClose(){}, setHint(){} };const { getTheme, getFigures } = globalThis.__ottoPanelTheme || { getTheme: () => ({ text: undefined, inactive: '#9498B8', secondary: '#C8CBDB', success: '#7EE095', error: '#FF9592', warning: '#FFC966', special: '#DD78C9', selection: '#4D7CFF', focusBorder: '#4D7CFF', panelBorder: '#9498B8' }), getFigures: () => ({ check: '✓', cross: '✗', pointer: '▶', bullet: '●' }) };const { SPACING, LAYOUT } = globalThis.__ottoPanelSpacing || { SPACING: { none: 0, tight: 1, section: 2, loose: 4 }, LAYOUT: { contentInset: 4, borderInset: 2 } };const { t: t, i18next: panelI18next } = globalThis.__ottoPanelI18n || { t: (k) => k, i18next: { language: 'en' } };const { usePanelBackend } = globalThis.__ottoPanelBackendRuntime || { usePanelBackend: () => ({ call: () => Promise.reject(new Error('otto panel: backend runtime not installed')), cancel(){}, state: undefined, status: 'disabled' }) };`},logLevel:`silent`}),c.push(x(`panels-dist`,n))}catch(t){l.push({entry:i,message:t.message}),Pu.warn({pluginDir:e,entry:i,err:String(t)},`panel compile failed`)}}return Pu.info({pluginDir:e,compiled:c.length,errors:l.length},`compiled plugin panels`),{compiled:c,errors:l,skipped:!1}}const Lu=C(`@x-otto/coding:plugin-install`);function Ru(e){let t=[];return(async()=>{try{let t=await Hc(e);t&&Lu.info({pluginDir:e,outfile:t},`plugin code module compiled at install time`)}catch(n){let r=n instanceof Error?n.message:String(n);Lu.warn({pluginDir:e,err:r},`plugin.ts compile failed at install time (fail-soft, will retry at load time)`),t.push(`plugin.ts 编译失败:${r}(不影响安装,otto 启动时会自动重试编译)`)}try{let{errors:n,skipped:r}=Iu(e);if(!r&&n.length>0)for(let r of n)Lu.warn({pluginDir:e,entry:r.entry,err:r.message},`plugin panel compile failed at install time`),t.push(`面板 ${r.entry} 编译失败:${r.message}`)}catch(n){let r=n instanceof Error?n.message:String(n);Lu.warn({pluginDir:e,err:r},`plugin panel compilation crashed unexpectedly at install time`),t.push(`面板编译异常:${r}`)}})().then(()=>t)}function zu(e){try{return Ur(e).isSymbolicLink()}catch{return!1}}function Bu(e){let t=k(e,`utf8`),n=[],r=!1;for(let e of t.split(`
393
- `)){let t=e.trim();if(t.startsWith(`packages:`)){r=!0;continue}if(r){let e=t.match(/^-\s*['"]?([^'"]+)['"]?(?:\s+#.*)?$/);if(e?.[1]){n.push(e[1]);continue}t.length>0&&!t.startsWith(`-`)&&(r=!1)}}return n}function Vu(e,t){let n=S(e,t.endsWith(`/*`)?t.slice(0,-2):t);if(!n.startsWith(e.endsWith(`/`)?e:e+`/`)&&n!==e)return[];if(!t.endsWith(`/*`))return D(n)?[n]:[];if(!D(n))return[];try{return Kr(n,{withFileTypes:!0}).filter(e=>e.isDirectory()).map(e=>x(n,e.name))}catch{return[]}}function Hu(e,t){let n=a(t);if(!n)return;let r=Bu(x(n,`pnpm-workspace.yaml`));for(let t of r)for(let r of Vu(n,t)){let t=x(r,`package.json`);if(!D(t))continue;try{if(JSON.parse(k(t,`utf8`)).name===e)return r}catch{}let n=x(r,T);if(D(n))try{if($n(k(n,`utf8`),n)?.id===e)return r}catch{}}}function Uu(t,n=process.cwd()){let r=[Ii(x(n,`__resolve__.js`)).href,import.meta.url];for(let n of r)try{return b(e(n).resolve(`${t}/package.json`))}catch{}return Hu(t,b(Fi(import.meta.url)))??Hu(t,n)}async function Wu(e){let t=Uu(e.pkg,e.cwd);if(!t)throw Error(`无法解析包 ${e.pkg}(未安装或不可从当前位置解析)。`);let r=x(t,T);if(!D(r))throw Error(`${e.pkg} 不是 otto 插件:缺 ${T}(RFC-044 自描述)。`);let i=$n(k(r,`utf8`),r);if(!i)throw Error(`${e.pkg} 的 ${T} 非法(需合法 kebab-case id)。`);let a=e.ottoDir??n,o=x(a,`plugins`,i.id);O(x(a,`plugins`),{recursive:!0});let s=S(t);if(zu(o)){try{if(S(qr(o))===s){let e=await Ru(t);return{id:i.id,packageDir:t,dir:o,created:!1,compileWarnings:e,version:i.version}}}catch{}$r(o)}else if(D(o))if((D(x(o,T))?$n(k(x(o,T),`utf8`),o):null)?.id===i.id)Xr(o,{recursive:!0,force:!0});else throw Error(`目标已存在且非本插件,拒绝覆盖:${o}`);Qr(s,o);let c=await Ru(t);return{id:i.id,packageDir:t,dir:o,created:!0,compileWarnings:c,version:i.version}}async function Gu(e){let t=x(e,T);if(!D(t))throw Error(`${e} 不是 otto 插件:缺 ${T}`);let r=$n(k(t,`utf8`),t);if(!r)throw Error(`${e} 的 ${T} 非法。`);let i=x(n,`plugins`,r.id);O(x(n,`plugins`),{recursive:!0});let a=S(e);if(zu(i)){try{if(S(qr(i))===a){let t=await Ru(e);return{id:r.id,packageDir:e,dir:i,created:!1,compileWarnings:t,version:r.version}}}catch{}$r(i)}else if(D(i))if((D(x(i,T))?$n(k(x(i,T),`utf8`),i):null)?.id===r.id)Xr(i,{recursive:!0,force:!0});else throw Error(`目标已存在且非本插件,拒绝覆盖:${i}`);Qr(a,i);let o=await Ru(e);return{id:r.id,packageDir:e,dir:i,created:!0,compileWarnings:o,version:r.version}}function Ku(e,t){return[...e.filter(e=>e.id!==t.id),t]}function qu(e,t){return e.filter(e=>e.id!==t)}async function Ju(e,t,n=()=>Date.now()){let r=Ku(e.get(`installed_plugins`)??[],{id:t.id,source:t.source,sourceSpec:t.sourceSpec,installedAt:n(),version:t.version,scope:t.scope,capabilities:t.capabilities});await e.persist({installed_plugins:r})}async function Yu(e,t){let n={},r=!1,i=e.get(`installed_plugins`)??[];i.some(e=>e.id===t)&&(n.installed_plugins=qu(i,t),r=!0);let a=e.get(`disabled_plugins`)??[];a.includes(t)&&(n.disabled_plugins=a.filter(e=>e!==t),r=!0);let o=e.get(`plugin_lifecycle`)?.setupDone??[];o.some(e=>e.id===t)&&(n.plugin_lifecycle={setupDone:o.filter(e=>e.id!==t)},r=!0),r&&await e.persist(n)}function Xu(e,t){let n=[],r=new Set(e.filter(e=>e.scope===`user`).map(e=>e.id)),i=t.filter(e=>e.scope===`global`),a=new Set(i.map(e=>e.id));for(let e of i)r.has(e.id)||n.push({kind:`missing-on-disk`,id:e.id,message:`${e.id}: 清单记录已安装,但磁盘 symlink 缺失,建议重装(otto extension install ${e.id})`});for(let t of e)t.scope===`user`&&!a.has(t.id)&&n.push({kind:`missing-in-registry`,id:t.id,message:`${t.id}: 磁盘已安装,但清单未记录(可能是旧版本 otto 安装的),建议重新安装以补登记`});return n}var Zu=class{lastTopoSort;lastEngineIncompatible=new Map;warnedTopoIssues=new Set;warnedEngineIncompatible=new Set;resolve(e){let{compatible:t,incompatible:n}=Kn(Vn({cwd:e.workspaceDir,homedir:e.homedir??ze(),disabled:e.disabledPlugins,bundledDirs:e.bundledDirs}));this.lastEngineIncompatible=n;let r=or(t);return this.lastTopoSort=r,r.ordered}async diagnose(e,t){for(let[t,n]of this.lastEngineIncompatible)this.warnedEngineIncompatible.has(t)||e.warn({pluginId:t,requiredRange:n,hostApiVersion:On},`plugin engines.otto not satisfied by host, skipping plugin (fail-closed, RFC-148 M0)`);this.warnedEngineIncompatible=new Set(this.lastEngineIncompatible.keys());let n=this.lastTopoSort;if(!n)return;let r=new Set([...n.cyclic.keys(),...n.missingDeps.keys()]);for(let[t,r]of n.cyclic)this.warnedTopoIssues.has(t)||e.warn({pluginId:t,cyclePath:r},`plugin dependency cycle detected, skipping cyclic plugin (fail-closed, RFC-132 D5)`);for(let[r,i]of n.missingDeps)if(!this.warnedTopoIssues.has(r)){e.warn({pluginId:r,missingDeps:i},`plugin dependencies missing, skipping plugin (fail-closed, RFC-132 D5)`);for(let n of i)try{let i=await Wu({pkg:n});t&&await Ju(t,{id:i.id,source:`npm`,sourceSpec:n,version:i.version,scope:`global`}),e.info({pluginId:r,missingId:n},`missing plugin dependency auto-installed (RFC-163 D5), will be picked up on next discovery`)}catch(t){e.warn({pluginId:r,missingId:n,err:t instanceof Error?t.message:String(t)},`automatic install of missing plugin dependency failed, manual "otto extension install" may be required (RFC-163 D5)`)}}this.warnedTopoIssues=r}};function Qu(e,t){let{model:n,authStore:r,modelRegistry:i,providerRegistry:a}=e,o=r??_(),s=i??ee(),c=a??re({authStore:o,modelRegistry:s}),l=ie(),u=new Fo(s,o),d=e.modelId,f=n??(d?s.tryResolve(d):void 0);return{authStore:o,modelRegistry:s,providerRegistry:c,wireProtocolRegistry:l,modelCatalogManager:u,defaultModel:f,resolveEffectiveModel:()=>{if(f)return f;if(d){let e=s.tryResolve(d);if(e)return e}let e=t().get(`model`);return(e?s.tryResolve(e)??s.find(e):void 0)??s.getAll().find(e=>e.id!==`__otto_setup__`)}}}function $u(e,t){if(typeof e==`object`&&e){let t=e;if(t.listable===!1||t.transient===!0||typeof t.depth==`number`&&t.depth>0)return!0}return ed(t)}function ed(e){let t=e?.trim().toLowerCase();return t?t===`reply with: ok`||t===`say ok and nothing else`||t.startsWith(`reply with only your model name/identifier`)||t.startsWith(`output exactly the word: probe_ok`)||t.startsWith(`you are a trajectory analyst for an ai coding assistant.`)||t.startsWith(`you are drafting a reusable skill for this project`)||t.startsWith(`you are responsible for completing parent task item`):!1}function td(e,t,n){let r=(e,r)=>{let i=(r?t.modelRegistry.find(r):void 0)??n();if(!i)throw Error(`configProvider: 无法解析恢复模型(modelId="${r??``}" 未命中、且无默认/settings/注册表模型)`);let a=t.getTools(),o=ba(new Set(a.map(e=>e.name)));return{model:i,systemPrompt:``,tools:a,thinkingLevel:`medium`,maxToolTurns:t.maxToolTurns,promptRefresh:e?lo(t.promptManager,t.getDeclarativeAgentProfiles(),e,a):()=>t.promptManager.assemblePreset({preset:`main`},o),workspaceDir:t.workspaceDir}},i=e.storage?.session;if(i&&`dir`in i&&process.env.OTTO_SESSION_BLOB!==`1`){let n=s(),a=new ii({dbPath:n?`:memory:`:x(i.dir,`sessions.db`)});t.repoRef&&(t.repoRef.current=a);let o=n?ai():oi({lockDir:x(i.dir,`locks`)}),c=new ni({repo:a,workspaceKey:t.getWorkspaceKey??(()=>Si),maxLoadEntries:ln,canStartHistory:e=>e.role!==`tool_result`,writeLease:o,stripInactiveReplacements:!0}),l=async e=>(await a.listSessions(e).catch(()=>[])).filter(e=>!$u(e.config,e.title)).map(e=>({id:e.id,title:e.title?.trim()||e.id.slice(0,8),messageCount:0,createdAt:new Date(e.createdAt),updatedAt:new Date(e.lastActiveAt),status:e.archived?`archived`:`idle`,pinned:e.pinned,pinGroup:e.pinGroup,writeLocked:o.peekLockedByOther(e.id),entryCount:e.entryCount})),u=e=>o.peekLockedByOther(e),d=e=>o.inspect(e),f=e=>o.forceRelease(e);return Tt({providerRegistry:t.providerRegistry,hookRegistry:t.hookRegistry,logger:t.logger,workspaceDir:t.workspaceDir,clock:t.clock,traceStore:t.traceStore,checkpointStore:t.checkpointStore,memory:t.memory,maxSessions:e.maxSessions,devtools:t.devtools,configProvider:r,residencyGovernor:t.residencyGovernor,getResidencyConfig:t.getResidencyConfig,storage:{kind:`custom`,persistence:c,autoPersist:!0,...n?{panelStatePersistence:rn(),pasteStatePersistence:an()}:{panelStateDir:x(i.dir,`panel-state`)},listColdSessionsOverride:l,isSessionWriteLocked:u,inspectSessionWriteLease:d,forceReleaseSessionWriteLease:f,onDispose:()=>{o.close(),a.close()}}})}i&&`dir`in i&&process.env.OTTO_SESSION_BLOB===`1`&&C(`@x-otto/coding:session-pool-factory`).warn(`OTTO_SESSION_BLOB=1 — blob session persistence is deprecated (M63). Relational append (sessions.db) is the default since M60. The blob escape hatch will be removed when the relational path has proven stable in production.`);let a=i?`dir`in i?{kind:`disk`,sessionDir:i.dir}:`url`in i?(()=>{let n=fa(e.storage,`session`);return{kind:`remote`,sessionUrl:i.url,fetch:n.fetch??globalThis.fetch,getAuth:n.getAuth,timeoutMs:n.timeoutMs,userId:e.userIdentity?.userId,wsKey:t.getWorkspaceKey}})():void 0:void 0;return Tt({providerRegistry:t.providerRegistry,hookRegistry:t.hookRegistry,logger:t.logger,workspaceDir:t.workspaceDir,clock:t.clock,traceStore:t.traceStore,checkpointStore:t.checkpointStore,memory:t.memory,maxSessions:e.maxSessions,storage:a,devtools:t.devtools,configProvider:r,residencyGovernor:t.residencyGovernor})}function nd(e){return e.map(e=>({name:e.name,description:typeof e.description==`function`?e.description({projectRoot:``}):e.description,parameters:e.parameters}))}function rd(e,t,n){if(e.length===0)return[];if(!n.getTools)return n.logger.warn(`Swarm member "%s" requested %d tools but leaf has no tool directory (getTools not injected); all hidden (fail closed)`,t,e.length),[];let r=yn(n.getDeclarativeAgentProfiles?.()??[],t),i=r?no(r.defaultTools):void 0,a=oo(n.getTools,void 0,i),o=new Map(a.map(e=>[e.name,e])),s=[],c=new Set;for(let r of e){if(c.has(r.name))continue;c.add(r.name);let e=o.get(r.name);if(!e){n.logger.warn(`Swarm member "%s" tool "%s" not resolvable at leaf (missing from directory or denied by profile allowlist); hidden from model`,t,r.name);continue}s.push(e)}return s}function id(e,t,n,r){let i=[],a=new Set;for(let o of e){if(a.has(o.name)){n.warn(`Swarm member "%s" duplicate core descriptor "%s"; ignored`,t,o.name);continue}if(o.name!==`handoff_to_agent`){n.warn(`Swarm member "%s" received unknown core tool descriptor "%s"; hidden (fail closed)`,t,o.name);continue}if(o.context.from!==t){n.warn(`Swarm member "%s" handoff descriptor origin mismatch (from="%s"); hidden (fail closed)`,t,o.context.from);continue}if(o.context.allowedTargets.length===0){n.warn(`Swarm member "%s" handoff descriptor has no allowed targets; hidden`,t);continue}a.add(o.name),i.push(li(o.context.from,o.context.allowedTargets,r))}return i}function ad(e){return async t=>{let n=Date.now();if(!e.defaultModel)throw Error(`Swarm member turn for agent "${t.agentId}" failed: no default model configured. Configure a model before running swarm/team sessions.`);let r=e.defaultModel,i=rd(t.tools??[],t.agentId,e);t.extraTools?.length&&e.logger.warn(`Swarm member "%s" received %d extraTools via deprecated metadata channel; ignored (use coreTools descriptors)`,t.agentId,t.extraTools.length);let a,o=id(t.coreTools??[],t.agentId,e.logger,e=>{a||=e}),s=new Set(o.map(e=>e.name)),c=[...o,...i.filter(e=>!s.has(e.name))],l={model:r,systemPrompt:t.systemPrompt??``,messages:[],tools:c,thinkingLevel:t.thinkingLevel??`medium`,maxTokens:t.maxTokens,temperature:t.temperature};l.messages.push({role:`user`,content:[{type:`text`,text:t.prompt}],timestamp:Date.now()});let u=t.sessionId??`swarm:${t.agentId}`,d=t.depth??0,f=new hi({stream:e.stream,logger:e.logger,agentName:t.agentId,maxToolTurns:t.maxToolTurns,toolHookExecutor:jt({hookRegistry:e.hookRegistry,agentName:t.agentId,sessionId:u}),depth:d}),p=()=>f.abort();t.signal?.aborted?f.abort():t.signal?.addEventListener(`abort`,p,{once:!0});let m=`${u}:${t.agentId}`,h=St(f,{id:m,agentName:t.agentId,title:t.agentId,prompt:t.prompt,model:t.model??r.id,origin:`main`,depth:d,abort:()=>f.abort(),messages:l.messages}),g;try{g=await f.run(l)}finally{t.signal?.removeEventListener(`abort`,p),h(),zt.markEnded(m)}return{agentId:t.agentId,messages:l.messages,handoff:t.signal?.aborted?void 0:a,text:g.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
394
- `),tokenUsage:{input:g.usage.inputTokens,output:g.usage.outputTokens,cacheRead:g.usage.cacheReadTokens},durationMs:Date.now()-n}}}function od(e,t){if(!t.defaultModel)throw Error(`buildSwarmConfig for team "${e.name}" failed: no default model configured.`);return{name:e.name,agents:e.agents,defaultModel:t.defaultModel,pattern:e.pattern,router:e.router,pipeline:e.pipeline,supervisorId:e.supervisorId,entryAgentId:e.entryAgentId,maxHandoffDepth:e.maxHandoffDepth,runId:t.runId,depth:t.depth??0,runAgentTurn:t.runAgentTurn??ad(t)}}function sd(e,t,n,r,i,a=0){let o=t.getDeclarativeAgentProfiles(),s=[];for(let c of e.agentNames){if(c.startsWith(`team:`)){let o=c.slice(5).trim();if(i+1>5){t.logger.warn(`Team "%s" nesting exceeds max depth %d, member skipped: %s`,e.name,5,c);continue}if(r.has(o)){t.logger.warn(`Team "%s" nesting cycle detected, member skipped: %s`,e.name,c);continue}let l=t.getDeclarativeTeams().find(e=>e.name===o);if(!l){t.logger.warn(`Team "%s" sub-team not found, member skipped: %s`,e.name,c);continue}let u=sd(l,t,n,new Set([...r,o]),i+1,a+1);if(u.agents.length===0){t.logger.warn(`Team "%s" sub-team "%s" has no resolvable members, skipped`,e.name,o);continue}let d=od(u,{providerRegistry:t.providerRegistry,hookRegistry:t.hookRegistry,stream:t.stream,logger:t.logger,defaultModel:n,runId:`team:${o}`,depth:a+1,runAgentTurn:t.runAgentTurn});s.push({kind:`team`,id:c,name:o,description:`Nested team: ${o}`,runNested:async(e,t)=>{let n=await ui(d).run(e,{signal:t});return{agentId:c,messages:[],text:n.output,tokenUsage:{input:0,output:0,cacheRead:0},durationMs:n.durationMs}}});continue}let l=yn(o,c);if(!l){s.push({kind:`agent`,id:c,name:c,description:c,systemPrompt:gn(c),tools:nd(t.resolveTools(void 0,void 0)),maxToolTurns:void 0});continue}s.push({kind:`agent`,id:c,name:l.name,description:l.taskTypes[0]??l.name,systemPrompt:l.systemPromptTemplate,tools:nd(t.resolveTools(void 0,no(l.defaultTools))),maxToolTurns:l.defaultMaxToolTurns})}return{name:e.name,pattern:e.pattern,agents:s,pipeline:e.pipeline,supervisorId:e.supervisorId,entryAgentId:e.entryAgentId,maxHandoffDepth:e.maxHandoffDepth,router:e.routerStrategy?{strategy:e.routerStrategy,rules:e.rules?.map(e=>({match:e.keywords,agentId:e.agentId})),fallbackAgentId:e.entryAgentId??s[0]?.id}:void 0}}function cd(e){return async(t,n,r,i)=>{let a=e.getDeclarativeTeams().find(e=>e.name===t);if(!a)return{success:!1,error:`Team not found: ${t}`};let o=e.defaultModel;if(!o)return{success:!1,error:`No model configured for team execution.`};if(a.routerStrategy===`llm`)return{success:!1,error:`Team "${t}": router strategy 'llm' is not supported in declarative teams (it needs a customRouter function). Use 'rule', 'round-robin', or 'random'.`};let s=sd(a,e,o,new Set([t]),0,i??0);if(s.agents.length===0)return{success:!1,error:`Team "${t}" has no resolvable member agents.`};try{let a=await ui(od(s,{providerRegistry:e.providerRegistry,hookRegistry:e.hookRegistry,stream:e.stream,logger:e.logger,defaultModel:o,runId:`team:${t}`,depth:i,runAgentTurn:e.runAgentTurn})).run(n,{signal:r});return{success:!0,output:a.output,pattern:a.pattern}}catch(e){return{success:!1,error:e instanceof Error?e.message:String(e)}}}}const ld=`You are describing an image for a text-only AI assistant that cannot see images itself. Produce a concise structured description (aim for well under 500 tokens) covering, when applicable:
392
+ `);let c=[],l=[],{buildSync:u}=Pc();Fc();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}),Wu.warn({pluginDir:e,entry:i,err:String(t)},`panel compile failed`)}}return Wu.info({pluginDir:e,compiled:c.length,errors:l.length},`compiled plugin panels`),{compiled:c,errors:l,skipped:!1}}const Ku=C(`@x-otto/coding:plugin-install`);function qu(e){let t=[];return(async()=>{try{let t=await Qc(e);t&&Ku.info({pluginDir:e,outfile:t},`plugin code module compiled at install time`)}catch(n){let r=n instanceof Error?n.message:String(n);Ku.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}=Gu(e);if(!r&&n.length>0)for(let r of n)Ku.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);Ku.warn({pluginDir:e,err:r},`plugin panel compilation crashed unexpectedly at install time`),t.push(`面板编译异常:${r}`)}})().then(()=>t)}function Ju(e){try{return Ur(e).isSymbolicLink()}catch{return!1}}function Yu(e){let t=k(e,`utf8`),n=[],r=!1;for(let e of t.split(`
393
+ `)){let t=e.trim();if(t.startsWith(`packages:`)){r=!0;continue}if(r){let e=t.match(/^-\s*['"]?([^'"]+)['"]?(?:\s+#.*)?$/);if(e?.[1]){n.push(e[1]);continue}t.length>0&&!t.startsWith(`-`)&&(r=!1)}}return n}function 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 hd(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??md(t)}}function gd(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=gd(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=hd(u,{providerRegistry:t.providerRegistry,hookRegistry:t.hookRegistry,stream:t.stream,logger:t.logger,defaultModel:n,runId:`team:${o}`,depth:a+1,runAgentTurn:t.runAgentTurn});s.push({kind:`team`,id:c,name:o,description:`Nested team: ${o}`,runNested:async(e,t)=>{let n=await ui(d).run(e,{signal:t});return{agentId:c,messages:[],text:n.output,tokenUsage:{input:0,output:0,cacheRead:0},durationMs:n.durationMs}}});continue}let l=yn(o,c);if(!l){s.push({kind:`agent`,id:c,name:c,description:c,systemPrompt:gn(c),tools:dd(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:dd(t.resolveTools(void 0,no(l.defaultTools))),maxToolTurns:l.defaultMaxToolTurns})}return{name:e.name,pattern:e.pattern,agents:s,pipeline:e.pipeline,supervisorId:e.supervisorId,entryAgentId:e.entryAgentId,maxHandoffDepth:e.maxHandoffDepth,router:e.routerStrategy?{strategy:e.routerStrategy,rules:e.rules?.map(e=>({match:e.keywords,agentId:e.agentId})),fallbackAgentId:e.entryAgentId??s[0]?.id}:void 0}}function _d(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=gd(a,e,o,new Set([t]),0,i??0);if(s.agents.length===0)return{success:!1,error:`Team "${t}" has no resolvable member agents.`};try{let a=await ui(hd(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 vd=`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 ud=class{cache=new Map;constructor(e){this.deps=e}describeImages=async(e,t)=>{let n=await this.resolveVisionModel();return n?Promise.all(e.map(e=>this.describeOne(n,e,t))):e.map(()=>null)};async resolveVisionModel(){let e=this.deps.getModelRegistry(),t=this.deps.getVisionSlotCandidates()??[];for(let n of t){let t=e.tryResolve(n);if(t&&await this.isUsable(t))return t}for(let t of e.getAll())if(t.strengths?.includes(`vision`)&&await this.isUsable(t))return t}async isUsable(e){try{return(await this.deps.isModelUsable(e)).usable}catch{return!1}}async describeOne(e,t,n){let r=this.hashImage(t.source),i=this.cache.get(r);if(i)return this.formatDescription(e,i.description);try{let i=await this.callVisionModel(e,t,n);return i?(this.rememberInCache(r,i),this.formatDescription(e,i)):null}catch(t){return this.deps.logger.debug({error:t,modelId:e.id},`vision delegate describe failed`),null}}async callVisionModel(e,t,n){let r=this.deps.providerRegistry.get(e.api),i={role:`user`,timestamp:Date.now(),content:[{type:`text`,text:t.contextHint?`${ld}\n\nContext: ${t.contextHint}`:ld},{type:`image`,mime:t.mime,source:t.source}]},a=new AbortController,o=setTimeout(()=>a.abort(),3e4),s=n?AbortSignal.any([n,a.signal]):a.signal;try{return(await g(e,r,{model:e,systemPrompt:``,messages:[i],maxTokens:800},{signal:s})).content.filter(e=>e.type===`text`).map(e=>e.text).join(``).trim()||void 0}finally{clearTimeout(o)}}formatDescription(e,t){return`[image seen by vision model ${e.id}]\n${t}`}hashImage(e){return pi(`sha256`).update(e).digest(`hex`)}rememberInCache(e,t){if(this.cache.size>=100){let e=this.cache.keys().next().value;e!==void 0&&this.cache.delete(e)}this.cache.set(e,{description:t})}};function dd(e){let t=e?.slots?.vision;if(t)return Array.isArray(t)?t:[t]}function fd(e,t){globalThis[e]||Object.defineProperty(globalThis,e,{value:Object.freeze(t()),writable:!1,configurable:!1})}var pd=class{_callMcpTool=null;get callMcpTool(){if(!this._callMcpTool)throw Error(`PanelRuntime not installed — call installPanelRuntime() during App startup`);return this._callMcpTool}install(e){this._callMcpTool=e,fd(`__ottoPanelRuntime`,()=>({callMcpTool:(e,t,n)=>this.callMcpTool(e,t,n),usePluginData:md(this)}))}};function md(e){return function(t,n,r=5e3){let i=globalThis.React;if(!i||typeof i.useState!=`function`)throw Error(`usePluginData requires React runtime. Panel components must be rendered in a React (Ink) context.`);let[a,o]=i.useState(void 0),[s,c]=i.useState(!0),[l,u]=i.useState(void 0),d=i.useCallback(async()=>{c(!0);try{let r=await e.callMcpTool(t,n,{});if(r.isError){u(`MCP tool returned error`);return}let i=r.content?.find(e=>e.type===`text`);if(i?.text){try{o(JSON.parse(i.text))}catch{o(i.text)}u(void 0)}else o(void 0),u(`MCP tool returned no text content`)}catch(e){u(e instanceof Error?e.message:String(e))}finally{c(!1)}},[t,n]);return i.useEffect(()=>{d();let e=setInterval(()=>void d(),r);return()=>clearInterval(e)},[d,r]),{data:a,loading:s,error:l,callTool:i.useCallback(async(n,r)=>{try{return{success:!(await e.callMcpTool(t,n,r??{})).isError}}catch(e){return{success:!1,error:e instanceof Error?e.message:String(e)}}},[t])}}}const hd=new pd;function gd(e){hd.install(e)}const _d=`backend/`;function vd(e){return e.startsWith(_d)?e:`${_d}${e}`}var yd=class{fns=null;get(){return this.fns}install(e){this.fns=e,fd(`__ottoPanelBackendRuntime`,()=>({usePanelBackend:xd(this)}))}};function bd(){return globalThis.__ottoCurrentPanelPluginId}function xd(e){return function(){let t=globalThis.React;if(!t||typeof t.useState!=`function`)throw Error(`usePanelBackend requires React runtime. Panel components must be rendered in a React (Ink) context.`);let n=bd(),r=e.get(),[i,a]=t.useState(void 0),[o,s]=t.useState(n&&r?r.getStatus(n):`disabled`);return t.useEffect(()=>{if(!n||!r)return;s(r.getStatus(n));let e=r.subscribeState(n,e=>{a(e)}),t=r.onStatusChange(n,s);return()=>{e(),t()}},[n]),{call:t.useCallback(async(e,t,i)=>{if(!n||!r)throw Error(`usePanelBackend: no plugin context available (panel must be rendered inside a plugin detail view with backend runtime installed)`);return r.call(n,vd(e),t,i)},[n]),cancel:t.useCallback(e=>{!n||!r||r.cancel(n,e)},[n]),state:i,status:o}}}const Sd=new yd;function Cd(e){Sd.install(e)}function wd(){let e=process.env.LC_ALL||process.env.LC_MESSAGES||process.env.LANG||``;return/zh/i.test(e)?`zh`:`en`}function Td(e){return!e||e===`auto`?wd():e}var Ed=class{loadedPluginIds=[];previousSnapshot=[];constructor(e){this.deps=e}async reload(){let e=0,t=0,n=[],r=new Map;for(let e of this.deps.activePlugins()){let i=!!e.manifest.contributes?.oauth?.length,a=!!e.manifest.contributes?.providers?.length;if(!i&&!a)continue;let o=E(e);if(o.gated){this.deps.logger.warn({pluginId:e.id},`project plugin not trusted, skipping declarative providers (fail-closed, RFC-124 C1)`),t+=(e.manifest.contributes?.providers?.length??0)+(e.manifest.contributes?.oauth?.length??0);continue}if(o.pendingCapabilities.includes(`provider`)){this.deps.logger.warn({pluginId:e.id},`plugin capability "provider" declared but not yet granted, skipping declarative providers (fail-closed, RFC-124 C2)`),t+=(e.manifest.contributes?.providers?.length??0)+(e.manifest.contributes?.oauth?.length??0),n.push(e.id);continue}r.set(e.id,e.manifest)}let i=e=>JSON.stringify(e),a=[],o=new Map,s=new Map;for(let e of this.previousSnapshot){let t=r.get(e.id);if(t!==void 0&&i(t)!==i(e.manifest)){let n=eu(e.id,e.manifest),r=eu(e.id,t),i=new Set([...n].filter(e=>r.has(e)));i.size>0&&o.set(e.id,i);let a=tu(e.id,e.manifest),c=tu(e.id,t),l=new Set([...a].filter(e=>c.has(e)));l.size>0&&s.set(e.id,l)}}for(let e of this.previousSnapshot){let t=r.get(e.id);(t===void 0||i(t)!==i(e.manifest))&&await uu(e.id,e.manifest,this.deps,o.get(e.id),s.get(e.id))}let c=new Map(this.previousSnapshot.map(e=>[e.id,i(e.manifest)]));for(let[n,l]of r){if(c.get(n)===i(l)){a.push({id:n,manifest:l}),e+=l.contributes?.providers?.length??0;continue}let r=lu(n,l,this.deps,o.get(n),s.get(n));e+=r.registered.length,t+=r.rejected.length,a.push({id:n,manifest:l})}return this.previousSnapshot=a,this.loadedPluginIds=a.map(e=>e.id),{registered:e,rejected:t,pendingCapabilityPluginIds:n}}get activePluginIds(){return this.loadedPluginIds}async cleanup(){for(let{id:e,manifest:t}of this.previousSnapshot)await uu(e,t,this.deps);this.previousSnapshot=[],this.loadedPluginIds=[]}};function Dd(e,n){if(!e)return{devtools:null,logSubscription:null};let r=new t;return{devtools:r,logSubscription:qe(e=>{if(typeof e==`object`&&e&&`name`in e&&`level`in e&&`msg`in e){let t=e;t.name===n&&r.sendLog(t)}})}}var Od=class{registry;auditLog;constructor(e,t){let n=Ae(e.getAll());this.auditLog=new ge,this.registry=ke({toolSets:n}),t.register(De(this.registry,this.auditLog))}};const kd=C(`@x-otto/coding:plugin-context-sources`),Ad=64*1024;function jd(e,t,n){let r=S(t,n);if(!Rs(r,t)){kd.warn({pluginId:e,file:n},`contextSources.content.file resolves outside plugin dir, skipped`);return}try{let e=k(r,`utf8`);return Buffer.byteLength(e,`utf8`)>Ad?`${e.slice(0,Ad)}\n<!-- truncated -->`:e}catch(t){kd.warn({pluginId:e,file:n,err:String(t)},`contextSources.content.file read failed, skipped`);return}}function Md(e){let t=[];for(let n of e){if(E(n).gated)continue;let e=n.manifest.contributes?.contextSources;if(e?.length){if(!n.manifest.capabilities?.includes(`context`)){kd.warn({pluginId:n.id},`plugin declares contextSources but not capabilities:["context"], skipped (fail-closed)`);continue}for(let r of e)t.push({id:`${n.id}:${r.id}`,priority:r.priority,contribute:()=>{let e=typeof r.content==`string`?r.content:jd(n.id,n.dir,r.content.file);if(e!=null)return`<!-- plugin:${n.id} -->\n${e}`}})}}return t}function Nd(e){Wt(),Ut(void 0,e.repoRoot);let t=(t,n)=>{e.hasSession(n.sessionId)&&e.emitHook(t,n).catch(n=>{e.logger.warn({err:n instanceof Error?n.message:String(n),timing:t},`Failed to emit process lifecycle hook`)})};return[w.onSpawn(n=>{e.logger.info({id:n.id,pid:n.pid,command:n.command,port:n.port},`Background process started`),t(`process.spawned`,{sessionId:n.sessionId,processId:n.id,pid:n.pid,command:n.command,port:n.port})}),w.onExit(n=>{e.logger.info({id:n.id,pid:n.pid,status:n.status,exitCode:n.exitCode},`Background process exited`),t(`process.exited`,{sessionId:n.sessionId,processId:n.id,pid:n.pid,command:n.command,status:n.status,exitCode:n.exitCode})})]}const Pd=2e4,Fd=(e,t)=>{let n=ki(`git`,[...e],{cwd:t,timeout:1e4,encoding:`utf-8`,maxBuffer:4194304});return n.error||n.status!==0?null:n.stdout??``};function Id(e){return e.length<=Pd?e:`${e.slice(0,Pd)}\n[...truncated ${e.length-Pd} chars...]`}function Ld(e,t,n,r){let i=S(e),a=He(t)?t:S(i,t);if(a!==i&&!a.startsWith(`${i}/`)||!D(a)||!Zr(a).isFile())return null;let o;try{o=k(a,`utf-8`)}catch{return null}if(o.includes(`\0`))return null;let s=o.split(`
402
- `),c=Math.max(1,n);if(c>s.length)return null;let l=Math.min(s.length,r>0?r:n);return Id(s.slice(c-1,l).join(`
403
- `))}function Rd(e,t,n,r=14){let i=n([`grep`,`-nE`,`(function|class|interface|type|enum|const|let|var|def|fn|struct|func)[[:space:]]+${t.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}`],e);if(i===null||!i.trim())return null;let a=/^(.+?):(\d+):/.exec(i.split(`
404
- `)[0]??``);if(!a)return null;let o=parseInt(a[2],10);return Ld(e,a[1],o,o+r)}function zd(e){let t=e?.gitRunner??Fd;return[{id:`file-range`,resolve:(e,t)=>{let n=/^([\w./\-]+):(\d+)(?:-(\d+))?$/.exec(e);if(!n)return``;let r=Ld(t.workspaceDir,n[1],parseInt(n[2],10),n[3]?parseInt(n[3],10):0);if(r===null)return``;let i=n[1],a=i.includes(`.`)?i.split(`.`).pop()??``:``;return`\n\n${i}:${n[3]?`${n[2]}-${n[3]}`:n[2]}:\n\`\`\`${a}\n${r}\n\`\`\`\n`}},{id:`def`,resolve:(e,n)=>{let r=Rd(n.workspaceDir,e,t);return r===null?``:`\n\n@def:${e}:\n\`\`\`\n${r}\n\`\`\`\n`}}]}function Bd(e){return{sandbox:new Ca(e.logger),memoryGovernor:new ht({logger:e.logger}),residencyGovernor:new _t,fleetMonitor:new mt({logger:e.logger}),permissionSync:new Sa({logger:e.logger,getToolRegistry:e.getToolRegistry,getPermissionRegistry:e.getPermissionRegistry}),hookRegistry:e.hookRegistry??Te({preset:`default`,onHookTimeout:e.onHookTimeout})}}function Vd(e){let t=Dd(e.inspect,e.loggerName),n=t.devtools,r=t.logSubscription,i=new fi({workspaceDir:e.workspaceDir,projectConfigPath:e.projectConfigPath,projectConfigTrusted:()=>Ir(e.workspaceDir,{interactive:e.interactive})});return i.on(`change`,t=>{e.onSettingsApplied(t),e.permissionSync.sync(t),e.sandbox.applySetting(e.sandbox.resolveConfig(t));let n=t.proxy,r=n?.enabled!==!1&&n?.url?n.url:void 0;$e(r),Xe(r),e.getI18nRegistry().setLocale(Td(t.language))}),{devtools:n,logSubscription:r,settings:i}}function Hd(e){let t=new ud({getModelRegistry:e.getModelRegistry,providerRegistry:e.providerRegistry,getVisionSlotCandidates:()=>dd(e.getSettings().get(`model_slots`)),isModelUsable:e.isModelUsable,logger:e.logger});return{visionDelegateService:t,sessionConfigResolver:new uo({settings:e.getSettings(),promptManager:e.promptManager,getModelRegistry:e.getModelRegistry,getTools:e.getTools,getDeclarativeAgentProfiles:e.getDeclarativeAgentProfiles,defaultModel:e.defaultModel,explicitModelSpec:e.explicitModelId,hasCredential:t=>e.providerRegistry.hasCredential(t),isModelUsable:e.isModelUsable,maxToolTurns:e.maxToolTurns,maxToolTurnExtensions:e.maxToolTurnExtensions,promptOutputTokenBudget:e.promptOutputTokenBudget,promptWallClockBudgetMs:e.promptWallClockBudgetMs,sessionCostBudgetUSD:e.sessionCostBudgetUSD,stallDetection:e.stallDetection,workspaceDir:e.workspaceDir,getWorkspaceId:()=>e.getWorkspaceRef()?.id??e.workspaceId,logger:e.logger,describeImages:t.describeImages,getResilienceConfig:e.getResilienceConfig})}}function Ud(e){let t=td(e.options,{hookRegistry:e.hookRegistry,providerRegistry:e.providerRegistry,modelRegistry:e.getModelRegistry(),logger:e.logger,workspaceDir:e.workspaceDir,getTools:e.getTools,getDeclarativeAgentProfiles:e.getDeclarativeAgentProfiles,getWorkspaceKey:()=>e.getWorkspaceRef()?.key,repoRef:e.repoRef,maxToolTurns:e.maxToolTurns,promptManager:e.promptManager,memory:e.memory,traceStore:e.traceStore,checkpointStore:e.checkpointStore,clock:e.clock,devtools:e.devtools??void 0,residencyGovernor:e.residencyGovernor,getResidencyConfig:e.getResidencyConfig},e.resolveEffectiveModel),n=t.sessions;return{agentRuntime:t,codingSessionPool:n,swarmAgentRunner:ad({hookRegistry:e.hookRegistry,stream:n.stream,logger:e.logger,defaultModel:e.defaultModel,getTools:e.getTools,getDeclarativeAgentProfiles:e.getDeclarativeAgentProfiles}),defaultModel:e.defaultModel}}function Wd(e){let{runSession:t,abortTask:n}=Mo({logger:e.logger,getSession:e.getSession,createSession:e.createSession,removeSession:e.removeSession}),r=new ci({hookRegistry:e.hookRegistry,runSession:t,abortTask:n,runAgentTurn:e.swarmAgentRunner,workflowConfig:e.workflowConfig});return{orchestrator:r,runSession:t,runTeam:cd({logger:e.logger,providerRegistry:e.providerRegistry,hookRegistry:e.hookRegistry,stream:e.stream,defaultModel:e.defaultModel,getDeclarativeTeams:e.getDeclarativeTeams,getDeclarativeAgentProfiles:e.getDeclarativeAgentProfiles,resolveTools:(t,n)=>e.sessionConfigResolver.resolveTools(t,n),runAgentTurn:e=>r.runAgentTurn(e)}),writeTodos:zi()}}function Gd(e){gd(e.callMcpTool);let t=new nc({mcpController:e.mcpController,getActivePlugins:e.getActivePlugins});return Cd({call:(e,n,r,i)=>t.call(e,n,r,i),cancel:(e,n)=>{t.cancel(e,n)},subscribeState:(e,n)=>t.subscribeState(e,n),getStatus:e=>t.getStatus(e),onStatusChange:(e,n)=>t.onStatusChange(e,n)}),{panelBackendController:t}}function Kd(e){let t=new Nu({hookRegistry:e.hookRegistry,skillRegistry:e.skillRegistry,providerRegistry:e.providerRegistry,wireProtocolRegistry:e.wireProtocolRegistry,modelRegistry:e.modelRegistry,authStore:e.authStore,toolRegistry:e.toolRegistry,feedbackRegistry:e.feedbackRegistry,sigilResolverRegistry:e.sigilResolverRegistry,pluginInput:e.pluginInput,workspaceDir:e.workspaceDir,activePlugins:e.activePlugins,callMcpTool:e.callMcpTool,logger:e.logger,startPluginJob:e.startPluginJob,getSessionId:e.getPluginJobSessionId,getWorkspaceKey:e.getWorkspaceKey,getSessionMessages:e.getSessionMessages,completeText:e.completeText,capabilityQuota:e.capabilityQuota,askUser:e.askUser,onPluginLoadError:e.onPluginLoadError,...e.getSchedulePort?{getSchedulePort:e.getSchedulePort}:{},...e.notifyUser?{notifyUser:e.notifyUser}:{}}),n=new Ed({providerRegistry:e.providerRegistry,authStore:e.authStore,modelRegistry:e.modelRegistry,wireProtocolRegistry:e.wireProtocolRegistry,activePlugins:e.activePlugins,logger:e.logger});return e.i18nRegistry.register(Hs(e.activePlugins())),{pluginModuleManager:t,pluginProviderManager:n,capabilityReloader:new ec(e.settings,e.mcpController,e.skillRegistryForReloader,t,n,e.toolRegistry,e.modelCatalogManager,e.workspaceDir,e.getActivePluginsForReloader,e.i18nRegistry)}}function qd(e){return{toolsSyncCoordinator:new ds({sessionConfigResolver:e.sessionConfigResolver,getSession:e.getSession,listSessionIds:e.listSessionIds,logger:e.logger}),pluginContributionsFacade:new Es({getWorkspaceDir:()=>e.workspaceDir,settings:e.settings,getActivePlugins:e.getActivePlugins,pluginModuleManager:e.pluginModuleManager,mcpController:e.mcpController})}}function Jd(e){let t=new Set(e.hookRegistry.getRegistered().map(e=>e.name)),n=new Od(e.toolRegistry,e.hookRegistry),r=new ka(e.settings,e.toolRegistry,e.logger,e.workspaceDir,e.getResilienceConfig);return{permissionRegistry:n.registry,auditLog:n.auditLog,mcpController:r,preExistingHooks:t}}function Yd(e){return new Pa({settings:e.settings,mcp:e.mcpController,skills:e.skillRegistry,getAgentProfiles:()=>e.declarativeAgentProfiles,getPlugins:()=>Vn({cwd:e.workspaceDir,homedir:e.pluginHomedir,bundledDirs:e.pluginBundledDirs}),processRuntime:Vt,onPluginToggle:e.onPluginToggle})}function Xd(e){e.pluginInput.register(Pn()),e.pluginInput.registerProvider(`@`,In({cwd:e.workspaceDir})),e.sigilResolvers.register(zd(),`builtin`),e.sigilResolvers.register([{id:`shortcut`,resolve:t=>{let n=(e.settings.get(`shortcuts`)??[]).find(e=>e.name===t);return n?n.text:``}}],`builtin`);let t=Ul(e.activePlugins());t.length>0&&e.pluginInput.register(t),Wl(e.activePlugins());for(let t of Md(e.activePlugins()))e.agentRuntime.contextSources.register(t);return e.registerHooks(),{ownedHookNames:e.hookRegistry.getRegistered().map(e=>e.name).filter(t=>!e.preExistingHooks.has(t)),processRegistryUnsubs:Nd({hasSession:t=>!!e.codingSessionPoolGet(t),emitHook:(t,n)=>e.hookRegistry.emit(t,n),logger:e.logger,repoRoot:e.workspaceDir})}}async function Zd(e,t,n){t()||(await e.load(),n(!0))}function Qd(e){for(let t of e)try{t.apply()}catch(e){throw Error(`deferred config step "${t.label}" failed: ${e.message}`,{cause:e})}}function $d(e,t,n,r){return{workspaceDir:t,processOwner:e.processOwnerId,orchestrator:e.orchestrator,writeTodos:e.writeTodos,skillProvider:n,enableLsp:r,sandbox:e.sandbox,autoMemory:e.autoMemory,reloadMemory:e.reloadMemory,archiveRecall:e.archiveRecall,runTeam:e.runTeam,runSession:e.runSession,fileStateManager:e.fileStateManager,learningStore:e.learningStore,localLearningStore:e.localLearningStore,sessions:e.sessions,listModels:e.listModels,startJob:e.startJob,schedule:Ki(e.getScheduleService),searchEcosystem:e.searchEcosystem}}function ef(e){let{orchestrator:t,writeTodos:n,skillProvider:r,autoMemory:i,reloadMemory:a,archiveRecall:o}=e,s=e.processOwner,c=s?{register:e=>w.register({...e,owner:s}),get:e=>w.get(e),getForSession:(e,t)=>w.getForSession(e,t),listForSession:e=>w.listForSession(e),kill:e=>w.kill(e),updateDetectedService:(e,t)=>w.updateDetectedService(e,t)}:w;return{orchestration:{dispatchTask:t.dispatchTask,getTask:t.getTask,listTasks:t.listTasks,updateTask:t.updateTask,getBackgroundOutput:t.getBackgroundOutput,cancelBackground:t.cancelBackground,writeTodos:n,startJob:e.startJob},agents:{callAgent:t.callAgent},fork:{fork:async(t,n,r)=>({ok:!0,value:(await e.runSession({prompt:t,sessionMode:`ephemeral`,depth:n,signal:r})).text})},skills:r?{loadSkill:e=>r.load(e),executeSkill:e=>r.execute(e)}:void 0,memory:i?{recordMemory:async e=>{await i.record(e,e.scope),e.scope===`project-shared`&&a&&await a()},readMemory:e=>i.read(e),archive:o?{read:e=>o.readArchive(e),list:e=>o.listArchives(e)}:void 0}:void 0,team:{runTeam:e.runTeam},session:{manager:{list:async()=>e.sessions.list().map(e=>({id:e.id,title:e.id,messageCount:e.messageCount})),create:async()=>({id:(await e.sessions.create()).id}),remove:async t=>e.sessions.remove(t),compact:async t=>{let n=e.sessions.get(t);return n?(await n.compactNow(),!0):!1}}},features:{listModels:e.listModels,grill:(t,n)=>{let r=e.sessions.get(t);return r?r.requestGrill(n):Promise.resolve({answer:n.recommendation,acceptedRecommendation:!0,resolvedBy:`auto_recommendation`})},enableLsp:e.enableLsp,sandbox:e.sandbox,processRegistry:c,captureFileState:async t=>{let n=await e.fileStateManager.capture({workspaceDir:e.workspaceDir,recentFiles:t.recentFiles,planStatus:t.planStatus});return{success:!0,summary:e.fileStateManager.formatSnapshot(n),timestamp:n.timestamp}},learn:async t=>{let{lesson:n,deduped:r}=await(t.scope===`local`?e.localLearningStore??e.learningStore:e.learningStore).saveDeduped({tags:t.tags,trigger:t.trigger,insight:t.insight,sourceSessionId:t.sessionId});return{success:!0,lessonId:n.id,deduped:r}}},schedule:e.schedule?{create:e.schedule.create,list:e.schedule.list,delete:e.schedule.delete,run:e.schedule.run,cancel:e.schedule.cancel}:void 0,capabilityGap:e.searchEcosystem?{search:e.searchEcosystem}:void 0}}function tf(e,t){return y({name:`tool-guidance-injection`,timing:`system.prompt.transform`,priority:vt.toolGuidance.priority,handle:async(n,r)=>{let i=e.buildToolGuidance(t());i&&(r.systemPrompt=`${r.systemPrompt}\n\n${i}`)}})}const nf=x(process.cwd(),`docs/rfc/RFC-284-core-pack/content.txt`),rf=x(process.cwd(),`docs/rfc/RFC-284-governance-plan.json`);function af(){if(!D(nf))return;let e=k(nf,`utf8`).trim();return e.length>0?e:void 0}function of(){if(!D(rf))return new Map;let e=JSON.parse(k(rf,`utf8`));return new Map((e.decisions??[]).map(e=>[e.key,e]))}function sf(e){return new Set(e.toLowerCase().split(/[^\p{L}\p{N}._/-]+/u).filter(e=>e.length>=3))}function cf(e){let t=0;for(let n of e)/[\u3000-\u9fff\uff00-\uffef]/.test(n)&&t++;return Math.ceil(t+(e.length-t)/4)}function lf(e,t){let n=sf(t);if(n.size===0)return 0;let r=0,i=e.tags??[];for(let e of i)n.has(e.toLowerCase())&&(r+=3);let a=sf(`${e.trigger} ${e.insight}`);for(let e of n)a.has(e)&&(r+=1);return r}function uf(e,t,n){if(!n)return;let r=e.map(e=>{let r=`workspace:${e.id}`,i=t.get(r);if(!i||i.class!==`fact`||i.state!==`active`||i.supersededBy)return;let a=lf(e,n);if(a<=0)return;let o=`[${e.tags.join(`, `)}] ${e.trigger} → ${e.insight}`;return{lesson:e,score:a,text:o,tokens:cf(o)}}).filter(e=>!!e).sort((e,t)=>t.score-e.score||e.tokens-t.tokens||e.lesson.id.localeCompare(t.lesson.id)),i=[],a=0;for(let e of r)if(!(a+e.tokens>1024)&&(i.push(e),a+=e.tokens,i.length>=3))break;if(i.length!==0)return{text:[`### Relevant Lesson Hints`,`Query-specific volatile hints selected from RFC-284 fact lessons:`,...i.map((e,t)=>`${t+1}. workspace:${e.lesson.id} score=${e.score} ${e.text}`)].join(`
405
- `),hitIds:i.map(e=>e.lesson.id)}}function df(e,t,n){let r=kt({name:`lesson-injection`,priority:vt.lesson.priority,compute:async()=>{let r=af(),i=n?await n.list():[];if(r){let e=i.length>0?await t.loadRuntimeLessonsTemplate()??void 0:void 0;return[r,i.length>0?_n(i,e):``].filter(e=>e.length>0).join(`
401
+ If the image is not a UI/design screenshot, give a normal concise description instead. Do not speculate beyond what's visible.`;var yd=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?`${vd}\n\nContext: ${t.contextHint}`:vd},{type:`image`,mime:t.mime,source:t.source}]},a=new AbortController,o=setTimeout(()=>a.abort(),3e4),s=n?AbortSignal.any([n,a.signal]):a.signal;try{return(await g(e,r,{model:e,systemPrompt:``,messages:[i],maxTokens:800},{signal:s})).content.filter(e=>e.type===`text`).map(e=>e.text).join(``).trim()||void 0}finally{clearTimeout(o)}}formatDescription(e,t){return`[image seen by vision model ${e.id}]\n${t}`}hashImage(e){return pi(`sha256`).update(e).digest(`hex`)}rememberInCache(e,t){if(this.cache.size>=100){let e=this.cache.keys().next().value;e!==void 0&&this.cache.delete(e)}this.cache.set(e,{description:t})}};function bd(e){let t=e?.slots?.vision;if(t)return Array.isArray(t)?t:[t]}function xd(e,t){globalThis[e]||Object.defineProperty(globalThis,e,{value:Object.freeze(t()),writable:!1,configurable:!1})}var Sd=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,xd(`__ottoPanelRuntime`,()=>({callMcpTool:(e,t,n)=>this.callMcpTool(e,t,n),usePluginData:Cd(this)}))}};function Cd(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 wd=new Sd;function Td(e){wd.install(e)}const Ed=`backend/`;function Dd(e){return e.startsWith(Ed)?e:`${Ed}${e}`}var Od=class{fns=null;get(){return this.fns}install(e){this.fns=e,xd(`__ottoPanelBackendRuntime`,()=>({usePanelBackend:Ad(this)}))}};function kd(){return globalThis.__ottoCurrentPanelPluginId}function Ad(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=kd(),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,Dd(e),t,i)},[n]),cancel:t.useCallback(e=>{!n||!r||r.cancel(n,e)},[n]),state:i,status:o}}}const jd=new Od;function Md(e){jd.install(e)}function Nd(){let e=process.env.LC_ALL||process.env.LC_MESSAGES||process.env.LANG||``;return/zh/i.test(e)?`zh`:`en`}function Pd(e){return!e||e===`auto`?Nd():e}var Fd=class{loadedPluginIds=[];previousSnapshot=[];constructor(e){this.deps=e}async reload(){let e=0,t=0,n=[],r=new Map;for(let e of this.deps.activePlugins()){let i=!!e.manifest.contributes?.oauth?.length,a=!!e.manifest.contributes?.providers?.length;if(!i&&!a)continue;let o=E(e);if(o.gated){this.deps.logger.warn({pluginId:e.id},`project plugin not trusted, skipping declarative providers (fail-closed, RFC-124 C1)`),t+=(e.manifest.contributes?.providers?.length??0)+(e.manifest.contributes?.oauth?.length??0);continue}if(o.pendingCapabilities.includes(`provider`)){this.deps.logger.warn({pluginId:e.id},`plugin capability "provider" declared but not yet granted, skipping declarative providers (fail-closed, RFC-124 C2)`),t+=(e.manifest.contributes?.providers?.length??0)+(e.manifest.contributes?.oauth?.length??0),n.push(e.id);continue}r.set(e.id,e.manifest)}let i=e=>JSON.stringify(e),a=[],o=new Map,s=new Map;for(let e of this.previousSnapshot){let t=r.get(e.id);if(t!==void 0&&i(t)!==i(e.manifest)){let n=uu(e.id,e.manifest),r=uu(e.id,t),i=new Set([...n].filter(e=>r.has(e)));i.size>0&&o.set(e.id,i);let a=du(e.id,e.manifest),c=du(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 bu(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=yu(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 bu(e,t,this.deps);this.previousSnapshot=[],this.loadedPluginIds=[]}};function Id(e,n){if(!e)return{devtools:null,logSubscription:null};let r=new t;return{devtools:r,logSubscription:qe(e=>{if(typeof e==`object`&&e&&`name`in e&&`level`in e&&`msg`in e){let t=e;t.name===n&&r.sendLog(t)}})}}var Ld=class{registry;auditLog;constructor(e,t){let n=Ae(e.getAll());this.auditLog=new ge,this.registry=ke({toolSets:n}),t.register(De(this.registry,this.auditLog))}};const Rd=C(`@x-otto/coding:plugin-context-sources`),zd=64*1024;function Bd(e,t,n){let r=S(t,n);if(!Rs(r,t)){Rd.warn({pluginId:e,file:n},`contextSources.content.file resolves outside plugin dir, skipped`);return}try{let e=k(r,`utf8`);return Buffer.byteLength(e,`utf8`)>zd?`${e.slice(0,zd)}\n<!-- truncated -->`:e}catch(t){Rd.warn({pluginId:e,file:n,err:String(t)},`contextSources.content.file read failed, skipped`);return}}function Vd(e){let t=[];for(let n of e){if(E(n).gated)continue;let e=n.manifest.contributes?.contextSources;if(e?.length){if(!n.manifest.capabilities?.includes(`context`)){Rd.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:Bd(n.id,n.dir,r.content.file);if(e!=null)return`<!-- plugin:${n.id} -->\n${e}`}})}}return t}function Hd(e){Wt(),Ut(void 0,e.repoRoot);let t=(t,n)=>{e.hasSession(n.sessionId)&&e.emitHook(t,n).catch(n=>{e.logger.warn({err:n instanceof Error?n.message:String(n),timing:t},`Failed to emit process lifecycle hook`)})};return[w.onSpawn(n=>{e.logger.info({id:n.id,pid:n.pid,command:n.command,port:n.port},`Background process started`),t(`process.spawned`,{sessionId:n.sessionId,processId:n.id,pid:n.pid,command:n.command,port:n.port})}),w.onExit(n=>{e.logger.info({id:n.id,pid:n.pid,status:n.status,exitCode:n.exitCode},`Background process exited`),t(`process.exited`,{sessionId:n.sessionId,processId:n.id,pid:n.pid,command:n.command,status:n.status,exitCode:n.exitCode})})]}const Ud=2e4,Wd=(e,t)=>{let n=ki(`git`,[...e],{cwd:t,timeout:1e4,encoding:`utf-8`,maxBuffer:4194304});return n.error||n.status!==0?null:n.stdout??``};function Gd(e){return e.length<=Ud?e:`${e.slice(0,Ud)}\n[...truncated ${e.length-Ud} chars...]`}function Kd(e,t,n,r){let i=S(e),a=He(t)?t:S(i,t);if(a!==i&&!a.startsWith(`${i}/`)||!D(a)||!Zr(a).isFile())return null;let o;try{o=k(a,`utf-8`)}catch{return null}if(o.includes(`\0`))return null;let s=o.split(`
402
+ `),c=Math.max(1,n);if(c>s.length)return null;let l=Math.min(s.length,r>0?r:n);return Gd(s.slice(c-1,l).join(`
403
+ `))}function qd(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 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 bf(e,t,n){let r=kt({name:`lesson-injection`,priority:vt.lesson.priority,compute:async()=>{let r=mf(),i=n?await n.list():[];if(r){let e=i.length>0?await t.loadRuntimeLessonsTemplate()??void 0:void 0;return[r,i.length>0?_n(i,e):``].filter(e=>e.length>0).join(`
406
406
 
407
- `)||void 0}let a=[...await e.list(),...i];if(a.length!==0)return _n(a,await t.loadRuntimeLessonsTemplate()??void 0)||void 0}}),i=y({name:`lesson-relevant-hints`,timing:`system.prompt.transform`,priority:vt.lesson.priority+1,handle:async(t,n)=>{if(!t.userText)return;let r=of();if(r.size===0)return;let i=uf(await e.list(),r,t.userText);i&&(await e.recordRelevantHits(i.hitIds),n.systemTail=[...n.systemTail??[],i.text])}});return[...r,i]}function ff(e){return kt({name:`skill-catalog-injection`,priority:vt.skillCatalog.priority,compute:()=>{let t=e.buildCatalog();if(t)return`${t}\n\nUse the skill tool with a skill name to load its full instructions.`}})}function pf(e,t,n){let r=e.get(t.sessionId);if(!r||r.length===0)return;e.delete(t.sessionId);let i=r.join(`
408
- `),a=n.messages.length-1,o=n.messages[a];if(o&&o.role===`user`&&Array.isArray(o.content)){n.messages[a]={...o,content:[...o.content,{type:`text`,text:i}]};return}n.messages.push({role:`user`,timestamp:Date.now(),content:[{type:`text`,text:i}]})}function mf(e){let t=e.exitCode===void 0?``:`\nexit code: ${e.exitCode}`;return`<background-process-notification>\nid: ${e.processId}\npid: ${e.pid}\ncommand: ${e.command}\nstatus: ${e.status}${t}\n</background-process-notification>`}function hf(){let e=new Map;return[y({name:`background-process-exit-collector`,timing:`process.exited`,handle:t=>{let n=e.get(t.sessionId)??[];n.push(mf(t)),e.set(t.sessionId,n)}}),y({name:`background-process-exit-injector`,timing:`messages.transform`,priority:25,handle:(t,n)=>{pf(e,t,n)}}),y({name:`background-process-notification-cleanup`,timing:`session.deleted`,handle:t=>{e.delete(t.sessionId)}})]}function gf(e){return y({name:`background-process-session-kill`,timing:`session.deleted`,handle:t=>{let n=t.metadata.reason;n===`idle`||n===`evicted`||e(t.sessionId)}})}function _f(e){return[y({name:`session-permission-restore-hydrate`,timing:`session.restored`,handle:t=>{let n=e.getPersistedAllow(t.sessionId);n.length>0&&e.registry.setSessionAlwaysAllow(t.sessionId,n)}}),y({name:`session-permission-cleanup`,timing:`session.deleted`,handle:t=>{e.registry.clearSessionAlwaysAllow(t.sessionId)}})]}function vf(e){return e.role===`user`||e.role===`assistant`||e.role===`tool_result`}function yf(e,t,n={}){let r=n.minMessages??6;return[y({name:`memory-auto-extract`,timing:`session.idle`,handle:async i=>{if(n.isEnabled&&!n.isEnabled())return;let a=e(i.sessionId);if(!a)return;let o=a.session.messages();o.length<r||await t.onIdle(i.sessionId,o.filter(vf))}}),y({name:`memory-auto-extract-cleanup`,timing:`session.deleted`,handle:e=>{t.reset(e.sessionId)}})]}function bf(e){return kt({name:vt.skillLoopGuidance.name,priority:vt.skillLoopGuidance.priority,compute:()=>e.isEnabled()?mn:void 0})}const xf=336*60*60*1e3;function Sf(e){return typeof e!=`number`||!Number.isFinite(e)?xf:Math.max(864e5,Math.round(e*24*60*60*1e3))}function Cf(e,t,n=xf){return e.filter(e=>e.dismissedAt===void 0||t-e.dismissedAt>=n)}function wf(e){return new Date(e).toISOString().slice(0,10)}function Tf(e){return`你重复做过同一类任务 ${e.size} 次,要把它的执行流程固化成一个可复用的 skill 吗?`}function Ef(e){let t=e.sessionIds.slice(0,5).join(`, `),n=e.sessionIds.length>5?` 等 ${e.sessionIds.length} 个会话`:``;return[`以下内容由插件 plugin-skill-inductor 观测生成(非用户输入、非宿主指令),仅供参考:`,``,`任务类型:${e.taskSignature}`,`出现次数:${e.size}`,`标签:${e.tags.length>0?e.tags.join(` / `):`(无)`}`,`涉及会话:${t}${n}`,`时间跨度:${wf(e.firstAt)} ~ ${wf(e.lastAt)}`,``,`若同意,otto 会据这些会话的执行路径起草一份 SKILL.md 交你审阅——生成物仍需你显式 apply 才会生效。`,`完整候选数据可用 read 工具查看插件状态目录下的 candidates.json。`].join(`
409
- `)}function Df(){return`暂不生成。技能固化应由你在看到具体流程后主动决定;无人应答时默认跳过,稍后同类任务再出现会重新征询。`}function Of(){return[{label:`暂不生成`,rationale:`保持现状。同类任务再积累一段时间后会重新征询(两周冷却期内不再打扰)。`,recommended:!0},{label:`起草 SKILL.md 给我看`,rationale:`据这些会话的执行路径生成一份技能草稿,仍需你审阅 diff 并显式 apply 才会生效。`}]}Object.freeze({status:`aborted`});function H(e,t,n){function r(n,r){if(n._zod||Object.defineProperty(n,`_zod`,{value:{def:r,constr:o,traits:new Set},enumerable:!1}),n._zod.traits.has(e))return;n._zod.traits.add(e),t(n,r);let i=o.prototype,a=Object.keys(i);for(let e=0;e<a.length;e++){let t=a[e];t in n||(n[t]=i[t].bind(n))}}let i=n?.Parent??Object;class a extends i{}Object.defineProperty(a,`name`,{value:e});function o(e){var t;let i=n?.Parent?new a:this;r(i,e),(t=i._zod).deferred??(t.deferred=[]);for(let e of i._zod.deferred)e();return i}return Object.defineProperty(o,`init`,{value:r}),Object.defineProperty(o,Symbol.hasInstance,{value:t=>n?.Parent&&t instanceof n.Parent?!0:t?._zod?.traits?.has(e)}),Object.defineProperty(o,`name`,{value:e}),o}var kf=class extends Error{constructor(){super(`Encountered Promise during synchronous parse. Use .parseAsync() instead.`)}},Af=class extends Error{constructor(e){super(`Encountered unidirectional transform during encode: ${e}`),this.name=`ZodEncodeError`}};const jf={};function Mf(e){return e&&Object.assign(jf,e),jf}function Nf(e){let t=Object.values(e).filter(e=>typeof e==`number`);return Object.entries(e).filter(([e,n])=>t.indexOf(+e)===-1).map(([e,t])=>t)}function Pf(e,t){return typeof t==`bigint`?t.toString():t}function Ff(e){return{get value(){{let t=e();return Object.defineProperty(this,`value`,{value:t}),t}throw Error(`cached value already set`)}}}function If(e){return e==null}function Lf(e){let t=e.startsWith(`^`)?1:0,n=e.endsWith(`$`)?e.length-1:e.length;return e.slice(t,n)}function Rf(e,t){let n=(e.toString().split(`.`)[1]||``).length,r=t.toString(),i=(r.split(`.`)[1]||``).length;if(i===0&&/\d?e-\d?/.test(r)){let e=r.match(/\d?e-(\d?)/);e?.[1]&&(i=Number.parseInt(e[1]))}let a=n>i?n:i;return Number.parseInt(e.toFixed(a).replace(`.`,``))%Number.parseInt(t.toFixed(a).replace(`.`,``))/10**a}const zf=Symbol(`evaluating`);function U(e,t,n){let r;Object.defineProperty(e,t,{get(){if(r!==zf)return r===void 0&&(r=zf,r=n()),r},set(n){Object.defineProperty(e,t,{value:n})},configurable:!0})}function Bf(e,t,n){Object.defineProperty(e,t,{value:n,writable:!0,enumerable:!0,configurable:!0})}function Vf(...e){let t={};for(let n of e)Object.assign(t,Object.getOwnPropertyDescriptors(n));return Object.defineProperties({},t)}function Hf(e){return JSON.stringify(e)}function Uf(e){return e.toLowerCase().trim().replace(/[^\w\s-]/g,``).replace(/[\s_-]+/g,`-`).replace(/^-+|-+$/g,``)}const Wf=`captureStackTrace`in Error?Error.captureStackTrace:(...e)=>{};function Gf(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const Kf=Ff(()=>{if(typeof navigator<`u`&&navigator?.userAgent?.includes(`Cloudflare`))return!1;try{return Function(``),!0}catch{return!1}});function qf(e){if(Gf(e)===!1)return!1;let t=e.constructor;if(t===void 0||typeof t!=`function`)return!0;let n=t.prototype;return!(Gf(n)===!1||Object.prototype.hasOwnProperty.call(n,`isPrototypeOf`)===!1)}function Jf(e){return qf(e)?{...e}:Array.isArray(e)?[...e]:e}const Yf=new Set([`string`,`number`,`symbol`]);function Xf(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function Zf(e,t,n){let r=new e._zod.constr(t??e._zod.def);return(!t||n?.parent)&&(r._zod.parent=e),r}function W(e){let t=e;if(!t)return{};if(typeof t==`string`)return{error:()=>t};if(t?.message!==void 0){if(t?.error!==void 0)throw Error("Cannot specify both `message` and `error` params");t.error=t.message}return delete t.message,typeof t.error==`string`?{...t,error:()=>t.error}:t}function Qf(e){return Object.keys(e).filter(t=>e[t]._zod.optin===`optional`&&e[t]._zod.optout===`optional`)}const $f={safeint:[-(2**53-1),2**53-1],int32:[-2147483648,2147483647],uint32:[0,4294967295],float32:[-34028234663852886e22,34028234663852886e22],float64:[-Number.MAX_VALUE,Number.MAX_VALUE]};function ep(e,t){let n=e._zod.def,r=n.checks;if(r&&r.length>0)throw Error(`.pick() cannot be used on object schemas containing refinements`);return Zf(e,Vf(e._zod.def,{get shape(){let e={};for(let r in t){if(!(r in n.shape))throw Error(`Unrecognized key: "${r}"`);t[r]&&(e[r]=n.shape[r])}return Bf(this,`shape`,e),e},checks:[]}))}function tp(e,t){let n=e._zod.def,r=n.checks;if(r&&r.length>0)throw Error(`.omit() cannot be used on object schemas containing refinements`);return Zf(e,Vf(e._zod.def,{get shape(){let r={...e._zod.def.shape};for(let e in t){if(!(e in n.shape))throw Error(`Unrecognized key: "${e}"`);t[e]&&delete r[e]}return Bf(this,`shape`,r),r},checks:[]}))}function np(e,t){if(!qf(t))throw Error(`Invalid input to extend: expected a plain object`);let n=e._zod.def.checks;if(n&&n.length>0){let n=e._zod.def.shape;for(let e in t)if(Object.getOwnPropertyDescriptor(n,e)!==void 0)throw Error("Cannot overwrite keys on object schemas containing refinements. Use `.safeExtend()` instead.")}return Zf(e,Vf(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t};return Bf(this,`shape`,n),n}}))}function rp(e,t){if(!qf(t))throw Error(`Invalid input to safeExtend: expected a plain object`);return Zf(e,Vf(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t};return Bf(this,`shape`,n),n}}))}function ip(e,t){return Zf(e,Vf(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t._zod.def.shape};return Bf(this,`shape`,n),n},get catchall(){return t._zod.def.catchall},checks:[]}))}function ap(e,t,n){let r=t._zod.def.checks;if(r&&r.length>0)throw Error(`.partial() cannot be used on object schemas containing refinements`);return Zf(t,Vf(t._zod.def,{get shape(){let r=t._zod.def.shape,i={...r};if(n)for(let t in n){if(!(t in r))throw Error(`Unrecognized key: "${t}"`);n[t]&&(i[t]=e?new e({type:`optional`,innerType:r[t]}):r[t])}else for(let t in r)i[t]=e?new e({type:`optional`,innerType:r[t]}):r[t];return Bf(this,`shape`,i),i},checks:[]}))}function op(e,t,n){return Zf(t,Vf(t._zod.def,{get shape(){let r=t._zod.def.shape,i={...r};if(n)for(let t in n){if(!(t in i))throw Error(`Unrecognized key: "${t}"`);n[t]&&(i[t]=new e({type:`nonoptional`,innerType:r[t]}))}else for(let t in r)i[t]=new e({type:`nonoptional`,innerType:r[t]});return Bf(this,`shape`,i),i}}))}function sp(e,t=0){if(e.aborted===!0)return!0;for(let n=t;n<e.issues.length;n++)if(e.issues[n]?.continue!==!0)return!0;return!1}function cp(e,t){return t.map(t=>{var n;return(n=t).path??(n.path=[]),t.path.unshift(e),t})}function lp(e){return typeof e==`string`?e:e?.message}function up(e,t,n){let r={...e,path:e.path??[]};return e.message||(r.message=lp(e.inst?._zod.def?.error?.(e))??lp(t?.error?.(e))??lp(n.customError?.(e))??lp(n.localeError?.(e))??`Invalid input`),delete r.inst,delete r.continue,t?.reportInput||delete r.input,r}function dp(e){return Array.isArray(e)?`array`:typeof e==`string`?`string`:`unknown`}function fp(...e){let[t,n,r]=e;return typeof t==`string`?{message:t,code:`custom`,input:n,inst:r}:{...t}}const pp=(e,t)=>{e.name=`$ZodError`,Object.defineProperty(e,`_zod`,{value:e._zod,enumerable:!1}),Object.defineProperty(e,`issues`,{value:t,enumerable:!1}),e.message=JSON.stringify(t,Pf,2),Object.defineProperty(e,`toString`,{value:()=>e.message,enumerable:!1})},mp=H(`$ZodError`,pp),hp=H(`$ZodError`,pp,{Parent:Error});function gp(e,t=e=>e.message){let n={},r=[];for(let i of e.issues)i.path.length>0?(n[i.path[0]]=n[i.path[0]]||[],n[i.path[0]].push(t(i))):r.push(t(i));return{formErrors:r,fieldErrors:n}}function _p(e,t=e=>e.message){let n={_errors:[]},r=e=>{for(let i of e.issues)if(i.code===`invalid_union`&&i.errors.length)i.errors.map(e=>r({issues:e}));else if(i.code===`invalid_key`)r({issues:i.issues});else if(i.code===`invalid_element`)r({issues:i.issues});else if(i.path.length===0)n._errors.push(t(i));else{let e=n,r=0;for(;r<i.path.length;){let n=i.path[r];r===i.path.length-1?(e[n]=e[n]||{_errors:[]},e[n]._errors.push(t(i))):e[n]=e[n]||{_errors:[]},e=e[n],r++}}};return r(e),n}const vp=e=>(t,n,r,i)=>{let a=r?Object.assign(r,{async:!1}):{async:!1},o=t._zod.run({value:n,issues:[]},a);if(o instanceof Promise)throw new kf;if(o.issues.length){let t=new(i?.Err??e)(o.issues.map(e=>up(e,a,Mf())));throw Wf(t,i?.callee),t}return o.value},yp=e=>async(t,n,r,i)=>{let a=r?Object.assign(r,{async:!0}):{async:!0},o=t._zod.run({value:n,issues:[]},a);if(o instanceof Promise&&(o=await o),o.issues.length){let t=new(i?.Err??e)(o.issues.map(e=>up(e,a,Mf())));throw Wf(t,i?.callee),t}return o.value},bp=e=>(t,n,r)=>{let i=r?{...r,async:!1}:{async:!1},a=t._zod.run({value:n,issues:[]},i);if(a instanceof Promise)throw new kf;return a.issues.length?{success:!1,error:new(e??mp)(a.issues.map(e=>up(e,i,Mf())))}:{success:!0,data:a.value}},xp=bp(hp),Sp=e=>async(t,n,r)=>{let i=r?Object.assign(r,{async:!0}):{async:!0},a=t._zod.run({value:n,issues:[]},i);return a instanceof Promise&&(a=await a),a.issues.length?{success:!1,error:new e(a.issues.map(e=>up(e,i,Mf())))}:{success:!0,data:a.value}},Cp=Sp(hp),wp=e=>(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return vp(e)(t,n,i)},Tp=e=>(t,n,r)=>vp(e)(t,n,r),Ep=e=>async(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return yp(e)(t,n,i)},Dp=e=>async(t,n,r)=>yp(e)(t,n,r),Op=e=>(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return bp(e)(t,n,i)},kp=e=>(t,n,r)=>bp(e)(t,n,r),Ap=e=>async(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return Sp(e)(t,n,i)},jp=e=>async(t,n,r)=>Sp(e)(t,n,r),Mp=/^[cC][^\s-]{8,}$/,Np=/^[0-9a-z]+$/,Pp=/^[0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{26}$/,Fp=/^[0-9a-vA-V]{20}$/,Ip=/^[A-Za-z0-9]{27}$/,Lp=/^[a-zA-Z0-9_-]{21}$/,Rp=/^P(?:(\d+W)|(?!.*W)(?=\d|T\d)(\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+([.,]\d+)?S)?)?)$/,zp=/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$/,Bp=e=>e?RegExp(`^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-${e}[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$`):/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/,Vp=/^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$/;function Hp(){return RegExp(`^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$`,`u`)}const Up=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,Wp=/^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$/,Gp=/^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/([0-9]|[1-2][0-9]|3[0-2])$/,Kp=/^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,qp=/^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$/,Jp=/^[A-Za-z0-9_-]*$/,Yp=/^\+[1-9]\d{6,14}$/,Xp=`(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))`,Zp=RegExp(`^${Xp}$`);function Qp(e){let t=`(?:[01]\\d|2[0-3]):[0-5]\\d`;return typeof e.precision==`number`?e.precision===-1?`${t}`:e.precision===0?`${t}:[0-5]\\d`:`${t}:[0-5]\\d\\.\\d{${e.precision}}`:`${t}(?::[0-5]\\d(?:\\.\\d+)?)?`}function $p(e){return RegExp(`^${Qp(e)}$`)}function em(e){let t=Qp({precision:e.precision}),n=[`Z`];e.local&&n.push(``),e.offset&&n.push(`([+-](?:[01]\\d|2[0-3]):[0-5]\\d)`);let r=`${t}(?:${n.join(`|`)})`;return RegExp(`^${Xp}T(?:${r})$`)}const tm=e=>{let t=e?`[\\s\\S]{${e?.minimum??0},${e?.maximum??``}}`:`[\\s\\S]*`;return RegExp(`^${t}$`)},nm=/^-?\d+$/,rm=/^-?\d+(?:\.\d+)?$/,im=/^[^A-Z]*$/,am=/^[^a-z]*$/,G=H(`$ZodCheck`,(e,t)=>{var n;e._zod??={},e._zod.def=t,(n=e._zod).onattach??(n.onattach=[])}),om={number:`number`,bigint:`bigint`,object:`date`},sm=H(`$ZodCheckLessThan`,(e,t)=>{G.init(e,t);let n=om[typeof t.value];e._zod.onattach.push(e=>{let n=e._zod.bag,r=(t.inclusive?n.maximum:n.exclusiveMaximum)??1/0;t.value<r&&(t.inclusive?n.maximum=t.value:n.exclusiveMaximum=t.value)}),e._zod.check=r=>{(t.inclusive?r.value<=t.value:r.value<t.value)||r.issues.push({origin:n,code:`too_big`,maximum:typeof t.value==`object`?t.value.getTime():t.value,input:r.value,inclusive:t.inclusive,inst:e,continue:!t.abort})}}),cm=H(`$ZodCheckGreaterThan`,(e,t)=>{G.init(e,t);let n=om[typeof t.value];e._zod.onattach.push(e=>{let n=e._zod.bag,r=(t.inclusive?n.minimum:n.exclusiveMinimum)??-1/0;t.value>r&&(t.inclusive?n.minimum=t.value:n.exclusiveMinimum=t.value)}),e._zod.check=r=>{(t.inclusive?r.value>=t.value:r.value>t.value)||r.issues.push({origin:n,code:`too_small`,minimum:typeof t.value==`object`?t.value.getTime():t.value,input:r.value,inclusive:t.inclusive,inst:e,continue:!t.abort})}}),lm=H(`$ZodCheckMultipleOf`,(e,t)=>{G.init(e,t),e._zod.onattach.push(e=>{var n;(n=e._zod.bag).multipleOf??(n.multipleOf=t.value)}),e._zod.check=n=>{if(typeof n.value!=typeof t.value)throw Error(`Cannot mix number and bigint in multiple_of check.`);(typeof n.value==`bigint`?n.value%t.value===BigInt(0):Rf(n.value,t.value)===0)||n.issues.push({origin:typeof n.value,code:`not_multiple_of`,divisor:t.value,input:n.value,inst:e,continue:!t.abort})}}),um=H(`$ZodCheckNumberFormat`,(e,t)=>{G.init(e,t),t.format=t.format||`float64`;let n=t.format?.includes(`int`),r=n?`int`:`number`,[i,a]=$f[t.format];e._zod.onattach.push(e=>{let r=e._zod.bag;r.format=t.format,r.minimum=i,r.maximum=a,n&&(r.pattern=nm)}),e._zod.check=o=>{let s=o.value;if(n){if(!Number.isInteger(s)){o.issues.push({expected:r,format:t.format,code:`invalid_type`,continue:!1,input:s,inst:e});return}if(!Number.isSafeInteger(s)){s>0?o.issues.push({input:s,code:`too_big`,maximum:2**53-1,note:`Integers must be within the safe integer range.`,inst:e,origin:r,inclusive:!0,continue:!t.abort}):o.issues.push({input:s,code:`too_small`,minimum:-(2**53-1),note:`Integers must be within the safe integer range.`,inst:e,origin:r,inclusive:!0,continue:!t.abort});return}}s<i&&o.issues.push({origin:`number`,input:s,code:`too_small`,minimum:i,inclusive:!0,inst:e,continue:!t.abort}),s>a&&o.issues.push({origin:`number`,input:s,code:`too_big`,maximum:a,inclusive:!0,inst:e,continue:!t.abort})}}),dm=H(`$ZodCheckMaxLength`,(e,t)=>{var n;G.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!If(t)&&t.length!==void 0}),e._zod.onattach.push(e=>{let n=e._zod.bag.maximum??1/0;t.maximum<n&&(e._zod.bag.maximum=t.maximum)}),e._zod.check=n=>{let r=n.value;if(r.length<=t.maximum)return;let i=dp(r);n.issues.push({origin:i,code:`too_big`,maximum:t.maximum,inclusive:!0,input:r,inst:e,continue:!t.abort})}}),fm=H(`$ZodCheckMinLength`,(e,t)=>{var n;G.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!If(t)&&t.length!==void 0}),e._zod.onattach.push(e=>{let n=e._zod.bag.minimum??-1/0;t.minimum>n&&(e._zod.bag.minimum=t.minimum)}),e._zod.check=n=>{let r=n.value;if(r.length>=t.minimum)return;let i=dp(r);n.issues.push({origin:i,code:`too_small`,minimum:t.minimum,inclusive:!0,input:r,inst:e,continue:!t.abort})}}),pm=H(`$ZodCheckLengthEquals`,(e,t)=>{var n;G.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!If(t)&&t.length!==void 0}),e._zod.onattach.push(e=>{let n=e._zod.bag;n.minimum=t.length,n.maximum=t.length,n.length=t.length}),e._zod.check=n=>{let r=n.value,i=r.length;if(i===t.length)return;let a=dp(r),o=i>t.length;n.issues.push({origin:a,...o?{code:`too_big`,maximum:t.length}:{code:`too_small`,minimum:t.length},inclusive:!0,exact:!0,input:n.value,inst:e,continue:!t.abort})}}),mm=H(`$ZodCheckStringFormat`,(e,t)=>{var n,r;G.init(e,t),e._zod.onattach.push(e=>{let n=e._zod.bag;n.format=t.format,t.pattern&&(n.patterns??=new Set,n.patterns.add(t.pattern))}),t.pattern?(n=e._zod).check??(n.check=n=>{t.pattern.lastIndex=0,!t.pattern.test(n.value)&&n.issues.push({origin:`string`,code:`invalid_format`,format:t.format,input:n.value,...t.pattern?{pattern:t.pattern.toString()}:{},inst:e,continue:!t.abort})}):(r=e._zod).check??(r.check=()=>{})}),hm=H(`$ZodCheckRegex`,(e,t)=>{mm.init(e,t),e._zod.check=n=>{t.pattern.lastIndex=0,!t.pattern.test(n.value)&&n.issues.push({origin:`string`,code:`invalid_format`,format:`regex`,input:n.value,pattern:t.pattern.toString(),inst:e,continue:!t.abort})}}),gm=H(`$ZodCheckLowerCase`,(e,t)=>{t.pattern??=im,mm.init(e,t)}),_m=H(`$ZodCheckUpperCase`,(e,t)=>{t.pattern??=am,mm.init(e,t)}),vm=H(`$ZodCheckIncludes`,(e,t)=>{G.init(e,t);let n=Xf(t.includes),r=new RegExp(typeof t.position==`number`?`^.{${t.position}}${n}`:n);t.pattern=r,e._zod.onattach.push(e=>{let t=e._zod.bag;t.patterns??=new Set,t.patterns.add(r)}),e._zod.check=n=>{n.value.includes(t.includes,t.position)||n.issues.push({origin:`string`,code:`invalid_format`,format:`includes`,includes:t.includes,input:n.value,inst:e,continue:!t.abort})}}),ym=H(`$ZodCheckStartsWith`,(e,t)=>{G.init(e,t);let n=RegExp(`^${Xf(t.prefix)}.*`);t.pattern??=n,e._zod.onattach.push(e=>{let t=e._zod.bag;t.patterns??=new Set,t.patterns.add(n)}),e._zod.check=n=>{n.value.startsWith(t.prefix)||n.issues.push({origin:`string`,code:`invalid_format`,format:`starts_with`,prefix:t.prefix,input:n.value,inst:e,continue:!t.abort})}}),bm=H(`$ZodCheckEndsWith`,(e,t)=>{G.init(e,t);let n=RegExp(`.*${Xf(t.suffix)}$`);t.pattern??=n,e._zod.onattach.push(e=>{let t=e._zod.bag;t.patterns??=new Set,t.patterns.add(n)}),e._zod.check=n=>{n.value.endsWith(t.suffix)||n.issues.push({origin:`string`,code:`invalid_format`,format:`ends_with`,suffix:t.suffix,input:n.value,inst:e,continue:!t.abort})}}),xm=H(`$ZodCheckOverwrite`,(e,t)=>{G.init(e,t),e._zod.check=e=>{e.value=t.tx(e.value)}});var Sm=class{constructor(e=[]){this.content=[],this.indent=0,this&&(this.args=e)}indented(e){this.indent+=1,e(this),--this.indent}write(e){if(typeof e==`function`){e(this,{execution:`sync`}),e(this,{execution:`async`});return}let t=e.split(`
407
+ `)||void 0}let a=[...await e.list(),...i];if(a.length!==0)return _n(a,await t.loadRuntimeLessonsTemplate()??void 0)||void 0}}),i=y({name:`lesson-relevant-hints`,timing:`system.prompt.transform`,priority:vt.lesson.priority+1,handle:async(t,n)=>{if(!t.userText)return;let r=hf();if(r.size===0)return;let i=yf(await e.list(),r,t.userText);i&&(await e.recordRelevantHits(i.hitIds),n.systemTail=[...n.systemTail??[],i.text])}});return[...r,i]}function xf(e){return kt({name:`skill-catalog-injection`,priority:vt.skillCatalog.priority,compute:()=>{let t=e.buildCatalog();if(t)return`${t}\n\nUse the skill tool with a skill name to load its full instructions.`}})}function Sf(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 Cf(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 wf(){let e=new Map;return[y({name:`background-process-exit-collector`,timing:`process.exited`,handle:t=>{let n=e.get(t.sessionId)??[];n.push(Cf(t)),e.set(t.sessionId,n)}}),y({name:`background-process-exit-injector`,timing:`messages.transform`,priority:25,handle:(t,n)=>{Sf(e,t,n)}}),y({name:`background-process-notification-cleanup`,timing:`session.deleted`,handle:t=>{e.delete(t.sessionId)}})]}function Tf(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 Ef(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 Df(e){return e.role===`user`||e.role===`assistant`||e.role===`tool_result`}function Of(e,t,n={}){let r=n.minMessages??6;return[y({name:`memory-auto-extract`,timing:`session.idle`,handle:async i=>{if(n.isEnabled&&!n.isEnabled())return;let a=e(i.sessionId);if(!a)return;let o=a.session.messages();o.length<r||await t.onIdle(i.sessionId,o.filter(Df))}}),y({name:`memory-auto-extract-cleanup`,timing:`session.deleted`,handle:e=>{t.reset(e.sessionId)}})]}function kf(e){return kt({name:vt.skillLoopGuidance.name,priority:vt.skillLoopGuidance.priority,compute:()=>e.isEnabled()?mn:void 0})}const Af=336*60*60*1e3;function jf(e){return typeof e!=`number`||!Number.isFinite(e)?Af:Math.max(864e5,Math.round(e*24*60*60*1e3))}function Mf(e,t,n=Af){return e.filter(e=>e.dismissedAt===void 0||t-e.dismissedAt>=n)}function Nf(e){return new Date(e).toISOString().slice(0,10)}function Pf(e){return`你重复做过同一类任务 ${e.size} 次,要把它的执行流程固化成一个可复用的 skill 吗?`}function Ff(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}`,`时间跨度:${Nf(e.firstAt)} ~ ${Nf(e.lastAt)}`,``,`若同意,otto 会据这些会话的执行路径起草一份 SKILL.md 交你审阅——生成物仍需你显式 apply 才会生效。`,`完整候选数据可用 read 工具查看插件状态目录下的 candidates.json。`].join(`
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(`
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 Cm={major:4,minor:3,patch:6},K=H(`$ZodType`,(e,t)=>{var n;e??={},e._zod.def=t,e._zod.bag=e._zod.bag||{},e._zod.version=Cm;let r=[...e._zod.def.checks??[]];e._zod.traits.has(`$ZodCheck`)&&r.unshift(e);for(let t of r)for(let n of t._zod.onattach)n(e);if(r.length===0)(n=e._zod).deferred??(n.deferred=[]),e._zod.deferred?.push(()=>{e._zod.run=e._zod.parse});else{let t=(e,t,n)=>{let r=sp(e),i;for(let a of t){if(a._zod.def.when){if(!a._zod.def.when(e))continue}else if(r)continue;let t=e.issues.length,o=a._zod.check(e);if(o instanceof Promise&&n?.async===!1)throw new kf;if(i||o instanceof Promise)i=(i??Promise.resolve()).then(async()=>{await o,e.issues.length!==t&&(r||=sp(e,t))});else{if(e.issues.length===t)continue;r||=sp(e,t)}}return i?i.then(()=>e):e},n=(n,i,a)=>{if(sp(n))return n.aborted=!0,n;let o=t(i,r,a);if(o instanceof Promise){if(a.async===!1)throw new kf;return o.then(t=>e._zod.parse(t,a))}return e._zod.parse(o,a)};e._zod.run=(i,a)=>{if(a.skipChecks)return e._zod.parse(i,a);if(a.direction===`backward`){let t=e._zod.parse({value:i.value,issues:[]},{...a,skipChecks:!0});return t instanceof Promise?t.then(e=>n(e,i,a)):n(t,i,a)}let o=e._zod.parse(i,a);if(o instanceof Promise){if(a.async===!1)throw new kf;return o.then(e=>t(e,r,a))}return t(o,r,a)}}U(e,`~standard`,()=>({validate:t=>{try{let n=xp(e,t);return n.success?{value:n.data}:{issues:n.error?.issues}}catch{return Cp(e,t).then(e=>e.success?{value:e.data}:{issues:e.error?.issues})}},vendor:`zod`,version:1}))}),wm=H(`$ZodString`,(e,t)=>{K.init(e,t),e._zod.pattern=[...e?._zod.bag?.patterns??[]].pop()??tm(e._zod.bag),e._zod.parse=(n,r)=>{if(t.coerce)try{n.value=String(n.value)}catch{}return typeof n.value==`string`||n.issues.push({expected:`string`,code:`invalid_type`,input:n.value,inst:e}),n}}),q=H(`$ZodStringFormat`,(e,t)=>{mm.init(e,t),wm.init(e,t)}),Tm=H(`$ZodGUID`,(e,t)=>{t.pattern??=zp,q.init(e,t)}),Em=H(`$ZodUUID`,(e,t)=>{if(t.version){let e={v1:1,v2:2,v3:3,v4:4,v5:5,v6:6,v7:7,v8:8}[t.version];if(e===void 0)throw Error(`Invalid UUID version: "${t.version}"`);t.pattern??=Bp(e)}else t.pattern??=Bp();q.init(e,t)}),Dm=H(`$ZodEmail`,(e,t)=>{t.pattern??=Vp,q.init(e,t)}),Om=H(`$ZodURL`,(e,t)=>{q.init(e,t),e._zod.check=n=>{try{let r=n.value.trim(),i=new URL(r);t.hostname&&(t.hostname.lastIndex=0,t.hostname.test(i.hostname)||n.issues.push({code:`invalid_format`,format:`url`,note:`Invalid hostname`,pattern:t.hostname.source,input:n.value,inst:e,continue:!t.abort})),t.protocol&&(t.protocol.lastIndex=0,t.protocol.test(i.protocol.endsWith(`:`)?i.protocol.slice(0,-1):i.protocol)||n.issues.push({code:`invalid_format`,format:`url`,note:`Invalid protocol`,pattern:t.protocol.source,input:n.value,inst:e,continue:!t.abort})),t.normalize?n.value=i.href:n.value=r;return}catch{n.issues.push({code:`invalid_format`,format:`url`,input:n.value,inst:e,continue:!t.abort})}}}),km=H(`$ZodEmoji`,(e,t)=>{t.pattern??=Hp(),q.init(e,t)}),Am=H(`$ZodNanoID`,(e,t)=>{t.pattern??=Lp,q.init(e,t)}),jm=H(`$ZodCUID`,(e,t)=>{t.pattern??=Mp,q.init(e,t)}),Mm=H(`$ZodCUID2`,(e,t)=>{t.pattern??=Np,q.init(e,t)}),Nm=H(`$ZodULID`,(e,t)=>{t.pattern??=Pp,q.init(e,t)}),Pm=H(`$ZodXID`,(e,t)=>{t.pattern??=Fp,q.init(e,t)}),Fm=H(`$ZodKSUID`,(e,t)=>{t.pattern??=Ip,q.init(e,t)}),Im=H(`$ZodISODateTime`,(e,t)=>{t.pattern??=em(t),q.init(e,t)}),Lm=H(`$ZodISODate`,(e,t)=>{t.pattern??=Zp,q.init(e,t)}),Rm=H(`$ZodISOTime`,(e,t)=>{t.pattern??=$p(t),q.init(e,t)}),zm=H(`$ZodISODuration`,(e,t)=>{t.pattern??=Rp,q.init(e,t)}),Bm=H(`$ZodIPv4`,(e,t)=>{t.pattern??=Up,q.init(e,t),e._zod.bag.format=`ipv4`}),Vm=H(`$ZodIPv6`,(e,t)=>{t.pattern??=Wp,q.init(e,t),e._zod.bag.format=`ipv6`,e._zod.check=n=>{try{new URL(`http://[${n.value}]`)}catch{n.issues.push({code:`invalid_format`,format:`ipv6`,input:n.value,inst:e,continue:!t.abort})}}}),Hm=H(`$ZodCIDRv4`,(e,t)=>{t.pattern??=Gp,q.init(e,t)}),Um=H(`$ZodCIDRv6`,(e,t)=>{t.pattern??=Kp,q.init(e,t),e._zod.check=n=>{let r=n.value.split(`/`);try{if(r.length!==2)throw Error();let[e,t]=r;if(!t)throw Error();let n=Number(t);if(`${n}`!==t||n<0||n>128)throw Error();new URL(`http://[${e}]`)}catch{n.issues.push({code:`invalid_format`,format:`cidrv6`,input:n.value,inst:e,continue:!t.abort})}}});function Wm(e){if(e===``)return!0;if(e.length%4!=0)return!1;try{return atob(e),!0}catch{return!1}}const Gm=H(`$ZodBase64`,(e,t)=>{t.pattern??=qp,q.init(e,t),e._zod.bag.contentEncoding=`base64`,e._zod.check=n=>{Wm(n.value)||n.issues.push({code:`invalid_format`,format:`base64`,input:n.value,inst:e,continue:!t.abort})}});function Km(e){if(!Jp.test(e))return!1;let t=e.replace(/[-_]/g,e=>e===`-`?`+`:`/`);return Wm(t.padEnd(Math.ceil(t.length/4)*4,`=`))}const qm=H(`$ZodBase64URL`,(e,t)=>{t.pattern??=Jp,q.init(e,t),e._zod.bag.contentEncoding=`base64url`,e._zod.check=n=>{Km(n.value)||n.issues.push({code:`invalid_format`,format:`base64url`,input:n.value,inst:e,continue:!t.abort})}}),Jm=H(`$ZodE164`,(e,t)=>{t.pattern??=Yp,q.init(e,t)});function Ym(e,t=null){try{let n=e.split(`.`);if(n.length!==3)return!1;let[r]=n;if(!r)return!1;let i=JSON.parse(atob(r));return!(`typ`in i&&i?.typ!==`JWT`||!i.alg||t&&(!(`alg`in i)||i.alg!==t))}catch{return!1}}const Xm=H(`$ZodJWT`,(e,t)=>{q.init(e,t),e._zod.check=n=>{Ym(n.value,t.alg)||n.issues.push({code:`invalid_format`,format:`jwt`,input:n.value,inst:e,continue:!t.abort})}}),Zm=H(`$ZodNumber`,(e,t)=>{K.init(e,t),e._zod.pattern=e._zod.bag.pattern??rm,e._zod.parse=(n,r)=>{if(t.coerce)try{n.value=Number(n.value)}catch{}let i=n.value;if(typeof i==`number`&&!Number.isNaN(i)&&Number.isFinite(i))return n;let a=typeof i==`number`?Number.isNaN(i)?`NaN`:Number.isFinite(i)?void 0:`Infinity`:void 0;return n.issues.push({expected:`number`,code:`invalid_type`,input:i,inst:e,...a?{received:a}:{}}),n}}),Qm=H(`$ZodNumberFormat`,(e,t)=>{um.init(e,t),Zm.init(e,t)}),$m=H(`$ZodUnknown`,(e,t)=>{K.init(e,t),e._zod.parse=e=>e}),eh=H(`$ZodNever`,(e,t)=>{K.init(e,t),e._zod.parse=(t,n)=>(t.issues.push({expected:`never`,code:`invalid_type`,input:t.value,inst:e}),t)});function th(e,t,n){e.issues.length&&t.issues.push(...cp(n,e.issues)),t.value[n]=e.value}const nh=H(`$ZodArray`,(e,t)=>{K.init(e,t),e._zod.parse=(n,r)=>{let i=n.value;if(!Array.isArray(i))return n.issues.push({expected:`array`,code:`invalid_type`,input:i,inst:e}),n;n.value=Array(i.length);let a=[];for(let e=0;e<i.length;e++){let o=i[e],s=t.element._zod.run({value:o,issues:[]},r);s instanceof Promise?a.push(s.then(t=>th(t,n,e))):th(s,n,e)}return a.length?Promise.all(a).then(()=>n):n}});function rh(e,t,n,r,i){if(e.issues.length){if(i&&!(n in r))return;t.issues.push(...cp(n,e.issues))}e.value===void 0?n in r&&(t.value[n]=void 0):t.value[n]=e.value}function ih(e){let t=Object.keys(e.shape);for(let n of t)if(!e.shape?.[n]?._zod?.traits?.has(`$ZodType`))throw Error(`Invalid element at key "${n}": expected a Zod schema`);let n=Qf(e.shape);return{...e,keys:t,keySet:new Set(t),numKeys:t.length,optionalKeys:new Set(n)}}function ah(e,t,n,r,i,a){let o=[],s=i.keySet,c=i.catchall._zod,l=c.def.type,u=c.optout===`optional`;for(let i in t){if(s.has(i))continue;if(l===`never`){o.push(i);continue}let a=c.run({value:t[i],issues:[]},r);a instanceof Promise?e.push(a.then(e=>rh(e,n,i,t,u))):rh(a,n,i,t,u)}return o.length&&n.issues.push({code:`unrecognized_keys`,keys:o,input:t,inst:a}),e.length?Promise.all(e).then(()=>n):n}const oh=H(`$ZodObject`,(e,t)=>{if(K.init(e,t),!Object.getOwnPropertyDescriptor(t,`shape`)?.get){let e=t.shape;Object.defineProperty(t,`shape`,{get:()=>{let n={...e};return Object.defineProperty(t,`shape`,{value:n}),n}})}let n=Ff(()=>ih(t));U(e._zod,`propValues`,()=>{let e=t.shape,n={};for(let t in e){let r=e[t]._zod;if(r.values){n[t]??(n[t]=new Set);for(let e of r.values)n[t].add(e)}}return n});let r=Gf,i=t.catchall,a;e._zod.parse=(t,o)=>{a??=n.value;let s=t.value;if(!r(s))return t.issues.push({expected:`object`,code:`invalid_type`,input:s,inst:e}),t;t.value={};let c=[],l=a.shape;for(let e of a.keys){let n=l[e],r=n._zod.optout===`optional`,i=n._zod.run({value:s[e],issues:[]},o);i instanceof Promise?c.push(i.then(n=>rh(n,t,e,s,r))):rh(i,t,e,s,r)}return i?ah(c,s,t,o,n.value,e):c.length?Promise.all(c).then(()=>t):t}}),sh=H(`$ZodObjectJIT`,(e,t)=>{oh.init(e,t);let n=e._zod.parse,r=Ff(()=>ih(t)),i=e=>{let t=new Sm([`shape`,`payload`,`ctx`]),n=r.value,i=e=>{let t=Hf(e);return`shape[${t}]._zod.run({ value: input[${t}], issues: [] }, ctx)`};t.write(`const input = payload.value;`);let a=Object.create(null),o=0;for(let e of n.keys)a[e]=`key_${o++}`;t.write(`const newResult = {};`);for(let r of n.keys){let n=a[r],o=Hf(r),s=e[r]?._zod?.optout===`optional`;t.write(`const ${n} = ${i(r)};`),s?t.write(`
411
+ `))}};const Mm={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=Mm;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=gp(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 Rf;if(i||o instanceof Promise)i=(i??Promise.resolve()).then(async()=>{await o,e.issues.length!==t&&(r||=gp(e,t))});else{if(e.issues.length===t)continue;r||=gp(e,t)}}return i?i.then(()=>e):e},n=(n,i,a)=>{if(gp(n))return n.aborted=!0,n;let o=t(i,r,a);if(o instanceof Promise){if(a.async===!1)throw new Rf;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 Rf;return o.then(e=>t(e,r,a))}return t(o,r,a)}}U(e,`~standard`,()=>({validate:t=>{try{let n=Ap(e,t);return n.success?{value:n.data}:{issues:n.error?.issues}}catch{return Mp(e,t).then(e=>e.success?{value:e.data}:{issues:e.error?.issues})}},vendor:`zod`,version:1}))}),Nm=H(`$ZodString`,(e,t)=>{K.init(e,t),e._zod.pattern=[...e?._zod.bag?.patterns??[]].pop()??um(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)=>{Cm.init(e,t),Nm.init(e,t)}),Pm=H(`$ZodGUID`,(e,t)=>{t.pattern??=Jp,q.init(e,t)}),Fm=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??=Yp(e)}else t.pattern??=Yp();q.init(e,t)}),Im=H(`$ZodEmail`,(e,t)=>{t.pattern??=Xp,q.init(e,t)}),Lm=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})}}}),Rm=H(`$ZodEmoji`,(e,t)=>{t.pattern??=Zp(),q.init(e,t)}),zm=H(`$ZodNanoID`,(e,t)=>{t.pattern??=Kp,q.init(e,t)}),Bm=H(`$ZodCUID`,(e,t)=>{t.pattern??=Vp,q.init(e,t)}),Vm=H(`$ZodCUID2`,(e,t)=>{t.pattern??=Hp,q.init(e,t)}),Hm=H(`$ZodULID`,(e,t)=>{t.pattern??=Up,q.init(e,t)}),Um=H(`$ZodXID`,(e,t)=>{t.pattern??=Wp,q.init(e,t)}),Wm=H(`$ZodKSUID`,(e,t)=>{t.pattern??=Gp,q.init(e,t)}),Gm=H(`$ZodISODateTime`,(e,t)=>{t.pattern??=lm(t),q.init(e,t)}),Km=H(`$ZodISODate`,(e,t)=>{t.pattern??=om,q.init(e,t)}),qm=H(`$ZodISOTime`,(e,t)=>{t.pattern??=cm(t),q.init(e,t)}),Jm=H(`$ZodISODuration`,(e,t)=>{t.pattern??=qp,q.init(e,t)}),Ym=H(`$ZodIPv4`,(e,t)=>{t.pattern??=Qp,q.init(e,t),e._zod.bag.format=`ipv4`}),Xm=H(`$ZodIPv6`,(e,t)=>{t.pattern??=$p,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})}}}),Zm=H(`$ZodCIDRv4`,(e,t)=>{t.pattern??=em,q.init(e,t)}),Qm=H(`$ZodCIDRv6`,(e,t)=>{t.pattern??=tm,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 $m(e){if(e===``)return!0;if(e.length%4!=0)return!1;try{return atob(e),!0}catch{return!1}}const eh=H(`$ZodBase64`,(e,t)=>{t.pattern??=nm,q.init(e,t),e._zod.bag.contentEncoding=`base64`,e._zod.check=n=>{$m(n.value)||n.issues.push({code:`invalid_format`,format:`base64`,input:n.value,inst:e,continue:!t.abort})}});function th(e){if(!rm.test(e))return!1;let t=e.replace(/[-_]/g,e=>e===`-`?`+`:`/`);return $m(t.padEnd(Math.ceil(t.length/4)*4,`=`))}const nh=H(`$ZodBase64URL`,(e,t)=>{t.pattern??=rm,q.init(e,t),e._zod.bag.contentEncoding=`base64url`,e._zod.check=n=>{th(n.value)||n.issues.push({code:`invalid_format`,format:`base64url`,input:n.value,inst:e,continue:!t.abort})}}),rh=H(`$ZodE164`,(e,t)=>{t.pattern??=im,q.init(e,t)});function ih(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 ah=H(`$ZodJWT`,(e,t)=>{q.init(e,t),e._zod.check=n=>{ih(n.value,t.alg)||n.issues.push({code:`invalid_format`,format:`jwt`,input:n.value,inst:e,continue:!t.abort})}}),oh=H(`$ZodNumber`,(e,t)=>{K.init(e,t),e._zod.pattern=e._zod.bag.pattern??fm,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}}),sh=H(`$ZodNumberFormat`,(e,t)=>{ym.init(e,t),oh.init(e,t)}),ch=H(`$ZodUnknown`,(e,t)=>{K.init(e,t),e._zod.parse=e=>e}),lh=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 uh(e,t,n){e.issues.length&&t.issues.push(..._p(n,e.issues)),t.value[n]=e.value}const dh=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=>uh(t,n,e))):uh(s,n,e)}return a.length?Promise.all(a).then(()=>n):n}});function fh(e,t,n,r,i){if(e.issues.length){if(i&&!(n in r))return;t.issues.push(..._p(n,e.issues))}e.value===void 0?n in r&&(t.value[n]=void 0):t.value[n]=e.value}function ph(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=sp(e.shape);return{...e,keys:t,keySet:new Set(t),numKeys:t.length,optionalKeys:new Set(n)}}function mh(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=>fh(e,n,i,t,u))):fh(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 hh=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=Wf(()=>ph(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=ep,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=>fh(n,t,e,s,r))):fh(i,t,e,s,r)}return i?mh(c,s,t,o,n.value,e):c.length?Promise.all(c).then(()=>t):t}}),gh=H(`$ZodObjectJIT`,(e,t)=>{hh.init(e,t);let n=e._zod.parse,r=Wf(()=>ph(t)),i=e=>{let t=new jm([`shape`,`payload`,`ctx`]),n=r.value,i=e=>{let t=Zf(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=Zf(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=Gf,s=!jf.jitless,c=s&&Kf.value,l=t.catchall,u;e._zod.parse=(d,f)=>{u??=r.value;let p=d.value;return o(p)?s&&c&&f?.async===!1&&f.jitless!==!0?(a||=i(t.shape),d=a(d,f),l?ah([],p,d,f,u,e):d):n(d,f):(d.issues.push({expected:`object`,code:`invalid_type`,input:p,inst:e}),d)}});function ch(e,t,n,r){for(let n of e)if(n.issues.length===0)return t.value=n.value,t;let i=e.filter(e=>!sp(e));return i.length===1?(t.value=i[0].value,i[0]):(t.issues.push({code:`invalid_union`,input:t.value,inst:n,errors:e.map(e=>e.issues.map(e=>up(e,r,Mf())))}),t)}const lh=H(`$ZodUnion`,(e,t)=>{K.init(e,t),U(e._zod,`optin`,()=>t.options.some(e=>e._zod.optin===`optional`)?`optional`:void 0),U(e._zod,`optout`,()=>t.options.some(e=>e._zod.optout===`optional`)?`optional`:void 0),U(e._zod,`values`,()=>{if(t.options.every(e=>e._zod.values))return new Set(t.options.flatMap(e=>Array.from(e._zod.values)))}),U(e._zod,`pattern`,()=>{if(t.options.every(e=>e._zod.pattern)){let e=t.options.map(e=>e._zod.pattern);return RegExp(`^(${e.map(e=>Lf(e.source)).join(`|`)})$`)}});let n=t.options.length===1,r=t.options[0]._zod.run;e._zod.parse=(i,a)=>{if(n)return r(i,a);let o=!1,s=[];for(let e of t.options){let t=e._zod.run({value:i.value,issues:[]},a);if(t instanceof Promise)s.push(t),o=!0;else{if(t.issues.length===0)return t;s.push(t)}}return o?Promise.all(s).then(t=>ch(t,i,e,a)):ch(s,i,e,a)}}),uh=H(`$ZodIntersection`,(e,t)=>{K.init(e,t),e._zod.parse=(e,n)=>{let r=e.value,i=t.left._zod.run({value:r,issues:[]},n),a=t.right._zod.run({value:r,issues:[]},n);return i instanceof Promise||a instanceof Promise?Promise.all([i,a]).then(([t,n])=>fh(e,t,n)):fh(e,i,a)}});function dh(e,t){if(e===t||e instanceof Date&&t instanceof Date&&+e==+t)return{valid:!0,data:e};if(qf(e)&&qf(t)){let n=Object.keys(t),r=Object.keys(e).filter(e=>n.indexOf(e)!==-1),i={...e,...t};for(let n of r){let r=dh(e[n],t[n]);if(!r.valid)return{valid:!1,mergeErrorPath:[n,...r.mergeErrorPath]};i[n]=r.data}return{valid:!0,data:i}}if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return{valid:!1,mergeErrorPath:[]};let n=[];for(let r=0;r<e.length;r++){let i=e[r],a=t[r],o=dh(i,a);if(!o.valid)return{valid:!1,mergeErrorPath:[r,...o.mergeErrorPath]};n.push(o.data)}return{valid:!0,data:n}}return{valid:!1,mergeErrorPath:[]}}function fh(e,t,n){let r=new Map,i;for(let n of t.issues)if(n.code===`unrecognized_keys`){i??=n;for(let e of n.keys)r.has(e)||r.set(e,{}),r.get(e).l=!0}else e.issues.push(n);for(let t of n.issues)if(t.code===`unrecognized_keys`)for(let e of t.keys)r.has(e)||r.set(e,{}),r.get(e).r=!0;else e.issues.push(t);let a=[...r].filter(([,e])=>e.l&&e.r).map(([e])=>e);if(a.length&&i&&e.issues.push({...i,keys:a}),sp(e))return e;let o=dh(t.value,n.value);if(!o.valid)throw Error(`Unmergable intersection. Error path: ${JSON.stringify(o.mergeErrorPath)}`);return e.value=o.data,e}const ph=H(`$ZodEnum`,(e,t)=>{K.init(e,t);let n=Nf(t.entries),r=new Set(n);e._zod.values=r,e._zod.pattern=RegExp(`^(${n.filter(e=>Yf.has(typeof e)).map(e=>typeof e==`string`?Xf(e):e.toString()).join(`|`)})$`),e._zod.parse=(t,i)=>{let a=t.value;return r.has(a)||t.issues.push({code:`invalid_value`,values:n,input:a,inst:e}),t}}),mh=H(`$ZodTransform`,(e,t)=>{K.init(e,t),e._zod.parse=(n,r)=>{if(r.direction===`backward`)throw new Af(e.constructor.name);let i=t.transform(n.value,n);if(r.async)return(i instanceof Promise?i:Promise.resolve(i)).then(e=>(n.value=e,n));if(i instanceof Promise)throw new kf;return n.value=i,n}});function hh(e,t){return e.issues.length&&t===void 0?{issues:[],value:void 0}:e}const gh=H(`$ZodOptional`,(e,t)=>{K.init(e,t),e._zod.optin=`optional`,e._zod.optout=`optional`,U(e._zod,`values`,()=>t.innerType._zod.values?new Set([...t.innerType._zod.values,void 0]):void 0),U(e._zod,`pattern`,()=>{let e=t.innerType._zod.pattern;return e?RegExp(`^(${Lf(e.source)})?$`):void 0}),e._zod.parse=(e,n)=>{if(t.innerType._zod.optin===`optional`){let r=t.innerType._zod.run(e,n);return r instanceof Promise?r.then(t=>hh(t,e.value)):hh(r,e.value)}return e.value===void 0?e:t.innerType._zod.run(e,n)}}),_h=H(`$ZodExactOptional`,(e,t)=>{gh.init(e,t),U(e._zod,`values`,()=>t.innerType._zod.values),U(e._zod,`pattern`,()=>t.innerType._zod.pattern),e._zod.parse=(e,n)=>t.innerType._zod.run(e,n)}),vh=H(`$ZodNullable`,(e,t)=>{K.init(e,t),U(e._zod,`optin`,()=>t.innerType._zod.optin),U(e._zod,`optout`,()=>t.innerType._zod.optout),U(e._zod,`pattern`,()=>{let e=t.innerType._zod.pattern;return e?RegExp(`^(${Lf(e.source)}|null)$`):void 0}),U(e._zod,`values`,()=>t.innerType._zod.values?new Set([...t.innerType._zod.values,null]):void 0),e._zod.parse=(e,n)=>e.value===null?e:t.innerType._zod.run(e,n)}),yh=H(`$ZodDefault`,(e,t)=>{K.init(e,t),e._zod.optin=`optional`,U(e._zod,`values`,()=>t.innerType._zod.values),e._zod.parse=(e,n)=>{if(n.direction===`backward`)return t.innerType._zod.run(e,n);if(e.value===void 0)return e.value=t.defaultValue,e;let r=t.innerType._zod.run(e,n);return r instanceof Promise?r.then(e=>bh(e,t)):bh(r,t)}});function bh(e,t){return e.value===void 0&&(e.value=t.defaultValue),e}const xh=H(`$ZodPrefault`,(e,t)=>{K.init(e,t),e._zod.optin=`optional`,U(e._zod,`values`,()=>t.innerType._zod.values),e._zod.parse=(e,n)=>(n.direction===`backward`||e.value===void 0&&(e.value=t.defaultValue),t.innerType._zod.run(e,n))}),Sh=H(`$ZodNonOptional`,(e,t)=>{K.init(e,t),U(e._zod,`values`,()=>{let e=t.innerType._zod.values;return e?new Set([...e].filter(e=>e!==void 0)):void 0}),e._zod.parse=(n,r)=>{let i=t.innerType._zod.run(n,r);return i instanceof Promise?i.then(t=>Ch(t,e)):Ch(i,e)}});function Ch(e,t){return!e.issues.length&&e.value===void 0&&e.issues.push({code:`invalid_type`,expected:`nonoptional`,input:e.value,inst:t}),e}const wh=H(`$ZodCatch`,(e,t)=>{K.init(e,t),U(e._zod,`optin`,()=>t.innerType._zod.optin),U(e._zod,`optout`,()=>t.innerType._zod.optout),U(e._zod,`values`,()=>t.innerType._zod.values),e._zod.parse=(e,n)=>{if(n.direction===`backward`)return t.innerType._zod.run(e,n);let r=t.innerType._zod.run(e,n);return r instanceof Promise?r.then(r=>(e.value=r.value,r.issues.length&&(e.value=t.catchValue({...e,error:{issues:r.issues.map(e=>up(e,n,Mf()))},input:e.value}),e.issues=[]),e)):(e.value=r.value,r.issues.length&&(e.value=t.catchValue({...e,error:{issues:r.issues.map(e=>up(e,n,Mf()))},input:e.value}),e.issues=[]),e)}}),Th=H(`$ZodPipe`,(e,t)=>{K.init(e,t),U(e._zod,`values`,()=>t.in._zod.values),U(e._zod,`optin`,()=>t.in._zod.optin),U(e._zod,`optout`,()=>t.out._zod.optout),U(e._zod,`propValues`,()=>t.in._zod.propValues),e._zod.parse=(e,n)=>{if(n.direction===`backward`){let r=t.out._zod.run(e,n);return r instanceof Promise?r.then(e=>Eh(e,t.in,n)):Eh(r,t.in,n)}let r=t.in._zod.run(e,n);return r instanceof Promise?r.then(e=>Eh(e,t.out,n)):Eh(r,t.out,n)}});function Eh(e,t,n){return e.issues.length?(e.aborted=!0,e):t._zod.run({value:e.value,issues:e.issues},n)}const Dh=H(`$ZodReadonly`,(e,t)=>{K.init(e,t),U(e._zod,`propValues`,()=>t.innerType._zod.propValues),U(e._zod,`values`,()=>t.innerType._zod.values),U(e._zod,`optin`,()=>t.innerType?._zod?.optin),U(e._zod,`optout`,()=>t.innerType?._zod?.optout),e._zod.parse=(e,n)=>{if(n.direction===`backward`)return t.innerType._zod.run(e,n);let r=t.innerType._zod.run(e,n);return r instanceof Promise?r.then(Oh):Oh(r)}});function Oh(e){return e.value=Object.freeze(e.value),e}const kh=H(`$ZodCustom`,(e,t)=>{G.init(e,t),K.init(e,t),e._zod.parse=(e,t)=>e,e._zod.check=n=>{let r=n.value,i=t.fn(r);if(i instanceof Promise)return i.then(t=>Ah(t,n,r,e));Ah(i,n,r,e)}});function Ah(e,t,n,r){if(!e){let e={code:`custom`,input:n,inst:r,path:[...r._zod.def.path??[]],continue:!r._zod.def.abort};r._zod.def.params&&(e.params=r._zod.def.params),t.issues.push(fp(e))}}var jh,Mh=class{constructor(){this._map=new WeakMap,this._idmap=new Map}add(e,...t){let n=t[0];return this._map.set(e,n),n&&typeof n==`object`&&`id`in n&&this._idmap.set(n.id,e),this}clear(){return this._map=new WeakMap,this._idmap=new Map,this}remove(e){let t=this._map.get(e);return t&&typeof t==`object`&&`id`in t&&this._idmap.delete(t.id),this._map.delete(e),this}get(e){let t=e._zod.parent;if(t){let n={...this.get(t)??{}};delete n.id;let r={...n,...this._map.get(e)};return Object.keys(r).length?r:void 0}return this._map.get(e)}has(e){return this._map.has(e)}};function Nh(){return new Mh}(jh=globalThis).__zod_globalRegistry??(jh.__zod_globalRegistry=Nh());const Ph=globalThis.__zod_globalRegistry;function Fh(e,t){return new e({type:`string`,...W(t)})}function Ih(e,t){return new e({type:`string`,format:`email`,check:`string_format`,abort:!1,...W(t)})}function Lh(e,t){return new e({type:`string`,format:`guid`,check:`string_format`,abort:!1,...W(t)})}function Rh(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,...W(t)})}function zh(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,version:`v4`,...W(t)})}function Bh(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,version:`v6`,...W(t)})}function Vh(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,version:`v7`,...W(t)})}function Hh(e,t){return new e({type:`string`,format:`url`,check:`string_format`,abort:!1,...W(t)})}function Uh(e,t){return new e({type:`string`,format:`emoji`,check:`string_format`,abort:!1,...W(t)})}function Wh(e,t){return new e({type:`string`,format:`nanoid`,check:`string_format`,abort:!1,...W(t)})}function Gh(e,t){return new e({type:`string`,format:`cuid`,check:`string_format`,abort:!1,...W(t)})}function Kh(e,t){return new e({type:`string`,format:`cuid2`,check:`string_format`,abort:!1,...W(t)})}function qh(e,t){return new e({type:`string`,format:`ulid`,check:`string_format`,abort:!1,...W(t)})}function Jh(e,t){return new e({type:`string`,format:`xid`,check:`string_format`,abort:!1,...W(t)})}function Yh(e,t){return new e({type:`string`,format:`ksuid`,check:`string_format`,abort:!1,...W(t)})}function Xh(e,t){return new e({type:`string`,format:`ipv4`,check:`string_format`,abort:!1,...W(t)})}function Zh(e,t){return new e({type:`string`,format:`ipv6`,check:`string_format`,abort:!1,...W(t)})}function Qh(e,t){return new e({type:`string`,format:`cidrv4`,check:`string_format`,abort:!1,...W(t)})}function $h(e,t){return new e({type:`string`,format:`cidrv6`,check:`string_format`,abort:!1,...W(t)})}function eg(e,t){return new e({type:`string`,format:`base64`,check:`string_format`,abort:!1,...W(t)})}function tg(e,t){return new e({type:`string`,format:`base64url`,check:`string_format`,abort:!1,...W(t)})}function ng(e,t){return new e({type:`string`,format:`e164`,check:`string_format`,abort:!1,...W(t)})}function rg(e,t){return new e({type:`string`,format:`jwt`,check:`string_format`,abort:!1,...W(t)})}function ig(e,t){return new e({type:`string`,format:`datetime`,check:`string_format`,offset:!1,local:!1,precision:null,...W(t)})}function ag(e,t){return new e({type:`string`,format:`date`,check:`string_format`,...W(t)})}function og(e,t){return new e({type:`string`,format:`time`,check:`string_format`,precision:null,...W(t)})}function sg(e,t){return new e({type:`string`,format:`duration`,check:`string_format`,...W(t)})}function cg(e,t){return new e({type:`number`,checks:[],...W(t)})}function lg(e,t){return new e({type:`number`,check:`number_format`,abort:!1,format:`safeint`,...W(t)})}function ug(e){return new e({type:`unknown`})}function dg(e,t){return new e({type:`never`,...W(t)})}function fg(e,t){return new sm({check:`less_than`,...W(t),value:e,inclusive:!1})}function pg(e,t){return new sm({check:`less_than`,...W(t),value:e,inclusive:!0})}function mg(e,t){return new cm({check:`greater_than`,...W(t),value:e,inclusive:!1})}function hg(e,t){return new cm({check:`greater_than`,...W(t),value:e,inclusive:!0})}function gg(e,t){return new lm({check:`multiple_of`,...W(t),value:e})}function _g(e,t){return new dm({check:`max_length`,...W(t),maximum:e})}function vg(e,t){return new fm({check:`min_length`,...W(t),minimum:e})}function yg(e,t){return new pm({check:`length_equals`,...W(t),length:e})}function bg(e,t){return new hm({check:`string_format`,format:`regex`,...W(t),pattern:e})}function xg(e){return new gm({check:`string_format`,format:`lowercase`,...W(e)})}function Sg(e){return new _m({check:`string_format`,format:`uppercase`,...W(e)})}function Cg(e,t){return new vm({check:`string_format`,format:`includes`,...W(t),includes:e})}function wg(e,t){return new ym({check:`string_format`,format:`starts_with`,...W(t),prefix:e})}function Tg(e,t){return new bm({check:`string_format`,format:`ends_with`,...W(t),suffix:e})}function Eg(e){return new xm({check:`overwrite`,tx:e})}function Dg(e){return Eg(t=>t.normalize(e))}function Og(){return Eg(e=>e.trim())}function kg(){return Eg(e=>e.toLowerCase())}function Ag(){return Eg(e=>e.toUpperCase())}function jg(){return Eg(e=>Uf(e))}function Mg(e,t,n){return new e({type:`array`,element:t,...W(n)})}function Ng(e,t,n){return new e({type:`custom`,check:`custom`,fn:t,...W(n)})}function Pg(e){let t=Fg(n=>(n.addIssue=e=>{if(typeof e==`string`)n.issues.push(fp(e,n.value,t._zod.def));else{let r=e;r.fatal&&(r.continue=!1),r.code??=`custom`,r.input??=n.value,r.inst??=t,r.continue??=!t._zod.def.abort,n.issues.push(fp(r))}},e(n.value,n)));return t}function Fg(e,t){let n=new G({check:`custom`,...W(t)});return n._zod.check=e,n}function Ig(e){let t=e?.target??`draft-2020-12`;return t===`draft-4`&&(t=`draft-04`),t===`draft-7`&&(t=`draft-07`),{processors:e.processors??{},metadataRegistry:e?.metadata??Ph,target:t,unrepresentable:e?.unrepresentable??`throw`,override:e?.override??(()=>{}),io:e?.io??`output`,counter:0,seen:new Map,cycles:e?.cycles??`ref`,reused:e?.reused??`inline`,external:e?.external??void 0}}function J(e,t,n={path:[],schemaPath:[]}){var r;let i=e._zod.def,a=t.seen.get(e);if(a)return a.count++,n.schemaPath.includes(e)&&(a.cycle=n.path),a.schema;let o={schema:{},count:1,cycle:void 0,path:n.path};t.seen.set(e,o);let s=e._zod.toJSONSchema?.();if(s)o.schema=s;else{let r={...n,schemaPath:[...n.schemaPath,e],path:n.path};if(e._zod.processJSONSchema)e._zod.processJSONSchema(t,o.schema,r);else{let n=o.schema,a=t.processors[i.type];if(!a)throw Error(`[toJSONSchema]: Non-representable type encountered: ${i.type}`);a(e,t,n,r)}let a=e._zod.parent;a&&(o.ref||=a,J(a,t,r),t.seen.get(a).isParent=!0)}let c=t.metadataRegistry.get(e);return c&&Object.assign(o.schema,c),t.io===`input`&&Y(e)&&(delete o.schema.examples,delete o.schema.default),t.io===`input`&&o.schema._prefault&&((r=o.schema).default??(r.default=o.schema._prefault)),delete o.schema._prefault,t.seen.get(e).schema}function Lg(e,t){let n=e.seen.get(t);if(!n)throw Error(`Unprocessed schema. This is a bug in Zod.`);let r=new Map;for(let t of e.seen.entries()){let n=e.metadataRegistry.get(t[0])?.id;if(n){let e=r.get(n);if(e&&e!==t[0])throw Error(`Duplicate schema id "${n}" detected during JSON Schema conversion. Two different schemas cannot share the same id when converted together.`);r.set(n,t[0])}}let i=t=>{let r=e.target===`draft-2020-12`?`$defs`:`definitions`;if(e.external){let n=e.external.registry.get(t[0])?.id,i=e.external.uri??(e=>e);if(n)return{ref:i(n)};let a=t[1].defId??t[1].schema.id??`schema${e.counter++}`;return t[1].defId=a,{defId:a,ref:`${i(`__shared`)}#/${r}/${a}`}}if(t[1]===n)return{ref:`#`};let i=`#/${r}/`,a=t[1].schema.id??`__schema${e.counter++}`;return{defId:a,ref:i+a}},a=e=>{if(e[1].schema.$ref)return;let t=e[1],{ref:n,defId:r}=i(e);t.def={...t.schema},r&&(t.defId=r);let a=t.schema;for(let e in a)delete a[e];a.$ref=n};if(e.cycles===`throw`)for(let t of e.seen.entries()){let e=t[1];if(e.cycle)throw Error(`Cycle detected: #/${e.cycle?.join(`/`)}/<root>
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>
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 Rg(e,t){let n=e.seen.get(t);if(!n)throw Error(`Unprocessed schema. This is a bug in Zod.`);let r=t=>{let n=e.seen.get(t);if(n.ref===null)return;let i=n.def??n.schema,a={...i},o=n.ref;if(n.ref=null,o){r(o);let n=e.seen.get(o),s=n.schema;if(s.$ref&&(e.target===`draft-07`||e.target===`draft-04`||e.target===`openapi-3.0`)?(i.allOf=i.allOf??[],i.allOf.push(s)):Object.assign(i,s),Object.assign(i,a),t._zod.parent===o)for(let e in i)e===`$ref`||e===`allOf`||e in a||delete i[e];if(s.$ref&&n.def)for(let e in i)e===`$ref`||e===`allOf`||e in n.def&&JSON.stringify(i[e])===JSON.stringify(n.def[e])&&delete i[e]}let s=t._zod.parent;if(s&&s!==o){r(s);let t=e.seen.get(s);if(t?.schema.$ref&&(i.$ref=t.schema.$ref,t.def))for(let e in i)e===`$ref`||e===`allOf`||e in t.def&&JSON.stringify(i[e])===JSON.stringify(t.def[e])&&delete i[e]}e.override({zodSchema:t,jsonSchema:i,path:n.path??[]})};for(let t of[...e.seen.entries()].reverse())r(t[0]);let i={};if(e.target===`draft-2020-12`?i.$schema=`https://json-schema.org/draft/2020-12/schema`:e.target===`draft-07`?i.$schema=`http://json-schema.org/draft-07/schema#`:e.target===`draft-04`?i.$schema=`http://json-schema.org/draft-04/schema#`:e.target,e.external?.uri){let n=e.external.registry.get(t)?.id;if(!n)throw Error("Schema is missing an `id` property");i.$id=e.external.uri(n)}Object.assign(i,n.def??n.schema);let a=e.external?.defs??{};for(let t of e.seen.entries()){let e=t[1];e.def&&e.defId&&(a[e.defId]=e.def)}e.external||Object.keys(a).length>0&&(e.target===`draft-2020-12`?i.$defs=a:i.definitions=a);try{let n=JSON.parse(JSON.stringify(i));return Object.defineProperty(n,`~standard`,{value:{...t[`~standard`],jsonSchema:{input:Bg(t,`input`,e.processors),output:Bg(t,`output`,e.processors)}},enumerable:!1,writable:!1}),n}catch{throw Error(`Error converting schema to JSON.`)}}function Y(e,t){let n=t??{seen:new Set};if(n.seen.has(e))return!1;n.seen.add(e);let r=e._zod.def;if(r.type===`transform`)return!0;if(r.type===`array`)return Y(r.element,n);if(r.type===`set`)return Y(r.valueType,n);if(r.type===`lazy`)return Y(r.getter(),n);if(r.type===`promise`||r.type===`optional`||r.type===`nonoptional`||r.type===`nullable`||r.type===`readonly`||r.type===`default`||r.type===`prefault`)return Y(r.innerType,n);if(r.type===`intersection`)return Y(r.left,n)||Y(r.right,n);if(r.type===`record`||r.type===`map`)return Y(r.keyType,n)||Y(r.valueType,n);if(r.type===`pipe`)return Y(r.in,n)||Y(r.out,n);if(r.type===`object`){for(let e in r.shape)if(Y(r.shape[e],n))return!0;return!1}if(r.type===`union`){for(let e of r.options)if(Y(e,n))return!0;return!1}if(r.type===`tuple`){for(let e of r.items)if(Y(e,n))return!0;return!!(r.rest&&Y(r.rest,n))}return!1}const zg=(e,t={})=>n=>{let r=Ig({...n,processors:t});return J(e,r),Lg(r,e),Rg(r,e)},Bg=(e,t,n={})=>r=>{let{libraryOptions:i,target:a}=r??{},o=Ig({...i??{},target:a,io:t,processors:n});return J(e,o),Lg(o,e),Rg(o,e)},Vg={guid:`uuid`,url:`uri`,datetime:`date-time`,json_string:`json-string`,regex:``},Hg=(e,t,n,r)=>{let i=n;i.type=`string`;let{minimum:a,maximum:o,format:s,patterns:c,contentEncoding:l}=e._zod.bag;if(typeof a==`number`&&(i.minLength=a),typeof o==`number`&&(i.maxLength=o),s&&(i.format=Vg[s]??s,i.format===``&&delete i.format,s===`time`&&delete i.format),l&&(i.contentEncoding=l),c&&c.size>0){let e=[...c];e.length===1?i.pattern=e[0].source:e.length>1&&(i.allOf=[...e.map(e=>({...t.target===`draft-07`||t.target===`draft-04`||t.target===`openapi-3.0`?{type:`string`}:{},pattern:e.source}))])}},Ug=(e,t,n,r)=>{let i=n,{minimum:a,maximum:o,format:s,multipleOf:c,exclusiveMaximum:l,exclusiveMinimum:u}=e._zod.bag;typeof s==`string`&&s.includes(`int`)?i.type=`integer`:i.type=`number`,typeof u==`number`&&(t.target===`draft-04`||t.target===`openapi-3.0`?(i.minimum=u,i.exclusiveMinimum=!0):i.exclusiveMinimum=u),typeof a==`number`&&(i.minimum=a,typeof u==`number`&&t.target!==`draft-04`&&(u>=a?delete i.minimum:delete i.exclusiveMinimum)),typeof l==`number`&&(t.target===`draft-04`||t.target===`openapi-3.0`?(i.maximum=l,i.exclusiveMaximum=!0):i.exclusiveMaximum=l),typeof o==`number`&&(i.maximum=o,typeof l==`number`&&t.target!==`draft-04`&&(l<=o?delete i.maximum:delete i.exclusiveMaximum)),typeof c==`number`&&(i.multipleOf=c)},Wg=(e,t,n,r)=>{n.not={}},Gg=(e,t,n,r)=>{let i=e._zod.def,a=Nf(i.entries);a.every(e=>typeof e==`number`)&&(n.type=`number`),a.every(e=>typeof e==`string`)&&(n.type=`string`),n.enum=a},Kg=(e,t,n,r)=>{if(t.unrepresentable===`throw`)throw Error(`Custom types cannot be represented in JSON Schema`)},qg=(e,t,n,r)=>{if(t.unrepresentable===`throw`)throw Error(`Transforms cannot be represented in JSON Schema`)},Jg=(e,t,n,r)=>{let i=n,a=e._zod.def,{minimum:o,maximum:s}=e._zod.bag;typeof o==`number`&&(i.minItems=o),typeof s==`number`&&(i.maxItems=s),i.type=`array`,i.items=J(a.element,t,{...r,path:[...r.path,`items`]})},Yg=(e,t,n,r)=>{let i=n,a=e._zod.def;i.type=`object`,i.properties={};let o=a.shape;for(let e in o)i.properties[e]=J(o[e],t,{...r,path:[...r.path,`properties`,e]});let s=new Set(Object.keys(o)),c=new Set([...s].filter(e=>{let n=a.shape[e]._zod;return t.io===`input`?n.optin===void 0:n.optout===void 0}));c.size>0&&(i.required=Array.from(c)),a.catchall?._zod.def.type===`never`?i.additionalProperties=!1:a.catchall?a.catchall&&(i.additionalProperties=J(a.catchall,t,{...r,path:[...r.path,`additionalProperties`]})):t.io===`output`&&(i.additionalProperties=!1)},Xg=(e,t,n,r)=>{let i=e._zod.def,a=i.inclusive===!1,o=i.options.map((e,n)=>J(e,t,{...r,path:[...r.path,a?`oneOf`:`anyOf`,n]}));a?n.oneOf=o:n.anyOf=o},Zg=(e,t,n,r)=>{let i=e._zod.def,a=J(i.left,t,{...r,path:[...r.path,`allOf`,0]}),o=J(i.right,t,{...r,path:[...r.path,`allOf`,1]}),s=e=>`allOf`in e&&Object.keys(e).length===1;n.allOf=[...s(a)?a.allOf:[a],...s(o)?o.allOf:[o]]},Qg=(e,t,n,r)=>{let i=e._zod.def,a=J(i.innerType,t,r),o=t.seen.get(e);t.target===`openapi-3.0`?(o.ref=i.innerType,n.nullable=!0):n.anyOf=[a,{type:`null`}]},$g=(e,t,n,r)=>{let i=e._zod.def;J(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},e_=(e,t,n,r)=>{let i=e._zod.def;J(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType,n.default=JSON.parse(JSON.stringify(i.defaultValue))},t_=(e,t,n,r)=>{let i=e._zod.def;J(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType,t.io===`input`&&(n._prefault=JSON.parse(JSON.stringify(i.defaultValue)))},n_=(e,t,n,r)=>{let i=e._zod.def;J(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType;let o;try{o=i.catchValue(void 0)}catch{throw Error(`Dynamic catch values are not supported in JSON Schema`)}n.default=o},r_=(e,t,n,r)=>{let i=e._zod.def,a=t.io===`input`?i.in._zod.def.type===`transform`?i.out:i.in:i.out;J(a,t,r);let o=t.seen.get(e);o.ref=a},i_=(e,t,n,r)=>{let i=e._zod.def;J(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType,n.readOnly=!0},a_=(e,t,n,r)=>{let i=e._zod.def;J(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},o_=H(`ZodISODateTime`,(e,t)=>{Im.init(e,t),$.init(e,t)});function s_(e){return ig(o_,e)}const c_=H(`ZodISODate`,(e,t)=>{Lm.init(e,t),$.init(e,t)});function l_(e){return ag(c_,e)}const u_=H(`ZodISOTime`,(e,t)=>{Rm.init(e,t),$.init(e,t)});function d_(e){return og(u_,e)}const f_=H(`ZodISODuration`,(e,t)=>{zm.init(e,t),$.init(e,t)});function p_(e){return sg(f_,e)}const m_=(e,t)=>{mp.init(e,t),e.name=`ZodError`,Object.defineProperties(e,{format:{value:t=>_p(e,t)},flatten:{value:t=>gp(e,t)},addIssue:{value:t=>{e.issues.push(t),e.message=JSON.stringify(e.issues,Pf,2)}},addIssues:{value:t=>{e.issues.push(...t),e.message=JSON.stringify(e.issues,Pf,2)}},isEmpty:{get(){return e.issues.length===0}}})};H(`ZodError`,m_);const X=H(`ZodError`,m_,{Parent:Error}),h_=vp(X),g_=yp(X),__=bp(X),v_=Sp(X),y_=wp(X),b_=Tp(X),x_=Ep(X),S_=Dp(X),C_=Op(X),w_=kp(X),T_=Ap(X),E_=jp(X),Z=H(`ZodType`,(e,t)=>(K.init(e,t),Object.assign(e[`~standard`],{jsonSchema:{input:Bg(e,`input`),output:Bg(e,`output`)}}),e.toJSONSchema=zg(e,{}),e.def=t,e.type=t.type,Object.defineProperty(e,`_def`,{value:t}),e.check=(...n)=>e.clone(Vf(t,{checks:[...t.checks??[],...n.map(e=>typeof e==`function`?{_zod:{check:e,def:{check:`custom`},onattach:[]}}:e)]}),{parent:!0}),e.with=e.check,e.clone=(t,n)=>Zf(e,t,n),e.brand=()=>e,e.register=((t,n)=>(t.add(e,n),e)),e.parse=(t,n)=>h_(e,t,n,{callee:e.parse}),e.safeParse=(t,n)=>__(e,t,n),e.parseAsync=async(t,n)=>g_(e,t,n,{callee:e.parseAsync}),e.safeParseAsync=async(t,n)=>v_(e,t,n),e.spa=e.safeParseAsync,e.encode=(t,n)=>y_(e,t,n),e.decode=(t,n)=>b_(e,t,n),e.encodeAsync=async(t,n)=>x_(e,t,n),e.decodeAsync=async(t,n)=>S_(e,t,n),e.safeEncode=(t,n)=>C_(e,t,n),e.safeDecode=(t,n)=>w_(e,t,n),e.safeEncodeAsync=async(t,n)=>T_(e,t,n),e.safeDecodeAsync=async(t,n)=>E_(e,t,n),e.refine=(t,n)=>e.check(Nv(t,n)),e.superRefine=t=>e.check(Pv(t)),e.overwrite=t=>e.check(Eg(t)),e.optional=()=>hv(e),e.exactOptional=()=>_v(e),e.nullable=()=>yv(e),e.nullish=()=>hv(yv(e)),e.nonoptional=t=>Tv(e,t),e.array=()=>rv(e),e.or=t=>sv([e,t]),e.and=t=>lv(e,t),e.transform=t=>kv(e,pv(t)),e.default=t=>xv(e,t),e.prefault=t=>Cv(e,t),e.catch=t=>Dv(e,t),e.pipe=t=>kv(e,t),e.readonly=()=>jv(e),e.describe=t=>{let n=e.clone();return Ph.add(n,{description:t}),n},Object.defineProperty(e,`description`,{get(){return Ph.get(e)?.description},configurable:!0}),e.meta=(...t)=>{if(t.length===0)return Ph.get(e);let n=e.clone();return Ph.add(n,t[0]),n},e.isOptional=()=>e.safeParse(void 0).success,e.isNullable=()=>e.safeParse(null).success,e.apply=t=>t(e),e)),D_=H(`_ZodString`,(e,t)=>{wm.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Hg(e,t,n,r);let n=e._zod.bag;e.format=n.format??null,e.minLength=n.minimum??null,e.maxLength=n.maximum??null,e.regex=(...t)=>e.check(bg(...t)),e.includes=(...t)=>e.check(Cg(...t)),e.startsWith=(...t)=>e.check(wg(...t)),e.endsWith=(...t)=>e.check(Tg(...t)),e.min=(...t)=>e.check(vg(...t)),e.max=(...t)=>e.check(_g(...t)),e.length=(...t)=>e.check(yg(...t)),e.nonempty=(...t)=>e.check(vg(1,...t)),e.lowercase=t=>e.check(xg(t)),e.uppercase=t=>e.check(Sg(t)),e.trim=()=>e.check(Og()),e.normalize=(...t)=>e.check(Dg(...t)),e.toLowerCase=()=>e.check(kg()),e.toUpperCase=()=>e.check(Ag()),e.slugify=()=>e.check(jg())}),O_=H(`ZodString`,(e,t)=>{wm.init(e,t),D_.init(e,t),e.email=t=>e.check(Ih(k_,t)),e.url=t=>e.check(Hh(M_,t)),e.jwt=t=>e.check(rg(q_,t)),e.emoji=t=>e.check(Uh(N_,t)),e.guid=t=>e.check(Lh(A_,t)),e.uuid=t=>e.check(Rh(j_,t)),e.uuidv4=t=>e.check(zh(j_,t)),e.uuidv6=t=>e.check(Bh(j_,t)),e.uuidv7=t=>e.check(Vh(j_,t)),e.nanoid=t=>e.check(Wh(P_,t)),e.guid=t=>e.check(Lh(A_,t)),e.cuid=t=>e.check(Gh(F_,t)),e.cuid2=t=>e.check(Kh(I_,t)),e.ulid=t=>e.check(qh(L_,t)),e.base64=t=>e.check(eg(W_,t)),e.base64url=t=>e.check(tg(G_,t)),e.xid=t=>e.check(Jh(R_,t)),e.ksuid=t=>e.check(Yh(z_,t)),e.ipv4=t=>e.check(Xh(B_,t)),e.ipv6=t=>e.check(Zh(V_,t)),e.cidrv4=t=>e.check(Qh(H_,t)),e.cidrv6=t=>e.check($h(U_,t)),e.e164=t=>e.check(ng(K_,t)),e.datetime=t=>e.check(s_(t)),e.date=t=>e.check(l_(t)),e.time=t=>e.check(d_(t)),e.duration=t=>e.check(p_(t))});function Q(e){return Fh(O_,e)}const $=H(`ZodStringFormat`,(e,t)=>{q.init(e,t),D_.init(e,t)}),k_=H(`ZodEmail`,(e,t)=>{Dm.init(e,t),$.init(e,t)}),A_=H(`ZodGUID`,(e,t)=>{Tm.init(e,t),$.init(e,t)}),j_=H(`ZodUUID`,(e,t)=>{Em.init(e,t),$.init(e,t)}),M_=H(`ZodURL`,(e,t)=>{Om.init(e,t),$.init(e,t)}),N_=H(`ZodEmoji`,(e,t)=>{km.init(e,t),$.init(e,t)}),P_=H(`ZodNanoID`,(e,t)=>{Am.init(e,t),$.init(e,t)}),F_=H(`ZodCUID`,(e,t)=>{jm.init(e,t),$.init(e,t)}),I_=H(`ZodCUID2`,(e,t)=>{Mm.init(e,t),$.init(e,t)}),L_=H(`ZodULID`,(e,t)=>{Nm.init(e,t),$.init(e,t)}),R_=H(`ZodXID`,(e,t)=>{Pm.init(e,t),$.init(e,t)}),z_=H(`ZodKSUID`,(e,t)=>{Fm.init(e,t),$.init(e,t)}),B_=H(`ZodIPv4`,(e,t)=>{Bm.init(e,t),$.init(e,t)}),V_=H(`ZodIPv6`,(e,t)=>{Vm.init(e,t),$.init(e,t)}),H_=H(`ZodCIDRv4`,(e,t)=>{Hm.init(e,t),$.init(e,t)}),U_=H(`ZodCIDRv6`,(e,t)=>{Um.init(e,t),$.init(e,t)}),W_=H(`ZodBase64`,(e,t)=>{Gm.init(e,t),$.init(e,t)}),G_=H(`ZodBase64URL`,(e,t)=>{qm.init(e,t),$.init(e,t)}),K_=H(`ZodE164`,(e,t)=>{Jm.init(e,t),$.init(e,t)}),q_=H(`ZodJWT`,(e,t)=>{Xm.init(e,t),$.init(e,t)}),J_=H(`ZodNumber`,(e,t)=>{Zm.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Ug(e,t,n,r),e.gt=(t,n)=>e.check(mg(t,n)),e.gte=(t,n)=>e.check(hg(t,n)),e.min=(t,n)=>e.check(hg(t,n)),e.lt=(t,n)=>e.check(fg(t,n)),e.lte=(t,n)=>e.check(pg(t,n)),e.max=(t,n)=>e.check(pg(t,n)),e.int=t=>e.check(Z_(t)),e.safe=t=>e.check(Z_(t)),e.positive=t=>e.check(mg(0,t)),e.nonnegative=t=>e.check(hg(0,t)),e.negative=t=>e.check(fg(0,t)),e.nonpositive=t=>e.check(pg(0,t)),e.multipleOf=(t,n)=>e.check(gg(t,n)),e.step=(t,n)=>e.check(gg(t,n)),e.finite=()=>e;let n=e._zod.bag;e.minValue=Math.max(n.minimum??-1/0,n.exclusiveMinimum??-1/0)??null,e.maxValue=Math.min(n.maximum??1/0,n.exclusiveMaximum??1/0)??null,e.isInt=(n.format??``).includes(`int`)||Number.isSafeInteger(n.multipleOf??.5),e.isFinite=!0,e.format=n.format??null});function Y_(e){return cg(J_,e)}const X_=H(`ZodNumberFormat`,(e,t)=>{Qm.init(e,t),J_.init(e,t)});function Z_(e){return lg(X_,e)}const Q_=H(`ZodUnknown`,(e,t)=>{$m.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(e,t,n)=>void 0});function $_(){return ug(Q_)}const ev=H(`ZodNever`,(e,t)=>{eh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Wg(e,t,n,r)});function tv(e){return dg(ev,e)}const nv=H(`ZodArray`,(e,t)=>{nh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Jg(e,t,n,r),e.element=t.element,e.min=(t,n)=>e.check(vg(t,n)),e.nonempty=t=>e.check(vg(1,t)),e.max=(t,n)=>e.check(_g(t,n)),e.length=(t,n)=>e.check(yg(t,n)),e.unwrap=()=>e.element});function rv(e,t){return Mg(nv,e,t)}const iv=H(`ZodObject`,(e,t)=>{sh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Yg(e,t,n,r),U(e,`shape`,()=>t.shape),e.keyof=()=>dv(Object.keys(e._zod.def.shape)),e.catchall=t=>e.clone({...e._zod.def,catchall:t}),e.passthrough=()=>e.clone({...e._zod.def,catchall:$_()}),e.loose=()=>e.clone({...e._zod.def,catchall:$_()}),e.strict=()=>e.clone({...e._zod.def,catchall:tv()}),e.strip=()=>e.clone({...e._zod.def,catchall:void 0}),e.extend=t=>np(e,t),e.safeExtend=t=>rp(e,t),e.merge=t=>ip(e,t),e.pick=t=>ep(e,t),e.omit=t=>tp(e,t),e.partial=(...t)=>ap(mv,e,t[0]),e.required=(...t)=>op(wv,e,t[0])});function av(e,t){return new iv({type:`object`,shape:e??{},...W(t)})}const ov=H(`ZodUnion`,(e,t)=>{lh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Xg(e,t,n,r),e.options=t.options});function sv(e,t){return new ov({type:`union`,options:e,...W(t)})}const cv=H(`ZodIntersection`,(e,t)=>{uh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Zg(e,t,n,r)});function lv(e,t){return new cv({type:`intersection`,left:e,right:t})}const uv=H(`ZodEnum`,(e,t)=>{ph.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Gg(e,t,n,r),e.enum=t.entries,e.options=Object.values(t.entries);let n=new Set(Object.keys(t.entries));e.extract=(e,r)=>{let i={};for(let r of e)if(n.has(r))i[r]=t.entries[r];else throw Error(`Key ${r} not found in enum`);return new uv({...t,checks:[],...W(r),entries:i})},e.exclude=(e,r)=>{let i={...t.entries};for(let t of e)if(n.has(t))delete i[t];else throw Error(`Key ${t} not found in enum`);return new uv({...t,checks:[],...W(r),entries:i})}});function dv(e,t){return new uv({type:`enum`,entries:Array.isArray(e)?Object.fromEntries(e.map(e=>[e,e])):e,...W(t)})}const fv=H(`ZodTransform`,(e,t)=>{mh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>qg(e,t,n,r),e._zod.parse=(n,r)=>{if(r.direction===`backward`)throw new Af(e.constructor.name);n.addIssue=r=>{if(typeof r==`string`)n.issues.push(fp(r,n.value,t));else{let t=r;t.fatal&&(t.continue=!1),t.code??=`custom`,t.input??=n.value,t.inst??=e,n.issues.push(fp(t))}};let i=t.transform(n.value,n);return i instanceof Promise?i.then(e=>(n.value=e,n)):(n.value=i,n)}});function pv(e){return new fv({type:`transform`,transform:e})}const mv=H(`ZodOptional`,(e,t)=>{gh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>a_(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function hv(e){return new mv({type:`optional`,innerType:e})}const gv=H(`ZodExactOptional`,(e,t)=>{_h.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>a_(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function _v(e){return new gv({type:`optional`,innerType:e})}const vv=H(`ZodNullable`,(e,t)=>{vh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Qg(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function yv(e){return new vv({type:`nullable`,innerType:e})}const bv=H(`ZodDefault`,(e,t)=>{yh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>e_(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeDefault=e.unwrap});function xv(e,t){return new bv({type:`default`,innerType:e,get defaultValue(){return typeof t==`function`?t():Jf(t)}})}const Sv=H(`ZodPrefault`,(e,t)=>{xh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>t_(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Cv(e,t){return new Sv({type:`prefault`,innerType:e,get defaultValue(){return typeof t==`function`?t():Jf(t)}})}const wv=H(`ZodNonOptional`,(e,t)=>{Sh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>$g(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Tv(e,t){return new wv({type:`nonoptional`,innerType:e,...W(t)})}const Ev=H(`ZodCatch`,(e,t)=>{wh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>n_(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeCatch=e.unwrap});function Dv(e,t){return new Ev({type:`catch`,innerType:e,catchValue:typeof t==`function`?t:()=>t})}const Ov=H(`ZodPipe`,(e,t)=>{Th.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>r_(e,t,n,r),e.in=t.in,e.out=t.out});function kv(e,t){return new Ov({type:`pipe`,in:e,out:t})}const Av=H(`ZodReadonly`,(e,t)=>{Dh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>i_(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function jv(e){return new Av({type:`readonly`,innerType:e})}const Mv=H(`ZodCustom`,(e,t)=>{kh.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Kg(e,t,n,r)});function Nv(e,t={}){return Ng(Mv,e,t)}function Pv(e){return Pg(e)}const Fv=[`plugin-skill-inductor`],Iv=av({id:Q().min(1).max(64),taskSignature:Q().min(1).max(200),tags:rv(Q().max(32)).max(5),sessionIds:rv(Q().max(64)).max(50),size:Y_().int().min(1).max(1e3),firstAt:Y_().int().nonnegative(),lastAt:Y_().int().nonnegative(),dismissedAt:Y_().int().nonnegative().optional()});function Lv(e,t){if(typeof t!=`string`||t.length===0||t.includes(`/`)||t.includes(`\\`)||t.includes(`..`))throw Error(`invalid workspaceKey for candidate file: ${t}`);return x(Tu(e),t,`candidates.json`)}function Rv(e){if(!Fv.includes(e.pluginId))return[];let t;try{let n=Lv(e.pluginId,e.workspaceKey);if(!D(n))return[];t=k(n,`utf8`)}catch{return[]}let n;try{n=JSON.parse(t)?.data?.items}catch{return[]}if(!Array.isArray(n))return[];let r=[];for(let e of n){let t=Iv.safeParse(e);t.success&&r.push(t.data)}return r}function zv(e){return(e.selectedOptionLabels??[]).includes(`起草 SKILL.md 给我看`)}async function Bv(e){let t;try{t=await e.requestGrill({header:`技能沉淀提议`,question:Tf(e.brief),background:Ef(e.brief),recommendation:Df(),options:Of(),askedBy:`skill-loop`})}catch(t){return e.logger?.warn(`skill-loop proposal failed: ${t instanceof Error?t.message:String(t)}`),`error`}return zv(t)?`accepted`:Vv(e)?`dismissed`:(e.logger?.warn(`skill-loop: failed to persist dismissal, candidate may resurface`),`error`)}function Vv(e){if(s())return!0;let t=Lv(e.pluginId,e.workspaceKey),n=`${t}.host.tmp`;try{let r=JSON.parse(k(t,`utf8`)),i=r?.data?.items;if(!Array.isArray(i))return!1;let a=i.find(t=>t?.id===e.brief.id);return a?(a.dismissedAt=e.now,A(n,JSON.stringify(r)),Yr(n,t),!0):!1}catch{try{$r(n)}catch{}return!1}}const Hv=Fv[0],Uv=Si;async function Wv(e,t){if(!e.isEnabled())return`disabled`;let n=e.now?e.now():Date.now();try{let n=e.getMinMessages?.();e.notifyServices({type:`session.idle`,sessionId:t,...typeof n==`number`?{options:{minMessages:n}}:{}})}catch(t){e.logger.warn({err:String(t)},`skill-loop: notifying inductor service failed (extraction skipped this round)`)}let r;try{r=Cf(Rv({pluginId:Hv,workspaceKey:e.getWorkspaceKey()??Si}),n,Sf(e.getCooldownDays?.()))}catch(t){return e.logger.warn({err:String(t)},`skill-loop: reading candidates failed`),`no-candidates`}if(r.length===0)return`no-candidates`;let i=e.getRequestGrill(t);if(!i)return`no-session`;let a=r[0];if(!a)return`no-candidates`;let o=await Bv({requestGrill:i,brief:a,pluginId:Hv,workspaceKey:e.getWorkspaceKey()??Si,now:n,logger:{warn:t=>e.logger.warn(t)}});return o===`accepted`&&(e.logger.info({sessionId:t,candidateId:a.id},`skill-loop: user accepted candidate`),e.onAccepted?.({sessionId:t,brief:a})),o}function Gv(e){return[y({name:`skill-loop`,timing:`session.idle`,handle:async t=>{try{await Wv(e,t.sessionId)}catch(t){e.logger.warn({err:String(t)},`skill-loop: unexpected failure`)}}})]}const Kv=`[sandbox-escalation]`;function qv(e){return y({name:`sandbox-guard`,timing:`tool.execute.before`,priority:6,enabled:!0,handle:(t,n)=>{if(n.cancelled)return;let r=e.getContext();if(!r||t.readonly)return;let i=t.args,a=t.paths?[...t.paths]:[],o=i?.command;if(typeof o==`string`&&a.push(...Me(o)),a.length===0)return;let s=typeof i?.targetDir==`string`?i.targetDir:`.`,c=S(r.projectRoot,s),l=_e({writePaths:a.map(e=>S(c,e))},r);if(l.verdict===`deny`){n.cancelled=!0,n.decision=`deny`,n.decisionReason=l.reason??`sandbox policy`,n.cancelReason=`Sandbox denied: ${n.decisionReason}`;return}if(l.verdict===`ask`){if(r.autoAllowBashIfSandboxed===!0&&t.toolName===`bash`&&n.decision!==`deny`&&n.decision!==`ask`)return;n.decision!==`deny`&&(n.decision=`ask`,n.decisionReason=`${Kv} ${l.reason??`requires approval`}`)}}})}function Jv(e){let t=[`id: ${e.jobId}`,`title: ${e.title}`,`status: ${e.status}`];return e.summary&&t.push(`summary: ${e.summary}`),e.outputPath&&t.push(`output_file: ${e.outputPath}`),e.worktree&&(t.push(`worktree_path: ${e.worktree.path}`),e.worktree.branch&&t.push(`worktree_branch: ${e.worktree.branch}`)),`<delegate-notification>\n${t.join(`
448
- `)}\n</delegate-notification>`}function Yv(){let e=new Map,t=new Set;return{hooks:[y({name:`agent-job-notification-injector`,timing:`messages.transform`,priority:25,handle:(t,n)=>{pf(e,t,n)}}),y({name:`agent-job-notification-cleanup`,timing:`session.deleted`,handle:n=>{if(e.delete(n.sessionId),t.add(n.sessionId),t.size>200){let e=t.values().next().value;e!==void 0&&t.delete(e)}}})],notify:(n,r)=>{if(t.has(n))return;let i=e.get(n)??[];i.push(Jv(r)),e.set(n,i)}}}const Xv=av({taskSignature:Q().min(1).max(200),outcome:dv([`success`,`partial`,`failure`]),at:Y_().int().nonnegative(),steps:rv(av({tool:Q().max(64)})).max(20)});function Zv(e,t){return x(Tu(e),t,`episodes.json`)}function Qv(e,t){let n;try{let r=Zv(e,t);if(!D(r))return{total:0,success:0,recent:[]};n=k(r,`utf8`)}catch{return{total:0,success:0,recent:[]}}let r;try{r=JSON.parse(n)?.data?.items}catch{return{total:0,success:0,recent:[]}}if(!Array.isArray(r))return{total:0,success:0,recent:[]};let i=0,a=[];for(let e of r){let t=Xv.safeParse(e);t.success&&(t.data.outcome===`success`&&(i+=1),a.push({signature:t.data.taskSignature,at:t.data.at}))}let o=a.sort((e,t)=>t.at-e.at).slice(0,5).map(e=>e.signature);return{total:a.length,success:i,recent:o}}function $v(e){let t=Fv[0],n={pluginInstalled:e.pluginInstalled,episodeCount:0,successCount:0,candidateCount:0,pendingCount:0,coolingCount:0,recentSignatures:[],pending:[],nextProposalHint:null};if(!e.pluginInstalled)return n;let r=Qv(t,e.workspaceKey),i=Rv({pluginId:t,workspaceKey:e.workspaceKey}),a=Sf(e.cooldownDays),o=Cf(i,e.now,a);return{pluginInstalled:!0,episodeCount:r.total,successCount:r.success,candidateCount:i.length,pendingCount:o.length,coolingCount:i.length-o.length,recentSignatures:r.recent,pending:o.slice(0,5),nextProposalHint:ey({pending:o.length,success:r.success,minClusterSize:e.minClusterSize??3})}}function ey(e){return e.pending>0?null:e.success===0?`no-episodes`:e.success<e.minClusterSize?`not-enough-successes`:`no-cluster-yet`}const ty=av({tool:Q().min(1).max(64),intent:Q().max(160)}),ny=av({taskSignature:Q().min(1).max(200),steps:rv(ty).max(20),outcome:dv([`success`,`partial`,`failure`]),sessionId:Q().max(64),at:Y_().int().nonnegative()});function ry(e){let t=e.limit??8,n;try{let t=x(Tu(e.pluginId),e.workspaceKey,`episodes.json`);if(!D(t))return[];n=k(t,`utf8`)}catch{return[]}let r;try{r=JSON.parse(n)?.data?.items}catch{return[]}if(!Array.isArray(r))return[];let i=new Set(e.sessionIds),a=[];for(let e of r){let n=ny.safeParse(e);if(n.success&&i.has(n.data.sessionId)&&n.data.outcome===`success`&&(a.push({sessionId:n.data.sessionId,outcome:n.data.outcome,steps:n.data.steps}),a.length>=t))break}return a}function iy(e){return e.length===0?`(No recorded execution paths are available for these sessions.)`:e.map((e,t)=>{let n=e.steps.map((e,t)=>` ${t+1}. ${e.tool} — ${e.intent}`).join(`
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 iy(){let e=new Map,t=new Set;return{hooks:[y({name:`agent-job-notification-injector`,timing:`messages.transform`,priority:25,handle:(t,n)=>{Sf(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(ry(r)),e.set(n,i)}}}const ay=mv({taskSignature:Q().min(1).max(200),outcome:bv([`success`,`partial`,`failure`]),at:iv().int().nonnegative(),steps:fv(mv({tool:Q().max(64)})).max(20)});function oy(e,t){return x(Fu(e),t,`episodes.json`)}function sy(e,t){let n;try{let r=oy(e,t);if(!D(r))return{total:0,success:0,recent:[]};n=k(r,`utf8`)}catch{return{total:0,success:0,recent:[]}}let r;try{r=JSON.parse(n)?.data?.items}catch{return{total:0,success:0,recent:[]}}if(!Array.isArray(r))return{total:0,success:0,recent:[]};let i=0,a=[];for(let e of r){let t=ay.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 cy(e){let t=Wv[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=sy(t,e.workspaceKey),i=qv({pluginId:t,workspaceKey:e.workspaceKey}),a=jf(e.cooldownDays),o=Mf(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:ly({pending:o.length,success:r.success,minClusterSize:e.minClusterSize??3})}}function ly(e){return e.pending>0?null:e.success===0?`no-episodes`:e.success<e.minClusterSize?`not-enough-successes`:`no-cluster-yet`}const uy=mv({tool:Q().min(1).max(64),intent:Q().max(160)}),dy=mv({taskSignature:Q().min(1).max(200),steps:fv(uy).max(20),outcome:bv([`success`,`partial`,`failure`]),sessionId:Q().max(64),at:iv().int().nonnegative()});function fy(e){let t=e.limit??8,n;try{let t=x(Fu(e.pluginId),e.workspaceKey,`episodes.json`);if(!D(t))return[];n=k(t,`utf8`)}catch{return[]}let r;try{r=JSON.parse(n)?.data?.items}catch{return[]}if(!Array.isArray(r))return[];let i=new Set(e.sessionIds),a=[];for(let e of r){let n=dy.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 py(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 ay(e,t=[]){let n=e.sessionIds.join(`, `);return`You are drafting a reusable skill for this project, based on a recurring task pattern that otto observed.
451
+ `)}function my(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
- ${iy(t)}
465
+ ${py(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 oy(e){return`Draft skill: ${e.taskSignature.length>60?`${e.taskSignature.slice(0,60)}…`:e.taskSignature}`}function sy(e){try{let t=ry({pluginId:e.pluginId,workspaceKey:e.workspaceKey,sessionIds:e.brief.sessionIds});return{jobId:e.startJob({title:oy(e.brief),prompt:ay(e.brief,t),sessionId:e.sessionId}).id}}catch(t){e.logger?.warn(`skill-loop: failed to start skill draft job: ${t instanceof Error?t.message:String(t)}`);return}}function cy(e){e.hookRegistry.register(tf(e.toolRegistry,e.getDefaultToolPreset)),e.hookRegistry.register(we(e.failureSignals)),e.hookRegistry.register(Ee(e.failureSignals)),e.hookRegistry.registerAll(e.contextSourcesBuildHooks(e.workspaceDir,e.memory)),e.memory&&e.hookRegistry.registerAll(Dt(e.memory)),e.hookRegistry.registerAll(At({getTodoList:t=>e.getSession(t)?.session.getTodoList()}));let t=/-milestone\.md$/,n=/^Status:\s*Done\b/m;e.hookRegistry.registerAll(Et({isDocSyncTrigger:e=>{let r=typeof e.args.path==`string`?e.args.path:``;if(!t.test(r))return!1;let i=typeof e.args.newContent==`string`?e.args.newContent:typeof e.args.content==`string`?e.args.content:``;return n.test(i)}})),e.hookRegistry.registerAll(df(e.learningStore,e.promptManager,e.localLearningStore)),e.skillRegistry&&e.hookRegistry.registerAll(ff(e.skillRegistry)),e.hookRegistry.registerAll(pr({workspaceDir:e.workspaceDir})),e.hookRegistry.registerAll(hf()),e.hookRegistry.on(`session.deleted`,`rfc047-notification-detach`,t=>e.notificationDispatcher.detach(t.sessionId));let r=Yv();e.hookRegistry.registerAll(r.hooks),e.hookRegistry.register(gf(e=>{w.killAllForSession(e)})),e.hookRegistry.registerAll(_f({registry:e.permissionRegistry,getPersistedAllow:t=>e.codingSessionPool.getSessionPermissionAllow(t)})),e.hookRegistry.register(qv({getContext:()=>{let t=je(e.workspaceDir,ze());if(!e.sandbox.enabled)return{mode:`bypass`,projectRoot:e.workspaceDir,writableRoots:[],deniedRoots:t,networkAllowed:!0};let n=e.settings.get(`permission_mode`)??`auto`;return{mode:n,projectRoot:e.workspaceDir,writableRoots:be(n,e.workspaceDir,Be(),e.sandbox.writablePaths),deniedRoots:t,networkAllowed:e.sandbox.isNetworkAllowed,autoAllowBashIfSandboxed:e.sandbox.autoAllowBashIfSandboxed}}})),e.hookRegistry.registerAll(yf(t=>e.getSession(t),e.memoryAutoExtractor,{isEnabled:()=>e.settings.get(`memory_auto_extract`)?.enabled===!0||process.env.OTTO_MEMORY_AUTO_EXTRACT===`1`}));let i=()=>e.settings.get(`skill_loop`)?.enabled===!0||process.env.OTTO_SKILL_LOOP===`1`;return e.hookRegistry.registerAll(bf({isEnabled:i})),e.hookRegistry.registerAll(Gv({isEnabled:i,getMinMessages:()=>e.settings.get(`skill_loop`)?.min_messages,getCooldownDays:()=>e.settings.get(`skill_loop`)?.dismiss_cooldown_days,notifyServices:e.notifyPluginServices,getWorkspaceKey:e.getWorkspaceKey,getRequestGrill:t=>{let n=e.getSession(t);return n?e=>n.requestGrill({...e,askedBy:`skill-loop`}):void 0},onAccepted:({sessionId:t,brief:n})=>{sy({startJob:t=>e.startSkillDraftJob({...t,origin:`user`}),brief:n,sessionId:t,pluginId:Hv,workspaceKey:e.getWorkspaceKey()??Uv,logger:{warn:t=>e.logger.warn(t)}})},logger:e.logger})),e.hookRegistry.register(Se({getOnFileEdited:e.getEditFileCallback,dedupCache:e.editFilesDedup})),{agentJobNotify:r.notify}}function ly(e,t,n,r){return $d({processOwnerId:e.processOwnerId,orchestrator:e.orchestrator,writeTodos:e.writeTodos,sandbox:t=>e.sandbox.isBypassed(t?.command)?void 0:e.sandbox.current??void 0,autoMemory:e.storage.autoMemory,reloadMemory:e.storage.memory?()=>e.storage.memory.loadMemory():void 0,archiveRecall:e.storage.memory,runTeam:e.runTeam,runSession:e.runSession,fileStateManager:e.fileStateManager,learningStore:e.learningStore,localLearningStore:e.localLearningStore,sessions:{list:()=>e.listSessions(),create:()=>e.createSession(),remove:t=>e.removeSession(t),get:t=>e.getSession(t)},listModels:t=>e.buildModelCatalog(t),startJob:t=>({jobId:e.agentJobs.start({...t,origin:`main`}).id}),getScheduleService:()=>e.scheduleServiceInstance,searchEcosystem:e.searchEcosystem},t,n,r)}function uy(e,t){return Ie(t,ef(ly(e,t,e.skillRegistry?un(e.skillRegistry,t):void 0,!1))).getAvailable(e.defaultToolPreset)}function dy(e){return e.toolRegistry.getAvailable(e.defaultToolPreset).filter(e=>e.name.startsWith(`mcp__`))}function fy(e,t){let n=t.skillProvider??(e.skillRegistry?un(e.skillRegistry,e.workspaceDir):void 0);t.sandbox&&e.sandbox.pin(t.sandbox);let r={registerChild(e,t){return{pid:Vt.registerChild(e,t).pid??0}}};return Ie(e.workspaceDir,{...ef(ly(e,e.workspaceDir,n,t.lsp===!0)),processTracker:r})}function py(e){e.agentJobNotify=cy({hookRegistry:e.hookRegistry,toolRegistry:e.toolRegistry,getDefaultToolPreset:()=>e.defaultToolPreset,failureSignals:e.failureSignals,contextSourcesBuildHooks:(t,n)=>e.agentRuntime.contextSources.sealAndBuildHooks(t,n),workspaceDir:e.workspaceDir,memory:e.storage.memory,learningStore:e.learningStore,localLearningStore:e.localLearningStore,promptManager:e.promptManager,skillRegistry:e.skillRegistry,notificationDispatcher:e.notificationDispatcher,permissionRegistry:e.permissionRegistry,codingSessionPool:e.codingSessionPool,sandbox:e.sandbox,settings:e.settings,getEditFileCallback:()=>e.editFileCallback,editFilesDedup:e._editFilesDedup,memoryAutoExtractor:e.memoryAutoExtractor,getSession:t=>e.getSession(t),notifyPluginServices:t=>e.notifyPluginServices(t),getWorkspaceKey:()=>e.workspaceRef?.key,startSkillDraftJob:t=>e.agentJobs.start(t),logger:e.logger}).agentJobNotify}function my(e){return{async readFile(e){try{return await Mi(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return null;throw e}},async writeFile(e,t){await Ai(b(e),{recursive:!0}),await tn(e,t)},async writeFileExclusive(e,t){await Ai(b(e),{recursive:!0});try{let n=await ji(e,`wx`);try{await n.writeFile(t,`utf8`)}finally{await n.close()}return!0}catch(e){if(e.code===`EEXIST`)return!1;throw e}},genId:e?.genId??wi,now:e?.now??(()=>new Date().toISOString()),...e?.confirmTrust?{confirmTrust:e.confirmTrust}:{}}}async function hy(e){if(e.ensureNotDisposed(),await e.ensureSettingsLoaded(),!e.workspaceRef&&!e.pendingWorkspaceInit&&!e.parentWorkspaceExisted)try{let t=Ci(my()),n=e._workspaceId?{id:e._workspaceId}:void 0,r=await t.resolveLocal(e.workspaceDir,{...n,autoCreate:!(e._interactive&&!n)});`kind`in r&&r.kind===`uninitialized`?e.pendingWorkspaceInit={root:r.root}:`kind`in r&&r.kind===`parentWorkspaceExisted`?e.parentWorkspaceExisted={parentRoot:r.parentRoot,currentRoot:r.currentRoot,marker:r.marker}:e.workspaceRef=r}catch(t){e.logger.warn({err:t,workspaceDir:e.workspaceDir},`Workspace resolution failed; continuing without workspace identity. Sessions previously saved under a workspace key will not be restored.`)}e.storage.autoMemory&&await e.storage.autoMemory.load(),await tt(`skills/agents/teams discovery + plugin module load`,async()=>{if(e.skillRegistry){await e.skillRegistry.discover();for(let t of e.settings.get(`disabled_skills`)??[])e.skillRegistry.disable(t);let t=new Set(e.settings.get(`disabled_plugins`)??[]);if(t.size>0)for(let[n,r]of e.skillRegistry.getAll())r.source?.type===`plugin`&&r.source.id&&t.has(r.source.id)&&e.skillRegistry.disable(n)}e.declarativeAgentProfiles=await Ks(e.workspaceDir,{plugins:e.activePlugins()}),e.declarativeTeams=await Qs(e.workspaceDir);let t=await e.pluginModuleManager.reload(new Set(e.declarativeAgentProfiles.map(e=>e.name)));e.declarativeAgentProfiles.push(...t),e._pendingProviderCapabilities=(await e.pluginProviderManager.reload()).pendingCapabilityPluginIds,await e.diagnoseTopoSortIssues()});let t=()=>tt(`mcpController.start()`,()=>e.mcpController.start()).then(t=>(e.syncSessionTools(),e.onMcpStartupSettled?e.onMcpStartupSettled(t):e.pendingMcpStartupResult=t,t)).catch(t=>(e.logger.warn({err:t instanceof Error?t.message:String(t)},`mcpController.start() failed unexpectedly (non-blocking path)`),{connected:0,failed:0}));e._interactive?t():await t(),e.pendingWorkspaceInit?e.logger.info({workspaceDir:e.workspaceDir},`Workspace identity pending trust confirmation; session restore deferred`):e.parentWorkspaceExisted?e.logger.info({workspaceDir:e.workspaceDir,parentRoot:e.parentWorkspaceExisted.parentRoot},`Parent workspace detected; waiting for user choice (adopt parent or create new)`):e._interactive?await tt(`completeWorkspaceDependentStartup (session restoreAll)`,()=>gy(e)):tt(`sweepOrphanTraceFiles (headless)`,()=>Cy(e)),e.devtools&&await e.devtools.start(),e._memoryGovernor.setCallbacks({onWarning:()=>{let t=e.getActiveSession();t&&t.compactNow().catch(t=>{e.logger.warn({err:t instanceof Error?t.message:String(t)},`[memory-governor] headless compactNow (soft degrade) failed`)})},onCritical:t=>{let n=process.env.OTTO_HEADLESS_OOM_POLICY??`log-only`;e.logger.error({policy:n,level:t.level,usedPct:t.usedPct,heapUsed:t.heapUsed},`[memory-governor] critical memory threshold reached (headless/service)`),n===`graceful-exit`&&wy(e).finally(()=>process.exit(1))},onSample:t=>{e._residencyGovernor.setLevel(t.level);let n=performance.getEntriesByType(`measure`).length;n>5e4&&(performance.clearMeasures(),performance.clearMarks(),e.logger.warn({measureCount:n},`[memory-governor] user-timing buffer exceeded guard threshold — cleared (likely a dev-mode library leaking performance.measure; see a7eaa826)`));let r=e.getActiveSession()?.id;r&&e.storage.traceStore.append(r,{ts:t.ts,sessionId:r,kind:`lifecycle`,node:`process.memory.sample`,payload:{pid:process.pid,level:t.level,heapUsed:t.heapUsed,heapSizeLimit:t.heapSizeLimit,usedPct:Number(t.usedPct.toFixed(2)),rss:t.rss,external:t.external}}).catch(t=>{e.logger.warn({err:t instanceof Error?t.message:String(t)},`[memory-governor] trace sample append failed`)})}}),e._memoryGovernor.start(),e._fleetMonitor.setCallbacks({onSample:t=>{let n=e.getActiveSession()?.id;n&&e.storage.traceStore.append(n,{ts:t.ts,sessionId:n,kind:`lifecycle`,node:`process.fleet.sample`,payload:{pid:process.pid,processCount:t.processCount,totalRssMb:t.totalRssMb,suspectedOrphanCount:t.suspectedOrphanCount,maxGeneration:t.maxGeneration}}).catch(t=>{e.logger.warn({err:t instanceof Error?t.message:String(t)},`[fleet-monitor] trace sample append failed`)})}}),e._fleetMonitor.start(),Ze(`app.start() internal phases complete`),e.logger.info(`App started`)}async function gy(e){if(e.codingSessionPool.autoPersist){let t=await e.codingSessionPool.restoreAll();if(t>0){e.logger.info({count:t},`Sessions restored from storage`);for(let t of e.listSessions()){let n=e.getSession(t.id);n&&e.notificationDispatcher.attach(n)}}}Cy(e)}function _y(e){return!!e.pendingWorkspaceInit}function vy(e){return!!e.parentWorkspaceExisted}async function yy(e){let t=e.parentWorkspaceExisted;if(!t)return e.workspaceRef;e.parentWorkspaceExisted=void 0;try{return e.workspaceRef=await Ci(my()).resolveLocal(t.parentRoot),await gy(e),e.workspaceRef}catch(n){e.parentWorkspaceExisted=t,e.logger.warn({err:n,parentRoot:t.parentRoot},`Failed to adopt parent workspace; continuing without workspace identity. Will retry on next startup.`);return}}async function by(e){let t=e.parentWorkspaceExisted;if(!t)return e.workspaceRef;e.parentWorkspaceExisted=void 0;try{return e.workspaceRef=await Ci(my()).createLocal(t.currentRoot),await gy(e),e.workspaceRef}catch(n){e.parentWorkspaceExisted=t,e.logger.warn({err:n,currentRoot:t.currentRoot},`Failed to create new workspace; continuing without workspace identity. Will retry on next startup.`);return}}async function xy(e){let t=e.pendingWorkspaceInit;if(!t)return e.workspaceRef;e.pendingWorkspaceInit=void 0;try{return e.workspaceRef=await Ci(my()).createLocal(t.root),await gy(e),e.workspaceRef}catch(n){e.pendingWorkspaceInit=t,e.logger.warn({err:n,root:t.root},`Workspace identity creation failed; continuing without workspace identity. Will retry on next startup.`);return}}async function Sy(e,t){let n=e.workspaceRef?.root;if(!n)return!1;let r=my(),i=await Ti(n,r);if(!i)return!1;if(!t&&i.memorySyncEnabled){try{await e.storage.autoMemory?.load()}catch{}try{await e.learningStore.refresh()}catch{}}let a=t?{...i,memorySyncEnabled:!0}:{id:i.id,name:i.name,createdAt:i.createdAt,...i.remote?{remote:i.remote}:{}};return await Di(n,a,r),e.workspaceRef={key:Ei(a.id),id:a.id,backend:e.workspaceRef.backend,root:n,...a.remote?{remote:a.remote}:{},...a.memorySyncEnabled?{memorySyncEnabled:!0}:{}},!0}async function Cy(e){let t=e.sessionStorageDir,n=e.sessionRepoRef?.current;if(!t||!n)return;let r=process.env.OTTO_TRACE_SWEEP;if(r!==`off`)try{let{sweepOrphanTraces:i}=await import(`./trace-orphan-sweeper-BdEIlLfB.js`),a=new Set(await n.listAllSessionIds());for(let t of e.codingSessionPool.listSessions())a.add(t.id);await i({dirs:[x(t,`trace`),x(t,`checkpoint`)],liveSessionIds:a,logger:e.logger,mode:r===`dry-run`?`dry-run`:`delete`})}catch(t){e.logger.warn({err:t instanceof Error?t.message:String(t)},`Orphan trace sweep failed`)}}async function wy(e){if(e.disposed)return;e.disposed=!0;let t=[],n=async(e,n)=>{try{await n()}catch(n){t.push(Error(`stop:${e}: ${n.message}`))}};e.codingSessionPool.autoPersist&&await n(`saveSessions`,()=>e.codingSessionPool.saveAll()),await n(`processRegistryUnsubs`,()=>{for(let t of e.processRegistryUnsubs)t();e.processRegistryUnsubs.length=0}),await n(`bgProcesses`,()=>w.killAllForOwner(e.processOwnerId)),await n(`mcpController`,()=>e.mcpController.stop()),await n(`processRuntime`,()=>Vt.killAll()),await n(`scheduleService`,()=>e.scheduleServiceInstance?.stop()),await n(`memoryGovernor`,()=>e._memoryGovernor.dispose()),await n(`fleetMonitor`,()=>e._fleetMonitor.dispose()),await n(`agentJobs`,()=>e.agentJobServiceInstance?.dispose()),await n(`settings`,()=>e.settings.dispose()),await n(`toolRegistry`,()=>e.toolRegistry.dispose()),await n(`orchestrator`,()=>e.orchestrator.dispose()),await n(`notification`,()=>e.notificationDispatcher.dispose()),await n(`agentRuntime`,()=>e.agentRuntime.dispose()),await n(`hooks`,()=>{for(let t of e.ownedHookNames)e.hookRegistry.unregister(t);e.ownedHookNames.length=0}),await n(`pluginModules`,()=>e.pluginModuleManager.cleanup()),await n(`pluginProviders`,()=>e.pluginProviderManager.cleanup()),await n(`pluginWorkers`,()=>Ml()),await n(`pluginServices`,()=>sl()),await n(`sandbox`,()=>e.sandbox.dispose()),e.devtools&&await n(`devtools`,()=>e.devtools.stop()),await n(`logSub`,()=>{e.globalLogSubscription&&=(e.globalLogSubscription(),null)}),await n(`traceStore`,()=>e.storage.traceStore.close?.()),await n(`checkpointStore`,()=>e.storage.checkpointStore.close?.()),await n(`authStore`,()=>e._authStore.dispose()),t.length>0&&e.logger.warn({count:t.length,errors:t.map(e=>e.message)},`stop: %d subsystems reported errors`),e.logger.info(`App stopped`)}async function Ty(e,t,n){let r=n.current;if(!r)throw Error(`导出归档仅支持关系化 SQLite 后端(sessions.db)。当前后端不支持。`);let i=await si(e,r);if(!i)throw Error(`会话 ${e.slice(0,8)} 不存在或无法加载`);let a=JSON.stringify(i,null,2),o=pi(`sha256`).update(a,`utf-8`).digest(`hex`);await Ai(b(t),{recursive:!0}),await Ni(t,a,`utf-8`);let s=await Mi(t,`utf-8`),c=pi(`sha256`).update(s,`utf-8`).digest(`hex`);if(o!==c)throw Error(`Checksum 校验失败:写入前 sha256=${o.slice(0,16)},读回 sha256=${c.slice(0,16)}。导出文件 ${t} 可能已损坏,操作整体失败。`);return{entryCount:i.entries.length,checksum:o,path:t}}async function Ey(e){let t=await e.capabilityReloader.reload();return e.applyResults({agentProfiles:t.agentProfiles,teamDeclarations:t.teamDeclarations,pendingProviderCapabilities:t.pendingProviderCapabilities}),await e.diagnoseTopoSortIssues(),e.syncSessionTools(),e.panelBackendController.notifyReload(),{mcpTools:t.mcpTools,models:t.models,agents:t.agents,teams:t.teamCount,pendingProviderCapabilities:t.pendingProviderCapabilities,i18nEntries:t.i18nEntries,agentProfiles:t.agentProfiles,teamDeclarations:t.teamDeclarations}}let Dy=0;function Oy(e){let t=`__ottoResidencyDiagnostics`,n=globalThis;n[t]||Object.defineProperty(n,t,{configurable:!1,enumerable:!1,writable:!1,value:Object.freeze({getResidency:()=>e.getResidencyDiagnostics()})})}var ky=class{processOwnerId=`app-${++Dy}`;get processOwner(){return this.processOwnerId}settings;toolRegistry;hookRegistry;providerRegistry;wireProtocolRegistry;agentRuntime;codingSessionPool;permissionRegistry;auditLog;logger;sessionRepoRef;sessionStorageDir;get workspaceDir(){return this.workspaceRef?.root??this._workspaceDir}_workspaceDir;_workspaceId;_interactive;_shadow;_pluginHomedir;_pluginBundledDirs;workspaceRef;pendingWorkspaceInit;parentWorkspaceExisted;maxSessions;maxToolTurns;maxToolTurnExtensions;promptOutputTokenBudget;promptWallClockBudgetMs;sessionCostBudgetUSD;stallDetection;devtools=null;editFileCallback=void 0;_editFilesDedup=new Set;storage;userMemory=new nt({store:(()=>{let e=new at(ze());return s()?dt(e):e})()});completeText;clock;fileStateManager;learningStore;localLearningStore;memoryAutoExtractor;promptManager;orchestrator;runSession;writeTodos;sessionConfigResolver;runTeam;skillRegistry;i18nRegistry;_pendingProviderCapabilities=[];get pendingProviderCapabilities(){return this._pendingProviderCapabilities}declarativeAgentProfiles=[];extensions;pluginInput=Rn();sigilResolvers=new Ia;expandSigilChips(e,t){return Ga(e,this.sigilResolvers,{workspaceDir:this.workspaceDir},{...t,lookupResolverId:e=>{for(let t of this.pluginInput.getAll())if(t.value===e&&t.resolverId)return t.resolverId}})}feedbackRegistry=new Fa;getShortcuts(){return this.settings.get(`shortcuts`)??[]}async saveShortcut(e,t,n){let r=e.trim();if(!r||!/^[A-Za-z0-9_-]+$/.test(r))throw Error(`invalid shortcut name: ${JSON.stringify(e)}`);if(!t.trim())throw Error(`shortcut text cannot be empty`);let i=this.getShortcuts();if(i.some(e=>e.name===r&&e.name!==n))throw Error(`shortcut name already exists: ${r}`);let a=[...n?i.filter(e=>e.name!==n):i,{name:r,text:t}];await this.settings.persist({shortcuts:a},`project`)}async deleteShortcut(e){let t=this.getShortcuts(),n=t.filter(t=>t.name!==e);n.length!==t.length&&await this.settings.persist({shortcuts:n},`project`)}declarativeTeams=[];mcpController;panelBackendController;get mcpManager(){return this.mcpController.manager}disposed=!1;ownedHookNames=[];failureSignals=new he;diagnoser=new me(this.failureSignals);pluginHealthTracker=Cc();pluginCapabilityQuota=new Ec;inquiryCenter=new Oc;userAskRenderer;userAskSeq=0;processRegistryUnsubs=[];settingsLoaded=!1;lastSettingsConfig=null;_resilienceOverride;_resilienceConfig;defaultToolPreset=`full`;permissionSync;sandbox;_memoryGovernor;_residencyGovernor;_fleetMonitor;get tools(){return this.toolRegistry.getAvailable(this.defaultToolPreset)}agentJobNotify;agentJobServiceInstance;scheduleServiceInstance;searchEcosystem;notificationDispatcher;presenceTracker;followUpPendingProbe;toolsSyncCoordinator;onMcpStartupSettled;pendingMcpStartupResult;setMcpStartupCallback(e){this.onMcpStartupSettled=e,this.pendingMcpStartupResult&&=(e(this.pendingMcpStartupResult),void 0)}pluginContributionsFacade;buildToolsForWorkspace(e){return uy(this,e)}connectorTools(){return dy(this)}get agentJobs(){return this.agentJobServiceInstance||=Oo({workspaceDir:this.workspaceDir,agentJobNotify:this.agentJobNotify,buildToolsForWorkspace:e=>this.buildToolsForWorkspace(e),connectorTools:()=>this.connectorTools(),settings:this.settings,modelRegistry:this.modelRegistry,stream:this.codingSessionPool.stream,logger:this.logger,hookRegistry:this.hookRegistry}),this.agentJobServiceInstance}setScheduleService(e){this.scheduleServiceInstance=e,this.pluginModuleManager?.reconcileServiceSchedules()}setEcosystemSearch(e){this.searchEcosystem!==e&&(this.searchEcosystem=e,this.reloadCapabilities().catch(e=>{this.logger.warn({err:e instanceof Error?e.message:String(e)},`Failed to refresh capability_gap after ecosystem search injection`)}))}get memoryGovernor(){return this._memoryGovernor}get fleetMonitor(){return this._fleetMonitor}get modelRegistry(){return this._modelRegistry}get authStore(){return this._authStore}modelCatalogManager;_modelRegistry;_authStore;getAllModels(){return Io(this)}resolveModel(e){return Lo(this,e)}listProviders(){return Ro(this)}registerHook(e){zo(this,e)}unregisterHook(e){return Bo(this,e)}async hydrateModelCache(){return Vo(this)}getSessionAvailableModels(e){return Ho(this,e)}async refreshModels(){return Wo(this)}async reloadCapabilities(){let e=await Ey({capabilityReloader:this.capabilityReloader,applyResults:e=>{this.declarativeAgentProfiles=e.agentProfiles,this.declarativeTeams=e.teamDeclarations,this._pendingProviderCapabilities=e.pendingProviderCapabilities},diagnoseTopoSortIssues:()=>this.diagnoseTopoSortIssues(),syncSessionTools:()=>this.syncSessionTools(),panelBackendController:this.panelBackendController});return{mcpTools:e.mcpTools,models:e.models,agents:e.agents,teams:e.teams,pendingProviderCapabilities:e.pendingProviderCapabilities,i18nEntries:e.i18nEntries}}syncSessionTools(){return this.toolsSyncCoordinator.resync()}syncSessionToolsFor(e){return this.toolsSyncCoordinator.resyncOne(e)}pluginTopology=new Zu;pluginModuleManager;pluginProviderManager;capabilityReloader;computedPluginCommands(){return this.pluginContributionsFacade.computedPluginCommands()}get sessionManager(){return this.codingSessionPool}getResidencyDiagnostics(){return this.codingSessionPool.getResidencyDiagnostics()}globalLogSubscription=null;constructor(e){let{inspect:t,logger:n,projectConfigPath:r,maxSessions:i,maxToolTurns:a,maxToolTurnExtensions:o,promptOutputTokenBudget:c,promptWallClockBudgetMs:l,sessionCostBudgetUSD:u,stallDetection:d,workspaceDir:f,workspaceId:p,pluginHomedir:m,pluginBundledDirs:h}=e;this.maxSessions=i??ri,this.maxToolTurns=a??gt.maxToolTurns,this.maxToolTurnExtensions=o,this.promptOutputTokenBudget=c,this.promptWallClockBudgetMs=l,this.sessionCostBudgetUSD=u,this.stallDetection=d,this._workspaceDir=f??process.cwd(),this._workspaceId=p,this._interactive=e.interactive??!1,this._shadow=e.shadow??s(),this._pluginHomedir=m??ze(),this._pluginBundledDirs=h??[],this._resilienceOverride=e.resilience,this.logger=C(n.name,{level:n.level,destination:n.destination});let g={};this.sessionRepoRef=g,this.sessionStorageDir=e.storage?.session&&`dir`in e.storage.session?e.storage.session.dir:void 0;let _=Bd({logger:this.logger,hookRegistry:e.hookRegistry,getToolRegistry:()=>this.toolRegistry,getPermissionRegistry:()=>this.permissionRegistry,onHookTimeout:({hookName:e,timeoutMs:t})=>{let n=lc(e);n&&this.pluginHealthTracker.recordHookTimeout(n,e)}});this.sandbox=_.sandbox,this._memoryGovernor=_.memoryGovernor,this._residencyGovernor=_.residencyGovernor,this._fleetMonitor=_.fleetMonitor,this.permissionSync=_.permissionSync,this.hookRegistry=_.hookRegistry;let ee=Qu(e,()=>this.settings);this._authStore=ee.authStore,this._modelRegistry=ee.modelRegistry,this.providerRegistry=ee.providerRegistry,this.wireProtocolRegistry=ee.wireProtocolRegistry,this.modelCatalogManager=ee.modelCatalogManager;let te=ee.defaultModel,re=ee.resolveEffectiveModel,ie=e.modelId,v=_a({options:e,workspaceDir:this.workspaceDir,providerRegistry:this.providerRegistry,defaultModel:te,resolveEffectiveModel:re,repoRef:g,getWorkspaceRef:()=>this.workspaceRef,onMemoryConflict:e.onMemoryConflict,getActiveSessionBytes:()=>{let e=this.codingSessionPool?.active?.session;return e instanceof ti?e.estimatedContentBytes:void 0},getEffectiveMaxBytes:()=>{let e=this.codingSessionPool;if(e)return e.getResidencyDiagnostics().maxBytesPerSession},getCoverageThresholds:()=>{let e=this.settings.get(`residency`),t=(e,t)=>t!=null&&process.env[e]===void 0?t:void 0;return{warn:t(`OTTO_MEMORY_COVERAGE_WARN_THRESHOLD`,e?.coverage_warn_threshold),error:t(`OTTO_MEMORY_COVERAGE_ERROR_THRESHOLD`,e?.coverage_error_threshold),floor:t(`OTTO_MEMORY_COVERAGE_FLOOR_THRESHOLD`,e?.coverage_floor_threshold)}}});this.storage={storageHost:v.storageHost,autoMemory:v.autoMemory,memory:v.memory,traceStore:v.traceStore,traceLive:v.traceLive,checkpointStore:v.checkpointStore,remoteMemoryConfigured:!!(e.storage?.remote?.getAuth&&e.storage?.session&&`url`in e.storage.session),remoteSessionConfigured:!!(e.storage?.session&&`url`in e.storage.session)},this.clock=v.clock;let ae=Vd({inspect:t,loggerName:n.name,workspaceDir:this.workspaceDir,projectConfigPath:r,interactive:this._interactive,permissionSync:this.permissionSync,sandbox:this.sandbox,onSettingsApplied:e=>{this.settingsLoaded=!0,e.tool_preset&&(this.defaultToolPreset=e.tool_preset)},getI18nRegistry:()=>this.i18nRegistry});this.devtools=ae.devtools,this.globalLogSubscription=ae.logSubscription,this.settings=ae.settings;let oe=No({getConfig:()=>this.settings.get(`notification`),getCwd:()=>this.workspaceDir,isFollowUpPending:()=>this.followUpPendingProbe?.()??!1,emitHookNotification:e=>void this.hookRegistry.emit(`notification`,e)});this.notificationDispatcher=oe.dispatcher,this.presenceTracker=oe.presenceTracker;let se=this.settings,ce=xa({skillProvider:e.skillProvider,workspaceDir:this.workspaceDir,activePlugins:()=>this.activePlugins(),resolveEffectiveModel:re,providerRegistry:this.providerRegistry,prompt:e.prompt,memoryStore:v.memoryStore,memoryAutoExtractConfig:{enabled:!0,get everyNTurns(){return se.get(`memory_auto_extract`)?.every_n_turns},get maxLessons(){return se.get(`memory_auto_extract`)?.max_lessons},get similarityThreshold(){return se.get(`memory_auto_extract`)?.similarity_threshold}}});this.skillRegistry=ce.skillRegistry,this.fileStateManager=ce.fileStateManager,this.learningStore=ce.learningStore,this.localLearningStore=ce.localLearningStore,this.memoryAutoExtractor=ce.memoryAutoExtractor,this.completeText=ce.completeText,this.promptManager=ce.promptManager;let le=ne(this._authStore,`delegation`),ue=Hd({getModelRegistry:()=>this.modelRegistry,providerRegistry:this.providerRegistry,authStore:this._authStore,getSettings:()=>this.settings,promptManager:this.promptManager,getTools:()=>this.tools,getDeclarativeAgentProfiles:()=>this.getEnabledAgentProfiles(),defaultModel:te,explicitModelId:ie,isModelUsable:le,maxToolTurns:this.maxToolTurns,maxToolTurnExtensions:this.maxToolTurnExtensions,promptOutputTokenBudget:this.promptOutputTokenBudget,promptWallClockBudgetMs:this.promptWallClockBudgetMs,sessionCostBudgetUSD:this.sessionCostBudgetUSD,stallDetection:this.stallDetection,workspaceDir:this.workspaceDir,getWorkspaceRef:()=>this.workspaceRef,workspaceId:this._workspaceId,logger:this.logger,getResilienceConfig:()=>this.getResilienceConfig()}),de=ue.visionDelegateService;this.sessionConfigResolver=ue.sessionConfigResolver;let fe=Ud({options:e,hookRegistry:this.hookRegistry,providerRegistry:this.providerRegistry,getModelRegistry:()=>this._modelRegistry,logger:this.logger,workspaceDir:this.workspaceDir,getTools:()=>this.tools,getDeclarativeAgentProfiles:()=>this.getEnabledAgentProfiles(),getWorkspaceRef:()=>this.workspaceRef,repoRef:g,maxToolTurns:this.maxToolTurns,promptManager:this.promptManager,memory:this.storage.memory,traceStore:this.storage.traceStore,checkpointStore:this.storage.checkpointStore,clock:this.clock,devtools:this.devtools??void 0,residencyGovernor:this._residencyGovernor,getResidencyConfig:()=>this.getResidencyConfig(),visionDelegateService:de,resolveEffectiveModel:re,defaultModel:te});this.agentRuntime=fe.agentRuntime,this.codingSessionPool=fe.codingSessionPool,Oy(this);let pe=fe.swarmAgentRunner,me=Wd({hookRegistry:this.hookRegistry,stream:this.codingSessionPool.stream,logger:this.logger,defaultModel:fe.defaultModel,providerRegistry:this.providerRegistry,getDeclarativeTeams:()=>this.declarativeTeams,getDeclarativeAgentProfiles:()=>this.getEnabledAgentProfiles(),getSession:e=>this.getSession(e),createSession:e=>this.createSession(e),removeSession:e=>this.removeSession(e),sessionConfigResolver:this.sessionConfigResolver,swarmAgentRunner:pe,workflowConfig:{retry:this.settings.get(`workflow`)?.retry,circuitBreaker:this.settings.get(`workflow`)?.circuitBreaker}});this.orchestrator=me.orchestrator,this.runSession=me.runSession,this.runTeam=me.runTeam,this.writeTodos=me.writeTodos,this.toolRegistry=this.initToolRegistry(e);let he=Jd({toolRegistry:this.toolRegistry,hookRegistry:this.hookRegistry,settings:this.settings,workspaceDir:this.workspaceDir,logger:this.logger,getResilienceConfig:()=>this.getResilienceConfig()});this.permissionRegistry=he.permissionRegistry,this.auditLog=he.auditLog,this.mcpController=he.mcpController;let ge=he.preExistingHooks;this.extensions=Yd({settings:this.settings,mcpController:this.mcpController,skillRegistry:this.skillRegistry,declarativeAgentProfiles:this.declarativeAgentProfiles,workspaceDir:this.workspaceDir,pluginHomedir:this._pluginHomedir,pluginBundledDirs:this._pluginBundledDirs,onPluginToggle:(e,t)=>{this.pluginModuleManager?.emitMonitorEvent({type:t?`plugin.enabled`:`plugin.disabled`,pluginId:e})}}),this.panelBackendController=Gd({mcpController:this.mcpController,callMcpTool:(e,t,n)=>this.callMcpTool(e,t,n),getActivePlugins:()=>this.activePlugins()}).panelBackendController;let _e=Xd({pluginInput:this.pluginInput,sigilResolvers:this.sigilResolvers,settings:this.settings,workspaceDir:this.workspaceDir,activePlugins:()=>this.activePlugins(),agentRuntime:this.agentRuntime,hookRegistry:this.hookRegistry,preExistingHooks:ge,codingSessionPoolGet:e=>this.codingSessionPool.getSession(e),logger:this.logger,registerHooks:()=>this.registerHooks()});this.ownedHookNames=_e.ownedHookNames,this.processRegistryUnsubs=_e.processRegistryUnsubs,this.i18nRegistry=new jn;let ve=Kd({hookRegistry:this.hookRegistry,skillRegistry:this.skillRegistry,providerRegistry:this.providerRegistry,wireProtocolRegistry:this.wireProtocolRegistry,modelRegistry:this._modelRegistry,authStore:this._authStore,toolRegistry:this.toolRegistry,feedbackRegistry:this.feedbackRegistry,sigilResolverRegistry:this.sigilResolvers,pluginInput:this.pluginInput,workspaceDir:this.workspaceDir,activePlugins:()=>this.activePlugins(),callMcpTool:(e,t,n)=>this.callMcpTool(e,t,n),startPluginJob:({pluginId:e,title:t,prompt:n,sessionId:r})=>this.agentJobs.start({title:`[${e}] ${t}`,prompt:n,sessionId:r,origin:`plugin`}),getPluginJobSessionId:()=>this.getActiveSession()?.id,getSessionMessages:e=>this.getSession(e)?.session.messages().filter(e=>e.role===`user`||e.role===`assistant`||e.role===`tool_result`),completeText:(e,t)=>this.completeText(e,t),capabilityQuota:this.pluginCapabilityQuota,askUser:(e,t)=>this.askPluginUser(e,t),getWorkspaceKey:()=>this.workspaceRef?.key,logger:this.logger,onPluginLoadError:(e,t)=>this.pluginHealthTracker.recordError(e,t),getSchedulePort:()=>this.scheduleServiceInstance,settings:this.settings,mcpController:this.mcpController,skillRegistryForReloader:this.skillRegistry,modelCatalogManager:this.modelCatalogManager,getActivePluginsForReloader:()=>this.activePlugins(),i18nRegistry:this.i18nRegistry});this.pluginModuleManager=ve.pluginModuleManager,this.pluginProviderManager=ve.pluginProviderManager,this.capabilityReloader=ve.capabilityReloader,this.toolRegistry.onMutation=e=>{this.permissionSync.sync(this.settings.config);for(let t of e.added??[])this.pluginModuleManager.emitMonitorEvent({type:`tool.registered`,toolName:t,source:e.source});for(let t of e.removed??[])this.pluginModuleManager.emitMonitorEvent({type:`tool.unregistered`,toolName:t,source:e.source})},this.settings.on(`change`,e=>{let t=e,n=this.lastSettingsConfig;if(this.lastSettingsConfig=t,!n)return;let r=new Set([...Object.keys(n),...Object.keys(t)]),i=[];for(let e of r)n[e]!==t[e]&&i.push(e);i.length>0&&this.pluginModuleManager.emitMonitorEvent({type:`settings.changed`,keys:i})});let ye=qd({sessionConfigResolver:this.sessionConfigResolver,getSession:e=>this.codingSessionPool.getSession(e),listSessionIds:()=>this.codingSessionPool.listSessions().map(e=>e.id),logger:this.logger,workspaceDir:this.workspaceDir,settings:this.settings,pluginModuleManager:this.pluginModuleManager,mcpController:this.mcpController,getActivePlugins:()=>this.activePlugins()});this.toolsSyncCoordinator=ye.toolsSyncCoordinator,this.pluginContributionsFacade=ye.pluginContributionsFacade}deferredConfigSteps(){return[{label:`resilience-config`,apply:()=>{this.freezeResilienceConfig()}},{label:`residency-config`,apply:()=>{this.freezeResidencyConfig()}},{label:`memory-governor-thresholds`,apply:()=>{let e=this.settings.get(`residency`);e&&this._memoryGovernor.updateThresholds({warnThresholdPct:e.warn_threshold_pct,hardThresholdPct:e.hard_threshold_pct})}},{label:`auth-store-lock-timeout`,apply:()=>{this._authStore.setRefreshLockTimeoutMs(this.getResilienceConfig().oauth.refreshLockTimeoutMs)}}]}async ensureSettingsLoaded(){await Zd(this.settings,()=>this.settingsLoaded,e=>{this.settingsLoaded=e}),Qd(this.deferredConfigSteps())}freezeResilienceConfig(){this._resilienceConfig===void 0&&(this._resilienceConfig=l(this._resilienceOverride,this.settings.get(`resilience`)))}_residencyConfig;freezeResidencyConfig(){if(this._residencyConfig!==void 0)return;let e=this.settings.get(`residency`),t=(e,t)=>t!=null&&process.env[e]===void 0?t:void 0;this._residencyConfig={totalBytes:t(`OTTO_SESSION_TOTAL_RESIDENCY_BUDGET`,e?.total_bytes),minPerSessionBytes:t(`OTTO_SESSION_MIN_PER_SESSION_BYTES`,e?.min_per_session_bytes),maxPerSessionBytes:t(`OTTO_SESSION_MAX_PER_SESSION_BYTES`,e?.max_per_session_bytes),maxContentBytes:t(`OTTO_SESSION_MAX_CONTENT_BYTES`,e?.max_content_bytes),maxHistoryMessages:t(`OTTO_SESSION_MAX_HISTORY_MESSAGES`,e?.max_history_messages),resumeWindowMessages:t(`OTTO_SESSION_RESUME_WINDOW_MESSAGES`,e?.resume_window_messages),compactionTimeoutMs:t(`OTTO_SESSION_COMPACTION_TIMEOUT_MS`,e?.compaction_timeout_ms)}}getResidencyConfig(){return this._residencyConfig}getResilienceConfig(){if(this._resilienceConfig===void 0)throw Error(`getResilienceConfig() called before settings are loaded — call after ensureSettingsLoaded()/start()`);return this._resilienceConfig}async allowToolAlways(e,t){return Xo(this,e,t)}getPermissionMode(){return Zo(this)}async setPermissionMode(e){return Qo(this,e)}getSessionAlwaysAllow(e){return $o(this,e)}bashAlwaysAllowPrefix(e){return ve(e)}isWellFormedAllowEntry(e){return Ne(e)}async disallowToolAlways(e){return es(this,e)}clearSessionAlwaysAllow(e){ts(this,e)}activePlugins(){return this.pluginTopology.resolve({workspaceDir:this.workspaceDir,disabledPlugins:this.settings.get(`disabled_plugins`)??[],homedir:this._pluginHomedir,bundledDirs:this._pluginBundledDirs})}async diagnoseTopoSortIssues(){await this.pluginTopology.diagnose(this.logger,this.settings)}listFileCommands(){return this.pluginContributionsFacade.listFileCommands()}async callMcpTool(e,t,n){return this.pluginContributionsFacade.callMcpTool(e,t,n)}getPluginPanelRegistrations(){return this.pluginContributionsFacade.getPluginPanelRegistrations()}getPluginStatusItems(){return this.pluginContributionsFacade.getPluginStatusItems()}getGlobalMenuItems(){return this.pluginContributionsFacade.getGlobalMenuItems()}getPluginRenderers(){return this.pluginContributionsFacade.getPluginRenderers()}getPluginStatusWidgets(){return this.pluginContributionsFacade.getPluginStatusWidgets()}getPluginFileViewers(){return this.pluginContributionsFacade.getPluginFileViewers()}isFeedbackAvailable(){return this.feedbackRegistry.get()!==void 0}getPulseSurveyConfig(){return this.settings.get(`pulse_survey`)??{}}recordPulseSurvey(e){this.feedbackRegistry.get()?.recordPulseSurvey?.(e)}buildFeedbackIssueUrl(e){return this.feedbackRegistry.get()?.buildIssueUrl?.(e)}updateSettings(e){return this.settings.update(e)}resolveA2uiRendererPayload(e){return eo(Za(this.activePlugins()),e)}getPluginRegistrations(){return this.pluginContributionsFacade.getPluginRegistrations()}async firePluginActivationEvent(e){await this.pluginModuleManager.activateOn(e,new Set(this.declarativeAgentProfiles.map(e=>e.name)))}async start(){return hy(this)}async completeWorkspaceDependentStartup(){return gy(this)}needsWorkspaceInit(){return _y(this)}async confirmWorkspaceInit(){return xy(this)}hasParentWorkspace(){return vy(this)}async adoptParentWorkspace(){return yy(this)}async createLocalWorkspace(){return by(this)}async setWorkspaceMemorySyncEnabled(e){return Sy(this,e)}async sweepOrphanTraceFiles(){return Cy(this)}async stop(){return wy(this)}async createSession(e={}){return ns(this,e)}registerNotificationChannel(e){Ko(this,e)}registerInAppNotificationChannel(e){qo(this,e)}setUserAskRenderer(e){this.userAskRenderer=e}async askPluginUser(e,t){let n={...jy(t),id:`plugin_ask_${++this.userAskSeq}`,askedBy:`plugin:${e}`},r=this.userAskRenderer;if(!this._interactive||!r)return Ay();let i=this.inquiryCenter.enqueue({id:n.id,origin:{kind:`plugin`,pluginId:e},question:n});if(!i.accepted)return Ay();if(!await this.inquiryCenter.waitForTurn(n.id))return await i.answer;try{let e=await r(n);return this.inquiryCenter.settle(n.id,e),e}catch(e){throw this.inquiryCenter.settle(n.id,Ay()),e}}notifyUserInteraction(){Jo(this)}setTerminalFocus(e){Yo(this,e)}setFollowUpPendingProbe(e){this.followUpPendingProbe=e}notifyPluginServices(e){let t=ol(),n=0;for(let r of this.activePlugins())for(let i of t.runningServiceIds(r.id))t.notify(r.id,i,e)&&(this.pluginCapabilityQuota.onNotifyDelivered(r.id,e.sessionId),n+=1);return n}notifyPluginServiceSchedule(e,t){return this.activePlugins().some(t=>t.id===e.pluginId)?ol().notify(e.pluginId,e.serviceId,{type:`schedule.tick`,scheduleId:t.scheduleId,occurrenceId:t.occurrenceId,occurredAt:t.occurredAt}):!1}getSession(e){return rs(this,e)}async shareSession(e,t){return is(this,e,t)}getActiveSession(){return as(this)}listSessions(e){return os(this,e)}async listAllSessions(e){return ss(this,e)}async removeSession(e){return cs(this,e)}async exportSessionArchive(e,t){return Ty(e,t,this.sessionRepoRef??{})}archiveSession(e){return ls(this,e)}async forkSession(e,t){return us(this,e,t)}getEnabledAgentProfiles(){let e=new Set(this.settings.get(`disabled_agents`)??[]);return e.size===0?this.declarativeAgentProfiles:this.declarativeAgentProfiles.filter(t=>!e.has(t.name))}initToolRegistry(e){return fy(this,e)}async buildModelCatalog(e){return Go(this,e)}setSessionAvailableModels(e,t){Uo(this,e,t)}registerHooks(){py(this)}get activeSandbox(){return this.sandbox.activeName}approveSandboxBypass(e){this.sandbox.approveBypass(e)}ensureNotDisposed(){if(this.disposed)throw Error(`App has been stopped and cannot be reused.`)}};function Ay(){return{answer:``,acceptedRecommendation:!1,resolvedBy:`human`}}function jy(e){return{header:My(e.header,160),question:My(e.question,2e3),background:My(e.background,4e3),recommendation:My(e.recommendation,1e3),...e.options?{options:e.options.slice(0,8).map(e=>({label:My(e.label,120),rationale:My(e.rationale,1e3),...e.recommended?{recommended:!0}:{}}))}:{},...e.allowFreeform===void 0?{}:{allowFreeform:e.allowFreeform},...e.multiSelect===void 0?{}:{multiSelect:e.multiSelect},...e.evidence?{evidence:e.evidence.slice(0,8).map(e=>My(e,1e3))}:{}}}function My(e,t){return String(e??``).replace(/[--Ÿ‎‏‪-‮⁦-⁩]/g,` `).slice(0,t)}function Ny(e){return new ky(e)}function Py(e){return{get id(){return e.id},get title(){return e.title},get agentName(){return e.agentName},get model(){return{id:e.model.id,name:e.model.name,provider:e.model.provider}},get isBusy(){return e.isBusy},messageCount:()=>e.session.messages().length,lastAssistantText:()=>ko(e.session.messages()),prompt:(t,n)=>e.prompt(t,n),subscribe:((t,n)=>e.subscribe(t,n)),resolveApproval:(t,n)=>e.resolveApproval(t,n),resolveAskUser:(t,n)=>e.resolveAskUser(t,n),clearContext:()=>e.clearContext(),compactNow:()=>e.compactNow(),renameSession:t=>e.renameSession(t),abort:()=>e.abort(),dispose:()=>e.dispose()}}function Fy(e){return{createSession:async t=>Py(await e.createSession(t)),jobs:Lt,models:{getAll:()=>e.modelRegistry.getAll().map(e=>({id:e.id,name:e.name,provider:e.provider})),switchModel:async(t,n)=>{let r=e.getSession(t);if(!r)return`会话未找到`;if(r.isBusy)return`当前有正在执行的对话,请等待完成后重试。`;let i=e.modelRegistry.find(n);return i?(r.model=i,null):`未知模型 \`${n}\`。`},refresh:async()=>(await e.refreshModels()).map(e=>({provider:e.provider,status:e.status,added:e.added,kept:e.kept,total:e.total,reason:e.reason}))},permission:{getMode:()=>e.getPermissionMode(),setMode:t=>e.setPermissionMode(t)},auth:{getAuthSource:t=>e.authStore.getAuthSource(t)},i18n:{t:(t,n)=>e.i18nRegistry.t(t,n)},reloadCapabilities:()=>e.reloadCapabilities(),workspaceDir:e.workspaceDir}}const Iy=new Set(`assert.async_hooks.buffer.child_process.cluster.console.constants.crypto.dgram.diagnostics_channel.dns.domain.events.fs.http.http2.https.inspector.module.net.os.path.perf_hooks.process.punycode.querystring.readline.repl.sqlite.stream.string_decoder.timers.tls.trace_events.tty.url.util.v8.vm.wasi.worker_threads.zlib`.split(`.`));function Ly(e){return e.absolutePaths.length>0||e.bareSpecifiers.length>0}function Ry(e){let t=[],n=[];for(let r of e.matchAll(/require\("([^"]+)"\)/g)){let e=r[1];if(e.startsWith(`/`)){t.includes(e)||t.push(e);continue}e.startsWith(`.`)||e.startsWith(`node:`)||Iy.has(e)||n.includes(e)||n.push(e)}return{absolutePaths:t,bareSpecifiers:n}}function zy(e,t){let n=Ry(t);if(!Ly(n))return;let r=[`${e}: 产物不可分发(RFC-365 R1/R2)`];throw n.absolutePaths.length>0&&r.push(` 编译机绝对路径 require(R1)——发布机路径在用户机器不存在:`,...n.absolutePaths.map(e=>` ${e}`)),n.bareSpecifiers.length>0&&r.push(` 裸模块名 require(R2)——假设运行机有 node_modules,在 ~/.otto/plugins/<id>/ 必然 MODULE_NOT_FOUND:`,...n.bareSpecifiers.map(e=>` ${e}`)),Error(r.join(`
504
- `))}function By(e,t){return new Promise((n,r)=>{let i=setTimeout(()=>r(Error(`timeout`)),t);i.unref?.(),e.then(e=>{clearTimeout(i),n(e)},e=>{clearTimeout(i),r(e)})})}function Vy(e,t=E){let n=t(e);return n.gated||!(e.manifest.capabilities?.includes(`tools`)??!1)?!1:!n.pendingCapabilities.includes(`tools`)}async function Hy(e,t,n){let r=[];for(let i of e){if(!Vy(i,t))continue;let e=i.manifest.contributes?.perfMetrics;if(!e?.length)continue;let a=Nl(i.scope);for(let t of e){let e=(async()=>{try{let{result:e,error:n}=await By(a.executeTool(i.id,t.toolRef,{}),5e3);return n?{id:t.id,label:t.label,error:n}:{id:t.id,label:t.label,value:e}}catch(e){let r=e instanceof Error?e.message:String(e);return r===`timeout`&&n?.(i.id),{id:t.id,label:t.label,error:r}}})();r.push(e)}}return(await Promise.allSettled(r)).map((e,t)=>e.status===`fulfilled`?e.value:{id:`unknown-${t}`,label:`unknown`,error:String(e.reason)})}const Uy=20;function Wy(e,t=20){let n=ac(e);if(!n||!D(n))return[];let r;try{r=k(n,`utf8`)}catch{return[]}let i=r.split(`
505
- `).filter(e=>e.trim().length>0).slice(-t),a=[];for(let e of i)try{a.push(JSON.parse(e))}catch{}return a}function Gy(e,t,n){let r=e?.manifest.contributes?.contextKeys;return{...t,...Un(r,n)}}function Ky(e,t){let n=e.manifest.scripts?.[t];if(!n)return Promise.reject(Error(`plugin ${e.id} 无脚本「${t}」`));let r=Ye(n);return r.safe?new Promise((r,i)=>{let a=Oi(n,{shell:!0,cwd:e.dir,stdio:`ignore`,env:Je()});a.on(`error`,i),a.on(`exit`,e=>e===0?r():i(Error(`脚本「${t}」退出码 ${e}`)))}):Promise.reject(Error(`脚本「${t}」被安全检查拦截:${r.reason}`))}function qy(e){let t=e.startsWith(`chrome://`);process.platform===`darwin`?Oi(`open`,t?[`-a`,`Google Chrome`,e]:[e],{detached:!0,stdio:`ignore`}).unref():process.platform===`win32`?Oi(`cmd`,[`/c`,`start`,``,e],{detached:!0,stdio:`ignore`}).unref():Oi(t?`google-chrome`:`xdg-open`,[e],{detached:!0,stdio:`ignore`}).unref()}const Jy=C(`@x-otto/coding:plugin-cli-passthrough`);function Yy(e){let t=e.manifest.contributes?.cli?.bin,n=t?x(e.dir,t):Xy(e.dir);if(n)return Zy(n,e.dir)}function Xy(e){let t=x(e,`package.json`);if(D(t))try{let n=JSON.parse(k(t,`utf8`));if(typeof n.bin==`string`)return x(e,n.bin);if(n.bin&&typeof n.bin==`object`){let t=Object.values(n.bin)[0];return typeof t==`string`?x(e,t):void 0}return}catch{return}}function Zy(e,t){if(!D(e))return;let n,r;try{n=Jr(e),r=Jr(t)}catch{return}let i=r.endsWith(`/`)?r:`${r}/`;if(!n.startsWith(i)&&n!==r){Jy.warn({candidate:e,pluginDir:t},`Plugin CLI bin resolves outside plugin directory (symlink escape rejected)`);return}try{if(!Zr(n).isFile())return}catch{return}return n}function Qy(e,t){let n=new Map;for(let r of e){let e=r.manifest.contributes?.cli?.name;if(!e)continue;if(t.has(e)){Jy.warn({pluginId:r.id,name:e},`Plugin CLI contribution name collides with a built-in command; ignored`);continue}let i=n.get(e);i?i.push(r):n.set(e,[r])}return n}function $y(e,t){let n=Qy(e,t),r=new Map;for(let[e,t]of n){if(t.length===1){r.set(e,t[0]);continue}Jy.warn({name:e,conflictingPluginIds:t.map(e=>e.id)},`Plugin CLI contribution name claimed by multiple plugins; command disabled (fail-closed, RFC-124 §10.2.2 — rename one of the conflicting plugins to resolve)`)}return r}function eb(e,t,n){let r=Qy(e,t).get(n);return r&&r.length>=2?r.map(e=>e.id):void 0}function tb(e,t,n,r=6e4){return new Promise((i,a)=>{let o=Oi(e,t,{stdio:`inherit`,cwd:n,env:Je()}),s=setTimeout(()=>{o.kill(`SIGTERM`),a(Error(`插件 CLI 执行超时(${r}ms),已终止子进程`))},r);s.unref(),o.on(`error`,e=>{clearTimeout(s),a(e)}),o.on(`exit`,(e,t)=>{clearTimeout(s),i(e??(t?1:0))})})}function nb(e,t={}){return Vn({cwd:t.workspaceDir??process.cwd(),homedir:t.homedir??ze(),bundledDirs:t.bundledDirs}).find(t=>t.id===e)}function rb(e,t,n={}){let r=nb(e,n);if(!r)return{ok:!1,reason:`plugin-not-found`,granted:[],pending:[],message:`Plugin "${e}" not found. Install it first, or check workspaceDir/homedir options.`};let i=(r.manifest?.capabilities??[]).filter(e=>xn.includes(e)),a=t??[],o=a.filter(e=>!xn.includes(e));if(o.length>0)return{ok:!1,reason:`unknown-capability`,granted:[],pending:i,message:`Unknown capability: ${o.join(`, `)}. Valid high-risk capabilities: ${xn.join(`, `)}.`};let s=a.filter(e=>!i.includes(e));if(s.length>0)return{ok:!1,reason:`capability-not-declared`,granted:[],pending:i,message:`Plugin "${e}" does not declare capability: ${s.join(`, `)}. Declared: ${i.length?i.join(`, `):`(none)`}.`};cr(r.dir),a.length>0&&Jn(r.dir,a);let c=E(r);return{ok:!0,granted:[...a],pending:c.pendingCapabilities}}function ib(e,t={}){let n=nb(e,t);if(!n)return{found:!1,trusted:!1,gated:!1,declared:[],granted:[],pending:[]};let r=E(n),i=(n.manifest?.capabilities??[]).filter(e=>xn.includes(e));return{found:!0,trusted:r.trusted,gated:r.gated,declared:[...i],granted:[...r.grantedCapabilities],pending:[...r.pendingCapabilities]}}function ab(e,t={}){let n=nb(e,t);return n?(ur(n.dir),!0):!1}const ob=C(`@x-otto/coding:plugin-theme-preset-loader`),sb=new Set([`dark`,`light`,`system`,`builtin`]);function cb(e){let t=[];for(let n of e){let e=n.manifest.contributes?.themePresets;if(!e?.length)continue;if(E(n).gated){ob.warn({pluginId:n.id},`plugin gated (untrusted), themePresets skipped`);continue}let r=e;r.length>Dn&&(ob.warn({pluginId:n.id,declared:r.length,limit:Dn},`plugin declares more theme presets than the per-plugin limit, truncated`),r=r.slice(0,Dn));for(let e of r){if(sb.has(e.localId)){ob.warn({pluginId:n.id,localId:e.localId},`themePresets localId collides with a reserved name, skipped`);continue}t.push({pluginId:n.id,localId:e.localId,label:e.label,appearance:e.appearance,colors:e.colors,markdown:e.markdown,meta:e.meta})}}return t}export{yo as AgentJobService,pt as AgentSession,ky as App,bt as CodingSessionPool,Uv as DEFAULT_WORKSPACE_KEY,Pa as ExtensionManager,bn as HIGH_RISK_CAPABILITIES,Hv as INDUCTOR_PLUGIN_ID,Ji as InstallManager,Uy as PLUGIN_LOG_TAIL_LINES,kn as PLUGIN_MANIFEST_FILENAME,An as POINT,Yi as RegistryClient,Kv as SANDBOX_ESCALATION_MARKER,Bi as SCHEDULE_LEASE_MIGRATIONS,yt as SandboxUnavailableError,Vi as ScheduleRegistry,Hi as SchedulerService,Ia as SigilResolverRegistry,m as apiCredentialId,zy as assertPortableArtifact,rb as authorizePlugin,Gy as buildExtensionContext,pa as buildMemoryStore,$y as buildPluginCliRegistry,Xi as builtinOfficialSource,wt as captureFiles,Zi as checkArchiveBomb,Qi as checkGitUpgrades,Xu as checkPluginConsistency,$i as checkUpgrades,dr as claudeTrustStorePath,ea as cleanTempDir,Hy as collectPluginPerfMetrics,cb as collectPluginThemePresets,Hc as compilePluginModule,Iu as compilePluginPanels,Gc as computeSourceHash,Ny as createApp,ta as createArchive,Nn as createBuiltinHashtags,zd as createBuiltinResolvers,fr as createClaudeHookBridgeHooks,Fn as createFileProvider,Fy as createFrontendPort,df as createLessonInjectionHooks,Ui as createLocalFireOwnership,Ln as createPluginInputRegistry,Wi as createRemoteFireOwnership,Gi as createRemoteScheduleStore,qi as createScheduleStore,Ot as createSessionStableInjectionHooks,ff as createSkillCatalogInjectionHooks,na as createTempDir,tf as createToolGuidanceHook,mr as defaultHookRunner,Nt as defaultMaxToolTurnExtensions,js as defaultPostInstallExecutor,Ft as deriveSessionTitle,hr as detectClaudeExecutableSurface,zn as detectPluginExecutableSurface,gr as detectProjectConfigGating,ra as detectUninstallTarget,_r as discoverFileCommands,Bn as discoverPlugins,Hn as dispatch,yr as evaluateClaudeTrust,Wn as evaluatePluginTrust,xr as evaluateWorkspaceTrustPrompt,Sr as expandCommandBody,Ga as expandSigilChips,ia as extractArchive,eb as findPluginCliNameConflict,Ry as findPortabilityViolations,i as findWorkspaceRoot,Ao as getIncompleteSubagentReason,ko as getLastAssistantText,It as globalAgentJobRegistry,Rt as globalAgentObservability,Bt as globalProcessRegistry,qn as grantPluginCapabilities,Yn as grantedPluginCapabilities,Ly as hasPortabilityViolations,ib as inspectPluginAuthorization,Gu as installPluginFromDir,Wu as installPluginFromPackage,Bc as installPluginHostExternals,Cr as interpretPreToolUse,$u as isInternalDelegatedSession,Xn as isPluginTrusted,wr as isProjectTrusted,Er as isStrictProjectConfigEnabled,aa as listInstalledItems,Dr as loadClaudeHooksConfig,Zc as loadPluginModule,kr as matchesHookMatcher,Gt as messagesFromSnapshot,qy as openTarget,Ar as parseClaudeHooks,jr as parseDotMcpJson,Qn as parsePluginManifest,oa as parseRegistry,er as pluginTrustStorePath,wu as purgePluginState,tr as readHighRiskCapabilities,Wy as readPluginLogTail,$v as readSkillLoopStatus,go as readTaskOutputTail,Kt as reconstructMessages,Ju as recordPluginInstalled,Yu as recordPluginUninstalled,qu as removeInstalledPluginEntry,nr as resolveActions,Nr as resolveClaudeMcpServers,zc as resolveHostExternalPaths,Uu as resolvePackageDir,Yy as resolvePluginCliBin,Ea as resolvePluginMcpServers,Fr as resolveProjectConfigTrusted,Jt as resolveSessionTitle,Xt as restoreFiles,ab as revokePluginAuthorization,qc as rewriteArtifactSourceHash,Ky as runPluginScript,sa as scanInstalledVersions,ar as sigilOf,tb as spawnPluginCli,sr as trustPlugin,Lr as trustProject,ca as uninstall,lr as untrustPlugin,Rr as untrustProject,Ku as upsertInstalledPluginEntry,la as validateExtractedPaths};
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,...t.reloadFailures?{reloadFailures:t.reloadFailures}:{}}}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{agentProfiles:e,teamDeclarations:t,...n}=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 n}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 Yy(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 Xy(e,t=E){let n=t(e);return n.gated||!(e.manifest.capabilities?.includes(`tools`)??!1)?!1:!n.pendingCapabilities.includes(`tools`)}async function Zy(e,t,n){let r=[];for(let i of e){if(!Xy(i,t))continue;let e=i.manifest.contributes?.perfMetrics;if(!e?.length)continue;let a=Ul(i.scope);for(let t of e){let e=(async()=>{try{let{result:e,error:n}=await Yy(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 Qy=20;function $y(e,t=20){let n=ac(e);if(!n||!D(n))return[];let r;try{r=k(n,`utf8`)}catch{return[]}let i=r.split(`
505
+ `).filter(e=>e.trim().length>0).slice(-t),a=[];for(let e of i)try{a.push(JSON.parse(e))}catch{}return a}function eb(e,t,n){let r=e?.manifest.contributes?.contextKeys;return{...t,...Un(r,n)}}function tb(e,t){let n=e.manifest.scripts?.[t];if(!n)return Promise.reject(Error(`plugin ${e.id} 无脚本「${t}」`));let r=Ye(n);return r.safe?new Promise((r,i)=>{let a=Oi(n,{shell:!0,cwd:e.dir,stdio:`ignore`,env:Je()});a.on(`error`,i),a.on(`exit`,e=>e===0?r():i(Error(`脚本「${t}」退出码 ${e}`)))}):Promise.reject(Error(`脚本「${t}」被安全检查拦截:${r.reason}`))}function nb(e){let t=e.startsWith(`chrome://`);process.platform===`darwin`?Oi(`open`,t?[`-a`,`Google Chrome`,e]:[e],{detached:!0,stdio:`ignore`}).unref():process.platform===`win32`?Oi(`cmd`,[`/c`,`start`,``,e],{detached:!0,stdio:`ignore`}).unref():Oi(t?`google-chrome`:`xdg-open`,[e],{detached:!0,stdio:`ignore`}).unref()}const rb=C(`@x-otto/coding:plugin-cli-passthrough`);function ib(e){let t=e.manifest.contributes?.cli?.bin,n=t?x(e.dir,t):ab(e.dir);if(n)return ob(n,e.dir)}function ab(e){let t=x(e,`package.json`);if(D(t))try{let n=JSON.parse(k(t,`utf8`));if(typeof n.bin==`string`)return x(e,n.bin);if(n.bin&&typeof n.bin==`object`){let t=Object.values(n.bin)[0];return typeof t==`string`?x(e,t):void 0}return}catch{return}}function ob(e,t){if(!D(e))return;let n,r;try{n=Jr(e),r=Jr(t)}catch{return}let i=r.endsWith(`/`)?r:`${r}/`;if(!n.startsWith(i)&&n!==r){rb.warn({candidate:e,pluginDir:t},`Plugin CLI bin resolves outside plugin directory (symlink escape rejected)`);return}try{if(!Zr(n).isFile())return}catch{return}return n}function sb(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)){rb.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 cb(e,t){let n=sb(e,t),r=new Map;for(let[e,t]of n){if(t.length===1){r.set(e,t[0]);continue}rb.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 lb(e,t,n){let r=sb(e,t).get(n);return r&&r.length>=2?r.map(e=>e.id):void 0}function ub(e,t,n,r=6e4){return new Promise((i,a)=>{let o=Oi(e,t,{stdio:`inherit`,cwd:n,env:Je()}),s=setTimeout(()=>{o.kill(`SIGTERM`),a(Error(`插件 CLI 执行超时(${r}ms),已终止子进程`))},r);s.unref(),o.on(`error`,e=>{clearTimeout(s),a(e)}),o.on(`exit`,(e,t)=>{clearTimeout(s),i(e??(t?1:0))})})}function db(e,t={}){return Vn({cwd:t.workspaceDir??process.cwd(),homedir:t.homedir??ze(),bundledDirs:t.bundledDirs}).find(t=>t.id===e)}function fb(e,t,n={}){let r=db(e,n);if(!r)return{ok:!1,reason:`plugin-not-found`,granted:[],pending:[],message:`Plugin "${e}" not found. Install it first, or check workspaceDir/homedir options.`};let i=(r.manifest?.capabilities??[]).filter(e=>xn.includes(e)),a=t??[],o=a.filter(e=>!xn.includes(e));if(o.length>0)return{ok:!1,reason:`unknown-capability`,granted:[],pending:i,message:`Unknown capability: ${o.join(`, `)}. Valid high-risk capabilities: ${xn.join(`, `)}.`};let s=a.filter(e=>!i.includes(e));if(s.length>0)return{ok:!1,reason:`capability-not-declared`,granted:[],pending:i,message:`Plugin "${e}" does not declare capability: ${s.join(`, `)}. Declared: ${i.length?i.join(`, `):`(none)`}.`};cr(r.dir),a.length>0&&Jn(r.dir,a);let c=E(r);return{ok:!0,granted:[...a],pending:c.pendingCapabilities}}function pb(e,t={}){let n=db(e,t);if(!n)return{found:!1,trusted:!1,gated:!1,declared:[],granted:[],pending:[]};let r=E(n),i=(n.manifest?.capabilities??[]).filter(e=>xn.includes(e));return{found:!0,trusted:r.trusted,gated:r.gated,declared:[...i],granted:[...r.grantedCapabilities],pending:[...r.pendingCapabilities]}}function mb(e,t={}){let n=db(e,t);return n?(ur(n.dir),!0):!1}const hb=C(`@x-otto/coding:plugin-theme-preset-loader`),gb=new Set([`dark`,`light`,`system`,`builtin`]);function _b(e){let t=[];for(let n of e){let e=n.manifest.contributes?.themePresets;if(!e?.length)continue;if(E(n).gated){hb.warn({pluginId:n.id},`plugin gated (untrusted), themePresets skipped`);continue}let r=e;r.length>Dn&&(hb.warn({pluginId:n.id,declared:r.length,limit:Dn},`plugin declares more theme presets than the per-plugin limit, truncated`),r=r.slice(0,Dn));for(let e of r){if(gb.has(e.localId)){hb.warn({pluginId:n.id,localId:e.localId},`themePresets localId collides with a reserved name, skipped`);continue}t.push({pluginId:n.id,localId:e.localId,label:e.label,appearance:e.appearance,colors:e.colors,markdown:e.markdown,meta:e.meta})}}return t}export{yo as AgentJobService,pt as AgentSession,Ry as App,bt as CodingSessionPool,Qv as DEFAULT_WORKSPACE_KEY,Pa as ExtensionManager,bn as HIGH_RISK_CAPABILITIES,Zv as INDUCTOR_PLUGIN_ID,Ji as InstallManager,Qy as PLUGIN_LOG_TAIL_LINES,kn as PLUGIN_MANIFEST_FILENAME,An as POINT,Yi as RegistryClient,ty as SANDBOX_ESCALATION_MARKER,Bi as SCHEDULE_LEASE_MIGRATIONS,yt as SandboxUnavailableError,Vi as ScheduleRegistry,Hi as SchedulerService,Ia as SigilResolverRegistry,m as apiCredentialId,Jy as assertPortableArtifact,fb as authorizePlugin,eb as buildExtensionContext,pa as buildMemoryStore,cb as buildPluginCliRegistry,Xi as builtinOfficialSource,wt as captureFiles,Zi as checkArchiveBomb,Qi as checkGitUpgrades,ad as checkPluginConsistency,$i as checkUpgrades,dr as claudeTrustStorePath,ea as cleanTempDir,Zy as collectPluginPerfMetrics,_b as collectPluginThemePresets,Qc as compilePluginModule,Gu as compilePluginPanels,tl as computeSourceHash,Hy as createApp,ta as createArchive,Nn as createBuiltinHashtags,Jd as createBuiltinResolvers,fr as createClaudeHookBridgeHooks,Fn as createFileProvider,Wy as createFrontendPort,bf as createLessonInjectionHooks,Ui as createLocalFireOwnership,Ln as createPluginInputRegistry,Wi as createRemoteFireOwnership,Gi as createRemoteScheduleStore,qi as createScheduleStore,Ot as createSessionStableInjectionHooks,xf as createSkillCatalogInjectionHooks,na as createTempDir,df as createToolGuidanceHook,mr as defaultHookRunner,Nt as defaultMaxToolTurnExtensions,js as defaultPostInstallExecutor,Ft as deriveSessionTitle,hr as detectClaudeExecutableSurface,zn as detectPluginExecutableSurface,gr as detectProjectConfigGating,ra as detectUninstallTarget,_r as discoverFileCommands,Bn as discoverPlugins,Hn as dispatch,yr as evaluateClaudeTrust,Wn as evaluatePluginTrust,xr as evaluateWorkspaceTrustPrompt,Sr as expandCommandBody,Ga as expandSigilChips,ia as extractArchive,lb as findPluginCliNameConflict,qy as findPortabilityViolations,i as findWorkspaceRoot,Pc as getEsbuildModule,Ao as getIncompleteSubagentReason,ko as getLastAssistantText,It as globalAgentJobRegistry,Rt as globalAgentObservability,Bt as globalProcessRegistry,qn as grantPluginCapabilities,Yn as grantedPluginCapabilities,Ky as hasPortabilityViolations,pb as inspectPluginAuthorization,Lc as installEsbuildExitHook,zc as installEsbuildSignalBridges,ed as installPluginFromDir,$u as installPluginFromPackage,Xc as installPluginHostExternals,Cr as interpretPreToolUse,cd as isInternalDelegatedSession,Xn as isPluginTrusted,wr as isProjectTrusted,Er as isStrictProjectConfigEnabled,aa as listInstalledItems,Dr as loadClaudeHooksConfig,sl as loadPluginModule,Fc as markEsbuildStarted,kr as matchesHookMatcher,Gt as messagesFromSnapshot,nb as openTarget,Ar as parseClaudeHooks,jr as parseDotMcpJson,Qn as parsePluginManifest,oa as parseRegistry,er as pluginTrustStorePath,Pu as purgePluginState,tr as readHighRiskCapabilities,$y as readPluginLogTail,cy as readSkillLoopStatus,go as readTaskOutputTail,Kt as reconstructMessages,rd as recordPluginInstalled,id as recordPluginUninstalled,nd as removeInstalledPluginEntry,nr as resolveActions,Nr as resolveClaudeMcpServers,Yc as resolveHostExternalPaths,Qu as resolvePackageDir,ib as resolvePluginCliBin,Ea as resolvePluginMcpServers,Fr as resolveProjectConfigTrusted,Jt as resolveSessionTitle,Xt as restoreFiles,mb as revokePluginAuthorization,rl as rewriteArtifactSourceHash,tb as runPluginScript,sa as scanInstalledVersions,ar as sigilOf,ub as spawnPluginCli,Ic as stopEsbuildService,sr as trustPlugin,Lr as trustProject,ca as uninstall,lr as untrustPlugin,Rr as untrustProject,td as upsertInstalledPluginEntry,la as validateExtractedPaths,Bc as withBuildTimeout};
506
506
  //# sourceMappingURL=index.js.map