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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,19 +1,19 @@
1
- import{createRequire as e}from"node:module";import{Devtools as t}from"@x-otto/devtools";import{AUTH_PATH as n,OTTO_HOME as r,SDK_VERSION as i,findWorkspaceRoot as a,findWorkspaceRoot as o,isClaudeCompatEnabled as s,isShadowModeEnabled as c,mergeResilienceConfig as l,normalizeEnv as u}from"@x-otto/env";import{CATEGORY_POLICY as d,ModelCatalogStore as f,OAUTH_PROVIDER_IDS as p,SETUP_MODEL_ID as m,TIER_TO_SLOT as h,apiCredentialId as g,builtinSlotModels as ee,collectModelCapabilityFacts as _,complete as te,createCredentialBackendRegistry as ne,createDefaultAuthStore as re,createDefaultModelRegistry as ie,createModelSlot as ae,createModelUsabilityGate as oe,createProviderRegistry as se,createWireProtocolRegistry as ce,fetchModels as le,isBuiltinProviderId as ue,mergeFetchedModels as de,rankModelsBySlotAffinity as fe,registerCacheReportingApi as pe,registerProviderDescriptor as me,resolveModelsRequest as he,stream as ge,unregisterCacheReportingApi as _e,unregisterProviderDescriptor as ve}from"@x-otto/ai";import{Diagnoser as ye,FailureSignalStore as be,PermissionAuditLog as xe,assessSandboxSafety as Se,bashAlwaysAllowPrefix as Ce,compilePolicyFromSetting as we,computeSandboxRoots as Te,createDisabledToolsPolicy as Ee,createEgressAllowlistPolicy as De,createFailureSignalHook as Oe,createPermissionDenyHook as ke,createPermissionGuardHook as Ae,createPermissionModePolicy as je,createPermissionRegistry as Me,createPermissionToolSetsFromRegistry as Ne,defaultDeniedRoots as Pe,extractWriteTargets as Fe,isWellFormedAllowEntry as Ie}from"@x-otto/guard";import{CapabilityGapReportStore as Le,ORCHESTRATION_TOOL_NAMES as Re,createPlatformSandbox as ze,createToolRegistry as Be,credentialDenyReadPaths as Ve,isPlatformSandboxAvailable as He}from"@x-otto/tools";import{appendFileSync as Ue,closeSync as We,constants as Ge,existsSync as v,fsyncSync as Ke,lstatSync as qe,mkdirSync as y,mkdtempSync as Je,openSync as Ye,readFileSync as b,readdirSync as Xe,readlinkSync as Ze,realpathSync as Qe,renameSync as $e,rmSync as et,statSync as tt,symlinkSync as nt,unlinkSync as rt,writeFileSync as x,writeSync as it}from"node:fs";import{homedir as at,tmpdir as ot}from"node:os";import{dirname as S,extname as st,isAbsolute as ct,join as C,relative as lt,resolve as w,sep as ut}from"node:path";import{CodedError as dt,ProviderError as ft,attachLogListener as pt,buildAllowedEnv as mt,checkShellCommand as ht,createLogger as T,installGlobalProxyDispatcher as gt,mapClaudeAgentToolNames as _t,markStartupPhase as vt,parseFrontmatterList as yt,setDefaultProxy as bt,splitFrontmatter as xt,traceStartupPhase as St}from"@x-otto/shared";import{AutoMemory as Ct,DEFAULT_MEMORY_SOURCES as wt,EvolutionSignalStore as Tt,FileStateManager as Et,FileSystemMemoryStore as Dt,HttpMemoryStore as Ot,InMemoryArchiveStorage as kt,OperationalLearningStore as At,computeLessonContentHash as jt,createMemoryAutoExtractor as Mt,createMemoryManager as Nt,createOverlayMemoryStore as Pt,createSignalLog as Ft,discoverAgentsSources as It,formatMessageForSummary as Lt}from"@x-otto/memory";import{Agent as Rt,wireSnapshotStore as zt}from"@x-otto/agent";import{AgentSession as Bt,FleetMonitor as Vt,HostRegistry as Ht,MemoryGovernor as Ut,RUNTIME_DEFAULTS as Wt,ResidencyGovernor as Gt,SandboxUnavailableError as Kt,SessionPool as qt,applyDiff as Jt,attachAgentObserver as Yt,buildEngineStores as Xt,captureFiles as Zt,checkApply as Qt,createAgentRuntime as $t,createDocSyncReminderHooks as en,createLlmEscalationReviewer as tn,createMemoryDeltaHooks as nn,createSessionStableInjectionHooks as rn,createTodoReminderHooks as an,createToolHookExecutor as on,createWorktree as sn,decideApply as cn,defaultMaxToolTurnExtensions as ln,defaultMaxToolTurnExtensions as un,definePromptSection as dn,deriveSessionTitle as fn,globalAgentJobRegistry as pn,globalAgentJobRegistry as mn,globalAgentObservability as hn,globalAgentObservability as gn,globalProcessRuntime as _n,globalProcessRuntime as E,globalToolResultStore as vn,hasRepoDrifted as yn,installAgentJobReaper as bn,installExitReaper as xn,messagesFromSnapshot as Sn,reconstructMessages as Cn,removeWorktree as wn,resolveSessionTitle as Tn,resolveTodoContinuationConfig as En,restoreFiles as Dn,revertDiff as On,touchesCapabilitySurface as kn,touchesForbiddenZone as An,worktreeDiff as jn}from"@x-otto/runtime";import{atomicWriteFile as Mn,createFileStorageHost as Nn,createInMemoryPanelStatePersistence as Pn,createInMemoryPasteStatePersistence as Fn,createLiveTappedAppendLog as In,createPersistence as Ln}from"@x-otto/persistence";import{SESSION_MAX_PER_SESSION_BYTES as Rn,SESSION_RESUME_WINDOW_MESSAGES as zn}from"@x-otto/session-contract";import{createRegistrySkillProvider as Bn,createSkillRegistry as Vn}from"@x-otto/skill";import{BUILTIN_PROMPTS_DIR as Hn,PromptManager as Un,SUBAGENT_GUARDRAILS as Wn,assembleGenericSubAgentPrompt as Gn,buildLessonInjection as Kn,createPromptProvider as qn,resolveAgentProfile as Jn}from"@x-otto/prompt";import{HIGH_RISK_CAPABILITIES as Yn,HIGH_RISK_CAPABILITIES as Xn,ID_RE as Zn,MAX_I18N_ENTRIES_PER_PLUGIN as Qn,MAX_I18N_FILE_BYTES as $n,MAX_I18N_LOCALE_FILES_PER_PLUGIN as er,MAX_I18N_TRANSLATION_BYTES as tr,MAX_THEME_PRESETS_PER_PLUGIN as nr,PLUGIN_API_VERSION as rr,PLUGIN_MANIFEST_FILENAME as ir,PLUGIN_MANIFEST_FILENAME as D,POINT as ar,PluginI18nRegistry as or,SHELL_POINTS as sr,createBuiltinHashtags as cr,createBuiltinHashtags as lr,createFileProvider as ur,createFileProvider as dr,createPluginInputRegistry as fr,createPluginInputRegistry as pr,detectPluginExecutableSurface as mr,discoverPlugins as hr,discoverPlugins as gr,dispatch as _r,evaluateContextKeys as vr,evaluatePluginTrust as yr,evaluatePluginTrust as O,evaluateWhen as br,filterEngineCompatible as xr,grantPluginCapabilities as Sr,grantPluginCapabilities as Cr,grantPluginCapabilitiesWithVersion as wr,grantedPluginCapabilities as Tr,grantedPluginCapabilitiesForVersion as Er,isPluginTrusted as Dr,isPluginTrusted as Or,isSensitiveField as kr,mergeConfigWithDefaults as Ar,parsePluginManifest as jr,parsePluginManifest as Mr,pluginTrustStorePath as Nr,readHighRiskCapabilities as Pr,redactSensitiveFields as Fr,resolveActions as Ir,resolveActions as Lr,resolveActivationEvents as Rr,resolveManifestPlane as zr,sigilOf as Br,topoSortPlugins as Vr,trustPlugin as Hr,trustPlugin as Ur,untrustPlugin as Wr,untrustPlugin as Gr}from"@x-otto/plugin";import{claudeTrustStorePath as Kr,createClaudeHookBridgeHooks as qr,createClaudeHookBridgeHooks as Jr,defaultHookRunner as Yr,detectClaudeExecutableSurface as Xr,discoverFileCommands as Zr,discoverFileCommands as Qr,evaluateClaudeTrust as $r,evaluateClaudeTrust as ei,expandCommandBody as ti,interpretPreToolUse as ni,isProjectTrusted as ri,loadClaudeHooksConfig as ii,matchesHookMatcher as ai,parseClaudeHooks as oi,resolveClaudeMcpServers as si,resolveClaudeMcpServers as ci,trustProject as li,untrustProject as ui}from"@x-otto/claude-compat";import{McpManager as di,parseDotMcpJson as fi,parseDotMcpJson as pi}from"@x-otto/mcp";import{InMemorySession as mi,RelationalSessionPersistence as hi,SESSION_MAX as gi,SqliteSessionRepository as _i,createNoopSessionWriteLeaseManager as vi,createSessionWriteLeaseManager as yi,reassembleSnapshot as bi,rowToEntry as xi}from"@x-otto/session";import{Orchestrator as Si,createHandoffTool as Ci,createSwarm as wi}from"@x-otto/orchestrator";import{BUILTIN_AGENT_PROFILES as Ti,SettingsManager as Ei,detectProjectConfigGating as Di,evaluateWorkspaceTrustPrompt as Oi,isProjectTrusted as ki,isStrictProjectConfigEnabled as Ai,parseResilienceEnvOverride as ji,resolveProjectConfigTrusted as Mi,resolveProjectConfigTrusted as Ni,validateResilienceOverride as Pi}from"@x-otto/setting";import{createHash as Fi,randomUUID as Ii}from"node:crypto";import{CallbackChannel as Li,CommandChannel as Ri,NotificationDispatcher as zi,PresenceTracker as Bi,TerminalChannel as Vi,TimestampPresenceGate as Hi}from"@x-otto/notification";import{DEFAULT_WORKSPACE_KEY as Ui,createWorkspaceResolver as Wi,genWorkspaceId as Gi,readMarker as Ki,workspaceKey as qi,writeMarker as Ji}from"@x-otto/workspace";import{mkdir as Yi,open as Xi,readFile as Zi,writeFile as Qi}from"node:fs/promises";import{spawn as $i,spawnSync as ea}from"node:child_process";import{createHookRegistry as ta,defineHook as k,isWaterfallTiming as na}from"@x-otto/hooks";import{Worker as ra}from"node:worker_threads";import{fileURLToPath as ia,pathToFileURL as aa}from"node:url";import{DeviceFlowOAuthTemplate as oa,PKCEOAuthTemplate as sa}from"@x-otto/provider";import{createTodoStore as ca}from"@x-otto/orchestration-contracts";import{SCHEDULE_LEASE_MIGRATIONS as la,ScheduleRegistry as ua,SchedulerService as da,createLocalFireOwnership as fa,createRemoteFireOwnership as pa,createRemoteScheduleStore as ma,createScheduleCapability as ha,createScheduleStore as ga}from"@x-otto/schedule";import{SYSTEM_PROMPT_SECTIONS as A,applySectionBudget as _a,boundFragment as va,contextFragmentBytes as ya,getToolCallsByAssistantMessage as ba}from"@x-otto/interchange";import{RegistryClient as xa,builtinOfficialSource as Sa,checkArchiveBomb as Ca,checkGitUpgrades as wa,checkUpgrades as Ta,cleanTempDir as Ea,createArchive as Da,createTempDir as Oa,detectUninstallTarget as ka,extractArchive as Aa,install as ja,installSkill as Ma,listInstalledItems as Na,parseRegistry as Pa,scanInstalledVersions as Fa,uninstall as Ia,validateExtractedPaths as La}from"@x-otto/install";C(at(),`.otto`);const Ra=u(process.env.OTTO_REMOTE_STORAGE_TIMEOUT_MS,3e4),za=T(`@x-otto/coding:rfc344-compaction-cost`),Ba=T(`@x-otto/coding:rfc387-prefix-degradation`);function Va(e,t){if(!e?.remote?.getAuth)throw Error(`storage.${t}.url is configured, so storage.remote.getAuth is required.`);return e.remote}function Ha(e,t,n,r,i){let a=Ua(e,t,n,r,i);return a&&c()?Pt(a):a}function Ua(e,t,n,r,i){let a=e?.memory;if(a&&`dir`in a)return new Dt(a.dir);let o=e?.session&&`url`in e.session?e.session.url:void 0;if(e?.remote?.getAuth&&o){let a=e.remote;return new Ot({baseUrl:o,getAuth:a.getAuth,fetch:a.fetch??globalThis.fetch,timeoutMs:a.timeoutMs??Ra,userId:n?.userId,workspaceKey:()=>r?.()?.key,isWorkspaceSyncEnabled:()=>r?.()?.memorySyncEnabled===!0,localDir:t,onConflict:i})}if(t)return new Dt(t)}function Wa(e,t){let n=()=>({ok:!1,fallbackText:Ka(e)});if(!t||t.length===0)return n();let r=e[0],i=e[e.length-1];if(!r||!i)return n();let a=t.findIndex(e=>Ga(e,r));if(a<0)return n();let o=-1;for(let e=t.length-1;e>=a;e--)if(Ga(t[e],i)){o=e;break}return o<0||o-a+1>e.length*2?n():{ok:!0,messages:t.slice(a,o+1)}}function Ga(e,t){if(e.role!==t.role)return!1;if(e.role===`tool_result`&&t.role===`tool_result`)return e.toolCallId===t.toolCallId;if(e.role===`assistant`&&t.role===`assistant`){let n=Array.isArray(e.content)?e.content.filter(e=>e.type===`tool_call`):[],r=Array.isArray(t.content)?t.content.filter(e=>e.type===`tool_call`):[];if(n.length>0&&r.length>0&&n.length===r.length)return n.every((e,t)=>e.id===r[t].id)}return JSON.stringify(e.content)===JSON.stringify(t.content)}function Ka(e){return e.map(Lt).join(`
1
+ import{createRequire as e}from"node:module";import{Devtools as t}from"@x-otto/devtools";import{AUTH_PATH as n,OTTO_HOME as r,SDK_VERSION as i,findWorkspaceRoot as a,findWorkspaceRoot as o,isClaudeCompatEnabled as s,isShadowModeEnabled as c,mergeResilienceConfig as l,normalizeEnv as u}from"@x-otto/env";import{CATEGORY_POLICY as d,ModelCatalogStore as f,OAUTH_PROVIDER_IDS as p,SETUP_MODEL_ID as m,TIER_TO_SLOT as h,apiCredentialId as g,builtinSlotModels as ee,collectModelCapabilityFacts as _,complete as te,createCredentialBackendRegistry as ne,createDefaultAuthStore as re,createDefaultModelRegistry as ie,createModelSlot as ae,createModelUsabilityGate as oe,createProviderRegistry as se,createWireProtocolRegistry as ce,fetchModels as le,isBuiltinProviderId as ue,mergeFetchedModels as de,rankModelsBySlotAffinity as fe,registerCacheReportingApi as pe,registerProviderDescriptor as me,resolveModelsRequest as he,stream as ge,unregisterCacheReportingApi as _e,unregisterProviderDescriptor as ve}from"@x-otto/ai";import{Diagnoser as ye,FailureSignalStore as be,PermissionAuditLog as xe,assessSandboxSafety as Se,bashAlwaysAllowPrefix as Ce,compilePolicyFromSetting as we,computeSandboxRoots as Te,createDisabledToolsPolicy as Ee,createEgressAllowlistPolicy as De,createFailureSignalHook as Oe,createPermissionDenyHook as ke,createPermissionGuardHook as Ae,createPermissionModePolicy as je,createPermissionRegistry as Me,createPermissionToolSetsFromRegistry as Ne,defaultDeniedRoots as Pe,extractWriteTargets as Fe,isWellFormedAllowEntry as Ie}from"@x-otto/guard";import{CapabilityGapReportStore as Le,ORCHESTRATION_TOOL_NAMES as Re,createPlatformSandbox as ze,createToolRegistry as Be,credentialDenyReadPaths as Ve,isPlatformSandboxAvailable as He}from"@x-otto/tools";import{appendFileSync as Ue,closeSync as We,constants as Ge,existsSync as v,fsyncSync as Ke,lstatSync as qe,mkdirSync as y,mkdtempSync as Je,openSync as Ye,readFileSync as b,readdirSync as Xe,readlinkSync as Ze,realpathSync as Qe,renameSync as $e,rmSync as et,statSync as tt,symlinkSync as nt,unlinkSync as rt,writeFileSync as x,writeSync as it}from"node:fs";import{homedir as at,tmpdir as ot}from"node:os";import{dirname as S,extname as st,isAbsolute as ct,join as C,relative as lt,resolve as w,sep as ut}from"node:path";import{CodedError as dt,ProviderError as ft,attachLogListener as pt,buildAllowedEnv as mt,checkShellCommand as ht,createLogger as T,installGlobalProxyDispatcher as gt,mapClaudeAgentToolNames as _t,markStartupPhase as vt,parseFrontmatterList as yt,setDefaultProxy as bt,splitFrontmatter as xt,traceStartupPhase as St}from"@x-otto/shared";import{AutoMemory as Ct,DEFAULT_MEMORY_SOURCES as wt,EvolutionSignalStore as Tt,FileStateManager as Et,FileSystemMemoryStore as Dt,HttpMemoryStore as Ot,InMemoryArchiveStorage as kt,OperationalLearningStore as At,computeLessonContentHash as jt,createMemoryAutoExtractor as Mt,createMemoryManager as Nt,createOverlayMemoryStore as Pt,createSignalLog as Ft,discoverAgentsSources as It,formatMessageForSummary as Lt}from"@x-otto/memory";import{Agent as Rt,wireSnapshotStore as zt}from"@x-otto/agent";import{AgentSession as Bt,FleetMonitor as Vt,HostRegistry as Ht,JobStateStore as Ut,MemoryGovernor as Wt,RUNTIME_DEFAULTS as Gt,ResidencyGovernor as Kt,SandboxUnavailableError as qt,SessionPool as Jt,applyDiff as Yt,attachAgentObserver as Xt,buildEngineStores as Zt,captureFiles as Qt,checkApply as $t,createAgentRuntime as en,createDocSyncReminderHooks as tn,createLlmEscalationReviewer as nn,createMemoryDeltaHooks as rn,createSessionStableInjectionHooks as an,createTodoReminderHooks as on,createToolHookExecutor as sn,createWorktree as cn,decideApply as ln,defaultMaxToolTurnExtensions as un,defaultMaxToolTurnExtensions as dn,definePromptSection as fn,deriveSessionTitle as pn,globalAgentJobRegistry as mn,globalAgentJobRegistry as hn,globalAgentObservability as gn,globalAgentObservability as _n,globalProcessRuntime as vn,globalProcessRuntime as E,globalToolResultStore as yn,hasRepoDrifted as bn,installAgentJobReaper as xn,installExitReaper as Sn,messagesFromSnapshot as Cn,reconstructMessages as wn,removeWorktree as Tn,resolveSessionTitle as En,resolveTodoContinuationConfig as Dn,restoreFiles as On,revertDiff as kn,touchesCapabilitySurface as An,touchesForbiddenZone as jn,worktreeDiff as Mn}from"@x-otto/runtime";import{atomicWriteFile as Nn,createFileStorageHost as Pn,createInMemoryPanelStatePersistence as Fn,createInMemoryPasteStatePersistence as In,createLiveTappedAppendLog as Ln,createPersistence as Rn}from"@x-otto/persistence";import{SESSION_MAX_PER_SESSION_BYTES as zn,SESSION_RESUME_WINDOW_MESSAGES as Bn}from"@x-otto/session-contract";import{createRegistrySkillProvider as Vn,createSkillRegistry as Hn}from"@x-otto/skill";import{BUILTIN_PROMPTS_DIR as Un,PromptManager as Wn,SUBAGENT_GUARDRAILS as Gn,assembleGenericSubAgentPrompt as Kn,buildLessonInjection as qn,createPromptProvider as Jn,resolveAgentProfile as Yn}from"@x-otto/prompt";import{HIGH_RISK_CAPABILITIES as Xn,HIGH_RISK_CAPABILITIES as Zn,ID_RE as Qn,MAX_I18N_ENTRIES_PER_PLUGIN as $n,MAX_I18N_FILE_BYTES as er,MAX_I18N_LOCALE_FILES_PER_PLUGIN as tr,MAX_I18N_TRANSLATION_BYTES as nr,MAX_THEME_PRESETS_PER_PLUGIN as rr,PLUGIN_API_VERSION as ir,PLUGIN_MANIFEST_FILENAME as ar,PLUGIN_MANIFEST_FILENAME as D,POINT as or,PluginI18nRegistry as sr,SHELL_POINTS as cr,createBuiltinHashtags as lr,createBuiltinHashtags as ur,createFileProvider as dr,createFileProvider as fr,createPluginInputRegistry as pr,createPluginInputRegistry as mr,detectPluginExecutableSurface as hr,discoverPlugins as gr,discoverPlugins as _r,dispatch as vr,evaluateContextKeys as yr,evaluatePluginTrust as br,evaluatePluginTrust as O,evaluateWhen as xr,filterEngineCompatible as Sr,grantPluginCapabilities as Cr,grantPluginCapabilities as wr,grantPluginCapabilitiesWithVersion as Tr,grantedPluginCapabilities as Er,grantedPluginCapabilitiesForVersion as Dr,isPluginTrusted as Or,isPluginTrusted as kr,isSensitiveField as Ar,mergeConfigWithDefaults as jr,parsePluginManifest as Mr,parsePluginManifest as Nr,pluginTrustStorePath as Pr,readHighRiskCapabilities as Fr,redactSensitiveFields as Ir,resolveActions as Lr,resolveActions as Rr,resolveActivationEvents as zr,resolveManifestPlane as Br,sigilOf as Vr,topoSortPlugins as Hr,trustPlugin as Ur,trustPlugin as Wr,untrustPlugin as Gr,untrustPlugin as Kr}from"@x-otto/plugin";import{claudeTrustStorePath as qr,createClaudeHookBridgeHooks as Jr,createClaudeHookBridgeHooks as Yr,defaultHookRunner as Xr,detectClaudeExecutableSurface as Zr,discoverFileCommands as Qr,discoverFileCommands as $r,evaluateClaudeTrust as ei,evaluateClaudeTrust as ti,expandCommandBody as ni,interpretPreToolUse as ri,isProjectTrusted as ii,loadClaudeHooksConfig as ai,matchesHookMatcher as oi,parseClaudeHooks as si,resolveClaudeMcpServers as ci,resolveClaudeMcpServers as li,trustProject as ui,untrustProject as di}from"@x-otto/claude-compat";import{McpManager as fi,parseDotMcpJson as pi,parseDotMcpJson as mi}from"@x-otto/mcp";import{InMemorySession as hi,RelationalSessionPersistence as gi,SESSION_MAX as _i,SqliteSessionRepository as vi,createNoopSessionWriteLeaseManager as yi,createSessionWriteLeaseManager as bi,reassembleSnapshot as xi,rowToEntry as Si}from"@x-otto/session";import{Orchestrator as Ci,createHandoffTool as wi,createSwarm as Ti}from"@x-otto/orchestrator";import{BUILTIN_AGENT_PROFILES as Ei,SettingsManager as Di,detectProjectConfigGating as Oi,evaluateWorkspaceTrustPrompt as ki,isProjectTrusted as Ai,isStrictProjectConfigEnabled as ji,parseResilienceEnvOverride as Mi,resolveProjectConfigTrusted as Ni,resolveProjectConfigTrusted as Pi,validateResilienceOverride as Fi}from"@x-otto/setting";import{createHash as Ii,randomUUID as Li}from"node:crypto";import{CallbackChannel as Ri,CommandChannel as zi,NotificationDispatcher as Bi,PresenceTracker as Vi,TerminalChannel as Hi,TimestampPresenceGate as Ui}from"@x-otto/notification";import{DEFAULT_WORKSPACE_KEY as k,createWorkspaceResolver as Wi,genWorkspaceId as Gi,readMarker as Ki,workspaceKey as qi,writeMarker as Ji}from"@x-otto/workspace";import{mkdir as Yi,open as Xi,readFile as Zi,writeFile as Qi}from"node:fs/promises";import{spawn as $i,spawnSync as ea}from"node:child_process";import{createHookRegistry as ta,defineHook as A,isWaterfallTiming as na}from"@x-otto/hooks";import{Worker as ra}from"node:worker_threads";import{fileURLToPath as ia,pathToFileURL as aa}from"node:url";import{SCHEDULE_LEASE_MIGRATIONS as oa,ScheduleRegistry as sa,SchedulerService as ca,createLocalFireOwnership as la,createRemoteFireOwnership as ua,createRemoteScheduleStore as da,createScheduleCapability as fa,createScheduleStore as pa}from"@x-otto/schedule";import{DeviceFlowOAuthTemplate as ma,PKCEOAuthTemplate as ha}from"@x-otto/provider";import{createTodoStore as ga}from"@x-otto/orchestration-contracts";import{SYSTEM_PROMPT_SECTIONS as j,applySectionBudget as _a,boundFragment as va,contextFragmentBytes as ya,getToolCallsByAssistantMessage as ba}from"@x-otto/interchange";import{RegistryClient as xa,builtinOfficialSource as Sa,checkArchiveBomb as Ca,checkGitUpgrades as wa,checkUpgrades as Ta,cleanTempDir as Ea,createArchive as Da,createTempDir as Oa,detectUninstallTarget as ka,extractArchive as Aa,install as ja,installSkill as Ma,listInstalledItems as Na,parseRegistry as Pa,scanInstalledVersions as Fa,uninstall as Ia,validateExtractedPaths as La}from"@x-otto/install";C(at(),`.otto`);const Ra=u(process.env.OTTO_REMOTE_STORAGE_TIMEOUT_MS,3e4),za=T(`@x-otto/coding:rfc344-compaction-cost`),Ba=T(`@x-otto/coding:rfc387-prefix-degradation`);function Va(e,t){if(!e?.remote?.getAuth)throw Error(`storage.${t}.url is configured, so storage.remote.getAuth is required.`);return e.remote}function Ha(e,t,n,r,i){let a=Ua(e,t,n,r,i);return a&&c()?Pt(a):a}function Ua(e,t,n,r,i){let a=e?.memory;if(a&&`dir`in a)return new Dt(a.dir);let o=e?.session&&`url`in e.session?e.session.url:void 0;if(e?.remote?.getAuth&&o){let a=e.remote;return new Ot({baseUrl:o,getAuth:a.getAuth,fetch:a.fetch??globalThis.fetch,timeoutMs:a.timeoutMs??Ra,userId:n?.userId,workspaceKey:()=>r?.()?.key,isWorkspaceSyncEnabled:()=>r?.()?.memorySyncEnabled===!0,localDir:t,onConflict:i})}if(t)return new Dt(t)}function Wa(e,t){let n=()=>({ok:!1,fallbackText:Ka(e)});if(!t||t.length===0)return n();let r=e[0],i=e[e.length-1];if(!r||!i)return n();let a=t.findIndex(e=>Ga(e,r));if(a<0)return n();let o=-1;for(let e=t.length-1;e>=a;e--)if(Ga(t[e],i)){o=e;break}return o<0||o-a+1>e.length*2?n():{ok:!0,messages:t.slice(a,o+1)}}function Ga(e,t){if(e.role!==t.role)return!1;if(e.role===`tool_result`&&t.role===`tool_result`)return e.toolCallId===t.toolCallId;if(e.role===`assistant`&&t.role===`assistant`){let n=Array.isArray(e.content)?e.content.filter(e=>e.type===`tool_call`):[],r=Array.isArray(t.content)?t.content.filter(e=>e.type===`tool_call`):[];if(n.length>0&&r.length>0&&n.length===r.length)return n.every((e,t)=>e.id===r[t].id)}return JSON.stringify(e.content)===JSON.stringify(t.content)}function Ka(e){return e.map(Lt).join(`
2
2
 
3
3
  `)}function qa(e){let{model:t,getModel:n,providerRegistry:r,onUsage:i,getWireSnapshot:a}=e;return async(e,o)=>{let s=n?.()??t;if(!s)throw Error(`No model available — sign in or pick a model first.`);let c=r.get(s.api),l=o?.prefix?.sessionId,u=l&&a?a(l):void 0,d=u!==void 0&&u.modelId===s.id;l&&a&&!d&&Ba.info({sessionId:l,reason:u===void 0?`snapshot-missing`:`model-mismatch`,snapshotModelId:u?.modelId,currentModelId:s.id},`[RFC-387] compaction prefix degraded to legacy (no snapshot assembly)`);let f=d?u.context:void 0,p=o?.prefix?.messages,m=p&&p.length>0&&f?.messages?Wa(p,f.messages):void 0;p&&p.length>0&&f?.messages&&m?.ok!==!0&&Ba.info({sessionId:l,reason:`replay-mismatch`},`[RFC-436] compaction messages replay degraded to rendered text`);let h;h=m?.ok===!0?[...m.messages,{role:`user`,content:e,timestamp:Date.now()}]:m?[{role:`user`,content:`${e}\n<conversation>\n${m.fallbackText}\n</conversation>`,timestamp:Date.now()}]:[{role:`user`,content:e,timestamp:Date.now()}];let g=await ge(s,c,{model:s,systemPrompt:f?.systemPrompt??``,...f?.systemPromptSegments?{systemPromptSegments:f.systemPromptSegments}:{},messages:h,...f?.tools?{tools:f.tools}:{},cacheRetention:o?.prefix?.cacheRetention??`long`,maxTokens:o?.maxTokens},{signal:o?.signal}).result();return i&&g.usage&&i(g.usage,{sessionId:o?.prefix?.sessionId}),g.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
4
- `)}}function Ja(e,t){return{compactionLock:{acquire:async(t,n)=>{let r=e(t);if(!r)return!0;let i=r.compactionLockState?.(),a=i?.phase===`start`&&Date.now()-i.timestamp>6e4;return i?.phase===`start`&&!a?!1:(r.appendCompactionLock?.(`start`,n),!0)},release:async(t,n)=>{let r=e(t);if(!r)return;let i=r.compactionLockState?.();i?.phase!==`start`||i.token!==n||r.appendCompactionLock?.(`end`,n)}},compactionSpill:async(e,n)=>{let r=t();if(r)return vn.spill(r.id,e,n)}}}function Ya(e){return()=>{let t=e(),n=(e,t)=>t!=null&&process.env[e]===void 0?t:void 0;return{warn:n(`OTTO_MEMORY_COVERAGE_WARN_THRESHOLD`,t?.coverage_warn_threshold),error:n(`OTTO_MEMORY_COVERAGE_ERROR_THRESHOLD`,t?.coverage_error_threshold),floor:n(`OTTO_MEMORY_COVERAGE_FLOOR_THRESHOLD`,t?.coverage_floor_threshold)}}}function Xa(e){return e.includes(`./.otto/AGENTS.md`)?0:e.includes(`~/.otto/AGENTS.md`)?1:2}function Za(e,t){try{let n=C(t,S(e.indexPath),`memory`),r=new Map;for(let e of Xe(n,{withFileTypes:!0}))!e.isFile()||!e.name.endsWith(`.md`)||r.set(`memory/${e.name}`,tt(C(n,e.name)).mtimeMs);return r}catch{return}}function Qa(e){let{model:t,getModel:n,memoryStore:r,providerRegistry:i,autoMemory:a,workspaceDir:o,getLoadSessionEntries:c,getActiveSessionBytes:l,getEffectiveMaxBytes:u,getRealInputTokens:d,getCoverageThresholds:f,getToolRegistry:p,compactionLock:m,compactionSpill:h,clock:g}=e,ee=qa({model:t,getModel:n,providerRegistry:i,getWireSnapshot:e=>zt.get(e),onUsage:(e,t)=>za.info({sessionId:t?.sessionId,inputTokens:e.inputTokens,outputTokens:e.outputTokens,cacheReadTokens:e.cacheReadTokens,cacheWriteTokens:e.cacheWriteTokens},`[RFC-344] compaction summarize request cost`)}),_=[...wt].filter(e=>e.writable).sort((e,t)=>Xa(e.path)-Xa(t.path)),te=It(o??process.cwd()),ne=s()?[{path:`~/.claude/CLAUDE.md`,writable:!1},...It(o??process.cwd(),{fileName:`CLAUDE.md`})]:[],re=[..._,...ne,...te],ie=r&&a?[...re,a.asSource()]:void 0;return Nt({entryMtimes:r&&a?Za(a,o??process.cwd()):void 0,clock:g,summarize:ee,compaction:{prefixReuse:process.env.OTTO_RFC387_PREFIX_REUSE!==`0`},prune:{regenerableToolNames:p?()=>p().listRegenerableNames():void 0},model:t?{contextWindow:t.contextWindow,maxOutput:t.maxOutputTokens}:void 0,getContextWindow:()=>(n?.()??t)?.contextWindow,maxContentBytes:Rn,getMaxContentBytes:u,getRealInputTokens:d,getCoverageThresholds:f,getEstimatedBytes:l,memoryStore:r,sources:ie,archiveStorage:new kt,messageFromEntry:e=>{let t=e.data;if(!t||typeof t!=`object`)return null;let n=t.message;return n&&typeof n.role==`string`?n:null},loadSessionEntries:async e=>{let t=c?.();if(!t)throw Error(`Session entries not wired`);return t(e)},compactionLock:m,compactionSpill:h})}function $a(e){let{options:t,workspaceDir:n,providerRegistry:r,defaultModel:i,resolveEffectiveModel:a,repoRef:o,getWorkspaceRef:s}=e,l=t.storage?.host?{host:Nn({baseDir:t.storage.host.dir,namespaces:t.storage.host.namespaces}),token:t.storage.host.token}:null,u=Ha(t.storage,n,t.userIdentity,s,e.onMemoryConflict),d=u?new Ct({store:u}):null,f=t.memory??Qa({model:i,getModel:a,storage:t.storage,memoryStore:u,providerRegistry:r,autoMemory:d,workspaceDir:n,clock:t.clock,getLoadSessionEntries:()=>o.current?async e=>(await o.current.loadEntries(e)).map(e=>({type:e.type,seq:e.seq,data:e.data})):void 0,compactionLock:e.compactionLock,compactionSpill:e.compactionSpill}),p=t.storage?.session,m=Xt({sessionDir:p&&`dir`in p?p.dir:void 0,remoteLog:p&&`url`in p&&t.storage?.remote?.getAuth?{baseUrl:p.url,getAuth:t.storage.remote.getAuth,fetch:t.storage.remote.fetch,timeoutMs:t.storage.remote.timeoutMs??Ra}:void 0,ephemeral:c()},{traceStore:t.traceStore,checkpointStore:t.checkpointStore}),{store:h,live:g}=In(m.traceStore);return{storageHost:l,autoMemory:d,memory:f,traceStore:h,traceLive:g,checkpointStore:m.checkpointStore,clock:t.clock,memoryStore:u}}const eo={delegation:`task_delegate`,"task-observability":`task_inspect`,"file-state-refresh":`capture_file_state`},to=new Set(Object.keys(eo));function no(e){let t=new Set;for(let[n,r]of Object.entries(eo))e.has(r)&&t.add(n);return t}function ro(e){let{skillProvider:t,workspaceDir:n,activePlugins:r,resolveEffectiveModel:i,providerRegistry:a,prompt:o,memoryStore:l,memoryAutoExtractConfig:u,evolutionSignals:d}=e,f=s()&&(e.compatProducts?.trustVerdict.gated??!0),p=t?null:Vn({workspaceDir:n,library:{...f?{projectDirs:[`.otto/skills`]}:{},pluginDirs:r().filter(e=>e.manifest.contributes?.skills!==!1).filter(e=>!O(e).gated).map(e=>({id:e.id,dir:C(e.dir,`skills`)}))},evolutionSignals:d}),m=new Et,h=c(),g=new At({path:`${n}/.otto/lessons.json`,...l?{store:l,storePath:`./.otto/lessons.json`}:{},ephemeral:h});return{skillRegistry:p,fileStateManager:m,learningStore:g,localLearningStore:new At({path:`${n}/.otto/local/lessons.json`,ephemeral:h}),memoryAutoExtractor:Mt({llm:qa({getModel:i,providerRegistry:a}),store:g,config:u??{enabled:!0},readRelevantHits:async()=>(await g.list()).reduce((e,t)=>Math.max(e,t.relevantHitCount??0),0)}),completeText:qa({getModel:i,providerRegistry:a}),promptManager:new Un({provider:qn(o??{type:`local`,baseDir:Hn}),knownCapabilities:to})}}function io(e,t){return{hooks:Jr({workspaceDir:e}),mcpServers:ci(e),fileCommands:Qr(e,t),trustVerdict:ei(e)}}var ao=class{currentPermissionMode=void 0;constructor(e){this.deps=e}sync(e){let t=Ne(this.deps.getToolRegistry().getAll());this.syncModePolicy(e.permission_mode,t),this.syncDisabledToolsPolicy(e.disabled_tools),this.syncEgressPolicy(e.web_fetch_allowed_hosts),this.syncUserPolicies(e.permissions),this.registry.setAlwaysAllow(e.permission_always_allow??[]),this.deps.logger.debug(`Permission policies synced: %d policies active`,this.registry.getAll().length)}get registry(){return this.deps.getPermissionRegistry()}syncModePolicy(e,t){let n=e??`auto`;this.currentPermissionMode&&this.registry.unregister(`mode::${this.currentPermissionMode}`),this.registry.register(je(n,t)),this.currentPermissionMode=n}syncDisabledToolsPolicy(e){e&&e.length>0?this.registry.register(Ee(e)):this.registry.unregister(`setting::disabled-tools`)}syncEgressPolicy(e){e&&e.length>0?this.registry.register(De(e)):this.registry.unregister(`setting::egress-allowlist`)}syncUserPolicies(e){for(let e of this.registry.getAll())e.name.startsWith(`user::`)&&this.registry.unregister(e.name);if(e)for(let t of e)this.registry.registerWithSource(we({...t,name:`user::${t.name}`}),`user`)}},oo=class{strategy=null;pinned=!1;settingSnapshot=`null`;networkAllowed=!0;configuredWritablePaths=[];autoAllowBash=!1;constructor(e){this.logger=e}get current(){return this.strategy}get activeName(){return this.strategy?.name??null}get enabled(){return this.strategy!==null}get isNetworkAllowed(){return this.networkAllowed}get writablePaths(){return this.configuredWritablePaths}get autoAllowBashIfSandboxed(){return this.autoAllowBash}bypassCommands=new Set;approveBypass(e){e&&this.bypassCommands.add(e)}isBypassed(e){return e!==void 0&&this.bypassCommands.has(e)}pin(e){this.pinned=!0,this.networkAllowed=e.network!==`deny`,this.configuredWritablePaths=Array.isArray(e.writablePaths)?e.writablePaths.filter(e=>typeof e==`string`):[],this.autoAllowBash=e.autoAllowBashIfSandboxed===!0,e.enabled&&!He()?(this.logger.warn(`Sandbox pinned but no platform sandbox available (install bwrap on Linux); running WITHOUT sandbox`),this.strategy=null):this.strategy=e.enabled?ze({network:e.network,writablePaths:e.writablePaths,denyReadPaths:e.protectCredentials?Ve():void 0}):null}applySetting(e){if(this.pinned)return;let t=JSON.stringify(e??null);if(t===this.settingSnapshot)return;this.settingSnapshot=t,this.networkAllowed=e?.network!==`deny`,this.configuredWritablePaths=Array.isArray(e?.writablePaths)?e.writablePaths.filter(e=>typeof e==`string`):[],this.autoAllowBash=e?.autoAllowBashIfSandboxed===!0;let n=this.strategy;e?.enabled===!0&&!He()?(this.logger.warn(`Sandbox enabled but no platform sandbox available (install bwrap on Linux); running WITHOUT sandbox`),this.strategy=null):this.strategy=e?.enabled===!0?ze({network:e.network===`deny`?`deny`:`allow`,writablePaths:this.configuredWritablePaths,denyReadPaths:e.protectCredentials?Ve():void 0}):null,n?.dispose().catch(()=>void 0),this.logger.info(`Sandbox strategy %s (settings)`,this.strategy?`enabled: ${this.strategy.name}`:`disabled`)}resolveConfig(e){if(e.sandbox)return e.sandbox;if((e.permission_mode??`auto`)!==`bypass`)return{enabled:!0,network:process.env.OTTO_SANDBOX_NETWORK===`deny`?`deny`:`allow`,writablePaths:[]}}async dispose(){this.strategy&&=(await this.strategy.dispose().catch(()=>void 0),null)}};function so(e){return typeof e==`string`&&(e.startsWith(`./`)||e.startsWith(`../`)||e.startsWith(`.\\`))}function co(e,t){let n={...e};return so(n.command)&&!ct(n.command)&&(n.command=w(t,n.command)),Array.isArray(n.args)&&(n.args=n.args.map(e=>so(e)?w(t,e):e)),n}function lo(e){let t=e.plugins??gr({cwd:e.workspaceDir,homedir:e.homedir,disabled:e.disabled}),n={};for(let e of t){if(e.manifest.contributes?.mcp===!1)continue;let t=O(e);if(t.gated||!(e.manifest.capabilities?.includes(`mcp.server`)??!1)||t.pendingCapabilities.includes(`mcp.server`))continue;let r=pi(e.dir);for(let[t,i]of Object.entries(r))n[t]={...co(i,e.dir),_pluginId:e.id}}return n}const uo=(e,t,n)=>{let r=E.spawn({command:e,args:t,env:n,owner:{type:`mcp-server`,id:e},category:`mcp`,lifecycle:`pinned`,label:`mcp:${e}`});return{pid:r.pid,stdin:r.stdin,stdout:r.stdout,stderr:r.stderr,kill:()=>r.kill(),onError:e=>{r.onError(e)},onExit:e=>{r.onExit(()=>e())}}};function fo(e){return e.code===`MCP_UNAUTHORIZED`?`MCP server "${e.name}" requires authentication. Run 'otto mcp login ${e.name}' to authenticate.`:null}var po=class{_manager=null;get manager(){return this._manager}getMcpClient(e){return this._manager?.getClient(e)}constructor(e,t,n,r,i,a){this.settings=e,this.toolRegistry=t,this.logger=n,this.workspaceDir=r,this.getResilienceConfig=i,this.compatProducts=a}resolveServerLayers(){return{otto:this.settings.get(`mcp_servers`)??{},claude:this.compatProducts?.mcpServers??{},plugin:this.workspaceDir?lo({workspaceDir:this.workspaceDir,homedir:at(),disabled:this.settings.get(`disabled_plugins`)??[]}):{}}}effectiveServers(){let{otto:e,claude:t,plugin:n}=this.resolveServerLayers();return{...n,...t,...e}}listEffectiveServers(){let{otto:e,claude:t,plugin:n}=this.resolveServerLayers(),r={};for(let[e,t]of Object.entries(n)){let n=t;r[e]={...t,source:`plugin`,pluginId:n._pluginId}}for(let[e,n]of Object.entries(t))r[e]={...n,source:`claude`};for(let[t,n]of Object.entries(e))r[t]={...n,source:`otto`};for(let[t,n]of Object.entries(r))n.source===`otto`?n.disabled=(e[t]??{}).disabled??!1:n.source===`plugin`&&n.managed&&(n.disabled=this.settings.get(`disabled_plugins`)?.includes(n.pluginId??``)??!1);return r}syncTools(){let e=this.toolRegistry.getAll().map(e=>e.name).filter(e=>e.startsWith(`mcp__`));e.length>0&&this.toolRegistry.unregister(e);let t=this._manager?.getAllTools()??[];t.length>0&&this.toolRegistry.register(t,{category:`mcp`,preset:`full`})}ensureManager(){if(this._manager)return this._manager;let e=this.getResilienceConfig?.(),t=new di({skipOnError:!0,processSpawnFactory:uo,maxReconnectAttempts:e?.mcp.maxReconnectAttempts,reconnectDelayMs:e?.mcp.reconnectDelayMs,requestTimeoutMs:e?.mcp.requestTimeoutMs});this._manager=t;let n=()=>this.syncTools();return t.on(`server.connected`,n),t.on(`tools.changed`,n),t.on(`server.disconnected`,n),t.on(`server.error`,e=>{let t=fo(e);t&&this.logger.warn(t)}),t}async start(){let e=this.effectiveServers();if(Object.keys(e).length===0)return{connected:0,failed:0};let t=Object.fromEntries(Object.entries(e).filter(([,e])=>!e.disabled));if(Object.keys(t).length===0)return{connected:0,failed:0};let n=await this.ensureManager().connectAll(t);return this.syncTools(),n}async setServerEnabled(e,t){let n={...this.settings.get(`mcp_servers`)},r=n[e];if(!r)throw Error(`Unknown MCP server "${e}"`);n[e]={...r,disabled:!t},await this.settings.persist({mcp_servers:n}),t?await this.ensureManager().connect(e,n[e]):await this._manager?.disconnect(e),this.syncTools()}async reload(){this._manager&&=(await this._manager.disconnectAll(),null),await this.start(),this.syncTools()}async stop(){this._manager&&=(await this._manager.disconnectAll(),null)}},mo=class{category=`mcp`;constructor(e){this.mcp=e}list(){let e=this.mcp.listEffectiveServers(),t=this.mcp.manager?.getServerInfos()??[],n=new Map(t.map(e=>[e.name,e])),r=(e,t)=>{let r=n.get(t),i=[];return e&&r&&(i.push(String(r.status)),r.tools?.length&&i.push(`${r.tools.length} tools`)),i.length?i.join(` · `):void 0},i=[];for(let[t,n]of Object.entries(e)){if(n.source===`claude`)continue;let e=n.source===`plugin`&&n.managed===!0,a=n.source===`otto`;if(!e&&!a)continue;let o=e?`由 ${n.pluginId??`unknown`} 插件管理`:n.url??n.command??`MCP server`,s=[r(!n.disabled,t),e?`managed`:void 0].filter(Boolean).join(` · `);i.push({category:this.category,id:t,name:t,description:o,enabled:!n.disabled,detail:s||void 0,applies:`live`,readonly:e})}return i}async setEnabled(e,t){let n=this.mcp.listEffectiveServers()[e];if(n?.source===`plugin`&&n.managed)throw Error(`MCP server "${e}" 由插件 ${n.pluginId??`unknown`} 管理,无法单独禁用。请卸载插件以移除。`);await this.mcp.setServerEnabled(e,t)}},ho=class{category=`skill`;constructor(e,t){this.settings=e,this.skills=t}list(){let e=[];for(let[t,n]of this.skills.getAll())e.push({category:this.category,id:t,name:t,description:n.definition.metadata.description??``,enabled:n.status!==`disabled`,detail:n.source?.type,applies:`next-turn`});return e}async setEnabled(e,t){t?this.skills.enable(e):this.skills.disable(e);let n=[];for(let[e,t]of this.skills.getAll())t.status===`disabled`&&n.push(e);await this.settings.persist({disabled_skills:n})}},go=class{category=`agent`;constructor(e,t){this.settings=e,this.getProfiles=t}list(){let e=new Set(this.settings.get(`disabled_agents`)??[]);return this.getProfiles().map(t=>({category:this.category,id:t.name,name:t.name,description:t.description??``,enabled:!e.has(t.name),applies:`next-turn`}))}async setEnabled(e,t){let n=new Set(this.settings.get(`disabled_agents`)??[]);t?n.delete(e):n.add(e),await this.settings.persist({disabled_agents:[...n]})}},_o=class{category=`plugin`;constructor(e,t,n){this.settings=e,this.getPlugins=t,this.processRuntime=n}list(){let e=new Set(this.settings.get(`disabled_plugins`)??[]);return this.getPlugins().map(t=>{let n=t.scope===`builtin`,r=O(t).gated,i=[t.scope,r?`untrusted`:void 0].filter(Boolean).join(` · `);return{category:this.category,id:t.id,name:t.manifest.name??t.id,description:t.manifest.description??``,enabled:n?!0:!e.has(t.id),detail:i||void 0,applies:`next-turn`,readonly:n||void 0,scope:t.scope}})}async setEnabled(e,t){if(this.getPlugins().find(t=>t.id===e)?.scope===`builtin`)throw Error(`插件 "${e}" 是 otto 内置插件,恒定信任+启用,无法禁用。`);let n=new Set(this.settings.get(`disabled_plugins`)??[]);t?n.delete(e):n.add(e),await this.settings.persist({disabled_plugins:[...n]}),!t&&this.processRuntime&&(await this.processRuntime.killAll({owner:{type:`plugin-hook`,id:e}}),await this.processRuntime.killAll({owner:{type:`plugin-script`,id:e}}))}},vo=class{providers;deps;constructor(e){this.deps=e,this.providers=[new mo(e.mcp),...e.skills?[new ho(e.settings,e.skills)]:[],new go(e.settings,e.getAgentProfiles),...e.getPlugins?[new _o(e.settings,e.getPlugins,e.processRuntime)]:[]]}list(){return this.providers.flatMap(e=>e.list())}async setEnabled(e,t,n){let r=this.providers.find(t=>t.category===e);if(!r)throw Error(`Unknown extension category "${e}"`);await r.setEnabled(t,n),e===`plugin`&&this.deps.onPluginToggle&&this.deps.onPluginToggle(t,n)}},yo=class{provider;source;register(e,t){return this.source!==void 0&&this.source!==t?!1:(this.provider=e,this.source=t,!0)}replace(e,t){this.provider=e,this.source=t}unregister(e){this.source===e&&(this.provider=void 0,this.source=void 0)}get(){return this.provider}reset(){this.provider=void 0,this.source=void 0}},bo=class{resolvers=new Map;register(e,t){for(let n of e)this.resolvers.set(n.id,{resolver:n,source:t})}get(e){return this.resolvers.get(e)?.resolver}unregisterBySource(e){for(let[t,n]of this.resolvers)n.source===e&&this.resolvers.delete(t)}getAll(){let e=new Map;for(let[t,n]of this.resolvers)e.set(t,n.resolver);return e}get size(){return this.resolvers.size}};const xo=T(`@x-otto/coding:sigil-expand`),So=/\[@([a-z][\w.-]*):((?:\\\]|[^\]])+)\]/g,Co=/\[@([a-z][\w.-]*)\]/g,wo=/@([\w./-]+):(\d+)(?:-(\d+))?/g,To=/@def:([A-Za-z_]\w*)/g;function Eo(e,t){let n=new Set,r=[];for(let i of[So,Co]){i.lastIndex=0;for(let a of e.matchAll(i)){let e=a[0];if(n.has(e))continue;n.add(e);let i=a[1];t?.has(i)||r.push({raw:e,kind:i,param:(a[2]??``).replace(/\\\]/g,`]`)})}}wo.lastIndex=0;for(let i of e.matchAll(wo)){let e=i[0];n.has(e)||(n.add(e),!t?.has(`file-range`)&&r.push({raw:e,kind:`file-range`,param:e.slice(1)}))}To.lastIndex=0;for(let i of e.matchAll(To)){let e=i[0];n.has(e)||(n.add(e),!t?.has(`def`)&&r.push({raw:e,kind:`def`,param:i[1]}))}return r}function Do(e,t){return new Promise((n,r)=>{let i=setTimeout(()=>r(Error(`resolver timeout after ${t}ms`)),t);e.then(e=>{clearTimeout(i),n(e)},e=>{clearTimeout(i),r(e)})})}function Oo(e,t){return e.length<=t?e:`${e.slice(0,t)}\n[...truncated ${e.length-t} chars...]`}async function ko(e,t,n,r){let i=Eo(e,r?.skipPrefixes);if(i.length===0)return e;let a=r?.uiHost??!0,o=r?.maxOutput??2e4,s={workspaceDir:n.workspaceDir,maxOutput:o},c=i.map(async e=>{let n=r?.lookupResolverId?.(e.raw),i=(n?t.get(n):void 0)??t.get(e.kind);if(!i)return null;if(i.uiHostOnly&&!a)return xo.debug({chip:e.raw},`uiHostOnly resolver skipped in non-uiHost context`),null;let c=i.timeoutMs??1e4,l=await Do(Promise.resolve().then(()=>i.resolve(e.param,s)),c);return l===``?null:[e.raw,Oo(l,o)]}),l=await Promise.allSettled(c),u=e;for(let e=0;e<l.length;e++){let t=l[e];if(t.status===`rejected`){xo.warn({chip:i[e].raw,err:String(t.reason)},`sigil resolver failed, chip left as-is`);continue}if(t.value===null)continue;let[n,r]=t.value;u=u.split(n).join(r)}return u}const Ao=e(import.meta.url);function jo(e,t){let n=t.entries(e);if(!n?.length)return[];let r=O(e);if(r.gated)return t.logger.warn({pluginId:e.id},`project/repository plugin not trusted, skipping ${t.axis} (fail-closed)`),[];if(!e.manifest.capabilities?.includes(t.capability))return t.logger.warn({pluginId:e.id},`plugin declares contributes.${t.axis} but not capabilities:["${t.capability}"], skipped (fail-closed)`),[];if(r.pendingCapabilities.includes(t.capability))return t.logger.warn({pluginId:e.id},`plugin capability "${t.capability}" declared but not yet granted, skipping ${t.axis} (fail-closed, ${t.pendingNote})`),[];let i=[];for(let r of n){if(t.preCheck&&!t.preCheck(e,r))continue;let n=C(e.dir,t.entryPath(r));if(!v(n)){t.logger.warn({pluginId:e.id,...t.idLogFields(r),modulePath:n},`${t.noun} entry not found, skipped`);continue}try{delete Ao.cache[n];let a=Ao(n),o=t.exportName(r)??`default`,s=a?.[o];if(typeof s!=`function`){t.logger.warn({pluginId:e.id,...t.idLogFields(r),exportName:o,...t.logTypeofOnNotFunction?{type:typeof s}:{}},`${t.noun} export is not a function, skipped`);continue}i.push(t.build(e,r,s)),t.successLogFields&&t.logger.info({pluginId:e.id,...t.successLogFields(r)},`plugin ${t.noun} loaded successfully`)}catch(n){t.logger.warn({pluginId:e.id,...t.idLogFields(r),err:String(n)},`${t.noun} load failed, skipped`)}}return i}function Mo(e,t,n){if(!n)return e.flatMap(e=>jo(e,t));let r=new Map,i=[];for(let a of e)for(let e of jo(a,t)){let t=n.key(e),a=r.get(t);if(a){n.onConflict(e,a);continue}r.set(t,e.pluginId),i.push(e)}return i}const No=T(`@x-otto/coding:plugin-a2ui-renderer-loader`),Po={capability:`a2ui.renderer`,axis:`a2uiRenderers`,noun:`a2ui renderer`,pendingNote:`RFC-210 D5`,logger:No,entries:e=>e.manifest.contributes?.a2uiRenderers,entryPath:e=>e.entry,exportName:e=>e.export,idLogFields:e=>({a2uiRendererId:e.id}),logTypeofOnNotFunction:!0,build:(e,t,n)=>({id:`${e.id}:${t.id}`,pluginId:e.id,matcher:t.matcher,toPayload:n}),successLogFields:e=>({a2uiRendererId:e.id,matcher:e.matcher})};function Fo(e){return Mo(e,Po)}function Io(e,t){let n=t;if(!n||typeof n!=`object`||e.role!=null&&n.role!==e.role||e.toolName!=null&&(n.name??n.toolName)!==e.toolName)return!1;if(e.contentType!=null){let t=n.content;if(!(Array.isArray(t)&&t.some(t=>t&&typeof t==`object`&&t.type===e.contentType)))return!1}return!0}const Lo=2e3;async function Ro(e,t){for(let n of e)if(Io(n.matcher,t))try{let e=await Promise.race([Promise.resolve().then(()=>n.toPayload(t)),new Promise((e,t)=>setTimeout(()=>t(Error(`toPayload timeout after ${Lo}ms`)),Lo))]);if(Array.isArray(e)&&e.length>0)return e}catch(e){No.warn({a2uiRendererId:n.id,err:String(e)},`toPayload failed, trying next candidate (fail-soft)`)}return null}const zo={file_read:[`read`],file_write:[`write`],file_edit:[`edit`],shell:[`bash`],search:[`find`,`grep`]};function Bo(e){if(e===void 0)return;if(e.length===0)return[];let t=new Set;for(let n of e){let e=zo[n];if(e&&e.length>0){for(let n of e)t.add(n);continue}t.add(n)}return[...t]}function Vo(){return process.env.OTTO_SUBAGENT_MODEL_POLICY===`off`}var Ho=class{constructor(e){this.deps=e}async resolveModel(e,t,n,r){let i=this.deps.getModelRegistry(),a=[],o=new Set,s=(e,t)=>{e&&!o.has(e.id)&&(o.add(e.id),a.push({model:e,layer:t}))};s(e,`explicit`);let c=this.deps.settings.get(`model_slots`),l=this.deps.settings.get(`model`),u=c?.default??l,f=(u===void 0?void 0:i.tryResolve(u))??this.deps.defaultModel??(this.deps.explicitModelSpec?i.tryResolve(this.deps.explicitModelSpec):void 0);if(t&&f)for(let e of this.slotCandidates(t,f,i))s(e,`slot`);if(r&&n)for(let e of this.categoryCandidates(n,f,i))s(e,`category`);s(f,`default`);let p=[];for(let{model:e,layer:t}of a){if(!r)return{model:e,decidedBy:t,rejected:p,capabilityFacts:_(e)};let n=await this.checkUsable(e);if(n.usable)return{model:e,decidedBy:t,rejected:p,capabilityFacts:_(e)};n.reason&&p.push({spec:e.id,reason:n.reason})}if(a.length===0&&!u&&!this.deps.defaultModel&&!this.deps.explicitModelSpec)throw Error(`No model configured. Set model in .otto/config.json or pass modelId to createApp().`);let m=t??(n?d[n]:void 0),h=await this.pickUsableFallback(i,m);return{model:h,decidedBy:`fallback`,rejected:p,capabilityFacts:_(h)}}async checkUsable(e){if(this.deps.isModelUsable)try{return await this.deps.isModelUsable(e)}catch{}if(this.deps.hasCredential)try{return await this.deps.hasCredential(e.provider)?{usable:!0}:{usable:!1,reason:`unauthenticated`}}catch{}return{usable:!0}}async pickUsableFallback(e,t){let n=fe(e.getAll(),t);for(let e of n)if((await this.checkUsable(e)).usable)return e;let r=this.deps.defaultModel??n[0];if(r)return r;throw Error(`No model available — sign in (/login) or pick a model (/model) first.`)}slotCandidates(e,t,n){return ae({slots:this.deps.settings.get(`model_slots`)?.slots??{},default:t},n).candidates(e).filter(e=>e.id!==t.id)}categoryCandidates(e,t,n){let r=[],i=e=>{if(e){let t=n.tryResolve(e);t&&r.push(t)}},a=this.deps.settings.get(`categories`)?.[e];i(a?.default_model);for(let e of a?.preferred_models??[])i(e);if(r.length>0)return r;if(Vo())return[];let o=d[e];if(!o||!t)return[];for(let e of this.slotCandidates(o,t,n))r.push(e);return r.length>0?r:ee(o,t,n)}};function Uo(e,t){let n=new Set(t);return e.filter(e=>n.has(e.name))}function Wo(e,t,n,r,i){let a;return a=t||(n?Uo(e(),n):e()),r?.length&&(a=a.filter(e=>!r.includes(e.name))),i||(a=a.filter(e=>!Re.has(e.name))),a}function Go(e,t,n,r){let i=n?[...t.disallowedToolNames??[],...r]:t.disallowedToolNames;return Wo(e,void 0,t.toolNames,i,t.allowSubagents)}const Ko=[`edit`,`write`,`lsp_rename`,`bash`];function qo(e,t,n,r){let i=Jn([...t,...Ti],n),a=no(new Set(r.map(e=>e.name)));return()=>e.assemblePreset({preset:`subagent`,agentName:n,profile:i,promptMode:i?.promptMode},a)}var Jo=class{modelResolver;constructor(e){this.deps=e,this.modelResolver=new Ho(e)}readAgentSources(e,t){let n=e?this.deps.settings.get(`agents`)?.[e]:void 0,r=t===`subagent`&&e?Jn([...this.deps.getDeclarativeAgentProfiles(),...Ti],e):void 0;return{slot:n?.default_workflow_slot,profileTier:r?.preferredModelTier,toolNames:n?.tools??Bo(r?.defaultTools),disallowedToolNames:r?.disallowedTools,allowSubagents:t===`main`?!0:r?.allowSubagents,systemPrompt:n?.system_prompt,maxToolTurns:n?.max_tool_turns??r?.defaultMaxToolTurns,maxToolTurnExtensions:n?.max_tool_turn_extensions??r?.defaultMaxToolTurnExtensions,promptOutputTokenBudget:n?.prompt_output_token_budget,promptWallClockBudgetMs:n?.prompt_wall_clock_budget_ms,sessionCostBudgetUSD:n?.session_cost_budget_usd,stallDetection:n?.stall_detection===!1?!1:n?.stall_detection?{windowTurns:n.stall_detection.window_turns,repeatThreshold:n.stall_detection.repeat_threshold}:void 0,promptMode:r?.promptMode,promptContext:void 0,profile:r}}resolvePersistedThinkingLevel(){let e=this.deps.settings.get(`thinking_level`),t=e===`minimal`?`low`:e;return typeof t==`string`&&[`low`,`medium`,`high`,`xhigh`,`max`].includes(t)?t:void 0}resolveToolsForResync(e,t,n){let r=t??(e?`subagent`:`main`),i=this.readAgentSources(e,r);return Go(this.deps.getTools,i,n,Ko)}resolveTools(e,t,n,r){return Wo(this.deps.getTools,e,t,n,r)}async resolve(e){let t=e.promptPreset??(e.agentName?`subagent`:`main`),n=this.readAgentSources(e.agentName,t),r=t===`subagent`||e.delegated===!0,i=e.slot??n.slot??h[n.profileTier??``];!i&&r&&!e.category&&(i=this.deps.settings.get(`model_slots`)?.subagent_default_slot);let a=e.model??(e.modelId?this.deps.getModelRegistry().tryResolve(e.modelId):void 0)??(this.deps.explicitModelSpec?this.deps.getModelRegistry().tryResolve(this.deps.explicitModelSpec):void 0),o=await this.modelResolver.resolveModel(a,i,e.category,r),s=o.model,c=ee(`compact`,s,this.deps.getModelRegistry())[0]??s;r&&this.deps.logger?.debug({model:s.id,decidedBy:o.decidedBy,category:e.category,slot:i,rejected:o.rejected},`subagent model resolved`);let l=e.readOnly?[...n.disallowedToolNames??[],...Ko]:n.disallowedToolNames,u=this.resolveTools(e.tools,n.toolNames,l,n.allowSubagents);s.supportsTools===!1&&(u=[]);let d=no(new Set(u.map(e=>e.name))),f=e.promptRefresh??(async()=>{let r=t===`subagent`&&e.agentName?await this.deps.promptManager.assemblePreset({preset:`subagent`,agentName:e.agentName,profile:n.profile,context:e.promptContext,promptMode:n.promptMode},d):await this.deps.promptManager.assemblePreset({preset:`main`},d),i=e.systemPrompt??n.systemPrompt;return i!==void 0&&i.length>0?r?`${r}\n\n${i}`:i:r}),p=await f(),m=e.systemPrompt===void 0&&n.systemPrompt===void 0&&t===`subagent`&&e.agentName?this.deps.promptManager.assembleSubAgentTail({preset:`subagent`,agentName:e.agentName,profile:n.profile,context:e.promptContext,promptMode:n.promptMode}):void 0,g=e.thinkingLevel??(r?void 0:this.resolvePersistedThinkingLevel())??`medium`;return{id:e.id,model:s,titleModel:c,modelResolution:o,agentName:e.agentName,systemPrompt:p??``,systemTail:m?[m]:void 0,tools:u,thinkingLevel:g,maxToolTurns:e.maxToolTurns??n.maxToolTurns??this.deps.maxToolTurns,maxToolTurnExtensions:e.maxToolTurnExtensions??n.maxToolTurnExtensions??this.deps.maxToolTurnExtensions??un(e.depth??0,e.transient),promptOutputTokenBudget:(e.depth??0)>0?void 0:e.promptOutputTokenBudget??n.promptOutputTokenBudget??this.deps.settings.get(`prompt_output_token_budget`)??this.deps.promptOutputTokenBudget,promptWallClockBudgetMs:(e.depth??0)>0?void 0:e.promptWallClockBudgetMs??n.promptWallClockBudgetMs??this.deps.settings.get(`prompt_wall_clock_budget_ms`)??this.deps.promptWallClockBudgetMs,sessionCostBudgetUSD:(e.depth??0)>0?void 0:e.sessionCostBudgetUSD??n.sessionCostBudgetUSD??this.deps.settings.get(`session_cost_budget_usd`)??this.deps.sessionCostBudgetUSD,stallDetection:e.stallDetection??n.stallDetection??(()=>{let e=this.deps.settings.get(`stall_detection`);if(e!==void 0)return e===!1?!1:{windowTurns:e.window_turns,repeatThreshold:e.repeat_threshold}})()??this.deps.stallDetection,todoContinuation:e.todoContinuation??(()=>{let e=this.deps.settings.get(`todo_continue_max`);if(e===void 0)return;let t=En(process.env),n=Number.isFinite(e)&&e>=0?Math.trunc(e):t.max;return{enabled:t.enabled,max:n}})(),promptRefresh:f,workspaceDir:e.workspaceDir??this.deps.workspaceDir,workspaceId:e.workspaceId??this.deps.getWorkspaceId?.(),transient:e.transient,depth:e.depth,interactive:e.interactive,listable:e.listable,retryAccelerate:e.retryAccelerate,streamRetry:e.streamRetry??this.deps.getResilienceConfig?.().stream,networkDisconnectRetry:e.networkDisconnectRetry??Yo(this.deps.getResilienceConfig?.().networkDisconnect),lifecycleAsyncTimeoutMs:Xo(process.env.OTTO_LIFECYCLE_ASYNC_TIMEOUT_MS),describeImages:this.deps.describeImages}}};function Yo(e){if(e)return{maxRetries:e.maxRetries,initialDelayMs:e.intervalMs,backoffFactor:1,maxDelayMs:e.intervalMs}}function Xo(e){if(!e)return;let t=Number(e);return Number.isFinite(t)&&t>0?t:void 0}const Zo=Ge.O_NOFOLLOW??0;function Qo(e,t){let n=Ye(e,Ge.O_WRONLY|Ge.O_APPEND|Ge.O_CREAT|Zo,384);try{it(n,t.endsWith(`
4
+ `)}}function Ja(e,t){return{compactionLock:{acquire:async(t,n)=>{let r=e(t);if(!r)return!0;let i=r.compactionLockState?.(),a=i?.phase===`start`&&Date.now()-i.timestamp>6e4;return i?.phase===`start`&&!a?!1:(r.appendCompactionLock?.(`start`,n),!0)},release:async(t,n)=>{let r=e(t);if(!r)return;let i=r.compactionLockState?.();i?.phase!==`start`||i.token!==n||r.appendCompactionLock?.(`end`,n)}},compactionSpill:async(e,n)=>{let r=t();if(r)return yn.spill(r.id,e,n)}}}function Ya(e){return()=>{let t=e(),n=(e,t)=>t!=null&&process.env[e]===void 0?t:void 0;return{warn:n(`OTTO_MEMORY_COVERAGE_WARN_THRESHOLD`,t?.coverage_warn_threshold),error:n(`OTTO_MEMORY_COVERAGE_ERROR_THRESHOLD`,t?.coverage_error_threshold),floor:n(`OTTO_MEMORY_COVERAGE_FLOOR_THRESHOLD`,t?.coverage_floor_threshold)}}}function Xa(e){return e.includes(`./.otto/AGENTS.md`)?0:e.includes(`~/.otto/AGENTS.md`)?1:2}function Za(e,t){try{let n=C(t,S(e.indexPath),`memory`),r=new Map;for(let e of Xe(n,{withFileTypes:!0}))!e.isFile()||!e.name.endsWith(`.md`)||r.set(`memory/${e.name}`,tt(C(n,e.name)).mtimeMs);return r}catch{return}}function Qa(e){let{model:t,getModel:n,memoryStore:r,providerRegistry:i,autoMemory:a,workspaceDir:o,getLoadSessionEntries:c,getActiveSessionBytes:l,getEffectiveMaxBytes:u,getRealInputTokens:d,getCoverageThresholds:f,getToolRegistry:p,compactionLock:m,compactionSpill:h,clock:g}=e,ee=qa({model:t,getModel:n,providerRegistry:i,getWireSnapshot:e=>zt.get(e),onUsage:(e,t)=>za.info({sessionId:t?.sessionId,inputTokens:e.inputTokens,outputTokens:e.outputTokens,cacheReadTokens:e.cacheReadTokens,cacheWriteTokens:e.cacheWriteTokens},`[RFC-344] compaction summarize request cost`)}),_=[...wt].filter(e=>e.writable).sort((e,t)=>Xa(e.path)-Xa(t.path)),te=It(o??process.cwd()),ne=s()?[{path:`~/.claude/CLAUDE.md`,writable:!1},...It(o??process.cwd(),{fileName:`CLAUDE.md`})]:[],re=[..._,...ne,...te],ie=r&&a?[...re,a.asSource()]:void 0;return Nt({entryMtimes:r&&a?Za(a,o??process.cwd()):void 0,clock:g,summarize:ee,compaction:{prefixReuse:process.env.OTTO_RFC387_PREFIX_REUSE!==`0`},prune:{regenerableToolNames:p?()=>p().listRegenerableNames():void 0},model:t?{contextWindow:t.contextWindow,maxOutput:t.maxOutputTokens}:void 0,getContextWindow:()=>(n?.()??t)?.contextWindow,maxContentBytes:zn,getMaxContentBytes:u,getRealInputTokens:d,getCoverageThresholds:f,getEstimatedBytes:l,memoryStore:r,sources:ie,archiveStorage:new kt,messageFromEntry:e=>{let t=e.data;if(!t||typeof t!=`object`)return null;let n=t.message;return n&&typeof n.role==`string`?n:null},loadSessionEntries:async e=>{let t=c?.();if(!t)throw Error(`Session entries not wired`);return t(e)},compactionLock:m,compactionSpill:h})}function $a(e){let{options:t,workspaceDir:n,providerRegistry:r,defaultModel:i,resolveEffectiveModel:a,repoRef:o,getWorkspaceRef:s}=e,l=t.storage?.host?{host:Pn({baseDir:t.storage.host.dir,namespaces:t.storage.host.namespaces}),token:t.storage.host.token}:null,u=Ha(t.storage,n,t.userIdentity,s,e.onMemoryConflict),d=u?new Ct({store:u}):null,f=t.memory??Qa({model:i,getModel:a,storage:t.storage,memoryStore:u,providerRegistry:r,autoMemory:d,workspaceDir:n,clock:t.clock,getLoadSessionEntries:()=>o.current?async e=>(await o.current.loadEntries(e)).map(e=>({type:e.type,seq:e.seq,data:e.data})):void 0,compactionLock:e.compactionLock,compactionSpill:e.compactionSpill}),p=t.storage?.session,m=Zt({sessionDir:p&&`dir`in p?p.dir:void 0,remoteLog:p&&`url`in p&&t.storage?.remote?.getAuth?{baseUrl:p.url,getAuth:t.storage.remote.getAuth,fetch:t.storage.remote.fetch,timeoutMs:t.storage.remote.timeoutMs??Ra}:void 0,ephemeral:c()},{traceStore:t.traceStore,checkpointStore:t.checkpointStore}),{store:h,live:g}=Ln(m.traceStore);return{storageHost:l,autoMemory:d,memory:f,traceStore:h,traceLive:g,checkpointStore:m.checkpointStore,clock:t.clock,memoryStore:u}}const eo={delegation:`task_delegate`,"task-observability":`task_inspect`,"file-state-refresh":`capture_file_state`},to=new Set(Object.keys(eo));function no(e){let t=new Set;for(let[n,r]of Object.entries(eo))e.has(r)&&t.add(n);return t}function ro(e){let{skillProvider:t,workspaceDir:n,activePlugins:r,resolveEffectiveModel:i,providerRegistry:a,prompt:o,memoryStore:l,memoryAutoExtractConfig:u,evolutionSignals:d}=e,f=s()&&(e.compatProducts?.trustVerdict.gated??!0),p=t?null:Hn({workspaceDir:n,library:{...f?{projectDirs:[`.otto/skills`]}:{},pluginDirs:r().filter(e=>e.manifest.contributes?.skills!==!1).filter(e=>!O(e).gated).map(e=>({id:e.id,dir:C(e.dir,`skills`)}))},evolutionSignals:d}),m=new Et,h=c(),g=new At({path:`${n}/.otto/lessons.json`,...l?{store:l,storePath:`./.otto/lessons.json`}:{},ephemeral:h});return{skillRegistry:p,fileStateManager:m,learningStore:g,localLearningStore:new At({path:`${n}/.otto/local/lessons.json`,ephemeral:h}),memoryAutoExtractor:Mt({llm:qa({getModel:i,providerRegistry:a}),store:g,config:u??{enabled:!0},readRelevantHits:async()=>(await g.list()).reduce((e,t)=>Math.max(e,t.relevantHitCount??0),0)}),completeText:qa({getModel:i,providerRegistry:a}),promptManager:new Wn({provider:Jn(o??{type:`local`,baseDir:Un}),knownCapabilities:to})}}function io(e,t){return{hooks:Yr({workspaceDir:e}),mcpServers:li(e),fileCommands:$r(e,t),trustVerdict:ti(e)}}var ao=class{currentPermissionMode=void 0;constructor(e){this.deps=e}sync(e){let t=Ne(this.deps.getToolRegistry().getAll());this.syncModePolicy(e.permission_mode,t),this.syncDisabledToolsPolicy(e.disabled_tools),this.syncEgressPolicy(e.web_fetch_allowed_hosts),this.syncUserPolicies(e.permissions),this.registry.setAlwaysAllow(e.permission_always_allow??[]),this.deps.logger.debug(`Permission policies synced: %d policies active`,this.registry.getAll().length)}get registry(){return this.deps.getPermissionRegistry()}syncModePolicy(e,t){let n=e??`auto`;this.currentPermissionMode&&this.registry.unregister(`mode::${this.currentPermissionMode}`),this.registry.register(je(n,t)),this.currentPermissionMode=n}syncDisabledToolsPolicy(e){e&&e.length>0?this.registry.register(Ee(e)):this.registry.unregister(`setting::disabled-tools`)}syncEgressPolicy(e){e&&e.length>0?this.registry.register(De(e)):this.registry.unregister(`setting::egress-allowlist`)}syncUserPolicies(e){for(let e of this.registry.getAll())e.name.startsWith(`user::`)&&this.registry.unregister(e.name);if(e)for(let t of e)this.registry.registerWithSource(we({...t,name:`user::${t.name}`}),`user`)}},oo=class{strategy=null;pinned=!1;settingSnapshot=`null`;networkAllowed=!0;configuredWritablePaths=[];autoAllowBash=!1;constructor(e){this.logger=e}get current(){return this.strategy}get activeName(){return this.strategy?.name??null}get enabled(){return this.strategy!==null}get isNetworkAllowed(){return this.networkAllowed}get writablePaths(){return this.configuredWritablePaths}get autoAllowBashIfSandboxed(){return this.autoAllowBash}bypassCommands=new Set;approveBypass(e){e&&this.bypassCommands.add(e)}isBypassed(e){return e!==void 0&&this.bypassCommands.has(e)}pin(e){this.pinned=!0,this.networkAllowed=e.network!==`deny`,this.configuredWritablePaths=Array.isArray(e.writablePaths)?e.writablePaths.filter(e=>typeof e==`string`):[],this.autoAllowBash=e.autoAllowBashIfSandboxed===!0,e.enabled&&!He()?(this.logger.warn(`Sandbox pinned but no platform sandbox available (install bwrap on Linux); running WITHOUT sandbox`),this.strategy=null):this.strategy=e.enabled?ze({network:e.network,writablePaths:e.writablePaths,denyReadPaths:e.protectCredentials?Ve():void 0}):null}applySetting(e){if(this.pinned)return;let t=JSON.stringify(e??null);if(t===this.settingSnapshot)return;this.settingSnapshot=t,this.networkAllowed=e?.network!==`deny`,this.configuredWritablePaths=Array.isArray(e?.writablePaths)?e.writablePaths.filter(e=>typeof e==`string`):[],this.autoAllowBash=e?.autoAllowBashIfSandboxed===!0;let n=this.strategy;e?.enabled===!0&&!He()?(this.logger.warn(`Sandbox enabled but no platform sandbox available (install bwrap on Linux); running WITHOUT sandbox`),this.strategy=null):this.strategy=e?.enabled===!0?ze({network:e.network===`deny`?`deny`:`allow`,writablePaths:this.configuredWritablePaths,denyReadPaths:e.protectCredentials?Ve():void 0}):null,n?.dispose().catch(()=>void 0),this.logger.info(`Sandbox strategy %s (settings)`,this.strategy?`enabled: ${this.strategy.name}`:`disabled`)}resolveConfig(e){if(e.sandbox)return e.sandbox;if((e.permission_mode??`auto`)!==`bypass`)return{enabled:!0,network:process.env.OTTO_SANDBOX_NETWORK===`deny`?`deny`:`allow`,writablePaths:[]}}async dispose(){this.strategy&&=(await this.strategy.dispose().catch(()=>void 0),null)}};function so(e){return typeof e==`string`&&(e.startsWith(`./`)||e.startsWith(`../`)||e.startsWith(`.\\`))}function co(e,t){let n={...e};return so(n.command)&&!ct(n.command)&&(n.command=w(t,n.command)),Array.isArray(n.args)&&(n.args=n.args.map(e=>so(e)?w(t,e):e)),n}function lo(e){let t=e.plugins??_r({cwd:e.workspaceDir,homedir:e.homedir,disabled:e.disabled}),n={};for(let e of t){if(e.manifest.contributes?.mcp===!1)continue;let t=O(e);if(t.gated||!(e.manifest.capabilities?.includes(`mcp.server`)??!1)||t.pendingCapabilities.includes(`mcp.server`))continue;let r=mi(e.dir);for(let[t,i]of Object.entries(r))n[t]={...co(i,e.dir),_pluginId:e.id}}return n}const uo=(e,t,n)=>{let r=E.spawn({command:e,args:t,env:n,owner:{type:`mcp-server`,id:e},category:`mcp`,lifecycle:`pinned`,label:`mcp:${e}`});return{pid:r.pid,stdin:r.stdin,stdout:r.stdout,stderr:r.stderr,kill:()=>r.kill(),onError:e=>{r.onError(e)},onExit:e=>{r.onExit(()=>e())}}};function fo(e){return e.code===`MCP_UNAUTHORIZED`?`MCP server "${e.name}" requires authentication. Run 'otto mcp login ${e.name}' to authenticate.`:null}var po=class{_manager=null;get manager(){return this._manager}getMcpClient(e){return this._manager?.getClient(e)}constructor(e,t,n,r,i,a){this.settings=e,this.toolRegistry=t,this.logger=n,this.workspaceDir=r,this.getResilienceConfig=i,this.compatProducts=a}resolveServerLayers(){return{otto:this.settings.get(`mcp_servers`)??{},claude:this.compatProducts?.mcpServers??{},plugin:this.workspaceDir?lo({workspaceDir:this.workspaceDir,homedir:at(),disabled:this.settings.get(`disabled_plugins`)??[]}):{}}}effectiveServers(){let{otto:e,claude:t,plugin:n}=this.resolveServerLayers();return{...n,...t,...e}}listEffectiveServers(){let{otto:e,claude:t,plugin:n}=this.resolveServerLayers(),r={};for(let[e,t]of Object.entries(n)){let n=t;r[e]={...t,source:`plugin`,pluginId:n._pluginId}}for(let[e,n]of Object.entries(t))r[e]={...n,source:`claude`};for(let[t,n]of Object.entries(e))r[t]={...n,source:`otto`};for(let[t,n]of Object.entries(r))n.source===`otto`?n.disabled=(e[t]??{}).disabled??!1:n.source===`plugin`&&n.managed&&(n.disabled=this.settings.get(`disabled_plugins`)?.includes(n.pluginId??``)??!1);return r}syncTools(){let e=this.toolRegistry.getAll().map(e=>e.name).filter(e=>e.startsWith(`mcp__`));e.length>0&&this.toolRegistry.unregister(e);let t=this._manager?.getAllTools()??[];t.length>0&&this.toolRegistry.register(t,{category:`mcp`,preset:`full`})}ensureManager(){if(this._manager)return this._manager;let e=this.getResilienceConfig?.(),t=new fi({skipOnError:!0,processSpawnFactory:uo,maxReconnectAttempts:e?.mcp.maxReconnectAttempts,reconnectDelayMs:e?.mcp.reconnectDelayMs,requestTimeoutMs:e?.mcp.requestTimeoutMs});this._manager=t;let n=()=>this.syncTools();return t.on(`server.connected`,n),t.on(`tools.changed`,n),t.on(`server.disconnected`,n),t.on(`server.error`,e=>{let t=fo(e);t&&this.logger.warn(t)}),t}async start(){let e=this.effectiveServers();if(Object.keys(e).length===0)return{connected:0,failed:0};let t=Object.fromEntries(Object.entries(e).filter(([,e])=>!e.disabled));if(Object.keys(t).length===0)return{connected:0,failed:0};let n=await this.ensureManager().connectAll(t);return this.syncTools(),n}async setServerEnabled(e,t){let n={...this.settings.get(`mcp_servers`)},r=n[e];if(!r)throw Error(`Unknown MCP server "${e}"`);n[e]={...r,disabled:!t},await this.settings.persist({mcp_servers:n}),t?await this.ensureManager().connect(e,n[e]):await this._manager?.disconnect(e),this.syncTools()}async reload(){this._manager&&=(await this._manager.disconnectAll(),null),await this.start(),this.syncTools()}async stop(){this._manager&&=(await this._manager.disconnectAll(),null)}},mo=class{category=`mcp`;constructor(e){this.mcp=e}list(){let e=this.mcp.listEffectiveServers(),t=this.mcp.manager?.getServerInfos()??[],n=new Map(t.map(e=>[e.name,e])),r=(e,t)=>{let r=n.get(t),i=[];return e&&r&&(i.push(String(r.status)),r.tools?.length&&i.push(`${r.tools.length} tools`)),i.length?i.join(` · `):void 0},i=[];for(let[t,n]of Object.entries(e)){if(n.source===`claude`)continue;let e=n.source===`plugin`&&n.managed===!0,a=n.source===`otto`;if(!e&&!a)continue;let o=e?`由 ${n.pluginId??`unknown`} 插件管理`:n.url??n.command??`MCP server`,s=[r(!n.disabled,t),e?`managed`:void 0].filter(Boolean).join(` · `);i.push({category:this.category,id:t,name:t,description:o,enabled:!n.disabled,detail:s||void 0,applies:`live`,readonly:e})}return i}async setEnabled(e,t){let n=this.mcp.listEffectiveServers()[e];if(n?.source===`plugin`&&n.managed)throw Error(`MCP server "${e}" 由插件 ${n.pluginId??`unknown`} 管理,无法单独禁用。请卸载插件以移除。`);await this.mcp.setServerEnabled(e,t)}},ho=class{category=`skill`;constructor(e,t){this.settings=e,this.skills=t}list(){let e=[];for(let[t,n]of this.skills.getAll())e.push({category:this.category,id:t,name:t,description:n.definition.metadata.description??``,enabled:n.status!==`disabled`,detail:n.source?.type,applies:`next-turn`});return e}async setEnabled(e,t){t?this.skills.enable(e):this.skills.disable(e);let n=[];for(let[e,t]of this.skills.getAll())t.status===`disabled`&&n.push(e);await this.settings.persist({disabled_skills:n})}},go=class{category=`agent`;constructor(e,t){this.settings=e,this.getProfiles=t}list(){let e=new Set(this.settings.get(`disabled_agents`)??[]);return this.getProfiles().map(t=>({category:this.category,id:t.name,name:t.name,description:t.description??``,enabled:!e.has(t.name),applies:`next-turn`}))}async setEnabled(e,t){let n=new Set(this.settings.get(`disabled_agents`)??[]);t?n.delete(e):n.add(e),await this.settings.persist({disabled_agents:[...n]})}},_o=class{category=`plugin`;constructor(e,t,n){this.settings=e,this.getPlugins=t,this.processRuntime=n}list(){let e=new Set(this.settings.get(`disabled_plugins`)??[]);return this.getPlugins().map(t=>{let n=t.scope===`builtin`,r=O(t).gated,i=[t.scope,r?`untrusted`:void 0].filter(Boolean).join(` · `);return{category:this.category,id:t.id,name:t.manifest.name??t.id,description:t.manifest.description??``,enabled:n?!0:!e.has(t.id),detail:i||void 0,applies:`next-turn`,readonly:n||void 0,scope:t.scope}})}async setEnabled(e,t){if(this.getPlugins().find(t=>t.id===e)?.scope===`builtin`)throw Error(`插件 "${e}" 是 otto 内置插件,恒定信任+启用,无法禁用。`);let n=new Set(this.settings.get(`disabled_plugins`)??[]);t?n.delete(e):n.add(e),await this.settings.persist({disabled_plugins:[...n]}),!t&&this.processRuntime&&(await this.processRuntime.killAll({owner:{type:`plugin-hook`,id:e}}),await this.processRuntime.killAll({owner:{type:`plugin-script`,id:e}}))}},vo=class{providers;deps;constructor(e){this.deps=e,this.providers=[new mo(e.mcp),...e.skills?[new ho(e.settings,e.skills)]:[],new go(e.settings,e.getAgentProfiles),...e.getPlugins?[new _o(e.settings,e.getPlugins,e.processRuntime)]:[]]}list(){return this.providers.flatMap(e=>e.list())}async setEnabled(e,t,n){let r=this.providers.find(t=>t.category===e);if(!r)throw Error(`Unknown extension category "${e}"`);await r.setEnabled(t,n),e===`plugin`&&this.deps.onPluginToggle&&this.deps.onPluginToggle(t,n)}},yo=class{provider;source;register(e,t){return this.source!==void 0&&this.source!==t?!1:(this.provider=e,this.source=t,!0)}replace(e,t){this.provider=e,this.source=t}unregister(e){this.source===e&&(this.provider=void 0,this.source=void 0)}get(){return this.provider}reset(){this.provider=void 0,this.source=void 0}},bo=class{resolvers=new Map;register(e,t){for(let n of e)this.resolvers.set(n.id,{resolver:n,source:t})}get(e){return this.resolvers.get(e)?.resolver}unregisterBySource(e){for(let[t,n]of this.resolvers)n.source===e&&this.resolvers.delete(t)}getAll(){let e=new Map;for(let[t,n]of this.resolvers)e.set(t,n.resolver);return e}get size(){return this.resolvers.size}};const xo=T(`@x-otto/coding:sigil-expand`),So=/\[@([a-z][\w.-]*):((?:\\\]|[^\]])+)\]/g,Co=/\[@([a-z][\w.-]*)\]/g,wo=/@([\w./-]+):(\d+)(?:-(\d+))?/g,To=/@def:([A-Za-z_]\w*)/g;function Eo(e,t){let n=new Set,r=[];for(let i of[So,Co]){i.lastIndex=0;for(let a of e.matchAll(i)){let e=a[0];if(n.has(e))continue;n.add(e);let i=a[1];t?.has(i)||r.push({raw:e,kind:i,param:(a[2]??``).replace(/\\\]/g,`]`)})}}wo.lastIndex=0;for(let i of e.matchAll(wo)){let e=i[0];n.has(e)||(n.add(e),!t?.has(`file-range`)&&r.push({raw:e,kind:`file-range`,param:e.slice(1)}))}To.lastIndex=0;for(let i of e.matchAll(To)){let e=i[0];n.has(e)||(n.add(e),!t?.has(`def`)&&r.push({raw:e,kind:`def`,param:i[1]}))}return r}function Do(e,t){return new Promise((n,r)=>{let i=setTimeout(()=>r(Error(`resolver timeout after ${t}ms`)),t);e.then(e=>{clearTimeout(i),n(e)},e=>{clearTimeout(i),r(e)})})}function Oo(e,t){return e.length<=t?e:`${e.slice(0,t)}\n[...truncated ${e.length-t} chars...]`}async function ko(e,t,n,r){let i=Eo(e,r?.skipPrefixes);if(i.length===0)return e;let a=r?.uiHost??!0,o=r?.maxOutput??2e4,s={workspaceDir:n.workspaceDir,maxOutput:o},c=i.map(async e=>{let n=r?.lookupResolverId?.(e.raw),i=(n?t.get(n):void 0)??t.get(e.kind);if(!i)return null;if(i.uiHostOnly&&!a)return xo.debug({chip:e.raw},`uiHostOnly resolver skipped in non-uiHost context`),null;let c=i.timeoutMs??1e4,l=await Do(Promise.resolve().then(()=>i.resolve(e.param,s)),c);return l===``?null:[e.raw,Oo(l,o)]}),l=await Promise.allSettled(c),u=e;for(let e=0;e<l.length;e++){let t=l[e];if(t.status===`rejected`){xo.warn({chip:i[e].raw,err:String(t.reason)},`sigil resolver failed, chip left as-is`);continue}if(t.value===null)continue;let[n,r]=t.value;u=u.split(n).join(r)}return u}const Ao=e(import.meta.url);function jo(e,t){let n=t.entries(e);if(!n?.length)return[];let r=O(e);if(r.gated)return t.logger.warn({pluginId:e.id},`project/repository plugin not trusted, skipping ${t.axis} (fail-closed)`),[];if(!e.manifest.capabilities?.includes(t.capability))return t.logger.warn({pluginId:e.id},`plugin declares contributes.${t.axis} but not capabilities:["${t.capability}"], skipped (fail-closed)`),[];if(r.pendingCapabilities.includes(t.capability))return t.logger.warn({pluginId:e.id},`plugin capability "${t.capability}" declared but not yet granted, skipping ${t.axis} (fail-closed, ${t.pendingNote})`),[];let i=[];for(let r of n){if(t.preCheck&&!t.preCheck(e,r))continue;let n=C(e.dir,t.entryPath(r));if(!v(n)){t.logger.warn({pluginId:e.id,...t.idLogFields(r),modulePath:n},`${t.noun} entry not found, skipped`);continue}try{delete Ao.cache[n];let a=Ao(n),o=t.exportName(r)??`default`,s=a?.[o];if(typeof s!=`function`){t.logger.warn({pluginId:e.id,...t.idLogFields(r),exportName:o,...t.logTypeofOnNotFunction?{type:typeof s}:{}},`${t.noun} export is not a function, skipped`);continue}i.push(t.build(e,r,s)),t.successLogFields&&t.logger.info({pluginId:e.id,...t.successLogFields(r)},`plugin ${t.noun} loaded successfully`)}catch(n){t.logger.warn({pluginId:e.id,...t.idLogFields(r),err:String(n)},`${t.noun} load failed, skipped`)}}return i}function Mo(e,t,n){if(!n)return e.flatMap(e=>jo(e,t));let r=new Map,i=[];for(let a of e)for(let e of jo(a,t)){let t=n.key(e),a=r.get(t);if(a){n.onConflict(e,a);continue}r.set(t,e.pluginId),i.push(e)}return i}const No=T(`@x-otto/coding:plugin-a2ui-renderer-loader`),Po={capability:`a2ui.renderer`,axis:`a2uiRenderers`,noun:`a2ui renderer`,pendingNote:`RFC-210 D5`,logger:No,entries:e=>e.manifest.contributes?.a2uiRenderers,entryPath:e=>e.entry,exportName:e=>e.export,idLogFields:e=>({a2uiRendererId:e.id}),logTypeofOnNotFunction:!0,build:(e,t,n)=>({id:`${e.id}:${t.id}`,pluginId:e.id,matcher:t.matcher,toPayload:n}),successLogFields:e=>({a2uiRendererId:e.id,matcher:e.matcher})};function Fo(e){return Mo(e,Po)}function Io(e,t){let n=t;if(!n||typeof n!=`object`||e.role!=null&&n.role!==e.role||e.toolName!=null&&(n.name??n.toolName)!==e.toolName)return!1;if(e.contentType!=null){let t=n.content;if(!(Array.isArray(t)&&t.some(t=>t&&typeof t==`object`&&t.type===e.contentType)))return!1}return!0}const Lo=2e3;async function Ro(e,t){for(let n of e)if(Io(n.matcher,t))try{let e=await Promise.race([Promise.resolve().then(()=>n.toPayload(t)),new Promise((e,t)=>setTimeout(()=>t(Error(`toPayload timeout after ${Lo}ms`)),Lo))]);if(Array.isArray(e)&&e.length>0)return e}catch(e){No.warn({a2uiRendererId:n.id,err:String(e)},`toPayload failed, trying next candidate (fail-soft)`)}return null}const zo={file_read:[`read`],file_write:[`write`],file_edit:[`edit`],shell:[`bash`],search:[`find`,`grep`]};function Bo(e){if(e===void 0)return;if(e.length===0)return[];let t=new Set;for(let n of e){let e=zo[n];if(e&&e.length>0){for(let n of e)t.add(n);continue}t.add(n)}return[...t]}function Vo(){return process.env.OTTO_SUBAGENT_MODEL_POLICY===`off`}var Ho=class{constructor(e){this.deps=e}async resolveModel(e,t,n,r){let i=this.deps.getModelRegistry(),a=[],o=new Set,s=(e,t)=>{e&&!o.has(e.id)&&(o.add(e.id),a.push({model:e,layer:t}))};s(e,`explicit`);let c=this.deps.settings.get(`model_slots`),l=this.deps.settings.get(`model`),u=c?.default??l,f=(u===void 0?void 0:i.tryResolve(u))??this.deps.defaultModel??(this.deps.explicitModelSpec?i.tryResolve(this.deps.explicitModelSpec):void 0);if(t&&f)for(let e of this.slotCandidates(t,f,i))s(e,`slot`);if(r&&n)for(let e of this.categoryCandidates(n,f,i))s(e,`category`);s(f,`default`);let p=[];for(let{model:e,layer:t}of a){if(!r)return{model:e,decidedBy:t,rejected:p,capabilityFacts:_(e)};let n=await this.checkUsable(e);if(n.usable)return{model:e,decidedBy:t,rejected:p,capabilityFacts:_(e)};n.reason&&p.push({spec:e.id,reason:n.reason})}if(a.length===0&&!u&&!this.deps.defaultModel&&!this.deps.explicitModelSpec)throw Error(`No model configured. Set model in .otto/config.json or pass modelId to createApp().`);let m=t??(n?d[n]:void 0),h=await this.pickUsableFallback(i,m);return{model:h,decidedBy:`fallback`,rejected:p,capabilityFacts:_(h)}}async checkUsable(e){if(this.deps.isModelUsable)try{return await this.deps.isModelUsable(e)}catch{}if(this.deps.hasCredential)try{return await this.deps.hasCredential(e.provider)?{usable:!0}:{usable:!1,reason:`unauthenticated`}}catch{}return{usable:!0}}async pickUsableFallback(e,t){let n=fe(e.getAll(),t);for(let e of n)if((await this.checkUsable(e)).usable)return e;let r=this.deps.defaultModel??n[0];if(r)return r;throw Error(`No model available — sign in (/login) or pick a model (/model) first.`)}slotCandidates(e,t,n){return ae({slots:this.deps.settings.get(`model_slots`)?.slots??{},default:t},n).candidates(e).filter(e=>e.id!==t.id)}categoryCandidates(e,t,n){let r=[],i=e=>{if(e){let t=n.tryResolve(e);t&&r.push(t)}},a=this.deps.settings.get(`categories`)?.[e];i(a?.default_model);for(let e of a?.preferred_models??[])i(e);if(r.length>0)return r;if(Vo())return[];let o=d[e];if(!o||!t)return[];for(let e of this.slotCandidates(o,t,n))r.push(e);return r.length>0?r:ee(o,t,n)}};function Uo(e,t){let n=new Set(t);return e.filter(e=>n.has(e.name))}function Wo(e,t,n,r,i){let a;return a=t||(n?Uo(e(),n):e()),r?.length&&(a=a.filter(e=>!r.includes(e.name))),i||(a=a.filter(e=>!Re.has(e.name))),a}function Go(e,t,n,r){let i=n?[...t.disallowedToolNames??[],...r]:t.disallowedToolNames;return Wo(e,void 0,t.toolNames,i,t.allowSubagents)}const Ko=[`edit`,`write`,`lsp_rename`,`bash`];function qo(e,t,n,r){let i=Yn([...t,...Ei],n),a=no(new Set(r.map(e=>e.name)));return()=>e.assemblePreset({preset:`subagent`,agentName:n,profile:i,promptMode:i?.promptMode},a)}var Jo=class{modelResolver;constructor(e){this.deps=e,this.modelResolver=new Ho(e)}readAgentSources(e,t){let n=e?this.deps.settings.get(`agents`)?.[e]:void 0,r=t===`subagent`&&e?Yn([...this.deps.getDeclarativeAgentProfiles(),...Ei],e):void 0;return{slot:n?.default_workflow_slot,profileTier:r?.preferredModelTier,toolNames:n?.tools??Bo(r?.defaultTools),disallowedToolNames:r?.disallowedTools,allowSubagents:t===`main`?!0:r?.allowSubagents,systemPrompt:n?.system_prompt,maxToolTurns:n?.max_tool_turns??r?.defaultMaxToolTurns,maxToolTurnExtensions:n?.max_tool_turn_extensions??r?.defaultMaxToolTurnExtensions,promptOutputTokenBudget:n?.prompt_output_token_budget,promptWallClockBudgetMs:n?.prompt_wall_clock_budget_ms,sessionCostBudgetUSD:n?.session_cost_budget_usd,stallDetection:n?.stall_detection===!1?!1:n?.stall_detection?{windowTurns:n.stall_detection.window_turns,repeatThreshold:n.stall_detection.repeat_threshold}:void 0,promptMode:r?.promptMode,promptContext:void 0,profile:r}}resolvePersistedThinkingLevel(){let e=this.deps.settings.get(`thinking_level`),t=e===`minimal`?`low`:e;return typeof t==`string`&&[`low`,`medium`,`high`,`xhigh`,`max`].includes(t)?t:void 0}resolveToolsForResync(e,t,n){let r=t??(e?`subagent`:`main`),i=this.readAgentSources(e,r);return Go(this.deps.getTools,i,n,Ko)}resolveTools(e,t,n,r){return Wo(this.deps.getTools,e,t,n,r)}async resolve(e){let t=e.promptPreset??(e.agentName?`subagent`:`main`),n=this.readAgentSources(e.agentName,t),r=t===`subagent`||e.delegated===!0,i=e.slot??n.slot??h[n.profileTier??``];!i&&r&&!e.category&&(i=this.deps.settings.get(`model_slots`)?.subagent_default_slot);let a=e.model??(e.modelId?this.deps.getModelRegistry().tryResolve(e.modelId):void 0)??(this.deps.explicitModelSpec?this.deps.getModelRegistry().tryResolve(this.deps.explicitModelSpec):void 0),o=await this.modelResolver.resolveModel(a,i,e.category,r),s=o.model,c=ee(`compact`,s,this.deps.getModelRegistry())[0]??s;r&&this.deps.logger?.debug({model:s.id,decidedBy:o.decidedBy,category:e.category,slot:i,rejected:o.rejected},`subagent model resolved`);let l=e.readOnly?[...n.disallowedToolNames??[],...Ko]:n.disallowedToolNames,u=this.resolveTools(e.tools,n.toolNames,l,n.allowSubagents);s.supportsTools===!1&&(u=[]);let d=no(new Set(u.map(e=>e.name))),f=e.promptRefresh??(async()=>{let r=t===`subagent`&&e.agentName?await this.deps.promptManager.assemblePreset({preset:`subagent`,agentName:e.agentName,profile:n.profile,context:e.promptContext,promptMode:n.promptMode},d):await this.deps.promptManager.assemblePreset({preset:`main`},d),i=e.systemPrompt??n.systemPrompt;return i!==void 0&&i.length>0?r?`${r}\n\n${i}`:i:r}),p=await f(),m=e.systemPrompt===void 0&&n.systemPrompt===void 0&&t===`subagent`&&e.agentName?this.deps.promptManager.assembleSubAgentTail({preset:`subagent`,agentName:e.agentName,profile:n.profile,context:e.promptContext,promptMode:n.promptMode}):void 0,g=e.thinkingLevel??(r?void 0:this.resolvePersistedThinkingLevel())??`medium`;return{id:e.id,model:s,titleModel:c,modelResolution:o,agentName:e.agentName,systemPrompt:p??``,systemTail:m?[m]:void 0,tools:u,thinkingLevel:g,maxToolTurns:e.maxToolTurns??n.maxToolTurns??this.deps.maxToolTurns,maxToolTurnExtensions:e.maxToolTurnExtensions??n.maxToolTurnExtensions??this.deps.maxToolTurnExtensions??dn(e.depth??0,e.transient),promptOutputTokenBudget:(e.depth??0)>0?void 0:e.promptOutputTokenBudget??n.promptOutputTokenBudget??this.deps.settings.get(`prompt_output_token_budget`)??this.deps.promptOutputTokenBudget,promptWallClockBudgetMs:(e.depth??0)>0?void 0:e.promptWallClockBudgetMs??n.promptWallClockBudgetMs??this.deps.settings.get(`prompt_wall_clock_budget_ms`)??this.deps.promptWallClockBudgetMs,sessionCostBudgetUSD:(e.depth??0)>0?void 0:e.sessionCostBudgetUSD??n.sessionCostBudgetUSD??this.deps.settings.get(`session_cost_budget_usd`)??this.deps.sessionCostBudgetUSD,stallDetection:e.stallDetection??n.stallDetection??(()=>{let e=this.deps.settings.get(`stall_detection`);if(e!==void 0)return e===!1?!1:{windowTurns:e.window_turns,repeatThreshold:e.repeat_threshold}})()??this.deps.stallDetection,todoContinuation:e.todoContinuation??(()=>{let e=this.deps.settings.get(`todo_continue_max`);if(e===void 0)return;let t=Dn(process.env),n=Number.isFinite(e)&&e>=0?Math.trunc(e):t.max;return{enabled:t.enabled,max:n}})(),promptRefresh:f,workspaceDir:e.workspaceDir??this.deps.workspaceDir,workspaceId:e.workspaceId??this.deps.getWorkspaceId?.(),transient:e.transient,depth:e.depth,interactive:e.interactive,listable:e.listable,retryAccelerate:e.retryAccelerate,streamRetry:e.streamRetry??this.deps.getResilienceConfig?.().stream,networkDisconnectRetry:e.networkDisconnectRetry??Yo(this.deps.getResilienceConfig?.().networkDisconnect),lifecycleAsyncTimeoutMs:Xo(process.env.OTTO_LIFECYCLE_ASYNC_TIMEOUT_MS),describeImages:this.deps.describeImages}}};function Yo(e){if(e)return{maxRetries:e.maxRetries,initialDelayMs:e.intervalMs,backoffFactor:1,maxDelayMs:e.intervalMs}}function Xo(e){if(!e)return;let t=Number(e);return Number.isFinite(t)&&t>0?t:void 0}const Zo=Ge.O_NOFOLLOW??0;function Qo(e,t){let n=Ye(e,Ge.O_WRONLY|Ge.O_APPEND|Ge.O_CREAT|Zo,384);try{it(n,t.endsWith(`
5
5
  `)?t:t+`
6
6
  `)}finally{We(n)}}function $o(e,t=20){let n;try{return n=Ye(e,Ge.O_RDONLY|Zo),b(n,`utf-8`).replace(/\n+$/,``).split(`
7
7
  `).slice(-t).join(`
8
8
  `)}catch{return``}finally{n!==void 0&&We(n)}}function es(e){return e.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
9
- `)}function ts(e){let t=Date.now(),n={model:e.model,systemPrompt:e.systemPrompt??``,messages:[{role:`user`,content:[{type:`text`,text:e.prompt}],timestamp:Date.now()}],tools:e.tools,thinkingLevel:e.thinkingLevel??`medium`,maxTokens:e.maxTokens},r,i=new Rt({stream:e.stream,logger:e.logger,agentName:e.runId,maxToolTurns:e.maxToolTurns,toolHookExecutor:on({hookRegistry:e.hookRegistry,agentName:e.runId,sessionId:e.runId}),depth:e.depth??0,approval:(t,n,i)=>{let a=e.onAwaitingInput;return a?new Promise(n=>{gn.setAwaitingApproval(e.runId,`${t}: ${i}`),r=t=>{gn.clearAwaitingApproval(e.runId),n(t)};try{Qo(e.outputPath,`⏳ 需要你确认「${t}」:${i}\n 进 Delegates 面板按 o,回复 yes 允许 / no 拒绝。`)}catch{}a(i)}):Promise.resolve(!1)}});i.on(`turn.end`,({message:t})=>{let n=es(t);if(n)try{Qo(e.outputPath,n)}catch{}});let a=()=>{if(r){let e=r;r=void 0,e(!1)}i.abort()},o=Yt(i,{id:e.runId,agentName:e.runId,title:e.runId,prompt:e.prompt,model:e.model.id,origin:`user`,depth:e.depth??0,abort:a,messages:n.messages});return{promise:i.run(n).then(e=>({text:es(e),messages:n.messages,tokenUsage:{input:e.usage.inputTokens,output:e.usage.outputTokens,cacheRead:e.usage.cacheReadTokens},durationMs:Date.now()-t})).finally(()=>{o(),gn.markEnded(e.runId)}),abort:a,steer:e=>{if(r){let t=r;r=void 0,t(/^\s*(y|yes|是|好|ok|approve|允许|同意|确认|可以|行)/i.test(e));return}i.steer({role:`user`,content:[{type:`text`,text:e}],timestamp:Date.now()})},outputPath:e.outputPath}}var ns=class{ownedJobIds=new Set;handles=new Map;appliedDiffs=new Map;constructor(e){if(this.deps=e,e.appliedDiffStore)for(let{jobId:t,diff:n}of e.appliedDiffStore.loadAll())this.appliedDiffs.set(t,n)}start(e){let{repoRoot:t,registry:n,spawnRun:r,buildOutputPath:i,newJobId:a}=this.deps,o=a(),s=sn(t,o),c=i(o),l;try{l=r({runId:o,prompt:e.prompt,outputPath:c,workspaceDir:s.path,onAwaitingInput:()=>this.deps.registry.update(o,{status:`needs_input`}),...e.model?{model:e.model}:{}})}catch(e){throw wn(s,this.deps.onWorktreeCleanupError),e}let u=n.register({id:o,sessionId:e.sessionId,title:e.title,origin:e.origin,worktree:s,outputPath:c,abort:l.abort});return this.ownedJobIds.add(o),this.handles.set(o,l),l.promise.then(t=>this.onRunComplete(o,e.title,e.sessionId,s,c,t)).catch(t=>this.onRunFailed(o,e.title,e.sessionId,t)).finally(()=>this.handles.delete(o)),u}supply(e,t){let n=this.handles.get(e);if(!n?.steer)return!1;let r=this.deps.registry.get(e);return!r||r.status!==`running`&&r.status!==`needs_input`?!1:(n.steer(t),r.status===`needs_input`&&this.deps.registry.update(e,{status:`running`}),!0)}dispose(){for(let e of this.ownedJobIds)this.deps.registry.cancel(e);this.ownedJobIds.clear(),this.handles.clear(),this.appliedDiffs.clear()}onRunComplete(e,t,n,r,i,a){let o=this.deps.registry.get(e);if(!o||o.status===`canceled`)return;let s=``;try{s=jn(r)}catch(r){this.onRunFailed(e,t,n,r);return}if(this.deps.registry.update(e,{status:`ready`,diff:s}),s.trim()){this.deps.notify(n,{jobId:e,title:t,status:`ready`,summary:`produced a diff (${as(s)})`,outputPath:i,worktree:{path:r.path,branch:r.branch}});return}let c=rs(a).trim(),l=c?`完成 — /jobs 按 o 看结果(约 ${c.length} 字)`:`完成(无文件改动、无文本输出)`;this.deps.notify(n,{jobId:e,title:t,status:`ready`,summary:l,outputPath:i})}onRunFailed(e,t,n,r){let i=this.deps.registry.get(e);if(!i||i.status===`canceled`)return;let a=r instanceof Error?r.message:String(r);this.deps.registry.update(e,{status:`failed`,error:a}),this.deps.notify(n,{jobId:e,title:t,status:`failed`,summary:a})}apply(e,t={}){let n=this.deps.registry.get(e);if(!n)return{applied:!1,status:`error`,message:`job ${e} not found`,conflictPaths:[]};if(n.status!==`ready`)return{applied:!1,status:`error`,message:`job ${e} is ${n.status}, not ready`,conflictPaths:[]};let r=n.diff??``,i=An(r),a=kn(r),{added:o,removed:s}=is(r),c=!Qt(this.deps.repoRoot,r),l=cn({forbiddenZone:i,capabilityTouched:a,diffStat:{added:o,removed:s},conflict:c,origin:t.origin??`user`},{level:0});if(l.action===`forbid`)return{applied:!1,status:`error`,message:`apply forbidden by governance policy: ${l.reasons.join(`; `)}`,conflictPaths:[],forbiddenZone:i,capabilityTouched:a.length>0};let u=Jt(this.deps.repoRoot,r);if(u.applied)return r.trim()&&(this.appliedDiffs.set(e,r),this.deps.appliedDiffStore?.save(e,r)),this.deps.registry.update(e,{status:`applied`}),{applied:!0,status:`success`,message:`applied cleanly`,conflictPaths:[],forbiddenZone:i,capabilityTouched:a.length>0};let d=yn(this.deps.repoRoot,n.worktree.base);return{applied:!1,status:u.conflictPaths.length?`partial`:`error`,message:u.conflictPaths.length?`conflicts in ${u.conflictPaths.length} file(s); resolve or cancel${d?` (main repo has moved since this job started)`:``}`:`apply failed`,conflictPaths:u.conflictPaths,repoDrifted:d}}revert(e){let t=this.appliedDiffs.get(e);if(!t)return{applied:!1,status:`error`,message:`job ${e} has no applied change to revert`,conflictPaths:[]};let n=On(this.deps.repoRoot,t);return n.applied?(this.appliedDiffs.delete(e),this.deps.appliedDiffStore?.delete(e),{applied:!0,status:`success`,message:`reverted cleanly`,conflictPaths:[]}):{applied:!1,status:n.conflictPaths.length?`partial`:`error`,message:n.conflictPaths.length?`cannot revert: ${n.conflictPaths.length} file(s) diverged since apply`:`revert failed`,conflictPaths:n.conflictPaths}}cancel(e){this.deps.registry.cancel(e)}};function rs(e){let t=e?.text;return typeof t==`string`?t:``}function is(e){let t=0,n=0,r=0,i=e.split(/^diff --git /m).filter(Boolean);for(let e of i){if(e.includes(`
9
+ `)}function ts(e){let t=Date.now(),n={model:e.model,systemPrompt:e.systemPrompt??``,messages:[{role:`user`,content:[{type:`text`,text:e.prompt}],timestamp:Date.now()}],tools:e.tools,thinkingLevel:e.thinkingLevel??`medium`,maxTokens:e.maxTokens},r,i=new Rt({stream:e.stream,logger:e.logger,agentName:e.runId,maxToolTurns:e.maxToolTurns,toolHookExecutor:sn({hookRegistry:e.hookRegistry,agentName:e.runId,sessionId:e.runId}),depth:e.depth??0,approval:(t,n,i)=>{let a=e.onAwaitingInput;return a?new Promise(n=>{_n.setAwaitingApproval(e.runId,`${t}: ${i}`),r=t=>{_n.clearAwaitingApproval(e.runId),n(t)};try{Qo(e.outputPath,`⏳ 需要你确认「${t}」:${i}\n 进 Delegates 面板按 o,回复 yes 允许 / no 拒绝。`)}catch{}a(i)}):Promise.resolve(!1)}});i.on(`turn.end`,({message:t})=>{let n=es(t);if(n)try{Qo(e.outputPath,n)}catch{}});let a=()=>{if(r){let e=r;r=void 0,e(!1)}i.abort()},o=Xt(i,{id:e.runId,agentName:e.runId,title:e.runId,prompt:e.prompt,model:e.model.id,origin:`user`,depth:e.depth??0,abort:a,messages:n.messages});return{promise:i.run(n).then(e=>({text:es(e),messages:n.messages,tokenUsage:{input:e.usage.inputTokens,output:e.usage.outputTokens,cacheRead:e.usage.cacheReadTokens},durationMs:Date.now()-t})).finally(()=>{o(),_n.markEnded(e.runId)}),abort:a,steer:e=>{if(r){let t=r;r=void 0,t(/^\s*(y|yes|是|好|ok|approve|允许|同意|确认|可以|行)/i.test(e));return}i.steer({role:`user`,content:[{type:`text`,text:e}],timestamp:Date.now()})},outputPath:e.outputPath}}var ns=class{ownedJobIds=new Set;handles=new Map;appliedDiffs=new Map;constructor(e){if(this.deps=e,e.appliedDiffStore)for(let{jobId:t,diff:n}of e.appliedDiffStore.loadAll())this.appliedDiffs.set(t,n)}start(e){let{repoRoot:t,registry:n,spawnRun:r,buildOutputPath:i,newJobId:a}=this.deps,o=a(),s=cn(t,o),c=i(o),l;try{l=r({runId:o,prompt:e.prompt,outputPath:c,workspaceDir:s.path,onAwaitingInput:()=>this.deps.registry.update(o,{status:`needs_input`}),...e.model?{model:e.model}:{}})}catch(e){throw Tn(s,this.deps.onWorktreeCleanupError),e}let u=n.register({id:o,sessionId:e.sessionId,title:e.title,origin:e.origin,worktree:s,outputPath:c,abort:l.abort});return this.ownedJobIds.add(o),this.handles.set(o,l),l.promise.then(t=>this.onRunComplete(o,e.title,e.sessionId,s,c,t)).catch(t=>this.onRunFailed(o,e.title,e.sessionId,t)).finally(()=>this.handles.delete(o)),u}supply(e,t){let n=this.handles.get(e);if(!n?.steer)return!1;let r=this.deps.registry.get(e);return!r||r.status!==`running`&&r.status!==`needs_input`?!1:(n.steer(t),r.status===`needs_input`&&this.deps.registry.update(e,{status:`running`}),!0)}dispose(){for(let e of this.ownedJobIds)this.deps.registry.cancel(e);this.ownedJobIds.clear(),this.handles.clear(),this.appliedDiffs.clear()}onRunComplete(e,t,n,r,i,a){let o=this.deps.registry.get(e);if(!o||o.status===`canceled`)return;let s=``;try{s=Mn(r)}catch(r){this.onRunFailed(e,t,n,r);return}if(this.deps.registry.update(e,{status:`ready`,diff:s}),s.trim()){this.deps.notify(n,{jobId:e,title:t,status:`ready`,summary:`produced a diff (${as(s)})`,outputPath:i,worktree:{path:r.path,branch:r.branch}});return}let c=rs(a).trim(),l=c?`完成 — /jobs 按 o 看结果(约 ${c.length} 字)`:`完成(无文件改动、无文本输出)`;this.deps.notify(n,{jobId:e,title:t,status:`ready`,summary:l,outputPath:i})}onRunFailed(e,t,n,r){let i=this.deps.registry.get(e);if(!i||i.status===`canceled`)return;let a=r instanceof Error?r.message:String(r);this.deps.registry.update(e,{status:`failed`,error:a}),this.deps.notify(n,{jobId:e,title:t,status:`failed`,summary:a})}readDiffFromWorktree(e){try{return Mn(e.worktree)}catch{return``}}apply(e,t={}){let n=this.deps.registry.get(e);if(!n)return{applied:!1,status:`error`,message:`job ${e} not found`,conflictPaths:[]};if(n.status!==`ready`)return{applied:!1,status:`error`,message:`job ${e} is ${n.status}, not ready`,conflictPaths:[]};let r=n.diff??this.readDiffFromWorktree(n);if(r.trim()===``)return{applied:!1,status:`error`,message:`job ${e} has no diff (worktree missing or empty — rehydrated job may be stale)`,conflictPaths:[]};let i=jn(r),a=An(r),{added:o,removed:s}=is(r),c=!$t(this.deps.repoRoot,r),l=ln({forbiddenZone:i,capabilityTouched:a,diffStat:{added:o,removed:s},conflict:c,origin:t.origin??`user`},{level:0});if(l.action===`forbid`)return{applied:!1,status:`error`,message:`apply forbidden by governance policy: ${l.reasons.join(`; `)}`,conflictPaths:[],forbiddenZone:i,capabilityTouched:a.length>0};let u=Yt(this.deps.repoRoot,r);if(u.applied)return r.trim()&&(this.appliedDiffs.set(e,r),this.deps.appliedDiffStore?.save(e,r)),this.deps.registry.update(e,{status:`applied`}),{applied:!0,status:`success`,message:`applied cleanly`,conflictPaths:[],forbiddenZone:i,capabilityTouched:a.length>0};let d=bn(this.deps.repoRoot,n.worktree.base);return{applied:!1,status:u.conflictPaths.length?`partial`:`error`,message:u.conflictPaths.length?`conflicts in ${u.conflictPaths.length} file(s); resolve or cancel${d?` (main repo has moved since this job started)`:``}`:`apply failed`,conflictPaths:u.conflictPaths,repoDrifted:d}}revert(e){let t=this.appliedDiffs.get(e);if(!t)return{applied:!1,status:`error`,message:`job ${e} has no applied change to revert`,conflictPaths:[]};let n=kn(this.deps.repoRoot,t);return n.applied?(this.appliedDiffs.delete(e),this.deps.appliedDiffStore?.delete(e),{applied:!0,status:`success`,message:`reverted cleanly`,conflictPaths:[]}):{applied:!1,status:n.conflictPaths.length?`partial`:`error`,message:n.conflictPaths.length?`cannot revert: ${n.conflictPaths.length} file(s) diverged since apply`:`revert failed`,conflictPaths:n.conflictPaths}}cancel(e){this.deps.registry.cancel(e)}};function rs(e){let t=e?.text;return typeof t==`string`?t:``}function is(e){let t=0,n=0,r=0,i=e.split(/^diff --git /m).filter(Boolean);for(let e of i){if(e.includes(`
10
10
  GIT binary patch`)){r++;continue}for(let r of e.split(`
11
- `))r.startsWith(`+`)&&!r.startsWith(`+++`)?t++:r.startsWith(`-`)&&!r.startsWith(`---`)&&n++}return{added:t,removed:n,binaryFiles:r}}function as(e){let{added:t,removed:n,binaryFiles:r}=is(e);return`+${t}/-${n}${r>0?`, ${r} binary file${r===1?``:`s`}`:``}`}const os=/^[a-zA-Z0-9_-]+$/;function ss(e){return{save(t,n){if(!os.test(t))throw Error(`Invalid jobId for applied diff store: ${t}`);y(e,{recursive:!0}),x(C(e,`${t}.patch`),n,`utf-8`)},load(t){let n=C(e,`${t}.patch`);if(v(n))return b(n,`utf-8`)},delete(t){let n=C(e,`${t}.patch`);v(n)&&rt(n)},loadAll(){return v(e)?Xe(e).filter(e=>st(e)===`.patch`).map(t=>({jobId:t.slice(0,-6),diff:b(C(e,t),`utf-8`)})):[]}}}const cs=[`delegate_job`];function ls(e){return e.filter(e=>!cs.includes(e.name))}function us(){return`job_${Ii().replace(/-/g,``).slice(0,8)}`}function ds(e){let t=e.outputDir??C(ot(),`otto-jobs`);return e.registry.setWorktreeCleanupErrorHandler((t,n,r)=>e.logger.warn({jobId:t,op:n,err:r instanceof Error?r.message:String(r)},`Failed to clean up agent job worktree`)),new ns({repoRoot:e.repoRoot,registry:e.registry,notify:e.notify,onWorktreeCleanupError:(t,n)=>{e.logger.warn({op:t,err:n instanceof Error?n.message:String(n)},`Failed to clean up agent job worktree`)},appliedDiffStore:e.appliedDiffDir?ss(e.appliedDiffDir):void 0,spawnRun:({runId:t,prompt:n,outputPath:r,workspaceDir:i,onAwaitingInput:a,model:o})=>{let s=o?ms(o,e):void 0;return ts({runId:t,prompt:n,outputPath:r,model:s?.model??e.getModel(),thinkingLevel:s?.thinkingLevel,systemPrompt:e.systemPrompt,tools:[...ls(e.buildTools(i)),...e.mcpTools?.()??[]],maxToolTurns:e.maxToolTurns,stream:e.stream,logger:e.logger,hookRegistry:e.hookRegistry,onAwaitingInput:a})},buildOutputPath:e=>(y(t,{recursive:!0}),C(t,`agent-job-${e}.log`)),newJobId:e.newJobId??us})}const fs=[`low`,`medium`,`high`,`xhigh`,`max`];function ps(e){return fs.includes(e)}function ms(e,t){if(!t.findModel)throw Error(`per-job model is not wired (findModel not injected)`);let n=t.findModel(e.id);if(!n)throw Error(`Model "${e.id}" not found for job (check /model list)`);let r;if(e.thinkingLevel!==void 0){if(!ps(e.thinkingLevel))throw Error(`Invalid thinking level "${e.thinkingLevel}" (expected low|medium|high|xhigh|max)`);r=e.thinkingLevel}return{model:n,thinkingLevel:r}}function hs(e){return ds({repoRoot:e.workspaceDir,registry:mn,notify:(t,n)=>e.agentJobNotify?.(t,n),buildTools:t=>e.buildToolsForWorkspace(t),mcpTools:()=>e.connectorTools(),getModel:()=>{let t=e.settings.get(`model`),n=(t?e.modelRegistry.find(t):void 0)??e.modelRegistry.getAll().find(e=>e.id!==m);if(!n)throw Error(`No model available — configure a model or run /model first.`);return n},stream:e.stream,logger:e.logger,hookRegistry:e.hookRegistry,appliedDiffDir:c()?void 0:C(r,`jobs`,`applied`)})}function gs(e){for(let t=e.length-1;t>=0;t--){let n=e[t];if(n?.role!==`assistant`)continue;let r=(n.content??[]).filter(e=>e.type===`text`&&typeof e.text==`string`).map(e=>e.text).join(`
12
- `).trim();if(r.length>0)return r}return``}function _s(e){for(let t=e.length-1;t>=0;t--){let n=e[t];if(n?.role!==`assistant`)continue;let r=n.stopReason;return r===`refusal`||r===`max_tokens`?r:null}return null}function vs(e){let t=Error(e);return t.name=`AbortError`,t}function ys(e){let t=new Map;return{runSession:async n=>{let r=Date.now(),i=new AbortController;n.taskId&&t.set(n.taskId,i);let a=n.signal,o=()=>i.abort();a&&(a.aborted?i.abort():a.addEventListener(`abort`,o,{once:!0}));let s,c=n.sessionMode===`sticky`&&n.sessionId?e.getSession(n.sessionId):void 0;if(c)s=c;else{let t={agentName:n.agentName,slot:n.slot,modelId:n.model,category:n.category,delegated:!0,promptContext:n.promptContext??(n.agentName?{taskDescription:n.prompt}:void 0),depth:n.depth,parentTaskId:n.parentTaskId,readOnly:n.readOnly};s=await e.createSession(n.sessionMode===`sticky`&&n.sessionId?{...t,id:n.sessionId}:{...t,transient:!0})}let l=s.id,u=Yt(s.coreAgent,{id:l,agentName:n.agentName??`agent`,title:n.agentName??n.prompt.replace(/\s+/g,` `).slice(0,48),prompt:n.prompt,model:n.model??s.model.id,modelDecidedBy:s.modelResolution?.decidedBy,origin:`main`,depth:n.depth??0,abort:()=>s.abort(),messages:()=>s.session.messages()});try{if(i.signal.aborted)throw vs(`Task cancelled before the session started`);let e=n.agentName?`<agent-guardrails>\n${Wn}\n</agent-guardrails>\n\n<task>\n${n.prompt}\n</task>`:n.prompt,t=s.prompt(e);t.catch(()=>{}),await Promise.race([t,new Promise((e,t)=>{i.signal.addEventListener(`abort`,()=>{s.abort(),t(vs(`Task cancelled`))})})]);let a=s.session.messages(),o=gs(a),c=_s(a);return c&&(o=`${o}\n\n[⚠ subagent did not complete cleanly (stop reason: ${c}) — the output above may be partial or unreliable; verify before relying on it]`),{text:o,sessionId:s.id,durationMs:Date.now()-r}}finally{gn.setMessages(l,s.session.messages()),u(),gn.markEnded(l),a?.removeEventListener(`abort`,o),n.taskId&&t.delete(n.taskId),n.sessionMode===`ephemeral`&&await e.removeSession(s.id).catch(t=>{e.logger.warn(`Failed to remove ephemeral session %s: %s`,s.id,t)})}},abortTask:e=>{t.get(e)?.abort()}}}function bs(e){let t=new Bi({focusTracking:process.env.OTTO_TUI_FOCUS===`1`}),n=new zi({getConfig:e.getConfig,getCwd:e.getCwd,onInteraction:()=>t.recordInteraction(),isFollowUpPending:e.isFollowUpPending,gate:new Hi({getCondition:()=>e.getConfig()?.condition,getIdleThresholdMs:()=>e.getConfig()?.idle_threshold_ms,state:t})});return n.registerChannel(new Vi({getConfig:e.getConfig})),n.registerChannel(new Li(`hook`,()=>!0,t=>e.emitHookNotification({sessionId:t.sessionId,message:t.message,title:t.title,notification_type:t.type}))),n.registerChannel(new Ri({getConfig:e.getConfig,isTrusted:()=>ki(e.getCwd())})),{dispatcher:n,presenceTracker:t}}function xs(e,t){if(!t||t.length===0)return e;let n=t.map(e=>RegExp(`^`+e.replace(/[.+^${}()|[\]\\]/g,`\\$&`).replace(/\*/g,`.*`)+`$`,`i`));return e.filter(e=>!n.some(t=>t.test(e)))}var Ss=class{catalog;derivedModelIds=new Map;constructor(e,t,n){this.modelRegistry=e,this.authStore=t,this.catalog=n??new f}async hydrate(){let e=new Set,t=await this.catalog.load();if(!t)return e;for(let n of Object.values(t.providers)){let t=de(this.modelRegistry,n.mergeProvider,n.modelIds,{templateApi:n.modelApi});for(let n of t.availableIds)e.add(n);let r=this.derivedModelIds.get(n.mergeProvider)??new Set;for(let e of t.derivedIds)r.add(e);this.derivedModelIds.set(n.mergeProvider,r)}return e}refreshInFlight=null;async refresh(){return this.refreshInFlight||=this.doRefresh().finally(()=>{this.refreshInFlight=null}),this.refreshInFlight}async doRefresh(){let e=this.modelRegistry,t=this.authStore,n=t.listProviders(),r=await Promise.all(n.map(e=>t.getAuthSource(e).catch(()=>null))),i=[];for(let a=0;a<n.length;a++){let o=n[a];if(!r[a]){i.push({provider:o,status:`skipped`,reason:`not authenticated`});continue}let s=await t.resolveAuth(o).catch(()=>null);if(!s?.token){let e=r[a]===`oauth`&&!t.oauth.has(o)?`provider capability not granted — trust the plugin in /extension`:`credential expired or refresh failed — re-login`;i.push({provider:o,status:`skipped`,reason:e});continue}let c=he(o,s.token,{mode:s.mode,beta:s.beta});if(!c){let t=e.getByProvider(o);if(t.length>0){let e=t.map(e=>e.id);await this.catalog.put(o,{fetchedAt:Date.now(),mergeProvider:o,modelIds:e}).catch(()=>{}),i.push({provider:o,status:`ok`,added:0,kept:e.length,total:e.length,availableIds:e})}else i.push({provider:o,status:`skipped`,reason:`no live models endpoint`});continue}try{let t=xs(await le(c),c.modelIdExclude),n=de(e,c.mergeProvider,t,{templateApi:c.modelApi}),r=new Set(n.availableIds),a=this.derivedModelIds.get(c.mergeProvider)??new Set;for(let t of a)r.has(t)||e.unregister(t);this.derivedModelIds.set(c.mergeProvider,new Set([...[...a].filter(e=>r.has(e)),...n.derivedIds])),await this.catalog.put(o,{fetchedAt:Date.now(),mergeProvider:c.mergeProvider,modelApi:c.modelApi,modelIds:t}).catch(()=>{}),i.push({provider:o,status:`ok`,added:n.added,kept:n.kept,total:n.total,availableIds:n.availableIds})}catch(e){i.push({provider:o,status:`failed`,reason:e instanceof Error?e.message:String(e)})}}return i}};function Cs(e){return e.modelRegistry.getAll()}function ws(e,t){return e.modelRegistry.resolve(t)}function Ts(e){return e.providerRegistry.list()}function Es(e,t){e.hookRegistry.register(t)}function Ds(e,t){return e.hookRegistry.unregister(t)}async function Os(e){return e.modelCatalogManager.hydrate()}function ks(e,t){return e.codingSessionPool.getSessionAvailableModels(t)}function As(e,t,n){e.codingSessionPool.setSessionAvailableModels(t,n)}async function js(e){return e.modelCatalogManager.refresh()}async function Ms(e,t){let n=new Set(t?e.codingSessionPool.getSessionAvailableModels(t):[]),r=oe(e.authStore,`delegation`);return Promise.all(e.modelRegistry.getAll().filter(e=>e.id!==m).map(async e=>{let t=await r(e);return{id:e.id,provider:e.provider,strengths:e.strengths??[],available:n.has(e.id),usable:t.usable,...t.reason?{unusableReason:t.reason}:{}}}))}var Ns=class{constructor(e){this.host=e}get modelRegistry(){return this.host.modelRegistry}get authStore(){return this.host.authStore}getAllModels(){return Cs(this.host)}resolveModel(e){return ws(this.host,e)}listProviders(){return Ts(this.host)}hydrateModelCache(){return Os(this.host)}getSessionAvailableModels(e){return ks(this.host,e)}setSessionAvailableModels(e,t){As(this.host,e,t)}refreshModels(){return js(this.host)}buildModelCatalog(e){return Ms(this.host,e)}};function Ps(e,t){e.notificationDispatcher.registerChannel(t)}function Fs(e,t){e.notificationDispatcher.registerChannel(new Li(`inapp`,()=>!0,e=>t(e.title??`otto`,e.message,e.type)))}function Is(e){e.presenceTracker.recordInteraction()}function Ls(e,t){e.presenceTracker.setFocus(t)}var Rs=class{constructor(e){this.host=e}registerNotificationChannel(e){Ps(this.host,e)}registerInAppNotificationChannel(e){Fs(this.host,e)}notifyUserInteraction(){Is(this.host)}setTerminalFocus(e){Ls(this.host,e)}setFollowUpPendingProbe(e){this.host.setFollowUpPendingProbe?.(e)}};async function zs(e,t,n){if(!t)return;if(n){e.permissionRegistry.addSessionAlwaysAllow(n,t),e.codingSessionPool.setSessionPermissionAllow(n,e.permissionRegistry.getSessionAlwaysAllow(n)),e.logger.info({tool:t,sessionId:n},`Tool added to session always-allow list`);return}let r=e.settings.get(`permission_always_allow`)??[];r.includes(t)||(e.permissionRegistry.addAlwaysAllow(t),await e.settings.persist({permission_always_allow:[...r,t]}),e.logger.info({tool:t},`Tool added to project always-allow list`))}function Bs(e){return e.settings.get(`permission_mode`)??`auto`}async function Vs(e,t){let n=Bs(e);await e.settings.update({permission_mode:t}),e.settings.persist({permission_mode:t}).catch(n=>e.logger.warn({err:n instanceof Error?n.message:String(n),mode:t},`Failed to persist permission mode`)),e.logger.info({from:n,to:t},`Permission mode set`)}function Hs(e,t){return e.permissionRegistry.getSessionAlwaysAllow(t)}async function Us(e,t){if(!t)return!1;let n=e.settings.get(`permission_always_allow`)??[];if(!n.includes(t))return!1;let r=n.filter(e=>e!==t);return e.permissionRegistry.setAlwaysAllow(r),await e.settings.persist({permission_always_allow:r}),e.logger.info({tool:t},`Tool removed from project always-allow list`),!0}function Ws(e,t){t&&(e.permissionRegistry.clearSessionAlwaysAllow(t),e.codingSessionPool.setSessionPermissionAllow(t,[]),e.logger.info({sessionId:t},`Session always-allow list cleared`))}var Gs=class{constructor(e){this.host=e}allowToolAlways(e,t){return zs(this.host,e,t)}disallowToolAlways(e){return Us(this.host,e)}setPermissionMode(e){return Vs(this.host,e)}getPermissionMode(){return Bs(this.host)}getSessionAlwaysAllow(e){return Hs(this.host,e)}clearSessionAlwaysAllow(e){Ws(this.host,e)}bashAlwaysAllowPrefix(e){return Ce(e)}isWellFormedAllowEntry(e){return Ie(e)}get activeSandbox(){return this.host.sandbox?.activeName??null}approveSandboxBypass(e){this.host.sandbox?.approveBypass(e)}getRecentPermissionDecisions(e,t=8){let n=this.host.auditLog;return n?n.getEntries({sessionId:e}).slice(-t).reverse().map(e=>({timestamp:e.timestamp,toolName:e.toolName,...e.filePath===void 0?{}:{filePath:e.filePath},effect:e.decision.effect,policyName:e.decision.policyName})):[]}recordAutoPermissionDecision(e){this.host.auditLog?.recordAutoDecision(e)}};async function Ks(e,t={}){e.ensureNotDisposed(),await e.ensureSettingsLoaded();let n=await e.sessionConfigResolver.resolve(t),r=await e.agentRuntime.createSession(n);return e.notificationDispatcher.attach(r),e.toolsSyncCoordinator?.record(r.id,{agentName:t.agentName,promptPreset:t.promptPreset??(t.agentName?`subagent`:`main`),readOnly:t.readOnly,hasExplicitTools:t.tools!==void 0}),e.logger.info({sessionId:r.id},`Session created`),r}function qs(e,t){return e.codingSessionPool.getSession(t)}async function Js(e,t,n){if(!e.storage.storageHost)throw Error(`shareSession requires a configured storage.host`);await e.storage.storageHost.host.updateMetadata(`sessions`,e.workspaceRef?.key,t,{visibility:n.visibility},void 0),e.logger.info({sessionId:t,visibility:n.visibility},`Session visibility changed`)}function Ys(e){return e.codingSessionPool.active}function Xs(e,t){return e.codingSessionPool.listSessions(t)}async function Zs(e,t){let n=Xs(e,t).filter(t=>{let n=e.codingSessionPool.getSession(t.id);return n?!(n.transient===!0||n.depth>0||n.listable===!1):!0}),r;try{r=t?.workspaceId===void 0?e.workspaceRef?.key:qi(t.workspaceId)}catch{r=void 0}if(!r)return n;let i=await e.codingSessionPool.listAllPersistedSessions({workspaceKey:r}).catch(()=>[]),a=t?.workspaceId??e.workspaceRef?.id,o=new Set(n.map(e=>e.id)),s=i.filter(e=>!o.has(e.id)).map(e=>({...e,workspaceId:a})),c=[...n,...s];return c.sort((e,t)=>{let n=e.updatedAt?.getTime()??e.createdAt.getTime();return(t.updatedAt?.getTime()??t.createdAt.getTime())-n}),c}async function Qs(e,t){e.notificationDispatcher.detach(t);let n=await e.codingSessionPool.removeSession(t);return n&&(e.toolsSyncCoordinator?.forget(t),e.logger.info({sessionId:t},`Session removed`)),n}async function $s(e,t){let n=await e.codingSessionPool.archiveSession(t);return n&&e.logger.info({sessionId:t},`Session archived`),n}async function ec(e,t,n){let r=await e.codingSessionPool.forkSession(t,n);return r&&e.notificationDispatcher.attach(r),r}async function tc(e,t,n){let r=n.current;if(!r)throw Error(`导出归档仅支持关系化 SQLite 后端(sessions.db)。当前后端不支持。`);let i=await bi(e,r);if(!i)throw Error(`会话 ${e.slice(0,8)} 不存在或无法加载`);let a=JSON.stringify(i,null,2),o=Fi(`sha256`).update(a,`utf-8`).digest(`hex`);await Yi(S(t),{recursive:!0}),await Qi(t,a,`utf-8`);let s=await Zi(t,`utf-8`),c=Fi(`sha256`).update(s,`utf-8`).digest(`hex`);if(o!==c)throw Error(`Checksum 校验失败:写入前 sha256=${o.slice(0,16)},读回 sha256=${c.slice(0,16)}。导出文件 ${t} 可能已损坏,操作整体失败。`);return{entryCount:i.entries.length,checksum:o,path:t}}var nc=class{constructor(e){this.host=e}get sessionManager(){return this.host.codingSessionPool}createSession(e={}){return Ks(this.host,e)}getSession(e){return qs(this.host,e)}getActiveSession(){return Ys(this.host)}listSessions(e){return Xs(this.host,e)}listAllSessions(e){return Zs(this.host,e)}removeSession(e){return Qs(this.host,e)}forkSession(e,t){return ec(this.host,e,t)}shareSession(e,t){return Js(this.host,e,t)}archiveSession(e){return $s(this.host,e)}exportSessionArchive(e,t){return tc(e,t,this.host.sessionRepoRef??{})}getResidencyConfig(){return this.host.getResidencyConfig?.()}sweepOrphanTraceFiles(){return this.host.sweepOrphanTraceFiles?.()??Promise.resolve()}},rc=class{contexts=new Map;constructor(e){this.deps=e}record(e,t){t.hasExplicitTools||this.contexts.set(e,{agentName:t.agentName,promptPreset:t.promptPreset,readOnly:t.readOnly})}forget(e){this.contexts.delete(e)}resyncOne(e){let t=this.contexts.get(e);return t?this.resyncSession(e,t):!1}resync(){let e=new Set(this.deps.listSessionIds());for(let t of this.contexts.keys())e.has(t)||this.contexts.delete(t);let t=0;for(let[e,n]of this.contexts)this.resyncSession(e,n)&&t++;return t}resyncSession(e,t){let n=this.deps.getSession(e);if(!n)return!1;try{let e=this.deps.sessionConfigResolver.resolveToolsForResync(t.agentName,t.promptPreset,t.readOnly);return n.model.supportsTools===!1&&(e=[]),n.applyTools(e),!0}catch(t){return this.deps.logger.warn({sessionId:e,err:t instanceof Error?t.message:String(t)},`[session-tools-sync] resync failed for session, skipping (fail-soft)`),!1}}};const ic=T(`@x-otto/coding:plugin-panel-manager`);function ac(e){let t=e.plugins??gr({cwd:e.workspaceDir,homedir:e.homedir,disabled:e.disabledPlugins}),n=[];for(let e of t){let t=e.manifest.contributes?.panels;if(!t||t.length===0)continue;let r=O(e);if(!r.gated){if(!e.manifest.capabilities?.includes(`tui.renderer`)){ic.warn({pluginId:e.id},`plugin declares contributes.panels but not capabilities:["tui.renderer"], skipped (fail-closed)`);continue}if(r.pendingCapabilities.includes(`tui.renderer`)){ic.warn({pluginId:e.id},`plugin capability "tui.renderer" declared but not yet granted, skipping panels (fail-closed)`);continue}for(let r of t){let t=C(e.dir,r.entry);if(!v(t)){ic.warn({pluginId:e.id,panelId:r.id,modulePath:t},`panel entry not found — postinstall build may not have run`);continue}n.push({id:`${e.id}:${r.id}`,pluginId:e.id,title:r.title,modulePath:t,exportName:r.export??`default`})}}}return n}function oc(e){let t=[];for(let n of e){if(O(n).gated)continue;let e=n.manifest.contributes?.statusItems;if(!e?.length)continue;let r=vr(n.manifest.contributes?.contextKeys);for(let i of e){if((i.point??sr.statuslineItem)!==sr.statuslineItem||!br(i.when,r))continue;let e=r[i.dataSource.contextKey];e!=null&&t.push({item:{id:`${n.id}:${i.id}`,text:e},order:i.order??0})}}return t.sort((e,t)=>e.order-t.order).map(e=>e.item)}function sc(e){let t=[];for(let n of e){if(O(n).gated)continue;let e=n.manifest.contributes;if(!e?.menus?.length)continue;let r=vr(e.contextKeys);t.push(...Lr(sr.menuItem,e.menus,e.actions,r))}return t}const cc={capability:`tui.renderer`,axis:`renderers`,noun:`renderer`,pendingNote:`RFC-140 D3`,logger:T(`@x-otto/coding:plugin-renderer-loader`),entries:e=>e.manifest.contributes?.renderers,entryPath:e=>e.entry,exportName:e=>e.export,idLogFields:e=>({rendererId:e.id}),logTypeofOnNotFunction:!0,build:(e,t,n)=>({id:`${e.id}:${t.id}`,pluginId:e.id,matcher:t.matcher,render:n}),successLogFields:e=>({rendererId:e.id,matcher:e.matcher})};function lc(e){return Mo(e,cc)}const uc=T(`@x-otto/coding:plugin-a2ui-component-loader`),dc=new Set([`Text`,`Card`,`List`,`Progress`,`Chip`,`Button`]),fc={capability:`a2ui.component`,axis:`a2uiComponents`,noun:`a2ui component`,pendingNote:`RFC-140 D3 pattern`,logger:uc,entries:e=>e.manifest.contributes?.a2uiComponents,entryPath:e=>e.entry,exportName:e=>e.export,idLogFields:e=>({type:e.type}),logTypeofOnNotFunction:!1,preCheck:(e,t)=>dc.has(t.type)?(uc.warn({pluginId:e.id,type:t.type},`plugin a2ui component type collides with builtin reserved type, rejected (R4)`),!1):!0,build:(e,t,n)=>({type:t.type,pluginId:e.id,render:n})};function pc(e){return Mo(e,fc,{key:e=>e.type,onConflict:(e,t)=>{uc.warn({pluginId:e.pluginId,type:e.type,existingOwner:t},`a2ui component type already registered by another plugin, rejected (first-registered wins)`)}})}const mc={capability:`tui.renderer`,axis:`statusWidgets`,noun:`status widget`,pendingNote:`RFC-140 D3 pattern`,logger:T(`@x-otto/coding:plugin-status-widget-loader`),entries:e=>e.manifest.contributes?.statusWidgets,entryPath:e=>e.entry,exportName:e=>e.export,idLogFields:e=>({widgetId:e.id}),logTypeofOnNotFunction:!0,build:(e,t,n)=>({id:`${e.id}:${t.id}`,pluginId:e.id,render:n,tickMs:t.tickMs,order:t.order}),successLogFields:e=>({widgetId:e.id})};function hc(e){return Mo(e,mc)}const gc={capability:`tui.renderer`,axis:`fileViewers`,noun:`file viewer`,pendingNote:`RFC-140 D3 pattern`,logger:T(`@x-otto/coding:plugin-file-viewer-loader`),entries:e=>e.manifest.contributes?.fileViewers,entryPath:e=>e.entry,exportName:e=>e.export,idLogFields:e=>({viewerId:e.id}),logTypeofOnNotFunction:!0,build:(e,t,n)=>({id:`${e.id}:${t.id}`,pluginId:e.id,label:t.label,matcher:t.matcher,render:n,order:t.order}),successLogFields:e=>({viewerId:e.id,matcher:e.matcher})};function _c(e){return Mo(e,gc)}var vc=class{constructor(e){this.deps=e}listFileCommands(){return[...this.deps.compatProducts?.fileCommands??[],...this.deps.pluginModuleManager.commands]}computedPluginCommands(){return this.deps.pluginModuleManager.commands}pluginCliCommands(){return this.deps.pluginModuleManager.cliCommands}pluginSlashCommands(){return this.deps.pluginModuleManager.slashCommands}async callMcpTool(e,t,n){let r=this.deps.mcpController.getMcpClient(e);if(!r)throw Error(`MCP server "${e}" not connected or not found`);let i=await r.callTool({name:t,arguments:n});return{content:i.content,isError:i.isError}}getPluginPanelRegistrations(){return ac({workspaceDir:this.deps.getWorkspaceDir(),homedir:at(),disabledPlugins:this.deps.settings.get(`disabled_plugins`),plugins:this.deps.getActivePlugins()})}getPluginStatusItems(){return oc(this.deps.getActivePlugins())}getGlobalMenuItems(){return sc(this.deps.getActivePlugins())}getPluginRenderers(){return lc(this.deps.getActivePlugins())}getPluginA2uiComponents(){return pc(this.deps.getActivePlugins())}getPluginStatusWidgets(){return hc(this.deps.getActivePlugins())}getPluginFileViewers(){return _c(this.deps.getActivePlugins())}getPluginRegistrations(){let e=new Map,t=t=>{let n=e.get(t);return n||(n={pluginId:t},e.set(t,n)),n};for(let e of this.getPluginRenderers()){let n=t(e.pluginId);(n.renderers??=[]).push(e)}for(let e of this.getPluginStatusItems()){let n=t(e.id.split(`:`)[0]??e.id);(n.statusItems??=[]).push(e)}for(let e of this.getPluginPanelRegistrations()){let n=t(e.pluginId);(n.panels??=[]).push(e)}for(let e of this.getPluginA2uiComponents()){let n=t(e.pluginId);(n.a2uiComponents??=[]).push(e)}for(let e of this.getPluginStatusWidgets()){let n=t(e.pluginId);(n.statusWidgets??=[]).push(e)}for(let e of this.getPluginFileViewers()){let n=t(e.pluginId);(n.fileViewers??=[]).push(e)}return[...e.values()]}};const j=T(`@x-otto/coding:plugin-hooks`),yc=4096;function bc(e,t){let n=mt();return n.OTTO_PLUGIN_DIR=e.pluginDir,n.OTTO_PLUGIN_ID=e.pluginId,e.workspaceDir&&(n.OTTO_WORKSPACE_DIR=e.workspaceDir),t&&Object.assign(n,t),n}function xc(e){let t=ht(e);return t.safe?null:{success:!1,hook:`pre-check`,command:e,error:`Dangerous command blocked: ${t.reason}`}}function Sc(e,t){let n=!1,r,i;if(e?.length){let t=typeof e==`string`?e:e.toString(`utf-8`);r=t.slice(0,yc),n=t.length>yc}if(t?.length){let e=typeof t==`string`?t:t.toString(`utf-8`);i=e.slice(0,yc),n||=e.length>yc}return{stdout:r,stderr:i,truncated:n}}async function Cc(e,t){return xc(t)||(j.info({pluginId:e.pluginId,command:t},`Executing postinstall hook`),new Promise(n=>{let r=$i(t,{cwd:e.pluginDir,env:bc(e),shell:!0,stdio:`pipe`}),i=[],a=[];r.stdout?.on(`data`,e=>{i.push(e)}),r.stderr?.on(`data`,e=>{a.push(e)});let o=!1,s=setTimeout(()=>{o=!0,r.kill()},3e4);r.on(`close`,(r,c)=>{clearTimeout(s);let{stdout:l,stderr:u,truncated:d}=Sc(Buffer.concat(i),Buffer.concat(a)),f={success:!o&&r===0&&c===null,hook:`postinstall`,command:t,exitCode:r,signal:c??void 0,stdout:l,stderr:u,truncated:d||void 0};o&&(f.timeout=!0,f.error=`postinstall hook timed out (30s)`),f.success||j.warn({pluginId:e.pluginId,result:f},`Postinstall hook failed`),n(f)}),r.on(`error`,e=>{clearTimeout(s),n({success:!1,hook:`postinstall`,command:t,error:e.message})})}))}function wc(e,t,n,r,i){let a=xc(t);if(a){j.warn({pluginId:e.pluginId,command:t},`Setup hook blocked by safety check`),n?.(a);return}if(j.info({pluginId:e.pluginId,command:t},`Executing setup hook (async)`),r){let a=r.spawn({command:t,args:[],options:{shell:!0},owner:{type:`plugin-hook`,id:e.pluginId},category:`plugin`,label:`${e.pluginId}:setup`,lifecycle:`evictable`,killGraceMs:5e3,cwd:e.pluginDir,env:bc(e),signal:i}),o=setTimeout(()=>{j.warn({pluginId:e.pluginId},`Setup hook exceeded 60s — killing`),a.kill({reason:`setup timeout (60s)`})},6e4);o.unref?.();let s=``,c=``;a.onStdoutLine(e=>{s+=e+`
11
+ `))r.startsWith(`+`)&&!r.startsWith(`+++`)?t++:r.startsWith(`-`)&&!r.startsWith(`---`)&&n++}return{added:t,removed:n,binaryFiles:r}}function as(e){let{added:t,removed:n,binaryFiles:r}=is(e);return`+${t}/-${n}${r>0?`, ${r} binary file${r===1?``:`s`}`:``}`}const os=/^[a-zA-Z0-9_-]+$/;function ss(e){return{save(t,n){if(!os.test(t))throw Error(`Invalid jobId for applied diff store: ${t}`);y(e,{recursive:!0}),x(C(e,`${t}.patch`),n,`utf-8`)},load(t){let n=C(e,`${t}.patch`);if(v(n))return b(n,`utf-8`)},delete(t){let n=C(e,`${t}.patch`);v(n)&&rt(n)},loadAll(){return v(e)?Xe(e).filter(e=>st(e)===`.patch`).map(t=>({jobId:t.slice(0,-6),diff:b(C(e,t),`utf-8`)})):[]}}}const cs=[`delegate_job`];function ls(e){return e.filter(e=>!cs.includes(e.name))}function us(){return`job_${Li().replace(/-/g,``).slice(0,8)}`}function ds(e){let t=e.outputDir??C(ot(),`otto-jobs`);return e.registry.setWorktreeCleanupErrorHandler((t,n,r)=>e.logger.warn({jobId:t,op:n,err:r instanceof Error?r.message:String(r)},`Failed to clean up agent job worktree`)),new ns({repoRoot:e.repoRoot,registry:e.registry,notify:e.notify,onWorktreeCleanupError:(t,n)=>{e.logger.warn({op:t,err:n instanceof Error?n.message:String(n)},`Failed to clean up agent job worktree`)},appliedDiffStore:e.appliedDiffDir?ss(e.appliedDiffDir):void 0,spawnRun:({runId:t,prompt:n,outputPath:r,workspaceDir:i,onAwaitingInput:a,model:o})=>{let s=o?ms(o,e):void 0;return ts({runId:t,prompt:n,outputPath:r,model:s?.model??e.getModel(),thinkingLevel:s?.thinkingLevel,systemPrompt:e.systemPrompt,tools:[...ls(e.buildTools(i)),...e.mcpTools?.()??[]],maxToolTurns:e.maxToolTurns,stream:e.stream,logger:e.logger,hookRegistry:e.hookRegistry,onAwaitingInput:a})},buildOutputPath:e=>(y(t,{recursive:!0}),C(t,`agent-job-${e}.log`)),newJobId:e.newJobId??us})}const fs=[`low`,`medium`,`high`,`xhigh`,`max`];function ps(e){return fs.includes(e)}function ms(e,t){if(!t.findModel)throw Error(`per-job model is not wired (findModel not injected)`);let n=t.findModel(e.id);if(!n)throw Error(`Model "${e.id}" not found for job (check /model list)`);let r;if(e.thinkingLevel!==void 0){if(!ps(e.thinkingLevel))throw Error(`Invalid thinking level "${e.thinkingLevel}" (expected low|medium|high|xhigh|max)`);r=e.thinkingLevel}return{model:n,thinkingLevel:r}}function hs(e){return ds({repoRoot:e.workspaceDir,registry:hn,notify:(t,n)=>e.agentJobNotify?.(t,n),buildTools:t=>e.buildToolsForWorkspace(t),mcpTools:()=>e.connectorTools(),getModel:()=>{let t=e.settings.get(`model`),n=(t?e.modelRegistry.find(t):void 0)??e.modelRegistry.getAll().find(e=>e.id!==m);if(!n)throw Error(`No model available — configure a model or run /model first.`);return n},findModel:t=>e.modelRegistry.find(t),stream:e.stream,logger:e.logger,hookRegistry:e.hookRegistry,appliedDiffDir:c()?void 0:C(r,`jobs`,`applied`)})}function gs(e){for(let t=e.length-1;t>=0;t--){let n=e[t];if(n?.role!==`assistant`)continue;let r=(n.content??[]).filter(e=>e.type===`text`&&typeof e.text==`string`).map(e=>e.text).join(`
12
+ `).trim();if(r.length>0)return r}return``}function _s(e){for(let t=e.length-1;t>=0;t--){let n=e[t];if(n?.role!==`assistant`)continue;let r=n.stopReason;return r===`refusal`||r===`max_tokens`?r:null}return null}function vs(e){let t=Error(e);return t.name=`AbortError`,t}function ys(e){let t=new Map;return{runSession:async n=>{let r=Date.now(),i=new AbortController;n.taskId&&t.set(n.taskId,i);let a=n.signal,o=()=>i.abort();a&&(a.aborted?i.abort():a.addEventListener(`abort`,o,{once:!0}));let s,c=n.sessionMode===`sticky`&&n.sessionId?e.getSession(n.sessionId):void 0;if(c)s=c;else{let t={agentName:n.agentName,slot:n.slot,modelId:n.model,category:n.category,delegated:!0,promptContext:n.promptContext??(n.agentName?{taskDescription:n.prompt}:void 0),depth:n.depth,parentTaskId:n.parentTaskId,readOnly:n.readOnly};s=await e.createSession(n.sessionMode===`sticky`&&n.sessionId?{...t,id:n.sessionId}:{...t,transient:!0})}let l=s.id,u=Xt(s.coreAgent,{id:l,agentName:n.agentName??`agent`,title:n.agentName??n.prompt.replace(/\s+/g,` `).slice(0,48),prompt:n.prompt,model:n.model??s.model.id,modelDecidedBy:s.modelResolution?.decidedBy,origin:`main`,depth:n.depth??0,abort:()=>s.abort(),messages:()=>s.session.messages()});try{if(i.signal.aborted)throw vs(`Task cancelled before the session started`);let e=n.agentName?`<agent-guardrails>\n${Gn}\n</agent-guardrails>\n\n<task>\n${n.prompt}\n</task>`:n.prompt,t=s.prompt(e);t.catch(()=>{}),await Promise.race([t,new Promise((e,t)=>{i.signal.addEventListener(`abort`,()=>{s.abort(),t(vs(`Task cancelled`))})})]);let a=s.session.messages(),o=gs(a),c=_s(a);return c&&(o=`${o}\n\n[⚠ subagent did not complete cleanly (stop reason: ${c}) — the output above may be partial or unreliable; verify before relying on it]`),{text:o,sessionId:s.id,durationMs:Date.now()-r}}finally{_n.setMessages(l,s.session.messages()),u(),_n.markEnded(l),a?.removeEventListener(`abort`,o),n.taskId&&t.delete(n.taskId),n.sessionMode===`ephemeral`&&await e.removeSession(s.id).catch(t=>{e.logger.warn(`Failed to remove ephemeral session %s: %s`,s.id,t)})}},abortTask:e=>{t.get(e)?.abort()}}}function bs(e){let t=new Vi({focusTracking:process.env.OTTO_TUI_FOCUS===`1`}),n=new Bi({getConfig:e.getConfig,getCwd:e.getCwd,onInteraction:()=>t.recordInteraction(),isFollowUpPending:e.isFollowUpPending,gate:new Ui({getCondition:()=>e.getConfig()?.condition,getIdleThresholdMs:()=>e.getConfig()?.idle_threshold_ms,state:t})});return n.registerChannel(new Hi({getConfig:e.getConfig})),n.registerChannel(new Ri(`hook`,()=>!0,t=>e.emitHookNotification({sessionId:t.sessionId,message:t.message,title:t.title,notification_type:t.type}))),n.registerChannel(new zi({getConfig:e.getConfig,isTrusted:()=>Ai(e.getCwd())})),{dispatcher:n,presenceTracker:t}}function xs(e,t){if(!t||t.length===0)return e;let n=t.map(e=>RegExp(`^`+e.replace(/[.+^${}()|[\]\\]/g,`\\$&`).replace(/\*/g,`.*`)+`$`,`i`));return e.filter(e=>!n.some(t=>t.test(e)))}var Ss=class{catalog;derivedModelIds=new Map;constructor(e,t,n){this.modelRegistry=e,this.authStore=t,this.catalog=n??new f}async hydrate(){let e=new Set,t=await this.catalog.load();if(!t)return e;for(let n of Object.values(t.providers)){let t=de(this.modelRegistry,n.mergeProvider,n.modelIds,{templateApi:n.modelApi});for(let n of t.availableIds)e.add(n);let r=this.derivedModelIds.get(n.mergeProvider)??new Set;for(let e of t.derivedIds)r.add(e);this.derivedModelIds.set(n.mergeProvider,r)}return e}refreshInFlight=null;async refresh(){return this.refreshInFlight||=this.doRefresh().finally(()=>{this.refreshInFlight=null}),this.refreshInFlight}async doRefresh(){let e=this.modelRegistry,t=this.authStore,n=t.listProviders(),r=await Promise.all(n.map(e=>t.getAuthSource(e).catch(()=>null))),i=[];for(let a=0;a<n.length;a++){let o=n[a];if(!r[a]){i.push({provider:o,status:`skipped`,reason:`not authenticated`});continue}let s=await t.resolveAuth(o).catch(()=>null);if(!s?.token){let e=r[a]===`oauth`&&!t.oauth.has(o)?`provider capability not granted — trust the plugin in /extension`:`credential expired or refresh failed — re-login`;i.push({provider:o,status:`skipped`,reason:e});continue}let c=he(o,s.token,{mode:s.mode,beta:s.beta});if(!c){let t=e.getByProvider(o);if(t.length>0){let e=t.map(e=>e.id);await this.catalog.put(o,{fetchedAt:Date.now(),mergeProvider:o,modelIds:e}).catch(()=>{}),i.push({provider:o,status:`ok`,added:0,kept:e.length,total:e.length,availableIds:e})}else i.push({provider:o,status:`skipped`,reason:`no live models endpoint`});continue}try{let t=xs(await le(c),c.modelIdExclude),n=de(e,c.mergeProvider,t,{templateApi:c.modelApi}),r=new Set(n.availableIds),a=this.derivedModelIds.get(c.mergeProvider)??new Set;for(let t of a)r.has(t)||e.unregister(t);this.derivedModelIds.set(c.mergeProvider,new Set([...[...a].filter(e=>r.has(e)),...n.derivedIds])),await this.catalog.put(o,{fetchedAt:Date.now(),mergeProvider:c.mergeProvider,modelApi:c.modelApi,modelIds:t}).catch(()=>{}),i.push({provider:o,status:`ok`,added:n.added,kept:n.kept,total:n.total,availableIds:n.availableIds})}catch(e){i.push({provider:o,status:`failed`,reason:e instanceof Error?e.message:String(e)})}}return i}};function Cs(e){return e.modelRegistry.getAll()}function ws(e,t){return e.modelRegistry.resolve(t)}function Ts(e){return e.providerRegistry.list()}function Es(e,t){e.hookRegistry.register(t)}function Ds(e,t){return e.hookRegistry.unregister(t)}async function Os(e){return e.modelCatalogManager.hydrate()}function ks(e,t){return e.codingSessionPool.getSessionAvailableModels(t)}function As(e,t,n){e.codingSessionPool.setSessionAvailableModels(t,n)}async function js(e){return e.modelCatalogManager.refresh()}async function Ms(e,t){let n=new Set(t?e.codingSessionPool.getSessionAvailableModels(t):[]),r=oe(e.authStore,`delegation`);return Promise.all(e.modelRegistry.getAll().filter(e=>e.id!==m).map(async e=>{let t=await r(e);return{id:e.id,provider:e.provider,strengths:e.strengths??[],available:n.has(e.id),usable:t.usable,...t.reason?{unusableReason:t.reason}:{}}}))}var Ns=class{constructor(e){this.host=e}get modelRegistry(){return this.host.modelRegistry}get authStore(){return this.host.authStore}getAllModels(){return Cs(this.host)}resolveModel(e){return ws(this.host,e)}listProviders(){return Ts(this.host)}hydrateModelCache(){return Os(this.host)}getSessionAvailableModels(e){return ks(this.host,e)}setSessionAvailableModels(e,t){As(this.host,e,t)}refreshModels(){return js(this.host)}buildModelCatalog(e){return Ms(this.host,e)}};function Ps(e,t){e.notificationDispatcher.registerChannel(t)}function Fs(e,t){e.notificationDispatcher.registerChannel(new Ri(`inapp`,()=>!0,e=>t(e.title??`otto`,e.message,e.type)))}function Is(e){e.presenceTracker.recordInteraction()}function Ls(e,t){e.presenceTracker.setFocus(t)}var Rs=class{constructor(e){this.host=e}registerNotificationChannel(e){Ps(this.host,e)}registerInAppNotificationChannel(e){Fs(this.host,e)}notifyUserInteraction(){Is(this.host)}setTerminalFocus(e){Ls(this.host,e)}setFollowUpPendingProbe(e){this.host.setFollowUpPendingProbe?.(e)}};async function zs(e,t,n){if(!t)return;if(n){e.permissionRegistry.addSessionAlwaysAllow(n,t),e.codingSessionPool.setSessionPermissionAllow(n,e.permissionRegistry.getSessionAlwaysAllow(n)),e.logger.info({tool:t,sessionId:n},`Tool added to session always-allow list`);return}let r=e.settings.get(`permission_always_allow`)??[];r.includes(t)||(e.permissionRegistry.addAlwaysAllow(t),await e.settings.persist({permission_always_allow:[...r,t]}),e.logger.info({tool:t},`Tool added to project always-allow list`))}function Bs(e){return e.settings.get(`permission_mode`)??`auto`}async function Vs(e,t){let n=Bs(e);await e.settings.update({permission_mode:t}),e.settings.persist({permission_mode:t}).catch(n=>e.logger.warn({err:n instanceof Error?n.message:String(n),mode:t},`Failed to persist permission mode`)),e.logger.info({from:n,to:t},`Permission mode set`)}function Hs(e,t){return e.permissionRegistry.getSessionAlwaysAllow(t)}async function Us(e,t){if(!t)return!1;let n=e.settings.get(`permission_always_allow`)??[];if(!n.includes(t))return!1;let r=n.filter(e=>e!==t);return e.permissionRegistry.setAlwaysAllow(r),await e.settings.persist({permission_always_allow:r}),e.logger.info({tool:t},`Tool removed from project always-allow list`),!0}function Ws(e,t){t&&(e.permissionRegistry.clearSessionAlwaysAllow(t),e.codingSessionPool.setSessionPermissionAllow(t,[]),e.logger.info({sessionId:t},`Session always-allow list cleared`))}var Gs=class{constructor(e){this.host=e}allowToolAlways(e,t){return zs(this.host,e,t)}disallowToolAlways(e){return Us(this.host,e)}setPermissionMode(e){return Vs(this.host,e)}getPermissionMode(){return Bs(this.host)}getSessionAlwaysAllow(e){return Hs(this.host,e)}clearSessionAlwaysAllow(e){Ws(this.host,e)}bashAlwaysAllowPrefix(e){return Ce(e)}isWellFormedAllowEntry(e){return Ie(e)}get activeSandbox(){return this.host.sandbox?.activeName??null}approveSandboxBypass(e){this.host.sandbox?.approveBypass(e)}getRecentPermissionDecisions(e,t=8){let n=this.host.auditLog;return n?n.getEntries({sessionId:e}).slice(-t).reverse().map(e=>({timestamp:e.timestamp,toolName:e.toolName,...e.filePath===void 0?{}:{filePath:e.filePath},effect:e.decision.effect,policyName:e.decision.policyName})):[]}recordAutoPermissionDecision(e){this.host.auditLog?.recordAutoDecision(e)}};async function Ks(e,t={}){e.ensureNotDisposed(),await e.ensureSettingsLoaded();let n=await e.sessionConfigResolver.resolve(t),r=await e.agentRuntime.createSession(n);return e.notificationDispatcher.attach(r),e.toolsSyncCoordinator?.record(r.id,{agentName:t.agentName,promptPreset:t.promptPreset??(t.agentName?`subagent`:`main`),readOnly:t.readOnly,hasExplicitTools:t.tools!==void 0}),e.logger.info({sessionId:r.id},`Session created`),r}function qs(e,t){return e.codingSessionPool.getSession(t)}async function Js(e,t,n){if(!e.storage.storageHost)throw Error(`shareSession requires a configured storage.host`);await e.storage.storageHost.host.updateMetadata(`sessions`,e.workspaceRef?.key,t,{visibility:n.visibility},void 0),e.logger.info({sessionId:t,visibility:n.visibility},`Session visibility changed`)}function Ys(e){return e.codingSessionPool.active}function Xs(e,t){return e.codingSessionPool.listSessions(t)}async function Zs(e,t){let n=Xs(e,t).filter(t=>{let n=e.codingSessionPool.getSession(t.id);return n?!(n.transient===!0||n.depth>0||n.listable===!1):!0}),r;try{r=t?.workspaceId===void 0?e.workspaceRef?.key:qi(t.workspaceId)}catch{r=void 0}if(!r)return n;let i=await e.codingSessionPool.listAllPersistedSessions({workspaceKey:r}).catch(()=>[]),a=t?.workspaceId??e.workspaceRef?.id,o=new Set(n.map(e=>e.id)),s=i.filter(e=>!o.has(e.id)).map(e=>({...e,workspaceId:a})),c=[...n,...s];return c.sort((e,t)=>{let n=e.updatedAt?.getTime()??e.createdAt.getTime();return(t.updatedAt?.getTime()??t.createdAt.getTime())-n}),c}async function Qs(e,t){e.notificationDispatcher.detach(t);let n=await e.codingSessionPool.removeSession(t);return n&&(e.toolsSyncCoordinator?.forget(t),e.logger.info({sessionId:t},`Session removed`)),n}async function $s(e,t){let n=await e.codingSessionPool.archiveSession(t);return n&&e.logger.info({sessionId:t},`Session archived`),n}async function ec(e,t,n){let r=await e.codingSessionPool.forkSession(t,n);return r&&e.notificationDispatcher.attach(r),r}async function tc(e,t,n){let r=n.current;if(!r)throw Error(`导出归档仅支持关系化 SQLite 后端(sessions.db)。当前后端不支持。`);let i=await xi(e,r);if(!i)throw Error(`会话 ${e.slice(0,8)} 不存在或无法加载`);let a=JSON.stringify(i,null,2),o=Ii(`sha256`).update(a,`utf-8`).digest(`hex`);await Yi(S(t),{recursive:!0}),await Qi(t,a,`utf-8`);let s=await Zi(t,`utf-8`),c=Ii(`sha256`).update(s,`utf-8`).digest(`hex`);if(o!==c)throw Error(`Checksum 校验失败:写入前 sha256=${o.slice(0,16)},读回 sha256=${c.slice(0,16)}。导出文件 ${t} 可能已损坏,操作整体失败。`);return{entryCount:i.entries.length,checksum:o,path:t}}var nc=class{constructor(e){this.host=e}get sessionManager(){return this.host.codingSessionPool}createSession(e={}){return Ks(this.host,e)}getSession(e){return qs(this.host,e)}getActiveSession(){return Ys(this.host)}listSessions(e){return Xs(this.host,e)}listAllSessions(e){return Zs(this.host,e)}removeSession(e){return Qs(this.host,e)}forkSession(e,t){return ec(this.host,e,t)}shareSession(e,t){return Js(this.host,e,t)}archiveSession(e){return $s(this.host,e)}exportSessionArchive(e,t){return tc(e,t,this.host.sessionRepoRef??{})}getResidencyConfig(){return this.host.getResidencyConfig?.()}sweepOrphanTraceFiles(){return this.host.sweepOrphanTraceFiles?.()??Promise.resolve()}},rc=class{contexts=new Map;constructor(e){this.deps=e}record(e,t){t.hasExplicitTools||this.contexts.set(e,{agentName:t.agentName,promptPreset:t.promptPreset,readOnly:t.readOnly})}forget(e){this.contexts.delete(e)}resyncOne(e){let t=this.contexts.get(e);return t?this.resyncSession(e,t):!1}resync(){let e=new Set(this.deps.listSessionIds());for(let t of this.contexts.keys())e.has(t)||this.contexts.delete(t);let t=0;for(let[e,n]of this.contexts)this.resyncSession(e,n)&&t++;return t}resyncSession(e,t){let n=this.deps.getSession(e);if(!n)return!1;try{let e=this.deps.sessionConfigResolver.resolveToolsForResync(t.agentName,t.promptPreset,t.readOnly);return n.model.supportsTools===!1&&(e=[]),n.applyTools(e),!0}catch(t){return this.deps.logger.warn({sessionId:e,err:t instanceof Error?t.message:String(t)},`[session-tools-sync] resync failed for session, skipping (fail-soft)`),!1}}};const ic=T(`@x-otto/coding:plugin-panel-manager`);function ac(e){let t=e.plugins??_r({cwd:e.workspaceDir,homedir:e.homedir,disabled:e.disabledPlugins}),n=[];for(let e of t){let t=e.manifest.contributes?.panels;if(!t||t.length===0)continue;let r=O(e);if(!r.gated){if(!e.manifest.capabilities?.includes(`tui.renderer`)){ic.warn({pluginId:e.id},`plugin declares contributes.panels but not capabilities:["tui.renderer"], skipped (fail-closed)`);continue}if(r.pendingCapabilities.includes(`tui.renderer`)){ic.warn({pluginId:e.id},`plugin capability "tui.renderer" declared but not yet granted, skipping panels (fail-closed)`);continue}for(let r of t){let t=C(e.dir,r.entry);if(!v(t)){ic.warn({pluginId:e.id,panelId:r.id,modulePath:t},`panel entry not found — postinstall build may not have run`);continue}n.push({id:`${e.id}:${r.id}`,pluginId:e.id,title:r.title,modulePath:t,exportName:r.export??`default`})}}}return n}function oc(e){let t=[];for(let n of e){if(O(n).gated)continue;let e=n.manifest.contributes?.statusItems;if(!e?.length)continue;let r=yr(n.manifest.contributes?.contextKeys);for(let i of e){if((i.point??cr.statuslineItem)!==cr.statuslineItem||!xr(i.when,r))continue;let e=r[i.dataSource.contextKey];e!=null&&t.push({item:{id:`${n.id}:${i.id}`,text:e},order:i.order??0})}}return t.sort((e,t)=>e.order-t.order).map(e=>e.item)}function sc(e){let t=[];for(let n of e){if(O(n).gated)continue;let e=n.manifest.contributes;if(!e?.menus?.length)continue;let r=yr(e.contextKeys);t.push(...Rr(cr.menuItem,e.menus,e.actions,r))}return t}const cc={capability:`tui.renderer`,axis:`renderers`,noun:`renderer`,pendingNote:`RFC-140 D3`,logger:T(`@x-otto/coding:plugin-renderer-loader`),entries:e=>e.manifest.contributes?.renderers,entryPath:e=>e.entry,exportName:e=>e.export,idLogFields:e=>({rendererId:e.id}),logTypeofOnNotFunction:!0,build:(e,t,n)=>({id:`${e.id}:${t.id}`,pluginId:e.id,matcher:t.matcher,render:n}),successLogFields:e=>({rendererId:e.id,matcher:e.matcher})};function lc(e){return Mo(e,cc)}const uc=T(`@x-otto/coding:plugin-a2ui-component-loader`),dc=new Set([`Text`,`Card`,`List`,`Progress`,`Chip`,`Button`]),fc={capability:`a2ui.component`,axis:`a2uiComponents`,noun:`a2ui component`,pendingNote:`RFC-140 D3 pattern`,logger:uc,entries:e=>e.manifest.contributes?.a2uiComponents,entryPath:e=>e.entry,exportName:e=>e.export,idLogFields:e=>({type:e.type}),logTypeofOnNotFunction:!1,preCheck:(e,t)=>dc.has(t.type)?(uc.warn({pluginId:e.id,type:t.type},`plugin a2ui component type collides with builtin reserved type, rejected (R4)`),!1):!0,build:(e,t,n)=>({type:t.type,pluginId:e.id,render:n})};function pc(e){return Mo(e,fc,{key:e=>e.type,onConflict:(e,t)=>{uc.warn({pluginId:e.pluginId,type:e.type,existingOwner:t},`a2ui component type already registered by another plugin, rejected (first-registered wins)`)}})}const mc={capability:`tui.renderer`,axis:`statusWidgets`,noun:`status widget`,pendingNote:`RFC-140 D3 pattern`,logger:T(`@x-otto/coding:plugin-status-widget-loader`),entries:e=>e.manifest.contributes?.statusWidgets,entryPath:e=>e.entry,exportName:e=>e.export,idLogFields:e=>({widgetId:e.id}),logTypeofOnNotFunction:!0,build:(e,t,n)=>({id:`${e.id}:${t.id}`,pluginId:e.id,render:n,tickMs:t.tickMs,order:t.order}),successLogFields:e=>({widgetId:e.id})};function hc(e){return Mo(e,mc)}const gc={capability:`tui.renderer`,axis:`fileViewers`,noun:`file viewer`,pendingNote:`RFC-140 D3 pattern`,logger:T(`@x-otto/coding:plugin-file-viewer-loader`),entries:e=>e.manifest.contributes?.fileViewers,entryPath:e=>e.entry,exportName:e=>e.export,idLogFields:e=>({viewerId:e.id}),logTypeofOnNotFunction:!0,build:(e,t,n)=>({id:`${e.id}:${t.id}`,pluginId:e.id,label:t.label,matcher:t.matcher,render:n,order:t.order}),successLogFields:e=>({viewerId:e.id,matcher:e.matcher})};function _c(e){return Mo(e,gc)}var vc=class{constructor(e){this.deps=e}listFileCommands(){return[...this.deps.compatProducts?.fileCommands??[],...this.deps.pluginModuleManager.commands]}computedPluginCommands(){return this.deps.pluginModuleManager.commands}pluginCliCommands(){return this.deps.pluginModuleManager.cliCommands}pluginSlashCommands(){return this.deps.pluginModuleManager.slashCommands}async callMcpTool(e,t,n){let r=this.deps.mcpController.getMcpClient(e);if(!r)throw Error(`MCP server "${e}" not connected or not found`);let i=await r.callTool({name:t,arguments:n});return{content:i.content,isError:i.isError}}getPluginPanelRegistrations(){return ac({workspaceDir:this.deps.getWorkspaceDir(),homedir:at(),disabledPlugins:this.deps.settings.get(`disabled_plugins`),plugins:this.deps.getActivePlugins()})}getPluginStatusItems(){return oc(this.deps.getActivePlugins())}getGlobalMenuItems(){return sc(this.deps.getActivePlugins())}getPluginRenderers(){return lc(this.deps.getActivePlugins())}getPluginA2uiComponents(){return pc(this.deps.getActivePlugins())}getPluginStatusWidgets(){return hc(this.deps.getActivePlugins())}getPluginFileViewers(){return _c(this.deps.getActivePlugins())}getPluginRegistrations(){let e=new Map,t=t=>{let n=e.get(t);return n||(n={pluginId:t},e.set(t,n)),n};for(let e of this.getPluginRenderers()){let n=t(e.pluginId);(n.renderers??=[]).push(e)}for(let e of this.getPluginStatusItems()){let n=t(e.id.split(`:`)[0]??e.id);(n.statusItems??=[]).push(e)}for(let e of this.getPluginPanelRegistrations()){let n=t(e.pluginId);(n.panels??=[]).push(e)}for(let e of this.getPluginA2uiComponents()){let n=t(e.pluginId);(n.a2uiComponents??=[]).push(e)}for(let e of this.getPluginStatusWidgets()){let n=t(e.pluginId);(n.statusWidgets??=[]).push(e)}for(let e of this.getPluginFileViewers()){let n=t(e.pluginId);(n.fileViewers??=[]).push(e)}return[...e.values()]}};const M=T(`@x-otto/coding:plugin-hooks`),yc=4096;function bc(e,t){let n=mt();return n.OTTO_PLUGIN_DIR=e.pluginDir,n.OTTO_PLUGIN_ID=e.pluginId,e.workspaceDir&&(n.OTTO_WORKSPACE_DIR=e.workspaceDir),t&&Object.assign(n,t),n}function xc(e){let t=ht(e);return t.safe?null:{success:!1,hook:`pre-check`,command:e,error:`Dangerous command blocked: ${t.reason}`}}function Sc(e,t){let n=!1,r,i;if(e?.length){let t=typeof e==`string`?e:e.toString(`utf-8`);r=t.slice(0,yc),n=t.length>yc}if(t?.length){let e=typeof t==`string`?t:t.toString(`utf-8`);i=e.slice(0,yc),n||=e.length>yc}return{stdout:r,stderr:i,truncated:n}}async function Cc(e,t){return xc(t)||(M.info({pluginId:e.pluginId,command:t},`Executing postinstall hook`),new Promise(n=>{let r=$i(t,{cwd:e.pluginDir,env:bc(e),shell:!0,stdio:`pipe`}),i=[],a=[];r.stdout?.on(`data`,e=>{i.push(e)}),r.stderr?.on(`data`,e=>{a.push(e)});let o=!1,s=setTimeout(()=>{o=!0,r.kill()},3e4);r.on(`close`,(r,c)=>{clearTimeout(s);let{stdout:l,stderr:u,truncated:d}=Sc(Buffer.concat(i),Buffer.concat(a)),f={success:!o&&r===0&&c===null,hook:`postinstall`,command:t,exitCode:r,signal:c??void 0,stdout:l,stderr:u,truncated:d||void 0};o&&(f.timeout=!0,f.error=`postinstall hook timed out (30s)`),f.success||M.warn({pluginId:e.pluginId,result:f},`Postinstall hook failed`),n(f)}),r.on(`error`,e=>{clearTimeout(s),n({success:!1,hook:`postinstall`,command:t,error:e.message})})}))}function wc(e,t,n,r,i){let a=xc(t);if(a){M.warn({pluginId:e.pluginId,command:t},`Setup hook blocked by safety check`),n?.(a);return}if(M.info({pluginId:e.pluginId,command:t},`Executing setup hook (async)`),r){let a=r.spawn({command:t,args:[],options:{shell:!0},owner:{type:`plugin-hook`,id:e.pluginId},category:`plugin`,label:`${e.pluginId}:setup`,lifecycle:`evictable`,killGraceMs:5e3,cwd:e.pluginDir,env:bc(e),signal:i}),o=setTimeout(()=>{M.warn({pluginId:e.pluginId},`Setup hook exceeded 60s — killing`),a.kill({reason:`setup timeout (60s)`})},6e4);o.unref?.();let s=``,c=``;a.onStdoutLine(e=>{s+=e+`
13
13
  `}),a.onStderrLine(e=>{c+=e+`
14
- `}),a.onExit(r=>{clearTimeout(o);let{stdout:i,stderr:a,truncated:l}=Sc(s,c),u={success:r.code===0&&r.signal===null,hook:`setup`,command:t,exitCode:r.code,signal:r.signal??void 0,stdout:i,stderr:a,truncated:l||void 0};u.success?j.info({pluginId:e.pluginId},`Setup hook succeeded`):j.error({pluginId:e.pluginId,exitCode:r.code,signal:r.signal,stderr:a?.slice(0,512)},`Setup hook failed`),n?.(u)}),a.onError(r=>{j.error({pluginId:e.pluginId,err:r},`Setup hook spawn error`),n?.({success:!1,hook:`setup`,command:t,error:r.message})});return}let o=$i(t,{cwd:e.pluginDir,env:bc(e),shell:!0,timeout:6e4,stdio:`pipe`}),s=``,c=``;o.stdout?.on(`data`,e=>{s+=e.toString(`utf-8`)}),o.stderr?.on(`data`,e=>{c+=e.toString(`utf-8`)}),o.on(`close`,(r,i)=>{let{stdout:a,stderr:o,truncated:l}=Sc(s,c),u={success:r===0&&i===null,hook:`setup`,command:t,exitCode:r,signal:i,stdout:a,stderr:o,truncated:l||void 0};u.success?j.info({pluginId:e.pluginId},`Setup hook succeeded`):j.error({pluginId:e.pluginId,exitCode:r,signal:i,stderr:o?.slice(0,512)},`Setup hook failed`),n?.(u)}),o.on(`error`,r=>{j.error({pluginId:e.pluginId,err:r},`Setup hook spawn error`),n?.({success:!1,hook:`setup`,command:t,error:r.message})})}const Tc=T(`@x-otto/coding:plugin-lifecycle`),Ec=`plugin_lifecycle`,Dc=new Set;async function Oc(e,t,n){let r=t.get(Ec)?.setupDone??[],i=new Map(r.map(e=>[e.id,e.version])),a=new Set(e.map(e=>e.id));for(let e of i.keys())a.has(e)||i.delete(e);let o=!1;for(let r of e){let e=i.get(r.id),a=r.manifest.version,s=r.manifest.scripts?.setup;if(!s){(e===void 0||e!==a)&&(i.set(r.id,a),o=!0);continue}if(!(e!==void 0&&e===a)){if(O(r).gated){Tc.info({pluginId:r.id},`Setup hook deferred: plugin not yet trusted`);continue}Dc.has(r.id)||(Dc.add(r.id),wc({pluginDir:r.dir,pluginId:r.id,workspaceDir:n},s,e=>{Dc.delete(r.id),i.set(r.id,a),kc(t,i)},E))}}o&&await kc(t,i)}async function kc(e,t){let n=[...t].map(([e,t])=>({id:e,version:t}));await e.persist({[Ec]:{setupDone:n}})}function Ac(e,t){let n;try{n=Qe(t)}catch{return!1}let r;try{r=Qe(e)}catch{r=e}return r===n||r.startsWith(n+ut)}const jc=T(`@x-otto/coding:plugin-i18n-loader`),Mc=/^([a-zA-Z0-9_-]+)\.json$/;function Nc(e){return Buffer.byteLength(e,`utf8`)<=tr?e:`${Buffer.from(e,`utf8`).subarray(0,tr).toString(`utf8`)}…`}function Pc(e,t,n){let r=new Map,i=w(t,n);if(!Ac(i,t))return jc.warn({pluginId:e,i18nDir:n},`i18nDir resolves outside plugin dir, skipped`),r;let a;try{a=Xe(i)}catch{return r}let o=a.filter(e=>Mc.test(e)).sort();o.length>er&&(jc.warn({pluginId:e,i18nDir:n,declared:o.length,limit:er},`plugin i18nDir declares more locale files than the per-plugin limit, truncated`),o=o.slice(0,er));for(let n of o){let a=Mc.exec(n)?.[1];if(!a)continue;let o=w(i,n);if(!Ac(o,t)){jc.warn({pluginId:e,filename:n},`i18nDir locale file resolves outside plugin dir, skipped`);continue}let s;try{s=b(o,`utf8`)}catch(t){jc.warn({pluginId:e,filename:n,err:String(t)},`i18nDir locale file read failed, skipped`);continue}if(Buffer.byteLength(s,`utf8`)>$n){jc.warn({pluginId:e,filename:n,limit:$n},`i18nDir locale file exceeds byte limit, skipped`);continue}let c;try{c=JSON.parse(s)}catch(t){jc.warn({pluginId:e,filename:n,err:String(t)},`i18nDir locale file is not valid JSON, skipped`);continue}if(typeof c!=`object`||!c||Array.isArray(c)){jc.warn({pluginId:e,filename:n},`i18nDir locale file is not a flat object, skipped`);continue}for(let[e,t]of Object.entries(c)){if(typeof t!=`string`)continue;let n=r.get(e)??{};n[a]=t,r.set(e,n)}}return r}function Fc(e){let t=[];for(let n of e){if(O(n).gated)continue;let e=n.manifest.contributes?.i18nDir,r=n.manifest.contributes?.i18n;if(!e&&!r?.length)continue;let i=e?Pc(n.id,n.dir,e):new Map;if(r?.length)for(let e of r){let t=i.get(e.id)??{};for(let[r,i]of Object.entries(e.translations))r in t&&jc.debug({pluginId:n.id,id:e.id,locale:r},`i18n inline entry overrides locale dir value`),t[r]=i;i.set(e.id,t)}let a=[...i.keys()];a.length>Qn&&(jc.warn({pluginId:n.id,declared:a.length,limit:Qn},`plugin declares more i18n entries than the per-plugin limit, truncated`),a=a.slice(0,Qn));for(let e of a){let r=i.get(e);if(!r)continue;let a={};for(let[e,t]of Object.entries(r))a[e]=Nc(t);t.push({pluginId:n.id,id:e,translations:a})}}return t}const Ic=T(`@x-otto/coding:declarative-agents`);function Lc(e){return{...e,defaultTools:e.defaultTools?.length?_t(e.defaultTools):e.defaultTools,disallowedTools:e.disallowedTools?.length?_t(e.disallowedTools):e.disallowedTools}}function Rc(e,t){let n=xt(e);if(!n)return Ic.warn({sourcePath:t},`Agent definition missing frontmatter, skipped`),null;let{fields:r,body:i}=n,a=r.get(`name`),o=r.get(`description`);if(!a||!o||!i)return Ic.warn({sourcePath:t},`Agent definition requires name/description/body, skipped`),null;let s=yt(r.get(`tools`)),c=Number.parseInt(r.get(`maxtoolturns`)??``,10),l=Number.parseInt(r.get(`maxtoolturnextensions`)??``,10),u=r.get(`prompt-mode`),d=yt(r.get(`disallowed-tools`)),f=r.get(`allow-subagents`)===`true`?!0:r.get(`allow-subagents`)===`false`?!1:void 0;return{name:a,description:o,taskTypes:yt(r.get(`tasktypes`))??[o],capabilities:yt(r.get(`capabilities`))??[],systemPromptTemplate:i,promptMode:u===`append`||u===`replace`?u:void 0,defaultTools:s,disallowedTools:d?.length?d:void 0,preferredModelTier:r.get(`slot`)??r.get(`tier`),defaultMaxToolTurns:Number.isInteger(c)?c:void 0,defaultMaxToolTurnExtensions:Number.isInteger(l)?l:void 0,allowSubagents:f}}async function zc(e,t){let{homedir:n}=await import(`node:os`),{join:r}=await import(`node:path`),i=t?.globalDir??r(n(),`.otto`,`agents`),a=r(e,`.otto`,`agents`),o=(t?.plugins??gr({cwd:e,homedir:n()})).filter(e=>e.manifest.contributes?.agents!==!1).filter(e=>!O(e).gated).map(e=>({dir:r(e.dir,`agents`),claude:!1})),c=s(),l=c&&(t?.claudeProjectAgentsAllowed??!1),u=[...o,...c?[{dir:r(n(),`.claude`,`agents`),claude:!0}]:[],{dir:i,claude:!1},...l?[{dir:r(e,`.claude`,`agents`),claude:!0}]:[],{dir:a,claude:!1}],d=new Map;for(let{dir:e,claude:t}of u)for(let n of await Bc(e))d.set(n.name,t?Lc(n):n);let f=[...d.values()];return f.length>0&&Ic.info(`Loaded %d declarative agent(s): %s`,f.length,f.map(e=>e.name).join(`, `)),f}async function Bc(e){let{readFile:t,readdir:n}=await import(`node:fs/promises`),{join:r}=await import(`node:path`),i;try{i=await n(e)}catch{return[]}let a=[];for(let n of i.filter(e=>e.endsWith(`.md`)).sort()){let i=r(e,n);try{let e=Rc(await t(i,`utf-8`),i);e&&a.push(e)}catch(e){Ic.warn({sourcePath:i,err:e},`Failed to read agent definition, skipped`)}}return a}const Vc=T(`@x-otto/coding:declarative-teams`),Hc=new Set([`handoff`,`sequential`,`parallel`,`hierarchical`,`router`]);function Uc(e){if(!e)return;let t=[];for(let n of e.split(`|`)){let[e,r]=n.split(/→|->/);if(e===void 0||r===void 0)continue;let i=e.split(`,`).map(e=>e.trim().toLowerCase()).filter(e=>e!==``),a=r.trim();i.length>0&&a!==``&&t.push({keywords:i,agentId:a})}return t.length>0?t:void 0}function Wc(e,t){let n=xt(e);if(!n)return Vc.warn({sourcePath:t},`Team definition missing frontmatter, skipped`),null;let{fields:r}=n,i=r.get(`name`),a=r.get(`pattern`),o=yt(r.get(`agents`));if(!i||!a||!Hc.has(a)||!o||o.length===0)return Vc.warn({sourcePath:t},`Team definition requires name, valid pattern and non-empty agents, skipped`),null;let s=Number.parseInt(r.get(`maxhandoffdepth`)??``,10);return{name:i,pattern:a,agentNames:o,pipeline:yt(r.get(`pipeline`)),supervisorId:r.get(`supervisor`),entryAgentId:r.get(`entry`),routerStrategy:r.get(`router`),rules:Uc(r.get(`rules`)),maxHandoffDepth:Number.isInteger(s)?s:void 0}}async function Gc(e,t){let{homedir:n}=await import(`node:os`),{join:r}=await import(`node:path`),i=t?.globalDir??r(n(),`.otto`,`teams`),a=r(e,`.otto`,`teams`),o=new Map;for(let e of[i,a])for(let t of await Kc(e))o.set(t.name,t);let s=[...o.values()];return s.length>0&&Vc.info(`Loaded %d declarative team(s): %s`,s.length,s.map(e=>e.name).join(`, `)),s}async function Kc(e){let{readFile:t,readdir:n}=await import(`node:fs/promises`),{join:r}=await import(`node:path`),i;try{i=await n(e)}catch{return[]}let a=[];for(let n of i.filter(e=>e.endsWith(`.md`)).sort()){let i=r(e,n);try{let e=Wc(await t(i,`utf-8`),i);e&&a.push(e)}catch(e){Vc.warn({sourcePath:i,err:e},`Failed to read team definition, skipped`)}}return a}var qc=class{reloadQueue=Promise.resolve();constructor(e,t,n,r,i,a,o,s,c,l,u){this.settings=e,this.mcp=t,this.skills=n,this.pluginModules=r,this.pluginProviders=i,this.tools=a,this.modelCatalog=o,this.workspaceDir=s,this.activePlugins=c,this.i18n=l,this.getCompatTrustGated=u}async reload(){let e=this.reloadQueue.then(()=>this.reloadSerial());return this.reloadQueue=e.catch(()=>void 0),e}async reloadSerial(){await this.settings.load(),Oc(this.activePlugins(),this.settings,this.workspaceDir),await this.mcp.reload(),this.skills&&(this.skills.updatePluginDirs(this.activePlugins().filter(e=>e.manifest.contributes?.skills!==!1).filter(e=>!O(e).gated).map(e=>({id:e.id,dir:C(e.dir,`skills`)}))),await this.skills.discover());let e=Fc(this.activePlugins());this.i18n.register(e);let t=(await this.modelCatalog.refresh().catch(()=>[])).reduce((e,t)=>e+(t.added??0),0),n=await zc(this.workspaceDir,{plugins:this.activePlugins(),claudeProjectAgentsAllowed:this.getCompatTrustGated?!this.getCompatTrustGated():void 0}),r=await Gc(this.workspaceDir),i=[],a=[];try{a=await this.pluginModules.reload(new Set(n.map(e=>e.name)))}catch(e){i.push({path:`pluginModules`,error:e instanceof Error?e.message:String(e)})}n.push(...a);let o={pendingCapabilityPluginIds:[]};try{o=await this.pluginProviders.reload()}catch(e){i.push({path:`pluginProviders`,error:e instanceof Error?e.message:String(e)})}return{mcpTools:this.tools.getAvailable(`full`).filter(e=>e.name.startsWith(`mcp__`)).length,models:t,agents:n.length,teamCount:r.length,agentProfiles:n,teamDeclarations:r,pendingProviderCapabilities:o.pendingCapabilityPluginIds,i18nEntries:e.length,...i.length>0?{reloadFailures:i}:{}}}};const Jc=T(`@x-otto/coding:panel-backend-controller`);var Yc=class{stateListeners=new Map;statusListeners=new Map;inProcessHandlers=new Map;subscribedManager=null;constructor(e){this.deps=e}registerInProcessBackend(e,t){this.inProcessHandlers.set(e,t);let n=this.statusListeners.get(e);if(n)for(let e of n)e(`ready`)}unregisterInProcessBackend(e){this.inProcessHandlers.delete(e)}resolveServerForPlugin(e){if(this.inProcessHandlers.has(e))return{ok:!0};let t=this.deps.getActivePlugins().find(t=>t.id===e);if(!t)return{ok:!1,reason:`plugin "${e}" not found or not active`};if(!t.manifest.capabilities?.includes(`panel.backend`))return{ok:!1,reason:`plugin "${e}" does not declare capabilities:["panel.backend"]`};let n=O(t);if(n.pendingCapabilities.includes(`panel.backend`))return{ok:!1,reason:`plugin "${e}" capability "panel.backend" declared but not yet granted`};if(n.gated)return{ok:!1,reason:`plugin "${e}" is untrusted`};let r=this.deps.mcpController.listEffectiveServers(),i=Object.entries(r).filter(([,t])=>t.pluginId===e);return i.length===0?{ok:!1,reason:`plugin "${e}" has no associated MCP server`}:(i.length>1&&Jc.warn({pluginId:e,serverNames:i.map(([e])=>e)},`plugin contributes multiple MCP servers; panel backend uses the first match (multi-server routing not yet supported)`),{ok:!0,serverName:i[0][0]})}async call(e,t,n,r){let i=this.inProcessHandlers.get(e);if(i)return i(t,n);let a=this.resolveServerForPlugin(e);if(!a.ok||!a.serverName)throw Error(a.reason??`cannot resolve backend server for plugin "${e}"`);let o=this.deps.mcpController.getMcpClient(a.serverName);if(!o)throw Error(`MCP server "${a.serverName}" for plugin "${e}" is not connected`);let s=r?.operationId?{...n,__operationId:r.operationId}:n;return o.callRaw(t,s,r?.signal)}async cancel(e,t){if(this.inProcessHandlers.has(e))return;let n=this.resolveServerForPlugin(e);if(!n.ok||!n.serverName)return;let r=this.deps.mcpController.getMcpClient(n.serverName);r&&await r.callRaw(`backend/cancel`,{id:t}).catch(()=>void 0)}subscribeState(e,t){return this.ensureNotificationSubscription(),this.stateListeners.has(e)||this.stateListeners.set(e,new Set),this.stateListeners.get(e).add(t),()=>{this.stateListeners.get(e)?.delete(t)}}onStatusChange(e,t){return this.ensureNotificationSubscription(),this.statusListeners.has(e)||this.statusListeners.set(e,new Set),this.statusListeners.get(e).add(t),()=>{this.statusListeners.get(e)?.delete(t)}}getStatus(e){if(this.inProcessHandlers.has(e))return`ready`;let t=this.resolveServerForPlugin(e);if(!t.ok||!t.serverName||this.deps.mcpController.listEffectiveServers()[t.serverName]?.disabled)return`disabled`;let n=this.deps.mcpController.getMcpClient(t.serverName);if(!n)return`crashed`;let r=n.getStatus();return r===`ready`?`ready`:r===`connecting`||r===`reconnecting`?`connecting`:`crashed`}notifyReload(){this.ensureNotificationSubscription();for(let[e,t]of this.statusListeners){if(t.size===0)continue;let n=this.getStatus(e);for(let e of t)e(n)}}ensureNotificationSubscription(){let e=this.deps.mcpController.manager;if(this.subscribedManager===e||(this.subscribedManager=e,!e))return;e.on(`server.notification`,({name:e,method:t,params:n})=>{if(t!==`backend/state`)return;let r=this.pluginIdForServer(e);if(!r)return;let i=this.stateListeners.get(r);if(!(!i||i.size===0))for(let e of i)e(n??{})});let t=e=>{let t=this.pluginIdForServer(e);if(!t)return;let n=this.statusListeners.get(t);if(!n||n.size===0)return;let r=this.getStatus(t);for(let e of n)e(r)};e.on(`server.connected`,({name:e})=>t(e)),e.on(`server.disconnected`,({name:e})=>t(e))}pluginIdForServer(e){return this.deps.mcpController.listEffectiveServers()[e]?.pluginId}};const Xc=T(`@x-otto/coding:plugin-log-writer`);function Zc(){return w(r,`plugin-logs`)}function Qc(e){return Zn.test(e)?C(Zc(),`${e}.jsonl`):(Xc.warn({pluginId:e},`plugin id failed kebab-case validation, skipping log path resolution`),null)}function $c(e){let t;try{t=tt(e).size}catch{return}if(!(t<=5242880))try{let t=b(e,`utf8`),n=Math.floor(t.length/2),r=t.indexOf(`
15
- `,n);x(e,r>=0?t.slice(r+1):t.slice(n))}catch(t){Xc.warn({path:e,err:String(t)},`plugin log truncation failed (fail-soft)`)}}function el(e,t,n){if(!c())try{let r=Qc(e);if(!r)return;let i=Zc();v(i)||y(i,{recursive:!0}),$c(r),Ue(r,`${JSON.stringify({ts:Date.now(),level:t,pluginId:e,msg:n})}\n`)}catch(t){Xc.warn({pluginId:e,err:String(t)},`plugin log append failed (fail-soft)`)}}const tl=T(`@x-otto/coding:plugin-tool-wiring`);function M(e,t){return`plugin:${e}:${t}`}function nl(e){let t=e.split(`:`);return t.length<3||t[0]!==`plugin`?null:t[1]||null}function rl(e){let t=e?.content;return typeof t==`string`?t:Array.isArray(t)?t.map(e=>e&&typeof e==`object`&&`text`in e?String(e.text):``).join(``):``}const N={preToolUse:`tool.execute.before`,postToolUse:`tool.execute.after`,userPromptSubmit:`chat.message.before`,sessionStart:`session.created`,stop:`stream.end`,sessionRestored:`session.restored`,sessionDeleted:`session.deleted`,sessionIdle:`session.idle`,sessionError:`session.error`,streamStart:`stream.start`,compactionPending:`compaction.before`,compactionOccurred:`compaction.after`,taskCreated:`task.created`,taskStarted:`task.started`,taskCompleted:`task.completed`,taskFailed:`task.failed`,taskCancelled:`task.cancelled`,onNotification:`notification`};function il(e,t){let n=[];if(t.preToolUse){let r=t.preToolUse;n.push(k({name:M(e,`preToolUse`),timing:N.preToolUse,handle:async(t,n)=>{let i=await r({toolName:t.toolName,input:t.args,paths:t.paths,readonly:t.readonly,sessionId:t.sessionId});i&&(i.decision===`deny`?(n.decision=`deny`,n.cancelled=!0,n.cancelReason=i.reason??`denied by plugin ${e}`):i.decision===`ask`&&(n.decision=`ask`,n.decisionReason=i.reason??`requires approval (plugin ${e})`))}}))}if(t.postToolUse){let r=t.postToolUse;n.push(k({name:M(e,`postToolUse`),timing:N.postToolUse,handle:async e=>{await r({toolName:e.toolName,input:e.args,result:e.result,readonly:e.readonly,sessionId:e.sessionId})}}))}if(t.userPromptSubmit){let r=t.userPromptSubmit;n.push(k({name:M(e,`userPromptSubmit`),timing:N.userPromptSubmit,handle:async e=>{await r({prompt:rl(e.message)})}}))}if(t.sessionStart){let r=t.sessionStart;n.push(k({name:M(e,`sessionStart`),timing:N.sessionStart,handle:async()=>{await r()}}))}if(t.stop){let r=t.stop;n.push(k({name:M(e,`stop`),timing:N.stop,handle:async()=>{await r()}}))}if(t.sessionRestored){let r=t.sessionRestored;n.push(k({name:M(e,`sessionRestored`),timing:N.sessionRestored,handle:async e=>{await r({sessionId:e.sessionId})}}))}if(t.sessionDeleted){let r=t.sessionDeleted;n.push(k({name:M(e,`sessionDeleted`),timing:N.sessionDeleted,handle:async e=>{await r({sessionId:e.sessionId})}}))}if(t.sessionIdle){let r=t.sessionIdle;n.push(k({name:M(e,`sessionIdle`),timing:N.sessionIdle,handle:async e=>{await r({sessionId:e.sessionId})}}))}if(t.sessionError){let r=t.sessionError;n.push(k({name:M(e,`sessionError`),timing:N.sessionError,handle:async e=>{await r({sessionId:e.sessionId,error:e.error})}}))}if(t.streamStart){let r=t.streamStart;n.push(k({name:M(e,`streamStart`),timing:N.streamStart,handle:async e=>{await r({sessionId:e.sessionId,model:e.model})}}))}if(t.compactionPending){let r=t.compactionPending;n.push(k({name:M(e,`compactionPending`),timing:N.compactionPending,handle:async e=>{await r({sessionId:e.sessionId,messageCount:e.messageCount})}}))}if(t.compactionOccurred){let r=t.compactionOccurred;n.push(k({name:M(e,`compactionOccurred`),timing:N.compactionOccurred,handle:async e=>{await r({sessionId:e.sessionId,retainedCount:e.retainedCount})}}))}if(t.taskCreated){let r=t.taskCreated;n.push(k({name:M(e,`taskCreated`),timing:N.taskCreated,handle:async e=>{await r({taskId:e.task.id})}}))}if(t.taskStarted){let r=t.taskStarted;n.push(k({name:M(e,`taskStarted`),timing:N.taskStarted,handle:async e=>{await r({taskId:e.task.id,agent:e.agent})}}))}if(t.onNotification){let r=t.onNotification;n.push(k({name:M(e,`onNotification`),timing:N.onNotification,handle:async e=>{await r({sessionId:e.sessionId,message:e.message,title:e.title,notification_type:e.notification_type})}}))}if(t.taskCompleted){let r=t.taskCompleted;n.push(k({name:M(e,`taskCompleted`),timing:N.taskCompleted,handle:async e=>{await r({taskId:e.task.id,status:e.task.status,durationMs:e.result.durationMs,tokenUsage:e.result.tokenUsage})}}))}if(t.taskFailed){let r=t.taskFailed;n.push(k({name:M(e,`taskFailed`),timing:N.taskFailed,handle:async e=>{await r({taskId:e.task.id,error:e.error.message})}}))}if(t.taskCancelled){let r=t.taskCancelled;n.push(k({name:M(e,`taskCancelled`),timing:N.taskCancelled,handle:async e=>{await r({taskId:e.taskId})}}))}if(t.waterfall)for(let r of Object.keys(t.waterfall)){if(!na(r)){tl.warn({pluginId:e,timing:r},`plugin waterfall timing not in whitelist, rejected (fail-closed)`),el(e,`warn`,`waterfall timing "${r}" not in whitelist, rejected (fail-closed)`);continue}let i=t.waterfall[r];i&&n.push(k({name:M(e,`waterfall:${r}`),timing:r,handle:async(t,n)=>r===`system.prompt.transform`?al(e,i,t,n):ol(e,r,i,t,n)}))}return n}async function al(e,t,n,r){let i=r.systemTail?[...r.systemTail]:[],a=r.systemPrompt,o=await t(n,r),s=!1,c=!1,l=!1;r.systemPrompt!==a&&(s=!0,r.systemPrompt=a);let u=Array.isArray(r.systemTail)?r.systemTail:void 0;if(u===void 0)i.length>0&&(c=!0,r.systemTail=[...i]);else if(!i.every((e,t)=>u[t]===e))c=!0,r.systemTail=[...i];else{let e=u.slice(i.length),t=[...i],n=4096;for(let r of e){if(n<=0){l=!0;break}let e=cl(r,n);if(e.truncated){l=!0,t.push(`${e.content}${ll}`);break}t.push(e.content),n-=Buffer.byteLength(e.content,`utf8`)}r.systemTail=t}if(s||c||l||ul(i,r.systemTail)){let t=(r.systemTail?.length??0)-i.length,a=[s?`systemPrompt-write-rejected`:null,c?`systemTail-destructive-rejected`:null,t>0?`systemTail:+${t}el`:null,l?`systemTail-truncated`:null].filter(e=>e!==null).join(`, `);sl(e,`system.prompt.transform`,n.sessionId,a)}return o}async function ol(e,t,n,r,i){let a=dl(i),o=await n(r,i),s=fl(t,a,i);return s&&sl(e,t,(typeof r==`object`&&r&&`sessionId`in r?String(r.sessionId??``):void 0)||void 0,s),o}function sl(e,t,n,r){let i=r.length>400?`${r.slice(0,400)}…`:r;tl.info({pluginId:e,timing:t,...n?{sessionId:n}:{}},`plugin waterfall rewrite: ${i}`)}function cl(e,t){let n=Buffer.from(e,`utf8`);if(n.length<=t)return{content:e,truncated:!1};let r=Math.max(0,t);for(;r>0&&r<n.length;){let e=n[r];if(e===void 0||(e&192)!=128)break;r--}return{content:n.subarray(0,r).toString(`utf8`).trimEnd(),truncated:!0}}const ll=`
16
- [context truncated: budget exceeded]`;function ul(e,t){return t===void 0?e.length>0:e.length!==t.length||e.some((e,n)=>e!==t[n])}function dl(e){if(typeof e!=`object`||!e)return{};let t={};for(let n of Object.keys(e))t[n]=e[n];return t}function fl(e,t,n){if(typeof n!=`object`||!n)return;let r=n,i=Object.keys(r).filter(e=>r[e]!==t[e]);if(i.length!==0)return e===`chat.params`?`fields:[${i.join(`, `)}]`:`messages:${Array.isArray(t.messages)?t.messages.length:`n/a`}→${Array.isArray(r.messages)?r.messages.length:`n/a`}`}function pl(e,t,n,r){return r.map(r=>({name:r.name,description:r.description,argumentHint:r.argumentHint,allowedTools:r.allowedTools,model:r.model,body:r.body,source:`plugin`,scope:t===`bundled`?`project`:t,pluginId:e,filePath:`${n}#computed:${r.name}`}))}function ml(e){return e.map(e=>({name:e.name,description:e.description,taskTypes:e.taskTypes??[],capabilities:e.capabilities??[],systemPromptTemplate:e.systemPromptTemplate,...e.promptMode?{promptMode:e.promptMode}:{},...e.defaultTools?{defaultTools:e.defaultTools}:{},...e.disallowedTools?{disallowedTools:e.disallowedTools}:{},...e.preferredModelTier?{preferredModelTier:e.preferredModelTier}:{},...e.allowSubagents===void 0?{}:{allowSubagents:e.allowSubagents}}))}function hl(e,t,n){return n.map(n=>({definition:{metadata:{name:n.name,description:n.description??``},body:n.body,directory:t,filePath:`${t}#computed:${n.name}`,supportingFiles:[]},source:{type:`plugin`,root:t,id:e}}))}function gl(e,t){return t instanceof dt?t.pluginSource===void 0?new t.constructor(t.message,{code:t.code,cause:t.cause,status:t.status,headers:t.headers,errorType:t.errorType,pluginSource:e}):t:new ft(t instanceof Error?t.message:String(t),{code:`PROVIDER_PLUGIN_ERROR`,cause:t instanceof Error?t:void 0,pluginSource:e})}function _l(e,t){return()=>{let n=t();return{...n,async*converse(t,r,i,a){try{for await(let o of n.converse(t,r,i,a))o.type===`error`?yield{type:`error`,error:gl(e,o.error)}:yield o}catch(t){throw gl(e,t)}}}}}function vl(e,t){try{return t()}catch(t){let n=String(t);return tl.warn({pluginId:e,err:n},`plugin oauthProviderFactory threw, skipped`),el(e,`warn`,`oauthProviderFactory threw, skipped: ${n}`),null}}function yl(e){return e&&typeof e==`object`&&Array.isArray(e.content)?e:{content:[{type:`text`,text:typeof e==`string`?e:JSON.stringify(e??null)}]}}function bl(e,t,n){let r=t;if(!r||typeof r!=`object`)return tl.warn({pluginId:e},`plugin tool entry is not an object, skipped`),null;if(typeof r.name!=`string`||!r.name)return tl.warn({pluginId:e},`plugin tool missing valid name, skipped`),null;if(typeof r.execute!=`function`)return tl.warn({pluginId:e,tool:r.name},`plugin tool missing execute function, skipped`),null;if(!r.parameters||typeof r.parameters.safeParse!=`function`)return tl.warn({pluginId:e,tool:r.name},`plugin tool missing valid parameters.safeParse, skipped`),null;typeof r.parameters.toJSONSchema!=`function`&&tl.warn({pluginId:e,tool:r.name},`plugin tool parameters missing toJSONSchema — model-side schema will be empty {}`);let i=r.name,a=r.description??``,o=r.parameters,s=r.execute,c=r.resolvePath?e=>r.resolvePath(e,n?.workspaceDir??``):void 0;return{name:i,description:a,parameters:o,...r.exposure!==void 0&&{exposure:r.exposure},...r.pathParams!==void 0&&{pathParams:r.pathParams},...r.readonly!==void 0&&{readonly:r.readonly},...r.regenerableOutput!==void 0&&{regenerableOutput:r.regenerableOutput},...c&&{resolvePath:c},async execute(t){try{let r={pluginId:e,workspaceDir:n?.workspaceDir??``,logger:n?.logger??{info:()=>{},warn:()=>{},error:()=>{}},host:n?.host,signal:t.signal,storage:n?.storage},i=yl(await s(t.params,r));return i.isError?{...i,pluginSource:e}:i}catch(t){throw t instanceof Error&&Object.assign(t,{pluginSource:e}),t}}}}function xl(e,t){let n=[],r=async(t,n)=>{try{await t.onEvent(n)}catch(n){tl.warn({pluginId:e,monitorId:t.id,err:String(n)},`plugin monitor onEvent threw, isolated`)}};for(let i of t)n.push(k({name:M(e,`monitor:${i.id}:stream.end`),timing:`stream.end`,handle:async e=>{e.tokenUsage&&await r(i,{type:`turn.completed`,sessionId:e.sessionId,tokenUsage:{input:e.tokenUsage.input,output:e.tokenUsage.output}})}})),n.push(k({name:M(e,`monitor:${i.id}:compaction.after`),timing:`compaction.after`,handle:async e=>{await r(i,{type:`compaction.occurred`,sessionId:e.sessionId})}})),n.push(k({name:M(e,`monitor:${i.id}:session.error`),timing:`session.error`,handle:async e=>{await r(i,{type:`error`,sessionId:e.sessionId,message:e.error})}}));return n}function Sl(e){return{...e}}var Cl=class{stats=new Map;clock;constructor(e=()=>Date.now()){this.clock=e}ensure(e){let t=this.stats.get(e);return t||(t={pluginId:e,hookTimeouts:0,toolTimeouts:0},this.stats.set(e,t)),t}recordHookTimeout(e,t){let n=this.ensure(e);n.hookTimeouts++,n.lastTimeoutHook=t}recordToolTimeout(e){let t=this.ensure(e);t.toolTimeouts++}recordError(e,t){let n=this.ensure(e);n.lastError={message:t,timestamp:this.clock()}}query(e){let t=this.stats.get(e);return t?Sl(t):{pluginId:e,hookTimeouts:0,toolTimeouts:0}}all(){return[...this.stats.values()].map(Sl)}clear(){this.stats.clear()}};function wl(e){return new Cl(e)}const Tl=3600*1e3;function El(){return{authorizedSessionIds:new Set,readCountThisEpoch:0,llmCountThisEpoch:0,llmCallTimes:[],notifyTimes:[]}}var Dl=class{states=new Map;constructor(e=()=>Date.now()){this.now=e}stateOf(e){let t=this.states.get(e);return t||(t=El(),this.states.set(e,t)),t}onNotifyDelivered(e,t){let n=this.stateOf(e);n.authorizedSessionIds.add(t),n.readCountThisEpoch=0,n.llmCountThisEpoch=0}isSessionAuthorized(e,t){return this.stateOf(e).authorizedSessionIds.has(t)}tryConsumeRead(e){let t=this.stateOf(e);return t.readCountThisEpoch>=1?!1:(t.readCountThisEpoch+=1,!0)}tryConsumeLlm(e){let t=this.stateOf(e);if(t.llmCountThisEpoch>=2)return{ok:!1,reason:`epoch`};let n=this.now()-Tl;return t.llmCallTimes=t.llmCallTimes.filter(e=>e>n),t.llmCallTimes.length>=30?{ok:!1,reason:`hourly`}:(t.llmCountThisEpoch+=1,t.llmCallTimes.push(this.now()),{ok:!0})}tryConsumeNotify(e){let t=this.stateOf(e),n=this.now()-Tl;return t.notifyTimes=t.notifyTimes.filter(e=>e>n),t.notifyTimes.length>=20?!1:(t.notifyTimes.push(this.now()),!0)}reset(e){this.states.delete(e)}};function Ol(e){return e.kind===`session`?0:1}var kl=class{queue=[];inFlightId=null;maxPending;maxPerPlugin;ttlMs;now;constructor(e={}){this.maxPending=e.maxPending??8,this.maxPerPlugin=e.maxPerPlugin??1,this.ttlMs=e.ttlMs??3e5,this.now=e.now??Date.now}enqueue(e){if(this.sweepExpired(),this.queue.length>=this.maxPending)return{accepted:!1,reason:`queue-full`};if(e.origin.kind===`plugin`){let t=e.origin.pluginId;if(this.queue.filter(e=>e.request.origin.kind===`plugin`&&e.request.origin.pluginId===t).length>=this.maxPerPlugin)return{accepted:!1,reason:`plugin-concurrency`}}let t,n=new Promise(e=>{t=e}),r={...e,enqueuedAt:this.now()};return this.queue.push({request:r,resolve:t,dispatched:!1}),this.queue.sort((e,t)=>Ol(e.request.origin)-Ol(t.request.origin)||e.request.enqueuedAt-t.request.enqueuedAt),{accepted:!0,answer:n}}async waitForTurn(e,t=25){for(;;){if(this.takeNext()?.id===e)return!0;if(!this.queue.some(t=>t.request.id===e))return!1;await new Promise(e=>setTimeout(e,t))}}takeNext(){if(this.sweepExpired(),this.inFlightId!==null)return;let e=this.queue.find(e=>!e.dispatched);if(e)return e.dispatched=!0,this.inFlightId=e.request.id,e.request}settle(e,t){let n=this.queue.findIndex(t=>t.request.id===e);if(n===-1)return!1;let[r]=this.queue.splice(n,1);return this.inFlightId===e&&(this.inFlightId=null),r.resolve(t),!0}release(e){let t=this.queue.findIndex(t=>t.request.id===e);return t===-1?!1:(this.queue.splice(t,1),this.inFlightId===e&&(this.inFlightId=null),!0)}get hasInFlight(){return this.inFlightId!==null}get size(){return this.queue.length}sweepExpired(){let e=this.now()-this.ttlMs;for(let t=this.queue.length-1;t>=0;t--){let n=this.queue[t];n.dispatched||n.request.enqueuedAt>e||(this.queue.splice(t,1),n.resolve(Al(n.request.question)))}}shutdown(){let e=this.queue.splice(0,this.queue.length);this.inFlightId=null;for(let t of e)t.resolve(Al(t.request.question))}};function Al(e){return{answer:``,acceptedRecommendation:!1,resolvedBy:`human`}}const P={start:`service.start`,started:`service.started`,stop:`service.stop`,stopped:`service.stopped`,hostCall:`service.hostCall`,hostResult:`service.hostResult`,crashed:`service.crashed`,notify:`service.notify`,eventPush:`service.eventPush`};function jl(){return`const { parentPort, workerData } = require('worker_threads')
14
+ `}),a.onExit(r=>{clearTimeout(o);let{stdout:i,stderr:a,truncated:l}=Sc(s,c),u={success:r.code===0&&r.signal===null,hook:`setup`,command:t,exitCode:r.code,signal:r.signal??void 0,stdout:i,stderr:a,truncated:l||void 0};u.success?M.info({pluginId:e.pluginId},`Setup hook succeeded`):M.error({pluginId:e.pluginId,exitCode:r.code,signal:r.signal,stderr:a?.slice(0,512)},`Setup hook failed`),n?.(u)}),a.onError(r=>{M.error({pluginId:e.pluginId,err:r},`Setup hook spawn error`),n?.({success:!1,hook:`setup`,command:t,error:r.message})});return}let o=$i(t,{cwd:e.pluginDir,env:bc(e),shell:!0,timeout:6e4,stdio:`pipe`}),s=``,c=``;o.stdout?.on(`data`,e=>{s+=e.toString(`utf-8`)}),o.stderr?.on(`data`,e=>{c+=e.toString(`utf-8`)}),o.on(`close`,(r,i)=>{let{stdout:a,stderr:o,truncated:l}=Sc(s,c),u={success:r===0&&i===null,hook:`setup`,command:t,exitCode:r,signal:i,stdout:a,stderr:o,truncated:l||void 0};u.success?M.info({pluginId:e.pluginId},`Setup hook succeeded`):M.error({pluginId:e.pluginId,exitCode:r,signal:i,stderr:o?.slice(0,512)},`Setup hook failed`),n?.(u)}),o.on(`error`,r=>{M.error({pluginId:e.pluginId,err:r},`Setup hook spawn error`),n?.({success:!1,hook:`setup`,command:t,error:r.message})})}const Tc=T(`@x-otto/coding:plugin-lifecycle`),Ec=`plugin_lifecycle`,Dc=new Set;async function Oc(e,t,n){let r=t.get(Ec)?.setupDone??[],i=new Map(r.map(e=>[e.id,e.version])),a=new Set(e.map(e=>e.id));for(let e of i.keys())a.has(e)||i.delete(e);let o=!1;for(let r of e){let e=i.get(r.id),a=r.manifest.version,s=r.manifest.scripts?.setup;if(!s){(e===void 0||e!==a)&&(i.set(r.id,a),o=!0);continue}if(!(e!==void 0&&e===a)){if(O(r).gated){Tc.info({pluginId:r.id},`Setup hook deferred: plugin not yet trusted`);continue}Dc.has(r.id)||(Dc.add(r.id),wc({pluginDir:r.dir,pluginId:r.id,workspaceDir:n},s,e=>{Dc.delete(r.id),i.set(r.id,a),kc(t,i)},E))}}o&&await kc(t,i)}async function kc(e,t){let n=[...t].map(([e,t])=>({id:e,version:t}));await e.persist({[Ec]:{setupDone:n}})}function Ac(e,t){let n;try{n=Qe(t)}catch{return!1}let r;try{r=Qe(e)}catch{r=e}return r===n||r.startsWith(n+ut)}const jc=T(`@x-otto/coding:plugin-i18n-loader`),Mc=/^([a-zA-Z0-9_-]+)\.json$/;function Nc(e){return Buffer.byteLength(e,`utf8`)<=nr?e:`${Buffer.from(e,`utf8`).subarray(0,nr).toString(`utf8`)}…`}function Pc(e,t,n){let r=new Map,i=w(t,n);if(!Ac(i,t))return jc.warn({pluginId:e,i18nDir:n},`i18nDir resolves outside plugin dir, skipped`),r;let a;try{a=Xe(i)}catch{return r}let o=a.filter(e=>Mc.test(e)).sort();o.length>tr&&(jc.warn({pluginId:e,i18nDir:n,declared:o.length,limit:tr},`plugin i18nDir declares more locale files than the per-plugin limit, truncated`),o=o.slice(0,tr));for(let n of o){let a=Mc.exec(n)?.[1];if(!a)continue;let o=w(i,n);if(!Ac(o,t)){jc.warn({pluginId:e,filename:n},`i18nDir locale file resolves outside plugin dir, skipped`);continue}let s;try{s=b(o,`utf8`)}catch(t){jc.warn({pluginId:e,filename:n,err:String(t)},`i18nDir locale file read failed, skipped`);continue}if(Buffer.byteLength(s,`utf8`)>er){jc.warn({pluginId:e,filename:n,limit:er},`i18nDir locale file exceeds byte limit, skipped`);continue}let c;try{c=JSON.parse(s)}catch(t){jc.warn({pluginId:e,filename:n,err:String(t)},`i18nDir locale file is not valid JSON, skipped`);continue}if(typeof c!=`object`||!c||Array.isArray(c)){jc.warn({pluginId:e,filename:n},`i18nDir locale file is not a flat object, skipped`);continue}for(let[e,t]of Object.entries(c)){if(typeof t!=`string`)continue;let n=r.get(e)??{};n[a]=t,r.set(e,n)}}return r}function Fc(e){let t=[];for(let n of e){if(O(n).gated)continue;let e=n.manifest.contributes?.i18nDir,r=n.manifest.contributes?.i18n;if(!e&&!r?.length)continue;let i=e?Pc(n.id,n.dir,e):new Map;if(r?.length)for(let e of r){let t=i.get(e.id)??{};for(let[r,i]of Object.entries(e.translations))r in t&&jc.debug({pluginId:n.id,id:e.id,locale:r},`i18n inline entry overrides locale dir value`),t[r]=i;i.set(e.id,t)}let a=[...i.keys()];a.length>$n&&(jc.warn({pluginId:n.id,declared:a.length,limit:$n},`plugin declares more i18n entries than the per-plugin limit, truncated`),a=a.slice(0,$n));for(let e of a){let r=i.get(e);if(!r)continue;let a={};for(let[e,t]of Object.entries(r))a[e]=Nc(t);t.push({pluginId:n.id,id:e,translations:a})}}return t}const Ic=T(`@x-otto/coding:declarative-agents`);function Lc(e){return{...e,defaultTools:e.defaultTools?.length?_t(e.defaultTools):e.defaultTools,disallowedTools:e.disallowedTools?.length?_t(e.disallowedTools):e.disallowedTools}}function Rc(e,t){let n=xt(e);if(!n)return Ic.warn({sourcePath:t},`Agent definition missing frontmatter, skipped`),null;let{fields:r,body:i}=n,a=r.get(`name`),o=r.get(`description`);if(!a||!o||!i)return Ic.warn({sourcePath:t},`Agent definition requires name/description/body, skipped`),null;let s=yt(r.get(`tools`)),c=Number.parseInt(r.get(`maxtoolturns`)??``,10),l=Number.parseInt(r.get(`maxtoolturnextensions`)??``,10),u=r.get(`prompt-mode`),d=yt(r.get(`disallowed-tools`)),f=r.get(`allow-subagents`)===`true`?!0:r.get(`allow-subagents`)===`false`?!1:void 0;return{name:a,description:o,taskTypes:yt(r.get(`tasktypes`))??[o],capabilities:yt(r.get(`capabilities`))??[],systemPromptTemplate:i,promptMode:u===`append`||u===`replace`?u:void 0,defaultTools:s,disallowedTools:d?.length?d:void 0,preferredModelTier:r.get(`slot`)??r.get(`tier`),defaultMaxToolTurns:Number.isInteger(c)?c:void 0,defaultMaxToolTurnExtensions:Number.isInteger(l)?l:void 0,allowSubagents:f}}async function zc(e,t){let{homedir:n}=await import(`node:os`),{join:r}=await import(`node:path`),i=t?.globalDir??r(n(),`.otto`,`agents`),a=r(e,`.otto`,`agents`),o=(t?.plugins??_r({cwd:e,homedir:n()})).filter(e=>e.manifest.contributes?.agents!==!1).filter(e=>!O(e).gated).map(e=>({dir:r(e.dir,`agents`),claude:!1})),c=s(),l=c&&(t?.claudeProjectAgentsAllowed??!1),u=[...o,...c?[{dir:r(n(),`.claude`,`agents`),claude:!0}]:[],{dir:i,claude:!1},...l?[{dir:r(e,`.claude`,`agents`),claude:!0}]:[],{dir:a,claude:!1}],d=new Map;for(let{dir:e,claude:t}of u)for(let n of await Bc(e))d.set(n.name,t?Lc(n):n);let f=[...d.values()];return f.length>0&&Ic.info(`Loaded %d declarative agent(s): %s`,f.length,f.map(e=>e.name).join(`, `)),f}async function Bc(e){let{readFile:t,readdir:n}=await import(`node:fs/promises`),{join:r}=await import(`node:path`),i;try{i=await n(e)}catch{return[]}let a=[];for(let n of i.filter(e=>e.endsWith(`.md`)).sort()){let i=r(e,n);try{let e=Rc(await t(i,`utf-8`),i);e&&a.push(e)}catch(e){Ic.warn({sourcePath:i,err:e},`Failed to read agent definition, skipped`)}}return a}const Vc=T(`@x-otto/coding:declarative-teams`),Hc=new Set([`handoff`,`sequential`,`parallel`,`hierarchical`,`router`]);function Uc(e){if(!e)return;let t=[];for(let n of e.split(`|`)){let[e,r]=n.split(/→|->/);if(e===void 0||r===void 0)continue;let i=e.split(`,`).map(e=>e.trim().toLowerCase()).filter(e=>e!==``),a=r.trim();i.length>0&&a!==``&&t.push({keywords:i,agentId:a})}return t.length>0?t:void 0}function Wc(e,t){let n=xt(e);if(!n)return Vc.warn({sourcePath:t},`Team definition missing frontmatter, skipped`),null;let{fields:r}=n,i=r.get(`name`),a=r.get(`pattern`),o=yt(r.get(`agents`));if(!i||!a||!Hc.has(a)||!o||o.length===0)return Vc.warn({sourcePath:t},`Team definition requires name, valid pattern and non-empty agents, skipped`),null;let s=Number.parseInt(r.get(`maxhandoffdepth`)??``,10);return{name:i,pattern:a,agentNames:o,pipeline:yt(r.get(`pipeline`)),supervisorId:r.get(`supervisor`),entryAgentId:r.get(`entry`),routerStrategy:r.get(`router`),rules:Uc(r.get(`rules`)),maxHandoffDepth:Number.isInteger(s)?s:void 0}}async function Gc(e,t){let{homedir:n}=await import(`node:os`),{join:r}=await import(`node:path`),i=t?.globalDir??r(n(),`.otto`,`teams`),a=r(e,`.otto`,`teams`),o=new Map;for(let e of[i,a])for(let t of await Kc(e))o.set(t.name,t);let s=[...o.values()];return s.length>0&&Vc.info(`Loaded %d declarative team(s): %s`,s.length,s.map(e=>e.name).join(`, `)),s}async function Kc(e){let{readFile:t,readdir:n}=await import(`node:fs/promises`),{join:r}=await import(`node:path`),i;try{i=await n(e)}catch{return[]}let a=[];for(let n of i.filter(e=>e.endsWith(`.md`)).sort()){let i=r(e,n);try{let e=Wc(await t(i,`utf-8`),i);e&&a.push(e)}catch(e){Vc.warn({sourcePath:i,err:e},`Failed to read team definition, skipped`)}}return a}var qc=class{reloadQueue=Promise.resolve();constructor(e,t,n,r,i,a,o,s,c,l,u){this.settings=e,this.mcp=t,this.skills=n,this.pluginModules=r,this.pluginProviders=i,this.tools=a,this.modelCatalog=o,this.workspaceDir=s,this.activePlugins=c,this.i18n=l,this.getCompatTrustGated=u}async reload(){let e=this.reloadQueue.then(()=>this.reloadSerial());return this.reloadQueue=e.catch(()=>void 0),e}async reloadSerial(){await this.settings.load(),Oc(this.activePlugins(),this.settings,this.workspaceDir),await this.mcp.reload(),this.skills&&(this.skills.updatePluginDirs(this.activePlugins().filter(e=>e.manifest.contributes?.skills!==!1).filter(e=>!O(e).gated).map(e=>({id:e.id,dir:C(e.dir,`skills`)}))),await this.skills.discover());let e=Fc(this.activePlugins());this.i18n.register(e);let t=(await this.modelCatalog.refresh().catch(()=>[])).reduce((e,t)=>e+(t.added??0),0),n=await zc(this.workspaceDir,{plugins:this.activePlugins(),claudeProjectAgentsAllowed:this.getCompatTrustGated?!this.getCompatTrustGated():void 0}),r=await Gc(this.workspaceDir),i=[],a=[];try{a=await this.pluginModules.reload(new Set(n.map(e=>e.name)))}catch(e){i.push({path:`pluginModules`,error:e instanceof Error?e.message:String(e)})}n.push(...a);let o={pendingCapabilityPluginIds:[]};try{o=await this.pluginProviders.reload()}catch(e){i.push({path:`pluginProviders`,error:e instanceof Error?e.message:String(e)})}return{mcpTools:this.tools.getAvailable(`full`).filter(e=>e.name.startsWith(`mcp__`)).length,models:t,agents:n.length,teamCount:r.length,agentProfiles:n,teamDeclarations:r,pendingProviderCapabilities:o.pendingCapabilityPluginIds,i18nEntries:e.length,...i.length>0?{reloadFailures:i}:{}}}};const Jc=T(`@x-otto/coding:panel-backend-controller`);var Yc=class{stateListeners=new Map;statusListeners=new Map;inProcessHandlers=new Map;subscribedManager=null;constructor(e){this.deps=e}registerInProcessBackend(e,t){this.inProcessHandlers.set(e,t);let n=this.statusListeners.get(e);if(n)for(let e of n)e(`ready`)}unregisterInProcessBackend(e){this.inProcessHandlers.delete(e)}resolveServerForPlugin(e){if(this.inProcessHandlers.has(e))return{ok:!0};let t=this.deps.getActivePlugins().find(t=>t.id===e);if(!t)return{ok:!1,reason:`plugin "${e}" not found or not active`};if(!t.manifest.capabilities?.includes(`panel.backend`))return{ok:!1,reason:`plugin "${e}" does not declare capabilities:["panel.backend"]`};let n=O(t);if(n.pendingCapabilities.includes(`panel.backend`))return{ok:!1,reason:`plugin "${e}" capability "panel.backend" declared but not yet granted`};if(n.gated)return{ok:!1,reason:`plugin "${e}" is untrusted`};let r=this.deps.mcpController.listEffectiveServers(),i=Object.entries(r).filter(([,t])=>t.pluginId===e);return i.length===0?{ok:!1,reason:`plugin "${e}" has no associated MCP server`}:(i.length>1&&Jc.warn({pluginId:e,serverNames:i.map(([e])=>e)},`plugin contributes multiple MCP servers; panel backend uses the first match (multi-server routing not yet supported)`),{ok:!0,serverName:i[0][0]})}async call(e,t,n,r){let i=this.inProcessHandlers.get(e);if(i)return i(t,n);let a=this.resolveServerForPlugin(e);if(!a.ok||!a.serverName)throw Error(a.reason??`cannot resolve backend server for plugin "${e}"`);let o=this.deps.mcpController.getMcpClient(a.serverName);if(!o)throw Error(`MCP server "${a.serverName}" for plugin "${e}" is not connected`);let s=r?.operationId?{...n,__operationId:r.operationId}:n;return o.callRaw(t,s,r?.signal)}async cancel(e,t){if(this.inProcessHandlers.has(e))return;let n=this.resolveServerForPlugin(e);if(!n.ok||!n.serverName)return;let r=this.deps.mcpController.getMcpClient(n.serverName);r&&await r.callRaw(`backend/cancel`,{id:t}).catch(()=>void 0)}subscribeState(e,t){return this.ensureNotificationSubscription(),this.stateListeners.has(e)||this.stateListeners.set(e,new Set),this.stateListeners.get(e).add(t),()=>{this.stateListeners.get(e)?.delete(t)}}onStatusChange(e,t){return this.ensureNotificationSubscription(),this.statusListeners.has(e)||this.statusListeners.set(e,new Set),this.statusListeners.get(e).add(t),()=>{this.statusListeners.get(e)?.delete(t)}}getStatus(e){if(this.inProcessHandlers.has(e))return`ready`;let t=this.resolveServerForPlugin(e);if(!t.ok||!t.serverName||this.deps.mcpController.listEffectiveServers()[t.serverName]?.disabled)return`disabled`;let n=this.deps.mcpController.getMcpClient(t.serverName);if(!n)return`crashed`;let r=n.getStatus();return r===`ready`?`ready`:r===`connecting`||r===`reconnecting`?`connecting`:`crashed`}notifyReload(){this.ensureNotificationSubscription();for(let[e,t]of this.statusListeners){if(t.size===0)continue;let n=this.getStatus(e);for(let e of t)e(n)}}ensureNotificationSubscription(){let e=this.deps.mcpController.manager;if(this.subscribedManager===e||(this.subscribedManager=e,!e))return;e.on(`server.notification`,({name:e,method:t,params:n})=>{if(t!==`backend/state`)return;let r=this.pluginIdForServer(e);if(!r)return;let i=this.stateListeners.get(r);if(!(!i||i.size===0))for(let e of i)e(n??{})});let t=e=>{let t=this.pluginIdForServer(e);if(!t)return;let n=this.statusListeners.get(t);if(!n||n.size===0)return;let r=this.getStatus(t);for(let e of n)e(r)};e.on(`server.connected`,({name:e})=>t(e)),e.on(`server.disconnected`,({name:e})=>t(e))}pluginIdForServer(e){return this.deps.mcpController.listEffectiveServers()[e]?.pluginId}};const Xc=T(`@x-otto/coding:plugin-log-writer`);function Zc(){return w(r,`plugin-logs`)}function Qc(e){return Qn.test(e)?C(Zc(),`${e}.jsonl`):(Xc.warn({pluginId:e},`plugin id failed kebab-case validation, skipping log path resolution`),null)}function $c(e){let t;try{t=tt(e).size}catch{return}if(!(t<=5242880))try{let t=b(e,`utf8`),n=Math.floor(t.length/2),r=t.indexOf(`
15
+ `,n);x(e,r>=0?t.slice(r+1):t.slice(n))}catch(t){Xc.warn({path:e,err:String(t)},`plugin log truncation failed (fail-soft)`)}}function el(e,t,n){if(!c())try{let r=Qc(e);if(!r)return;let i=Zc();v(i)||y(i,{recursive:!0}),$c(r),Ue(r,`${JSON.stringify({ts:Date.now(),level:t,pluginId:e,msg:n})}\n`)}catch(t){Xc.warn({pluginId:e,err:String(t)},`plugin log append failed (fail-soft)`)}}const tl=T(`@x-otto/coding:plugin-tool-wiring`);function N(e,t){return`plugin:${e}:${t}`}function nl(e){let t=e.split(`:`);return t.length<3||t[0]!==`plugin`?null:t[1]||null}function rl(e){let t=e?.content;return typeof t==`string`?t:Array.isArray(t)?t.map(e=>e&&typeof e==`object`&&`text`in e?String(e.text):``).join(``):``}const 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`,taskCancelled:`task.cancelled`,onNotification:`notification`};function il(e,t){let n=[];if(t.preToolUse){let r=t.preToolUse;n.push(A({name:N(e,`preToolUse`),timing:P.preToolUse,handle:async(t,n)=>{let i=await r({toolName:t.toolName,input:t.args,paths:t.paths,readonly:t.readonly,sessionId:t.sessionId});i&&(i.decision===`deny`?(n.decision=`deny`,n.cancelled=!0,n.cancelReason=i.reason??`denied by plugin ${e}`):i.decision===`ask`&&(n.decision=`ask`,n.decisionReason=i.reason??`requires approval (plugin ${e})`))}}))}if(t.postToolUse){let r=t.postToolUse;n.push(A({name:N(e,`postToolUse`),timing:P.postToolUse,handle:async e=>{await r({toolName:e.toolName,input:e.args,result:e.result,readonly:e.readonly,sessionId:e.sessionId})}}))}if(t.userPromptSubmit){let r=t.userPromptSubmit;n.push(A({name:N(e,`userPromptSubmit`),timing:P.userPromptSubmit,handle:async e=>{await r({prompt:rl(e.message)})}}))}if(t.sessionStart){let r=t.sessionStart;n.push(A({name:N(e,`sessionStart`),timing:P.sessionStart,handle:async()=>{await r()}}))}if(t.stop){let r=t.stop;n.push(A({name:N(e,`stop`),timing:P.stop,handle:async()=>{await r()}}))}if(t.sessionRestored){let r=t.sessionRestored;n.push(A({name:N(e,`sessionRestored`),timing:P.sessionRestored,handle:async e=>{await r({sessionId:e.sessionId})}}))}if(t.sessionDeleted){let r=t.sessionDeleted;n.push(A({name:N(e,`sessionDeleted`),timing:P.sessionDeleted,handle:async e=>{await r({sessionId:e.sessionId})}}))}if(t.sessionIdle){let r=t.sessionIdle;n.push(A({name:N(e,`sessionIdle`),timing:P.sessionIdle,handle:async e=>{await r({sessionId:e.sessionId})}}))}if(t.sessionError){let r=t.sessionError;n.push(A({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(A({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(A({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(A({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(A({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(A({name:N(e,`taskStarted`),timing:P.taskStarted,handle:async e=>{await r({taskId:e.task.id,agent:e.agent})}}))}if(t.onNotification){let r=t.onNotification;n.push(A({name:N(e,`onNotification`),timing:P.onNotification,handle:async e=>{await r({sessionId:e.sessionId,message:e.message,title:e.title,notification_type:e.notification_type})}}))}if(t.taskCompleted){let r=t.taskCompleted;n.push(A({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(A({name:N(e,`taskFailed`),timing:P.taskFailed,handle:async e=>{await r({taskId:e.task.id,error:e.error.message})}}))}if(t.taskCancelled){let r=t.taskCancelled;n.push(A({name:N(e,`taskCancelled`),timing:P.taskCancelled,handle:async e=>{await r({taskId:e.taskId})}}))}if(t.waterfall)for(let r of Object.keys(t.waterfall)){if(!na(r)){tl.warn({pluginId:e,timing:r},`plugin waterfall timing not in whitelist, rejected (fail-closed)`),el(e,`warn`,`waterfall timing "${r}" not in whitelist, rejected (fail-closed)`);continue}let i=t.waterfall[r];i&&n.push(A({name:N(e,`waterfall:${r}`),timing:r,handle:async(t,n)=>r===`system.prompt.transform`?al(e,i,t,n):ol(e,r,i,t,n)}))}return n}async function al(e,t,n,r){let i=r.systemTail?[...r.systemTail]:[],a=r.systemPrompt,o=await t(n,r),s=!1,c=!1,l=!1;r.systemPrompt!==a&&(s=!0,r.systemPrompt=a);let u=Array.isArray(r.systemTail)?r.systemTail:void 0;if(u===void 0)i.length>0&&(c=!0,r.systemTail=[...i]);else if(!i.every((e,t)=>u[t]===e))c=!0,r.systemTail=[...i];else{let e=u.slice(i.length),t=[...i],n=4096;for(let r of e){if(n<=0){l=!0;break}let e=cl(r,n);if(e.truncated){l=!0,t.push(`${e.content}${ll}`);break}t.push(e.content),n-=Buffer.byteLength(e.content,`utf8`)}r.systemTail=t}if(s||c||l||ul(i,r.systemTail)){let t=(r.systemTail?.length??0)-i.length,a=[s?`systemPrompt-write-rejected`:null,c?`systemTail-destructive-rejected`:null,t>0?`systemTail:+${t}el`:null,l?`systemTail-truncated`:null].filter(e=>e!==null).join(`, `);sl(e,`system.prompt.transform`,n.sessionId,a)}return o}async function ol(e,t,n,r,i){let a=dl(i),o=await n(r,i),s=fl(t,a,i);return s&&sl(e,t,(typeof r==`object`&&r&&`sessionId`in r?String(r.sessionId??``):void 0)||void 0,s),o}function sl(e,t,n,r){let i=r.length>400?`${r.slice(0,400)}…`:r;tl.info({pluginId:e,timing:t,...n?{sessionId:n}:{}},`plugin waterfall rewrite: ${i}`)}function cl(e,t){let n=Buffer.from(e,`utf8`);if(n.length<=t)return{content:e,truncated:!1};let r=Math.max(0,t);for(;r>0&&r<n.length;){let e=n[r];if(e===void 0||(e&192)!=128)break;r--}return{content:n.subarray(0,r).toString(`utf8`).trimEnd(),truncated:!0}}const ll=`
16
+ [context truncated: budget exceeded]`;function ul(e,t){return t===void 0?e.length>0:e.length!==t.length||e.some((e,n)=>e!==t[n])}function dl(e){if(typeof e!=`object`||!e)return{};let t={};for(let n of Object.keys(e))t[n]=e[n];return t}function fl(e,t,n){if(typeof n!=`object`||!n)return;let r=n,i=Object.keys(r).filter(e=>r[e]!==t[e]);if(i.length!==0)return e===`chat.params`?`fields:[${i.join(`, `)}]`:`messages:${Array.isArray(t.messages)?t.messages.length:`n/a`}→${Array.isArray(r.messages)?r.messages.length:`n/a`}`}function pl(e,t,n,r){return r.map(r=>({name:r.name,description:r.description,argumentHint:r.argumentHint,allowedTools:r.allowedTools,model:r.model,body:r.body,source:`plugin`,scope:t===`bundled`?`project`:t,pluginId:e,filePath:`${n}#computed:${r.name}`}))}function ml(e){return e.map(e=>({name:e.name,description:e.description,taskTypes:e.taskTypes??[],capabilities:e.capabilities??[],systemPromptTemplate:e.systemPromptTemplate,...e.promptMode?{promptMode:e.promptMode}:{},...e.defaultTools?{defaultTools:e.defaultTools}:{},...e.disallowedTools?{disallowedTools:e.disallowedTools}:{},...e.preferredModelTier?{preferredModelTier:e.preferredModelTier}:{},...e.allowSubagents===void 0?{}:{allowSubagents:e.allowSubagents}}))}function hl(e,t,n){return n.map(n=>({definition:{metadata:{name:n.name,description:n.description??``},body:n.body,directory:t,filePath:`${t}#computed:${n.name}`,supportingFiles:[]},source:{type:`plugin`,root:t,id:e}}))}function gl(e,t){return t instanceof dt?t.pluginSource===void 0?new t.constructor(t.message,{code:t.code,cause:t.cause,status:t.status,headers:t.headers,errorType:t.errorType,pluginSource:e}):t:new ft(t instanceof Error?t.message:String(t),{code:`PROVIDER_PLUGIN_ERROR`,cause:t instanceof Error?t:void 0,pluginSource:e})}function _l(e,t){return()=>{let n=t();return{...n,async*converse(t,r,i,a){try{for await(let o of n.converse(t,r,i,a))o.type===`error`?yield{type:`error`,error:gl(e,o.error)}:yield o}catch(t){throw gl(e,t)}}}}}function vl(e,t){try{return t()}catch(t){let n=String(t);return tl.warn({pluginId:e,err:n},`plugin oauthProviderFactory threw, skipped`),el(e,`warn`,`oauthProviderFactory threw, skipped: ${n}`),null}}function yl(e){return e&&typeof e==`object`&&Array.isArray(e.content)?e:{content:[{type:`text`,text:typeof e==`string`?e:JSON.stringify(e??null)}]}}function bl(e,t,n){let r=t;if(!r||typeof r!=`object`)return tl.warn({pluginId:e},`plugin tool entry is not an object, skipped`),null;if(typeof r.name!=`string`||!r.name)return tl.warn({pluginId:e},`plugin tool missing valid name, skipped`),null;if(typeof r.execute!=`function`)return tl.warn({pluginId:e,tool:r.name},`plugin tool missing execute function, skipped`),null;if(!r.parameters||typeof r.parameters.safeParse!=`function`)return tl.warn({pluginId:e,tool:r.name},`plugin tool missing valid parameters.safeParse, skipped`),null;typeof r.parameters.toJSONSchema!=`function`&&tl.warn({pluginId:e,tool:r.name},`plugin tool parameters missing toJSONSchema — model-side schema will be empty {}`);let i=r.name,a=r.description??``,o=r.parameters,s=r.execute,c=r.resolvePath?e=>r.resolvePath(e,n?.workspaceDir??``):void 0;return{name:i,description:a,parameters:o,...r.exposure!==void 0&&{exposure:r.exposure},...r.pathParams!==void 0&&{pathParams:r.pathParams},...r.readonly!==void 0&&{readonly:r.readonly},...r.regenerableOutput!==void 0&&{regenerableOutput:r.regenerableOutput},...c&&{resolvePath:c},async execute(t){try{let r={pluginId:e,workspaceDir:n?.workspaceDir??``,logger:n?.logger??{info:()=>{},warn:()=>{},error:()=>{}},host:n?.host,signal:t.signal,storage:n?.storage},i=yl(await s(t.params,r));return i.isError?{...i,pluginSource:e}:i}catch(t){throw t instanceof Error&&Object.assign(t,{pluginSource:e}),t}}}}function xl(e,t){let n=[],r=async(t,n)=>{try{await t.onEvent(n)}catch(n){tl.warn({pluginId:e,monitorId:t.id,err:String(n)},`plugin monitor onEvent threw, isolated`)}};for(let i of t)n.push(A({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,tokenUsage:{input:e.tokenUsage.input,output:e.tokenUsage.output}})}})),n.push(A({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(A({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 Sl(e){return{...e}}var Cl=class{stats=new Map;clock;constructor(e=()=>Date.now()){this.clock=e}ensure(e){let t=this.stats.get(e);return t||(t={pluginId:e,hookTimeouts:0,toolTimeouts:0},this.stats.set(e,t)),t}recordHookTimeout(e,t){let n=this.ensure(e);n.hookTimeouts++,n.lastTimeoutHook=t}recordToolTimeout(e){let t=this.ensure(e);t.toolTimeouts++}recordError(e,t){let n=this.ensure(e);n.lastError={message:t,timestamp:this.clock()}}query(e){let t=this.stats.get(e);return t?Sl(t):{pluginId:e,hookTimeouts:0,toolTimeouts:0}}all(){return[...this.stats.values()].map(Sl)}clear(){this.stats.clear()}};function wl(e){return new Cl(e)}const Tl=3600*1e3;function El(){return{authorizedSessionIds:new Set,readCountThisEpoch:0,llmCountThisEpoch:0,llmCallTimes:[],notifyTimes:[]}}var Dl=class{states=new Map;constructor(e=()=>Date.now()){this.now=e}stateOf(e){let t=this.states.get(e);return t||(t=El(),this.states.set(e,t)),t}onNotifyDelivered(e,t){let n=this.stateOf(e);n.authorizedSessionIds.add(t),n.readCountThisEpoch=0,n.llmCountThisEpoch=0}isSessionAuthorized(e,t){return this.stateOf(e).authorizedSessionIds.has(t)}tryConsumeRead(e){let t=this.stateOf(e);return t.readCountThisEpoch>=1?!1:(t.readCountThisEpoch+=1,!0)}tryConsumeLlm(e){let t=this.stateOf(e);if(t.llmCountThisEpoch>=2)return{ok:!1,reason:`epoch`};let n=this.now()-Tl;return t.llmCallTimes=t.llmCallTimes.filter(e=>e>n),t.llmCallTimes.length>=30?{ok:!1,reason:`hourly`}:(t.llmCountThisEpoch+=1,t.llmCallTimes.push(this.now()),{ok:!0})}tryConsumeNotify(e){let t=this.stateOf(e),n=this.now()-Tl;return t.notifyTimes=t.notifyTimes.filter(e=>e>n),t.notifyTimes.length>=20?!1:(t.notifyTimes.push(this.now()),!0)}reset(e){this.states.delete(e)}};function Ol(e){return e.kind===`session`?0:1}var kl=class{queue=[];inFlightId=null;maxPending;maxPerPlugin;ttlMs;now;constructor(e={}){this.maxPending=e.maxPending??8,this.maxPerPlugin=e.maxPerPlugin??1,this.ttlMs=e.ttlMs??3e5,this.now=e.now??Date.now}enqueue(e){if(this.sweepExpired(),this.queue.length>=this.maxPending)return{accepted:!1,reason:`queue-full`};if(e.origin.kind===`plugin`){let t=e.origin.pluginId;if(this.queue.filter(e=>e.request.origin.kind===`plugin`&&e.request.origin.pluginId===t).length>=this.maxPerPlugin)return{accepted:!1,reason:`plugin-concurrency`}}let t,n=new Promise(e=>{t=e}),r={...e,enqueuedAt:this.now()};return this.queue.push({request:r,resolve:t,dispatched:!1}),this.queue.sort((e,t)=>Ol(e.request.origin)-Ol(t.request.origin)||e.request.enqueuedAt-t.request.enqueuedAt),{accepted:!0,answer:n}}async waitForTurn(e,t=25){for(;;){if(this.takeNext()?.id===e)return!0;if(!this.queue.some(t=>t.request.id===e))return!1;await new Promise(e=>setTimeout(e,t))}}takeNext(){if(this.sweepExpired(),this.inFlightId!==null)return;let e=this.queue.find(e=>!e.dispatched);if(e)return e.dispatched=!0,this.inFlightId=e.request.id,e.request}settle(e,t){let n=this.queue.findIndex(t=>t.request.id===e);if(n===-1)return!1;let[r]=this.queue.splice(n,1);return this.inFlightId===e&&(this.inFlightId=null),r.resolve(t),!0}release(e){let t=this.queue.findIndex(t=>t.request.id===e);return t===-1?!1:(this.queue.splice(t,1),this.inFlightId===e&&(this.inFlightId=null),!0)}get hasInFlight(){return this.inFlightId!==null}get size(){return this.queue.length}sweepExpired(){let e=this.now()-this.ttlMs;for(let t=this.queue.length-1;t>=0;t--){let n=this.queue[t];n.dispatched||n.request.enqueuedAt>e||(this.queue.splice(t,1),n.resolve(Al(n.request.question)))}}shutdown(){let e=this.queue.splice(0,this.queue.length);this.inFlightId=null;for(let t of e)t.resolve(Al(t.request.question))}};function Al(e){return{answer:``,acceptedRecommendation:!1,resolvedBy:`human`}}const 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`,eventPush:`service.eventPush`};function jl(){return`const { parentPort, workerData } = require('worker_threads')
17
17
  const __send = (m) => parentPort.postMessage(m)
18
18
 
19
19
  // RFC-303 M5:worker 侧 scoped storage 实现(无第三方依赖,直接文件读写)。
@@ -66,7 +66,7 @@ function callHost(method, params) {
66
66
  return new Promise((resolve, reject) => {
67
67
  const callId = 'hc_' + (++hostCallSeq)
68
68
  hostCalls.set(callId, { resolve, reject })
69
- __send({ type: '${P.hostCall}', callId, method, params })
69
+ __send({ type: '${F.hostCall}', callId, method, params })
70
70
  })
71
71
  }
72
72
 
@@ -105,14 +105,14 @@ function buildHost(capabilities) {
105
105
  // 服务运行期的未捕获错误 → 上报宿主(计入崩溃,触发退避重启)。不 process.exit:
106
106
  // 让宿主决定重启策略,worker 自杀会丢失错误上下文。
107
107
  process.on('uncaughtException', (err) => {
108
- __send({ type: '${P.crashed}', error: (err && err.message) || String(err) })
108
+ __send({ type: '${F.crashed}', error: (err && err.message) || String(err) })
109
109
  })
110
110
  process.on('unhandledRejection', (err) => {
111
- __send({ type: '${P.crashed}', error: (err && err.message) || String(err) })
111
+ __send({ type: '${F.crashed}', error: (err && err.message) || String(err) })
112
112
  })
113
113
 
114
114
  parentPort.on('message', async (msg) => {
115
- if (msg.type === '${P.hostResult}') {
115
+ if (msg.type === '${F.hostResult}') {
116
116
  const pending = hostCalls.get(msg.callId)
117
117
  if (!pending) return
118
118
  hostCalls.delete(msg.callId)
@@ -121,7 +121,7 @@ parentPort.on('message', async (msg) => {
121
121
  return
122
122
  }
123
123
 
124
- if (msg.type === '${P.start}') {
124
+ if (msg.type === '${F.start}') {
125
125
  try {
126
126
  // RFC-365 R3:host-slot 注入槽——service worker 是第三条加载路径,同样是独立 realm
127
127
  // 且 entry 落在 tmpdir。与隔离端 entry 同一处理(宿主运行机解析绝对路径 → 消息下发
@@ -136,7 +136,7 @@ parentPort.on('message', async (msg) => {
136
136
  const mod = require(msg.compiledPath)
137
137
  const factory = mod && (mod.default || mod)
138
138
  if (typeof factory !== 'function') {
139
- __send({ type: '${P.started}', error: 'plugin entry is not a factory function' })
139
+ __send({ type: '${F.started}', error: 'plugin entry is not a factory function' })
140
140
  return
141
141
  }
142
142
  // 工厂期 ctx:service 场景下不注入 host(host 只进 service ctx),保持与既有
@@ -168,7 +168,7 @@ parentPort.on('message', async (msg) => {
168
168
  const services = Array.isArray(instance && instance.services) ? instance.services : []
169
169
  const svc = services.find((s) => s && s.id === msg.serviceId)
170
170
  if (!svc || typeof svc.start !== 'function') {
171
- __send({ type: '${P.started}', error: 'service not found: ' + msg.serviceId })
171
+ __send({ type: '${F.started}', error: 'service not found: ' + msg.serviceId })
172
172
  return
173
173
  }
174
174
  serviceInstance = svc
@@ -183,9 +183,9 @@ parentPort.on('message', async (msg) => {
183
183
  workspaceDir: msg.serviceCtx.workspaceDir,
184
184
  workspaceKey: msg.serviceCtx.workspaceKey,
185
185
  logger: {
186
- info: (m) => __send({ type: '${P.hostCall}', callId: 'log', method: 'log.info', params: { msg: String(m) } }),
187
- warn: (m) => __send({ type: '${P.hostCall}', callId: 'log', method: 'log.warn', params: { msg: String(m) } }),
188
- error: (m) => __send({ type: '${P.hostCall}', callId: 'log', method: 'log.error', params: { msg: String(m) } }),
186
+ info: (m) => __send({ type: '${F.hostCall}', callId: 'log', method: 'log.info', params: { msg: String(m) } }),
187
+ warn: (m) => __send({ type: '${F.hostCall}', callId: 'log', method: 'log.warn', params: { msg: String(m) } }),
188
+ error: (m) => __send({ type: '${F.hostCall}', callId: 'log', method: 'log.error', params: { msg: String(m) } }),
189
189
  },
190
190
  host: buildHost(msg.serviceCtx.hostCapabilities),
191
191
  storage,
@@ -193,46 +193,46 @@ parentPort.on('message', async (msg) => {
193
193
  // 被动面,真正的数据面是 readTranscript,那才有独立能力门)。
194
194
  onNotify: (handler) => { notifyHandler = typeof handler === 'function' ? handler : null },
195
195
  })
196
- __send({ type: '${P.started}' })
196
+ __send({ type: '${F.started}' })
197
197
  } catch (err) {
198
- __send({ type: '${P.started}', error: (err && err.message) || String(err) })
198
+ __send({ type: '${F.started}', error: (err && err.message) || String(err) })
199
199
  }
200
200
  return
201
201
  }
202
202
 
203
- if (msg.type === '${P.notify}') {
203
+ if (msg.type === '${F.notify}') {
204
204
  // 未注册 handler → 丢弃(服务可能还没 start 完,或根本不关心通知)。
205
205
  if (!notifyHandler) return
206
206
  try {
207
207
  await notifyHandler(msg.notification)
208
208
  } catch (err) {
209
209
  // 不静默:handler 异常按运行期崩溃上报,宿主据此退避重启(对齐 uncaughtException 纹理)。
210
- __send({ type: '${P.crashed}', error: (err && err.message) || String(err) })
210
+ __send({ type: '${F.crashed}', error: (err && err.message) || String(err) })
211
211
  }
212
212
  return
213
213
  }
214
214
 
215
- if (msg.type === '${P.eventPush}') {
215
+ if (msg.type === '${F.eventPush}') {
216
216
  const list = serviceLocalSubs.get(msg.eventType) || []
217
217
  for (const h of list) {
218
218
  try { h(msg.payload, { pluginId: msg.sourcePluginId }) }
219
- catch (e) { __send({ type: '${P.crashed}', error: (e && e.message) || String(e) }) }
219
+ catch (e) { __send({ type: '${F.crashed}', error: (e && e.message) || String(e) }) }
220
220
  }
221
221
  return
222
222
  }
223
223
 
224
- if (msg.type === '${P.stop}') {
224
+ if (msg.type === '${F.stop}') {
225
225
  try {
226
226
  if (serviceInstance && typeof serviceInstance.stop === 'function') await serviceInstance.stop()
227
- __send({ type: '${P.stopped}' })
227
+ __send({ type: '${F.stopped}' })
228
228
  } catch (err) {
229
- __send({ type: '${P.stopped}', error: (err && err.message) || String(err) })
229
+ __send({ type: '${F.stopped}', error: (err && err.message) || String(err) })
230
230
  }
231
231
  return
232
232
  }
233
233
  })
234
- `}const Ml=e(import.meta.url);let Nl=!1,Pl=()=>Ml(`esbuild`);function Fl(){return Pl()}function Il(){Nl=!0}function Ll(){if(Nl)try{Pl().stop?.()}catch{}}function Rl(e=process){e.once(`exit`,()=>Ll())}const zl=[`SIGINT`,`SIGTERM`,`SIGHUP`];function Bl(e=process){for(let t of zl){let n=()=>{e.listenerCount(t)>1||(Ll(),e.removeListener(t,n),e.kill?.(e.pid??process.pid,t))};e.on(t,n)}}function Vl(e,t,n){let r,i=!1,a=new Promise((e,n)=>{r=setTimeout(()=>{i=!0,n(Error(`esbuild build timed out after ${t}ms`))},t)});return Promise.race([e,a]).finally(()=>clearTimeout(r)).catch(e=>{throw i&&n(),e})}const F=T(`@x-otto/coding:plugin-module-loader`),I=e(import.meta.url),Hl=[`plugin.ts`,`plugin.tsx`];function Ul(e){for(let t of Hl){let n=C(e,t);if(v(n))return n}return null}const Wl={name:`otto-plugin-sdk-shim`,setup(e){e.onResolve({filter:/^@(?:x-)?otto\/(plugin|extension)$/},()=>({path:`otto-plugin-sdk`,namespace:`otto-sdk-shim`})),e.onLoad({filter:/.*/,namespace:`otto-sdk-shim`},()=>({contents:`export const definePlugin = (f) => f;`,loader:`js`}))}};function Gl(){let e={};try{let t=import.meta.resolve(`@x-otto/shared`),n=S(ia(t)),r=I.resolve(`pino`,{paths:[n]});e.pino=r,e[`thread-stream`]=I.resolve(`thread-stream`,{paths:[S(r)]}),e[`jsonc-parser`]=I.resolve(`jsonc-parser`,{paths:[n]}),e[`@x-otto/shared`]=t.startsWith(`file://`)?ia(t):t;let i=import.meta.resolve(`@x-otto/provider`);e[`@x-otto/provider`]=i.startsWith(`file://`)?ia(i):i;let a=import.meta.resolve(`@x-otto/interchange`);e[`@x-otto/interchange`]=a.startsWith(`file://`)?ia(a):a;let o=import.meta.resolve(`@x-otto/env`);e[`@x-otto/env`]=o.startsWith(`file://`)?ia(o):o}catch(e){F.warn({err:String(e)},`failed to pre-resolve pino/thread-stream/jsonc-parser/@x-otto absolute paths, falling back to bare-specifier external (pre-fix behavior)`)}return e}const Kl=[`pino`,`thread-stream`,`jsonc-parser`,`undici`],ql=`otto-host-external`,Jl=`__ottoPluginHostExternals`;function Yl(){let e=RegExp(`^(${Kl.join(`|`)})$`);return{name:`otto-plugin-host-slot`,setup(t){t.onResolve({filter:e},e=>({path:e.path,namespace:ql})),t.onLoad({filter:/.*/,namespace:ql},e=>({contents:`const __slot = globalThis[${JSON.stringify(Jl)}]\nif (!__slot || !__slot[${JSON.stringify(e.path)}]) {\n throw new Error('otto plugin: host external ${e.path} 未注入' +\n '(宿主须在加载插件产物前调用 installPluginHostExternals;隔离端见 RFC-365 R3)')\n}\nmodule.exports = __slot[${JSON.stringify(e.path)}]\n`,loader:`js`}))}}}function Xl(){let e={};try{let t=S(ia(import.meta.resolve(`@x-otto/shared`))),n=I.resolve(`pino`,{paths:[t]});e.pino=n,e[`thread-stream`]=I.resolve(`thread-stream`,{paths:[S(n)]}),e[`jsonc-parser`]=I.resolve(`jsonc-parser`,{paths:[t]}),e.undici=I.resolve(`undici`,{paths:[t]})}catch(e){F.warn({err:String(e)},`failed to resolve host external paths (pino/thread-stream/jsonc-parser/undici) — plugins compiled in portable mode will fail to load`)}return e}function Zl(){let e=globalThis,t=e[Jl]??={};for(let[e,n]of Object.entries(Xl()))if(t[e]===void 0)try{t[e]=I(n)}catch(t){F.warn({module:e,path:n,err:String(t)},`failed to load host external into injection slot`)}}function Ql(e){let t=Object.keys(e);return{name:`otto-plugin-absolute-external`,setup(n){if(t.length===0)return;let r=RegExp(`^(${t.map(e=>e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)).join(`|`)})$`);n.onResolve({filter:r},t=>({path:e[t.path],external:!0}))}}}async function $l(e,t){let n=Ul(e);if(!n)return null;let r=C(e,`plugin-dist`);y(r,{recursive:!0});let i=C(r,`plugin.cjs`),a=t?.portable?{}:Gl(),o=(t?.portable?[`react`,`ink`]:[`react`,`ink`,`jsonc-parser`,`pino`,`thread-stream`,`@x-otto/shared`,`@x-otto/provider`,`@x-otto/interchange`,`@x-otto/env`]).filter(e=>!(e in a)),{build:s}=Fl();return Il(),await Vl(s({entryPoints:[n],outfile:i,bundle:!0,format:`cjs`,platform:`node`,external:o,jsx:`transform`,logLevel:`silent`,define:{"import.meta.url":`__otto_plugin_import_meta_url`},banner:{js:`const __otto_plugin_import_meta_url = require("url").pathToFileURL(__filename).href;`},plugins:[Wl,...t?.portable?[Yl()]:[Ql(a)]]}),t?.timeoutMs??12e4,()=>Ll()),au(r,e),i}const eu=[`.ts`,`.tsx`,`.js`,`.jsx`,`.mjs`,`.cjs`,`.json`];function tu(e){let t=[],n=r=>{let i;try{i=Xe(r,{withFileTypes:!0})}catch{return}for(let a of i){let i=a.name;if(i===`plugin-dist`||i===`panels-dist`||i===`node_modules`||i.startsWith(`.`))continue;let o=C(r,i);if(a.isDirectory())n(o);else if(a.isFile()){let n=i.lastIndexOf(`.`),r=n>=0?i.slice(n):``;eu.includes(r)&&t.push(lt(e,o))}}};return n(e),t.sort()}function nu(e){let t=tu(e),n=Fi(`sha256`);for(let r of t){let t=r.split(ut).join(`/`);n.update(t),n.update(`\0`);try{n.update(b(C(e,r)))}catch(e){n.update(`<unreadable:${e instanceof Error?e.message:String(e)}>`)}n.update(`\0`)}return n.digest(`hex`)}function ru(e){return{apiVersion:rr,compilerVersion:i,sourceHash:nu(e)}}function iu(e,t=e){let n=C(e,`plugin-dist`,`meta.json`);if(v(n))try{let e=JSON.parse(b(n,`utf8`));e.sourceHash=nu(t),x(n,JSON.stringify(e))}catch(t){F.warn({pluginDir:e,err:String(t)},`failed to rewrite artifact sourceHash`)}}function au(e,t){try{let n=C(e,`meta.json`),r=C(e,`.meta.json.tmp-${process.pid}`);x(r,JSON.stringify(ru(t))),$e(r,n)}catch(e){F.warn(`Failed to write plugin artifact meta: %s`,e instanceof Error?e.message:String(e))}}function ou(e){try{let t=b(C(e,`plugin-dist`,`meta.json`),`utf8`),n=JSON.parse(t),r=ru(e);return n.apiVersion===r.apiVersion&&n.compilerVersion===r.compilerVersion&&n.sourceHash===r.sourceHash}catch{return!1}}function su(e){let t=C(e,`plugin-dist`,`plugin.cjs`);return v(t)?ou(e)?t:(F.info(`Plugin artifact at %s is stale (meta mismatch/missing) — recompiling`,t),null):null}async function cu(e,t,n){if(!Ul(e.dir))return null;if((e.scope===`project`||e.scope===`repository`)&&!Or(e.dir))return F.warn({pluginId:e.id},`project/repository plugin not trusted, skipping code module (fail-closed)`),n?.(e.id,`project/repository plugin not trusted, skipping code module (fail-closed)`,`not-trusted`),null;let r=O(e);if(r.pendingCapabilities.length>0)return F.warn({pluginId:e.id,pendingCapabilities:r.pendingCapabilities},`plugin declares high-risk capabilities not yet granted, skipping code module entirely before factory execution (fail-closed, RFC-140 D3)`),n?.(e.id,`declares high-risk capabilities not yet granted: ${r.pendingCapabilities.join(`, `)}`,`capability-not-granted`),null;let i=!1,a=su(e.dir);if(a)i=!0,F.info({pluginId:e.id,outfile:a},`using prebuilt plugin module (RFC-150 D5, skip compile)`);else try{a=await $l(e.dir)}catch(t){let r=String(t);return F.warn({pluginId:e.id,err:r},`plugin.ts compile failed`),n?.(e.id,`compile failed: ${r}`,`module-error`),null}if(!a)return null;Zl();let o;try{delete I.cache[a];let e=I(a);o=e?.default??e}catch(t){if(i){F.warn({pluginId:e.id,outfile:a,err:String(t)},`prebuilt plugin module failed to load — recompiling for this machine`);try{let t=await $l(e.dir);if(!t)throw Error(`recompile produced no artifact`);a=t,delete I.cache[a];let n=I(a);o=n?.default??n}catch(t){let r=String(t);return F.warn({pluginId:e.id,err:r},`plugin.ts load failed (after recompile retry)`),n?.(e.id,`load failed: ${r}`,`module-error`),null}}else{let r=String(t);return F.warn({pluginId:e.id,err:r},`plugin.ts load failed`),n?.(e.id,`load failed: ${r}`,`module-error`),null}}if(typeof o!=`function`)return F.warn({pluginId:e.id},`plugin.ts default export is not a factory function`),n?.(e.id,`default export is not a factory function`,`module-error`),null;try{let n=await o(t);return{pluginId:e.id,module:n,compiledPath:a??void 0}}catch(t){let r=String(t);return F.warn({pluginId:e.id,err:r},`plugin factory threw`),n?.(e.id,`factory threw: ${r}`,`module-error`),null}}const L=T(`@x-otto/coding:plugin-service-pool`),lu=5e3;function uu(e){return[`--experimental-permission`,`--allow-fs-read=*`,...e?[`--allow-fs-write=${e}`]:[]]}`${ot()}`;let du=null,fu=null;function pu(){return fu||(du||=Je(C(ot(),`otto-plugin-service-`)),fu=C(du,`service-entry.cjs`),x(fu,jl()),fu)}function mu(e,t){return`${e}:${t}`}var hu=class{services=new Map;eventDispatcher;setEventDispatcher(e){this.eventDispatcher=e}get runningKeys(){return[...this.services.entries()].filter(([,e])=>e.status===`running`).map(([e])=>e)}statusOf(e,t){return this.services.get(mu(e,t))?.status}restartsOf(e,t){return this.services.get(mu(e,t))?.restarts??0}notify(e,t,n){let r=this.services.get(mu(e,t));if(!r||r.status!==`running`)return!1;try{return r.worker.postMessage({type:P.notify,notification:n}),!0}catch{return!1}}pushEvent(e,t){for(let n of this.runningServiceIds(e)){let r=this.services.get(mu(e,n));if(r)try{r.worker.postMessage({type:P.eventPush,eventType:t.type,payload:t.payload,sourcePluginId:t.sourcePluginId})}catch{}}}runningServiceIds(e){let t=`${e}:`;return[...this.services.entries()].filter(([e,n])=>e.startsWith(t)&&n.status===`running`).map(([e])=>e.slice(t.length))}async start(e){let t=mu(e.pluginId,e.serviceId);return await this.stop(e.pluginId,e.serviceId),this.spawnAndStart(t,e,0)}spawnAndStart(e,t,n){return new Promise(r=>{let i;try{i=new ra(pu(),{execArgv:[...uu(t.storageDir)]})}catch(t){L.error({key:e,err:String(t)},`failed to create service worker`),r({error:String(t)});return}i.unref();let a={worker:i,input:t,status:`starting`,restarts:n,stopping:!1};this.services.set(e,a);let o=!1,s=e=>{o||(o=!0,r(e))};i.on(`message`,t=>{this.onWorkerMessage(e,a,t,s)}),i.on(`error`,t=>{L.warn({key:e,err:String(t)},`service worker error`),a.status=`failed`,s({error:String(t)}),this.scheduleRestart(e,a)}),i.on(`exit`,()=>{a.stopping||(a.status!==`failed`&&(a.status=`failed`),s({error:`service worker exited unexpectedly`}),this.scheduleRestart(e,a))}),i.postMessage({type:P.start,compiledPath:t.compiledPath,hostExternals:Xl(),serviceId:t.serviceId,factoryCtx:t.factoryCtx,serviceCtx:{pluginId:t.pluginId,workspaceDir:t.workspaceDir,workspaceKey:t.workspaceKey,hostCapabilities:t.hostCapabilities,storageDir:t.storageDir,hasStorageCapability:t.hasStorageCapability}})})}async onWorkerMessage(e,t,n,r){if(n.type===P.started){n.error?(t.status=`failed`,L.warn({key:e,err:n.error},`plugin service failed to start`),r({error:n.error}),this.scheduleRestart(e,t)):(t.status=`running`,L.info({key:e},`plugin service started`),r({}));return}if(n.type===P.crashed){L.warn({key:e,err:n.error},`plugin service crashed at runtime`),t.status=`failed`,this.scheduleRestart(e,t);return}if(n.type===P.hostCall){await this.dispatchHostCall(e,t,n);return}}async dispatchHostCall(e,t,n){let{callId:r,method:i,params:a}=n;if(i===`log.info`||i===`log.warn`||i===`log.error`){let e=a?.msg??``;L[i.slice(4)]({pluginId:t.input.pluginId,serviceId:t.input.serviceId},e);return}if(!r)return;let o=(e,n)=>{try{t.worker.postMessage({type:P.hostResult,callId:r,result:e,error:n})}catch{}};if(i===`startJob`){let e=t.input.bridge.startJob;if(!e){o(void 0,`capability not granted: agent.dispatch`);return}let n=a;try{o(await e({title:String(n?.title??``),prompt:String(n?.prompt??``)}))}catch(e){o(void 0,e instanceof Error?e.message:String(e))}return}if(i===`readTranscript`){let e=t.input.bridge.readTranscript;if(!e){o(void 0,`capability not granted: session.read`);return}let n=a;try{let t=typeof n?.sinceIndex==`number`?n.sinceIndex:void 0;o(await e({sessionId:String(n?.sessionId??``),sinceIndex:t}))}catch(e){o(void 0,e instanceof Error?e.message:String(e))}return}if(i===`emitEvent`){if(!this.eventDispatcher){o(void 0,`event dispatcher not available (service events capability not wired)`);return}let e=a,n=String(e?.type??``),r=e?.payload??{};this.eventDispatcher.emit(t.input.pluginId,n,r),o(void 0);return}if(i===`subscribeEvent`){if(!this.eventDispatcher){o(void 0,`event dispatcher not available (service events capability not wired)`);return}let e=String(a?.type??``),n=t.input.pluginId;this.eventDispatcher.subscribe(n,e,()=>{},(e,t,r)=>{this.pushEvent(n,{type:e,payload:t,sourcePluginId:r.pluginId})}),o(void 0);return}if(i===`unsubscribeEvent`){if(!this.eventDispatcher){o(void 0,`event dispatcher not available (service events capability not wired)`);return}this.eventDispatcher.unregisterPluginSubscriptions(t.input.pluginId),o(void 0);return}if(i===`notify`){let e=t.input.bridge.notify;if(!e){o(void 0,`capability not granted: user.notify`);return}let n=a,r=String(n?.level??`info`),i=r===`warning`||r===`error`?r:`info`;try{await e({level:i,code:String(n?.code??``),message:String(n?.message??``)}),o(void 0)}catch(e){o(void 0,e instanceof Error?e.message:String(e))}return}if(i===`ask`){o(void 0,`capability not granted: user.ask`);return}if(i===`complete`){let e=t.input.bridge.complete;if(!e){o(void 0,`capability not granted: llm.complete`);return}let n=a;try{let t=typeof n?.maxTokens==`number`?n.maxTokens:void 0;o(await e({prompt:String(n?.prompt??``),maxTokens:t}))}catch(e){o(void 0,e instanceof Error?e.message:String(e))}return}L.warn({key:e,method:i},`plugin service requested unknown host method (rejected)`),o(void 0,`unknown host method: ${String(i)}`)}scheduleRestart(e,t){if(t.stopping||t.restartTimer)return;if(t.restarts>=5){L.error({key:e,restarts:t.restarts},`plugin service exceeded restart limit, giving up (no further restarts)`),t.status=`failed`;return}let n=t.restarts+1,r=Math.min(1e3*2**(n-1),3e4);L.warn({key:e,attempt:n,delayMs:r},`restarting plugin service after crash`);let i=setTimeout(()=>{t.restartTimer=void 0;let r=this.services.get(e);!r||r.stopping||this.spawnAndStart(e,t.input,n)},r);i.unref?.(),t.restartTimer=i}async stop(e,t){let n=mu(e,t),r=this.services.get(n);if(!r)return;r.stopping=!0,r.restartTimer&&=(clearTimeout(r.restartTimer),void 0),this.services.delete(n);let i=new Promise(e=>{let t=n=>{n?.type===P.stopped&&(r.worker.off(`message`,t),e(!0))};r.worker.on(`message`,t);try{r.worker.postMessage({type:P.stop})}catch{e(!1)}}),a=new Promise(e=>{setTimeout(()=>e(!1),lu).unref?.()});await Promise.race([i,a])||L.warn({key:n,timeoutMs:lu},`plugin service did not stop gracefully, terminating (state may be lost)`),r.status=`stopped`;try{await r.worker.terminate()}catch{}}async stopPlugin(e){let t=`${e}:`,n=[...this.services.keys()].filter(e=>e.startsWith(t));for(let r of n){let n=r.slice(t.length);await this.stop(e,n)}}async dispose(){let e=[...this.services.keys()];for(let t of e){let e=t.indexOf(`:`);await this.stop(t.slice(0,e),t.slice(e+1))}if(du){try{et(du,{recursive:!0,force:!0})}catch{}du=null,fu=null}}};let gu=null;function _u(){return gu||=new hu,gu}async function vu(){await gu?.dispose(),gu=null}const yu=[/\bsk-[A-Za-z0-9_-]{16,}/g,/\bgh[pousr]_[A-Za-z0-9]{20,}/g,/\bAKIA[0-9A-Z]{16}\b/g,/\bxox[abposr]-[A-Za-z0-9-]{10,}/g,/\bBearer\s+[A-Za-z0-9._~+/-]{20,}=*/g,/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}/g];function bu(e){let t=e;for(let e of yu)t=t.replace(e,`***`);return t}function xu(e){if(typeof e==`string`)return e;if(!Array.isArray(e))return``;let t=[];for(let n of e){let e=n;e?.type===`text`&&typeof e.text==`string`&&t.push(e.text)}return t.join(`
235
- `)}function Su(e){if(e.role===`user`)return e.internal?null:{role:`user`,text:bu(xu(e.content))};if(e.role===`assistant`){let t=e.content.filter(e=>e.type===`tool_call`)[0]?.name,n={role:`assistant`,text:bu(xu(e.content))};return t&&(n.toolName=t),n}return e.role===`tool_result`?e.internal?null:{role:`tool_result`,text:bu(xu(e.content)),toolName:e.toolName}:null}function Cu(e,t,n){let r=Math.max(0,Math.min(t,e.length)),i=e.slice(r),a=i.length>n?i.slice(i.length-n):i,o=[];for(let e of a){let t=Su(e);t&&o.push(t)}return{messages:o,nextIndex:e.length}}const R={load:`worker.load`,loaded:`worker.loaded`,error:`worker.error`,toolExecute:`tool.execute`,toolResult:`tool.result`,toolCancel:`tool.cancel`,sigilResolve:`sigil.resolve`,sigilResult:`sigil.result`,onActivate:`worker.onActivate`,activated:`worker.activated`,onDeactivate:`worker.onDeactivate`,deactivated:`worker.deactivated`,stop:`worker.stop`,hostCall:`host.call`,hostResult:`host.result`,eventPush:`event.push`};function wu(e){return`${e===`worker`?`const { parentPort } = require('worker_threads')
234
+ `}const Ml=e(import.meta.url);let Nl=!1,Pl=()=>Ml(`esbuild`);function Fl(){return Pl()}function Il(){Nl=!0}function Ll(){if(Nl)try{Pl().stop?.()}catch{}}function Rl(e=process){e.once(`exit`,()=>Ll())}const zl=[`SIGINT`,`SIGTERM`,`SIGHUP`];function Bl(e=process){for(let t of zl){let n=()=>{e.listenerCount(t)>1||(Ll(),e.removeListener(t,n),e.kill?.(e.pid??process.pid,t))};e.on(t,n)}}function Vl(e,t,n){let r,i=!1,a=new Promise((e,n)=>{r=setTimeout(()=>{i=!0,n(Error(`esbuild build timed out after ${t}ms`))},t)});return Promise.race([e,a]).finally(()=>clearTimeout(r)).catch(e=>{throw i&&n(),e})}const I=T(`@x-otto/coding:plugin-module-loader`),L=e(import.meta.url),Hl=[`plugin.ts`,`plugin.tsx`];function Ul(e){for(let t of Hl){let n=C(e,t);if(v(n))return n}return null}const Wl={name:`otto-plugin-sdk-shim`,setup(e){e.onResolve({filter:/^@(?:x-)?otto\/(plugin|extension)$/},()=>({path:`otto-plugin-sdk`,namespace:`otto-sdk-shim`})),e.onLoad({filter:/.*/,namespace:`otto-sdk-shim`},()=>({contents:`export const definePlugin = (f) => f;`,loader:`js`}))}};function Gl(){let e={};try{let t=import.meta.resolve(`@x-otto/shared`),n=S(ia(t)),r=L.resolve(`pino`,{paths:[n]});e.pino=r,e[`thread-stream`]=L.resolve(`thread-stream`,{paths:[S(r)]}),e[`jsonc-parser`]=L.resolve(`jsonc-parser`,{paths:[n]}),e[`@x-otto/shared`]=t.startsWith(`file://`)?ia(t):t;let i=import.meta.resolve(`@x-otto/provider`);e[`@x-otto/provider`]=i.startsWith(`file://`)?ia(i):i;let a=import.meta.resolve(`@x-otto/interchange`);e[`@x-otto/interchange`]=a.startsWith(`file://`)?ia(a):a;let o=import.meta.resolve(`@x-otto/env`);e[`@x-otto/env`]=o.startsWith(`file://`)?ia(o):o}catch(e){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 Kl=[`pino`,`thread-stream`,`jsonc-parser`,`undici`],ql=`otto-host-external`,Jl=`__ottoPluginHostExternals`;function Yl(){let e=RegExp(`^(${Kl.join(`|`)})$`);return{name:`otto-plugin-host-slot`,setup(t){t.onResolve({filter:e},e=>({path:e.path,namespace:ql})),t.onLoad({filter:/.*/,namespace:ql},e=>({contents:`const __slot = globalThis[${JSON.stringify(Jl)}]\nif (!__slot || !__slot[${JSON.stringify(e.path)}]) {\n throw new Error('otto plugin: host external ${e.path} 未注入' +\n '(宿主须在加载插件产物前调用 installPluginHostExternals;隔离端见 RFC-365 R3)')\n}\nmodule.exports = __slot[${JSON.stringify(e.path)}]\n`,loader:`js`}))}}}function Xl(){let e={};try{let t=S(ia(import.meta.resolve(`@x-otto/shared`))),n=L.resolve(`pino`,{paths:[t]});e.pino=n,e[`thread-stream`]=L.resolve(`thread-stream`,{paths:[S(n)]}),e[`jsonc-parser`]=L.resolve(`jsonc-parser`,{paths:[t]}),e.undici=L.resolve(`undici`,{paths:[t]})}catch(e){I.warn({err:String(e)},`failed to resolve host external paths (pino/thread-stream/jsonc-parser/undici) — plugins compiled in portable mode will fail to load`)}return e}function Zl(){let e=globalThis,t=e[Jl]??={};for(let[e,n]of Object.entries(Xl()))if(t[e]===void 0)try{t[e]=L(n)}catch(t){I.warn({module:e,path:n,err:String(t)},`failed to load host external into injection slot`)}}function Ql(e){let t=Object.keys(e);return{name:`otto-plugin-absolute-external`,setup(n){if(t.length===0)return;let r=RegExp(`^(${t.map(e=>e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)).join(`|`)})$`);n.onResolve({filter:r},t=>({path:e[t.path],external:!0}))}}}async function $l(e,t){let n=Ul(e);if(!n)return null;let r=C(e,`plugin-dist`);y(r,{recursive:!0});let i=C(r,`plugin.cjs`),a=t?.portable?{}:Gl(),o=(t?.portable?[`react`,`ink`]:[`react`,`ink`,`jsonc-parser`,`pino`,`thread-stream`,`@x-otto/shared`,`@x-otto/provider`,`@x-otto/interchange`,`@x-otto/env`]).filter(e=>!(e in a)),{build:s}=Fl();return Il(),await Vl(s({entryPoints:[n],outfile:i,bundle:!0,format:`cjs`,platform:`node`,external:o,jsx:`transform`,logLevel:`silent`,define:{"import.meta.url":`__otto_plugin_import_meta_url`},banner:{js:`const __otto_plugin_import_meta_url = require("url").pathToFileURL(__filename).href;`},plugins:[Wl,...t?.portable?[Yl()]:[Ql(a)]]}),t?.timeoutMs??12e4,()=>Ll()),au(r,e),i}const eu=[`.ts`,`.tsx`,`.js`,`.jsx`,`.mjs`,`.cjs`,`.json`];function tu(e){let t=[],n=r=>{let i;try{i=Xe(r,{withFileTypes:!0})}catch{return}for(let a of i){let i=a.name;if(i===`plugin-dist`||i===`panels-dist`||i===`node_modules`||i.startsWith(`.`))continue;let o=C(r,i);if(a.isDirectory())n(o);else if(a.isFile()){let n=i.lastIndexOf(`.`),r=n>=0?i.slice(n):``;eu.includes(r)&&t.push(lt(e,o))}}};return n(e),t.sort()}function nu(e){let t=tu(e),n=Ii(`sha256`);for(let r of t){let t=r.split(ut).join(`/`);n.update(t),n.update(`\0`);try{n.update(b(C(e,r)))}catch(e){n.update(`<unreadable:${e instanceof Error?e.message:String(e)}>`)}n.update(`\0`)}return n.digest(`hex`)}function ru(e){return{apiVersion:ir,compilerVersion:i,sourceHash:nu(e)}}function iu(e,t=e){let n=C(e,`plugin-dist`,`meta.json`);if(v(n))try{let e=JSON.parse(b(n,`utf8`));e.sourceHash=nu(t),x(n,JSON.stringify(e))}catch(t){I.warn({pluginDir:e,err:String(t)},`failed to rewrite artifact sourceHash`)}}function au(e,t){try{let n=C(e,`meta.json`),r=C(e,`.meta.json.tmp-${process.pid}`);x(r,JSON.stringify(ru(t))),$e(r,n)}catch(e){I.warn(`Failed to write plugin artifact meta: %s`,e instanceof Error?e.message:String(e))}}function ou(e){try{let t=b(C(e,`plugin-dist`,`meta.json`),`utf8`),n=JSON.parse(t),r=ru(e);return n.apiVersion===r.apiVersion&&n.compilerVersion===r.compilerVersion&&n.sourceHash===r.sourceHash}catch{return!1}}function su(e){let t=C(e,`plugin-dist`,`plugin.cjs`);return v(t)?ou(e)?t:(I.info(`Plugin artifact at %s is stale (meta mismatch/missing) — recompiling`,t),null):null}async function cu(e,t,n){if(!Ul(e.dir))return null;if((e.scope===`project`||e.scope===`repository`)&&!kr(e.dir))return I.warn({pluginId:e.id},`project/repository plugin not trusted, skipping code module (fail-closed)`),n?.(e.id,`project/repository plugin not trusted, skipping code module (fail-closed)`,`not-trusted`),null;let r=O(e);if(r.pendingCapabilities.length>0)return 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)`),n?.(e.id,`declares high-risk capabilities not yet granted: ${r.pendingCapabilities.join(`, `)}`,`capability-not-granted`),null;let i=!1,a=su(e.dir);if(a)i=!0,I.info({pluginId:e.id,outfile:a},`using prebuilt plugin module (RFC-150 D5, skip compile)`);else try{a=await $l(e.dir)}catch(t){let r=String(t);return I.warn({pluginId:e.id,err:r},`plugin.ts compile failed`),n?.(e.id,`compile failed: ${r}`,`module-error`),null}if(!a)return null;Zl();let o;try{delete 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 $l(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}`,`module-error`),null}}else{let r=String(t);return I.warn({pluginId:e.id,err:r},`plugin.ts load failed`),n?.(e.id,`load failed: ${r}`,`module-error`),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`,`module-error`),null;try{let n=await o(t);return{pluginId:e.id,module:n,compiledPath:a??void 0}}catch(t){let r=String(t);return I.warn({pluginId:e.id,err:r},`plugin factory threw`),n?.(e.id,`factory threw: ${r}`,`module-error`),null}}const R=T(`@x-otto/coding:plugin-service-pool`),lu=5e3;function uu(e){return[`--experimental-permission`,`--allow-fs-read=*`,...e?[`--allow-fs-write=${e}`]:[]]}`${ot()}`;let du=null,fu=null;function pu(){return fu||(du||=Je(C(ot(),`otto-plugin-service-`)),fu=C(du,`service-entry.cjs`),x(fu,jl()),fu)}function mu(e,t){return`${e}:${t}`}var hu=class{services=new Map;eventDispatcher;setEventDispatcher(e){this.eventDispatcher=e}get runningKeys(){return[...this.services.entries()].filter(([,e])=>e.status===`running`).map(([e])=>e)}statusOf(e,t){return this.services.get(mu(e,t))?.status}restartsOf(e,t){return this.services.get(mu(e,t))?.restarts??0}notify(e,t,n){let r=this.services.get(mu(e,t));if(!r||r.status!==`running`)return!1;try{return r.worker.postMessage({type:F.notify,notification:n}),!0}catch{return!1}}pushEvent(e,t){for(let n of this.runningServiceIds(e)){let r=this.services.get(mu(e,n));if(r)try{r.worker.postMessage({type:F.eventPush,eventType:t.type,payload:t.payload,sourcePluginId:t.sourcePluginId})}catch{}}}runningServiceIds(e){let t=`${e}:`;return[...this.services.entries()].filter(([e,n])=>e.startsWith(t)&&n.status===`running`).map(([e])=>e.slice(t.length))}async start(e){let t=mu(e.pluginId,e.serviceId);return await this.stop(e.pluginId,e.serviceId),this.spawnAndStart(t,e,0)}spawnAndStart(e,t,n){return new Promise(r=>{let i;try{i=new ra(pu(),{execArgv:[...uu(t.storageDir)]})}catch(t){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:Xl(),serviceId:t.serviceId,factoryCtx:t.factoryCtx,serviceCtx:{pluginId:t.pluginId,workspaceDir:t.workspaceDir,workspaceKey:t.workspaceKey,hostCapabilities:t.hostCapabilities,storageDir:t.storageDir,hasStorageCapability:t.hasStorageCapability}})})}async onWorkerMessage(e,t,n,r){if(n.type===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===`emitEvent`){if(!this.eventDispatcher){o(void 0,`event dispatcher not available (service events capability not wired)`);return}let e=a,n=String(e?.type??``),r=e?.payload??{};this.eventDispatcher.emit(t.input.pluginId,n,r),o(void 0);return}if(i===`subscribeEvent`){if(!this.eventDispatcher){o(void 0,`event dispatcher not available (service events capability not wired)`);return}let e=String(a?.type??``),n=t.input.pluginId;this.eventDispatcher.subscribe(n,e,()=>{},(e,t,r)=>{this.pushEvent(n,{type:e,payload:t,sourcePluginId:r.pluginId})}),o(void 0);return}if(i===`unsubscribeEvent`){if(!this.eventDispatcher){o(void 0,`event dispatcher not available (service events capability not wired)`);return}this.eventDispatcher.unregisterPluginSubscriptions(t.input.pluginId),o(void 0);return}if(i===`notify`){let e=t.input.bridge.notify;if(!e){o(void 0,`capability not granted: user.notify`);return}let n=a,r=String(n?.level??`info`),i=r===`warning`||r===`error`?r:`info`;try{await e({level:i,code:String(n?.code??``),message:String(n?.message??``)}),o(void 0)}catch(e){o(void 0,e instanceof Error?e.message:String(e))}return}if(i===`ask`){o(void 0,`capability not granted: user.ask`);return}if(i===`complete`){let e=t.input.bridge.complete;if(!e){o(void 0,`capability not granted: llm.complete`);return}let n=a;try{let t=typeof n?.maxTokens==`number`?n.maxTokens:void 0;o(await e({prompt:String(n?.prompt??``),maxTokens:t}))}catch(e){o(void 0,e instanceof Error?e.message:String(e))}return}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=mu(e,t),r=this.services.get(n);if(!r)return;r.stopping=!0,r.restartTimer&&=(clearTimeout(r.restartTimer),void 0),this.services.delete(n);let i=new Promise(e=>{let t=n=>{n?.type===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),lu).unref?.()});await Promise.race([i,a])||R.warn({key:n,timeoutMs:lu},`plugin service did not stop gracefully, terminating (state may be lost)`),r.status=`stopped`;try{await r.worker.terminate()}catch{}}async stopPlugin(e){let t=`${e}:`,n=[...this.services.keys()].filter(e=>e.startsWith(t));for(let r of n){let n=r.slice(t.length);await this.stop(e,n)}}async dispose(){let e=[...this.services.keys()];for(let t of e){let e=t.indexOf(`:`);await this.stop(t.slice(0,e),t.slice(e+1))}if(du){try{et(du,{recursive:!0,force:!0})}catch{}du=null,fu=null}}};let gu=null;function _u(){return gu||=new hu,gu}async function vu(){await gu?.dispose(),gu=null}const yu=[/\bsk-[A-Za-z0-9_-]{16,}/g,/\bgh[pousr]_[A-Za-z0-9]{20,}/g,/\bAKIA[0-9A-Z]{16}\b/g,/\bxox[abposr]-[A-Za-z0-9-]{10,}/g,/\bBearer\s+[A-Za-z0-9._~+/-]{20,}=*/g,/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}/g];function bu(e){let t=e;for(let e of yu)t=t.replace(e,`***`);return t}function xu(e){if(typeof e==`string`)return e;if(!Array.isArray(e))return``;let t=[];for(let n of e){let e=n;e?.type===`text`&&typeof e.text==`string`&&t.push(e.text)}return t.join(`
235
+ `)}function Su(e){if(e.role===`user`)return e.internal?null:{role:`user`,text:bu(xu(e.content))};if(e.role===`assistant`){let t=e.content.filter(e=>e.type===`tool_call`)[0]?.name,n={role:`assistant`,text:bu(xu(e.content))};return t&&(n.toolName=t),n}return e.role===`tool_result`?e.internal?null:{role:`tool_result`,text:bu(xu(e.content)),toolName:e.toolName}:null}function Cu(e,t,n){let r=Math.max(0,Math.min(t,e.length)),i=e.slice(r),a=i.length>n?i.slice(i.length-n):i,o=[];for(let e of a){let t=Su(e);t&&o.push(t)}return{messages:o,nextIndex:e.length}}const 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`,eventPush:`event.push`};function wu(e){return`${e===`worker`?`const { parentPort } = require('worker_threads')
236
236
  const __send = (m) => parentPort.postMessage(m)
237
237
  const __onMessage = (fn) => parentPort.on('message', fn)`:`const __send = (m) => process.send(m)
238
238
  const __onMessage = (fn) => process.on('message', fn)`}\n${`// RFC-303 M4:工具执行上下文——host/logger 经反向 RPC 代理回宿主
@@ -248,7 +248,7 @@ function makeHostStub(methods) {
248
248
  return (...args) => new Promise((resolve, reject) => {
249
249
  const id = 'host-' + (++hostCallSeq)
250
250
  hostCallPending.set(id, { resolve, reject })
251
- __send({ type: '${R.hostCall}', id, method, args })
251
+ __send({ type: '${z.hostCall}', id, method, args })
252
252
  })
253
253
  },
254
254
  })
@@ -264,7 +264,7 @@ const localSubs = new Map()
264
264
  let pluginInstance = null
265
265
 
266
266
  __onMessage(async (msg) => {
267
- if (msg.type === '${R.load}') {
267
+ if (msg.type === '${z.load}') {
268
268
  pluginId = msg.pluginId
269
269
  try {
270
270
  // RFC-365 R3:host-slot 注入槽——隔离端是独立 realm(worker_threads / child_process
@@ -281,7 +281,7 @@ __onMessage(async (msg) => {
281
281
  const mod = require(msg.compiledPath)
282
282
  const factory = mod?.default ?? mod
283
283
  if (typeof factory !== 'function') {
284
- __send({ type: '${R.loaded}', pluginId, module: { tools: [], hookEvents: [], hasOnActivate: false, hasOnDeactivate: false } })
284
+ __send({ type: '${z.loaded}', pluginId, module: { tools: [], hookEvents: [], hasOnActivate: false, hasOnDeactivate: false } })
285
285
  return
286
286
  }
287
287
  // RFC-303 M4:host stub(工具 ctx 与 factory ctx 共用;白名单方法名随 load 下发)。
@@ -353,7 +353,7 @@ __onMessage(async (msg) => {
353
353
  host: hostMethods.some((m) => m !== 'listActivePlugins') ? hostStub : undefined,
354
354
  }
355
355
  __send({
356
- type: '${R.loaded}', pluginId,
356
+ type: '${z.loaded}', pluginId,
357
357
  module: {
358
358
  contributions: instance.contributions,
359
359
  tools: tools.map((t) => ({
@@ -369,39 +369,39 @@ __onMessage(async (msg) => {
369
369
  },
370
370
  })
371
371
  } catch (err) {
372
- __send({ type: '${R.error}', pluginId, error: err?.message ?? String(err) })
372
+ __send({ type: '${z.error}', pluginId, error: err?.message ?? String(err) })
373
373
  }
374
374
  return
375
375
  }
376
- if (msg.type === '${R.toolExecute}') {
376
+ if (msg.type === '${z.toolExecute}') {
377
377
  const exec = toolExecutors.get(msg.name)
378
- if (!exec) { __send({ type: '${R.toolResult}', id: msg.id, error: "tool not found" }); return }
378
+ if (!exec) { __send({ type: '${z.toolResult}', id: msg.id, error: "tool not found" }); return }
379
379
  try {
380
380
  const r = await exec(msg.params, toolCtx)
381
381
  if (cancelledToolIds.delete(msg.id)) return
382
- __send({ type: '${R.toolResult}', id: msg.id, result: r })
382
+ __send({ type: '${z.toolResult}', id: msg.id, result: r })
383
383
  } catch (e) {
384
384
  if (cancelledToolIds.delete(msg.id)) return
385
- __send({ type: '${R.toolResult}', id: msg.id, error: e?.message ?? String(e) })
385
+ __send({ type: '${z.toolResult}', id: msg.id, error: e?.message ?? String(e) })
386
386
  }
387
387
  return
388
388
  }
389
- if (msg.type === '${R.toolCancel}') {
389
+ if (msg.type === '${z.toolCancel}') {
390
390
  cancelledToolIds.add(msg.id)
391
391
  return
392
392
  }
393
- if (msg.type === '${R.sigilResolve}') {
393
+ if (msg.type === '${z.sigilResolve}') {
394
394
  const fn = sigilResolverExecutors.get(msg.name)
395
- if (!fn) { __send({ type: '${R.sigilResult}', id: msg.id, error: "sigil resolver not found" }); return }
395
+ if (!fn) { __send({ type: '${z.sigilResult}', id: msg.id, error: "sigil resolver not found" }); return }
396
396
  try {
397
397
  const r = await fn(msg.param, msg.ctx)
398
- __send({ type: '${R.sigilResult}', id: msg.id, result: r })
398
+ __send({ type: '${z.sigilResult}', id: msg.id, result: r })
399
399
  } catch (e) {
400
- __send({ type: '${R.sigilResult}', id: msg.id, error: e?.message ?? String(e) })
400
+ __send({ type: '${z.sigilResult}', id: msg.id, error: e?.message ?? String(e) })
401
401
  }
402
402
  return
403
403
  }
404
- if (msg.type === '${R.hostResult}') {
404
+ if (msg.type === '${z.hostResult}') {
405
405
  const p = hostCallPending.get(msg.id)
406
406
  if (!p) return
407
407
  hostCallPending.delete(msg.id)
@@ -409,7 +409,7 @@ __onMessage(async (msg) => {
409
409
  else p.resolve(msg.result)
410
410
  return
411
411
  }
412
- if (msg.type === '${R.eventPush}') {
412
+ if (msg.type === '${z.eventPush}') {
413
413
  // RFC-427 M4 D-M4-2:宿主推送插件事件(跨进程 subscribe 投递方向)——宿主 dispatcher
414
414
  // 已做通配匹配 + 权限 + 校验(评审边界声明:匹配在宿主单点),本端只按**精确 type**
415
415
  // 查本地订阅表调 handler。handler 异常吞掉 + 静默(隔离端无 logger,R2a 语义靠宿主
@@ -421,26 +421,26 @@ __onMessage(async (msg) => {
421
421
  }
422
422
  return
423
423
  }
424
- if (msg.type === '${R.onActivate}') {
424
+ if (msg.type === '${z.onActivate}') {
425
425
  if (!pluginInstance || typeof pluginInstance.onActivate !== 'function') {
426
- __send({ type: '${R.activated}', id: msg.id })
426
+ __send({ type: '${z.activated}', id: msg.id })
427
427
  return
428
428
  }
429
- try { await pluginInstance.onActivate(); __send({ type: '${R.activated}', id: msg.id }) }
430
- catch (e) { __send({ type: '${R.activated}', id: msg.id, error: e?.message ?? String(e) }) }
429
+ try { await pluginInstance.onActivate(); __send({ type: '${z.activated}', id: msg.id }) }
430
+ catch (e) { __send({ type: '${z.activated}', id: msg.id, error: e?.message ?? String(e) }) }
431
431
  return
432
432
  }
433
- if (msg.type === '${R.onDeactivate}') {
433
+ if (msg.type === '${z.onDeactivate}') {
434
434
  if (!pluginInstance || typeof pluginInstance.onDeactivate !== 'function') {
435
- __send({ type: '${R.deactivated}', id: msg.id })
435
+ __send({ type: '${z.deactivated}', id: msg.id })
436
436
  return
437
437
  }
438
- try { await pluginInstance.onDeactivate(); __send({ type: '${R.deactivated}', id: msg.id }) }
439
- catch (e) { __send({ type: '${R.deactivated}', id: msg.id, error: e?.message ?? String(e) }) }
438
+ try { await pluginInstance.onDeactivate(); __send({ type: '${z.deactivated}', id: msg.id }) }
439
+ catch (e) { __send({ type: '${z.deactivated}', id: msg.id, error: e?.message ?? String(e) }) }
440
440
  return
441
441
  }
442
- if (msg.type === '${R.stop}') { toolExecutors.clear(); pluginInstance = null; process.exit(0) }
443
- })`}`}var Tu=class{pending=new Map;idCounter=0;boundPluginId=``;hostCallDispatcher=null;setHostCallDispatcher(e){this.hostCallDispatcher=e}pushEvent(e){try{this.adapter.send({type:R.eventPush,eventType:e.type,payload:e.payload,sourcePluginId:e.sourcePluginId})}catch{}}constructor(e){this.adapter=e,this.adapter.onMessage(e=>{if(e.type===R.loaded){let t=this.settlePending(`__load__`);t&&t.resolve(e.module);return}if(e.type===R.error){let t=this.settlePending(`__load__`);t&&t.reject(Error(e.error??this.adapter.loadFailedMessage?.()??`plugin isolated transport load failed`));return}if(e.type===R.toolResult){let t=this.settlePending(e.id);t&&t.resolve({result:e.result,error:e.error});return}if(e.type===R.sigilResult){let t=this.settlePending(e.id);t&&t.resolve({result:e.result,error:e.error});return}if(e.type===R.activated||e.type===R.deactivated){let t=this.settlePending(e.id);t&&t.resolve({error:e.error});return}if(e.type===R.hostCall){let t=this.boundPluginId,n=this.hostCallDispatcher,r=t=>{try{this.adapter.send({type:R.hostResult,id:e.id,...t})}catch{}};if(!n){r({error:`host call dispatcher not installed (plugin host capabilities unavailable)`});return}n(t,e.method??``,e.args??[]).then(e=>r({result:e})).catch(e=>r({error:e instanceof Error?e.message:String(e)}));return}}),this.adapter.onError(e=>{this.adapter.onErrorLog?.(e),this.rejectAllPending(e)}),this.adapter.onExit(e=>{if(this.pending.size===0)return;this.adapter.onExitLog?.(e);let t=this.adapter.exitErrorMessage?.(e)??`plugin isolated transport exited unexpectedly (code ${e})`;this.rejectAllPending(Error(t))})}rejectAllPending(e){for(let[,t]of this.pending)t.type===`load`?t.reject(e):t.resolve({error:e.message});this.pending.clear(),this.adapter.unref()}syncRefState(){this.pending.size>0?this.adapter.ref():this.adapter.unref()}trackPending(e,t){this.pending.set(e,t),this.syncRefState()}settlePending(e){let t=this.pending.get(e);return t&&(this.pending.delete(e),this.syncRefState()),t}async load(e,t,n){if(this.pending.has(`__load__`))throw Error(this.adapter.alreadyLoadingMessage?.(e)??`plugin isolated transport already loading ${e}`);return this.boundPluginId=e,new Promise((r,i)=>{this.trackPending(`__load__`,{type:`load`,resolve:r,reject:i}),this.adapter.send({type:R.load,pluginId:e,compiledPath:t,ctx:n,...n.hostMethods?{hostMethods:n.hostMethods}:{},...n.hostExternals?{hostExternals:n.hostExternals}:{}})})}async executeTool(e,t,n){let r=`tool-${++this.idCounter}`,i=n?.timeoutMs??6e4,a=n?.signal;return a?.aborted?{error:`plugin tool execution aborted`}:new Promise(n=>{let o,s,c=()=>{o!==void 0&&clearTimeout(o),s&&a&&a.removeEventListener(`abort`,s)};this.trackPending(r,{type:`tool`,resolve:e=>{c(),n(e)}});let l=e=>{let t=this.settlePending(r);if(t){try{this.adapter.send({type:R.toolCancel,id:r})}catch{}t.resolve({error:e})}};i>0&&(o=setTimeout(()=>{this.adapter.onToolTimeout?.(e,i),l(`plugin tool "${e}" timed out after ${i}ms`)},i),o.unref?.()),a&&(s=()=>l(`plugin tool execution aborted`),a.addEventListener(`abort`,s,{once:!0})),this.adapter.send({type:R.toolExecute,id:r,name:e,params:t})})}async resolveSigil(e,t,n,r){let i=`sigil-${++this.idCounter}`,a=r?.timeoutMs??6e4;return new Promise(r=>{let o;this.trackPending(i,{type:`sigil`,resolve:e=>{o!==void 0&&clearTimeout(o),r(e)}}),a>0&&(o=setTimeout(()=>{let t=this.settlePending(i);t&&t.resolve({error:`sigil resolver "${e}" timed out after ${a}ms`})},a),o.unref?.()),this.adapter.send({type:R.sigilResolve,id:i,name:e,param:t,ctx:n})})}async activate(){let e=`lifecycle-${++this.idCounter}`;return new Promise(t=>{this.trackPending(e,{type:`lifecycle`,resolve:t}),this.adapter.send({type:R.onActivate,id:e})})}async deactivate(){let e=`lifecycle-${++this.idCounter}`;return new Promise(t=>{this.trackPending(e,{type:`lifecycle`,resolve:t}),this.adapter.send({type:R.onDeactivate,id:e})})}clearPending(){this.pending.clear()}};const Eu=T(`@x-otto/coding:plugin-worker-pool`);let Du=null,Ou=null;function ku(){return Ou||(Du||=Je(C(ot(),`otto-plugin-worker-`)),Ou=C(Du,`worker-entry.cjs`),x(Ou,wu(`worker`)),Ou)}var Au=class extends Tu{worker;constructor(){let e=new ra(ku());e.unref(),super({send:t=>e.postMessage(t),onMessage:t=>e.on(`message`,e=>t(e)),onError:t=>e.on(`error`,e=>t(e)),onExit:t=>e.on(`exit`,t),ref:()=>e.ref(),unref:()=>e.unref(),onToolTimeout:(e,t)=>{Eu.warn({tool:e,timeoutMs:t},`plugin tool execution timed out`)},onErrorLog:e=>{Eu.warn({err:String(e)},`plugin worker error`)},onExitLog:e=>{Eu.warn({code:e},`plugin worker exited unexpectedly with pending requests`)},exitErrorMessage:e=>`plugin worker exited unexpectedly (code ${e})`,loadFailedMessage:()=>`plugin worker load failed`,alreadyLoadingMessage:e=>`plugin worker already loading ${e}`}),this.worker=e}async stop(){try{this.worker.postMessage({type:R.stop}),await this.worker.terminate()}catch{}this.clearPending(),this.worker.unref()}},ju=class{workers=new Map;maxConcurrent;hostCallDispatcher=null;constructor(e=8){this.maxConcurrent=e}setHostCallDispatcher(e){this.hostCallDispatcher=e}async load(e,t,n){if(this.workers.size>=this.maxConcurrent)return null;await this.unload(e);let r=new Au;this.hostCallDispatcher&&r.setHostCallDispatcher(this.hostCallDispatcher),this.workers.set(e,r);try{return await r.load(e,t,n)}catch(t){throw this.workers.delete(e),r.stop().catch(()=>{}),t}}async executeTool(e,t,n,r){let i=this.workers.get(e);if(!i)throw Error(`no worker for plugin ${e}`);return i.executeTool(t,n,r)}async resolveSigil(e,t,n,r,i){let a=this.workers.get(e);if(!a)throw Error(`no worker for plugin ${e}`);return a.resolveSigil(t,n,r,i)}async activate(e){let t=this.workers.get(e);if(!t)throw Error(`no worker for plugin ${e}`);return t.activate()}async deactivate(e){let t=this.workers.get(e);if(!t)throw Error(`no worker for plugin ${e}`);return t.deactivate()}async unload(e){let t=this.workers.get(e);t&&(this.workers.delete(e),await t.stop())}pushEvent(e,t){let n=this.workers.get(e);n&&n.pushEvent(t)}async dispose(){let e=[...this.workers.values()];if(this.workers.clear(),Du){try{et(Du,{recursive:!0,force:!0})}catch{}Du=null,Ou=null}await Promise.all(e.map(e=>e.stop().catch(()=>{})))}get size(){return this.workers.size}};const Mu=T(`@x-otto/coding:plugin-process-pool`);let Nu=null,Pu=null;function Fu(){return Pu||(Nu||=Je(C(ot(),`otto-plugin-process-`)),Pu=C(Nu,`process-entry.cjs`),x(Pu,wu(`process`)),Pu)}var Iu=class extends Tu{child;sandboxToDispose;constructor(e){let t=Fu(),n=process.execPath,r=[t],i=n,a=r,o;if(He()){let t=ze({network:`deny`}),s=t.wrap({command:n,args:r,options:{timeout:0,cwd:e},projectRoot:e});i=s.command,a=s.args,o=t}else Mu.warn(`No platform sandbox available for project/repository scope plugin isolation — falling back to plain child_process (still process-isolated, but without OS-level file/network constraints)`);let s=$i(i,a,{cwd:e,stdio:[`ignore`,`ignore`,`pipe`,`ipc`]});s.unref(),super({send:e=>s.send(e),onMessage:e=>s.on(`message`,t=>e(t)),onError:e=>s.on(`error`,t=>e(t)),onExit:e=>s.on(`exit`,e),ref:()=>{s.channel?.ref(),s.stderr?.ref?.()},unref:()=>{s.channel?.unref(),s.stderr?.unref?.()},onToolTimeout:(e,t)=>{Mu.warn({tool:e,timeoutMs:t},`plugin tool execution timed out (isolated process)`)},onErrorLog:e=>{Mu.warn({err:String(e)},`plugin process error`)},onExitLog:e=>{Mu.warn({code:e},`plugin process exited unexpectedly with pending requests`)},exitErrorMessage:e=>`plugin process exited unexpectedly (code ${e})`,loadFailedMessage:()=>`plugin process load failed`,alreadyLoadingMessage:e=>`plugin process already loading ${e}`}),this.child=s,this.sandboxToDispose=o,this.child.stderr?.on(`data`,e=>{Mu.warn({stderr:e.toString().slice(0,500)},`plugin process stderr output`)}),this.child.on(`exit`,()=>{this.sandboxToDispose?.dispose().catch(()=>void 0),this.sandboxToDispose=void 0})}async stop(){try{this.child.send({type:R.stop})}catch{}try{this.child.kill()}catch{}this.clearPending()}},Lu=class{processes=new Map;maxConcurrent;hostCallDispatcher=null;constructor(e=4){this.maxConcurrent=e}setHostCallDispatcher(e){this.hostCallDispatcher=e}async load(e,t,n){if(this.processes.size>=this.maxConcurrent)return null;await this.unload(e);let r=new Iu(n.workspaceDir);this.hostCallDispatcher&&r.setHostCallDispatcher(this.hostCallDispatcher),this.processes.set(e,r);try{return await r.load(e,t,n)}catch(t){throw this.processes.delete(e),r.stop().catch(()=>{}),t}}async executeTool(e,t,n,r){let i=this.processes.get(e);if(!i)throw Error(`no process for plugin ${e}`);return i.executeTool(t,n,r)}async resolveSigil(e,t,n,r,i){let a=this.processes.get(e);if(!a)throw Error(`no process for plugin ${e}`);return a.resolveSigil(t,n,r,i)}async activate(e){let t=this.processes.get(e);if(!t)throw Error(`no process for plugin ${e}`);return t.activate()}async deactivate(e){let t=this.processes.get(e);if(!t)throw Error(`no process for plugin ${e}`);return t.deactivate()}async unload(e){let t=this.processes.get(e);t&&(this.processes.delete(e),await t.stop())}pushEvent(e,t){let n=this.processes.get(e);n&&n.pushEvent(t)}async dispose(){let e=[...this.processes.values()];if(this.processes.clear(),Nu){try{et(Nu,{recursive:!0,force:!0})}catch{}Nu=null,Pu=null}await Promise.all(e.map(e=>e.stop().catch(()=>{})))}get size(){return this.processes.size}};const z=T(`@x-otto/coding:plugin-module-loader-isolated`);let Ru=null;function zu(){return Ru||=new ju,Ru}let Bu=null;function Vu(){return Bu||=new Lu,Bu}async function Hu(){await Promise.all([Ru?.dispose()??Promise.resolve(),Bu?.dispose()??Promise.resolve()])}function Uu(e){return e===`project`||e===`repository`?Vu():zu()}function Wu(e){return!!e.manifest.capabilities?.includes(`tools`)}function Gu(e,t,n){let r={};if(t.contributions&&(r.contributions=t.contributions),t.tools.length>0&&(r.tools=t.tools.map(t=>({name:t.name,description:t.description||t.name,parameters:{safeParse(e){return t.hasParameters?{success:!0,data:e}:{success:!0,data:{}}},...t.parametersSchema===void 0?{}:{toJSONSchema:()=>t.parametersSchema}},async execute(r,i){let{result:a,error:o}=await n.executeTool(e,t.name,r,{signal:i?.signal});if(o)throw Error(o);return a&&typeof a==`object`&&Array.isArray(a.content)?a:{content:[{type:`text`,text:typeof a==`string`?a:JSON.stringify(a??null)}]}}}))),t.hasSigilProviders&&z.warn({pluginId:e},`plugin declares sigilProviders but is loaded via the isolated path (tools capability) — dynamic @ search providers are not proxied over RPC and will be inactive; declare input.resolver without tools to use the in-process path, or use static sigilEntries`),t.sigilResolvers?.length>0){r.sigilResolvers={};for(let i of t.sigilResolvers)r.sigilResolvers[i.name]={resolve:(t,r)=>n.resolveSigil(e,i.name,t,r,{timeoutMs:i.timeoutMs}).then(e=>{if(e.error)throw Error(e.error);return e.result??``}),timeoutMs:i.timeoutMs,uiHostOnly:i.uiHostOnly}}return t.hasOnActivate&&(r.onActivate=async()=>{let{error:t}=await n.activate(e);if(t)throw Error(t)}),t.hasOnDeactivate&&(r.onDeactivate=async()=>{let{error:t}=await n.deactivate(e);if(t)throw Error(t)}),r}async function Ku(e,t,n,r){if((e.scope===`project`||e.scope===`repository`)&&!Or(e.dir))return z.warn({pluginId:e.id},`project/repository plugin not trusted, skipping isolated code module (fail-closed)`),r?.(e.id,`project/repository plugin not trusted, skipping isolated code module (fail-closed)`,`not-trusted`),null;let i=O(e);if(i.pendingCapabilities.length>0)return z.warn({pluginId:e.id,pendingCapabilities:i.pendingCapabilities},`plugin declares high-risk capabilities not yet granted, skipping isolated code module before worker execution (fail-closed, RFC-140 D3)`),r?.(e.id,`declares high-risk capabilities not yet granted: ${i.pendingCapabilities.join(`, `)}`,`capability-not-granted`),null;let a=n??Uu(e.scope),o=su(e.dir);try{o?z.info({pluginId:e.id,compiledPath:o},`using prebuilt plugin module (isolated path, RFC-150 D5)`):o=await $l(e.dir)}catch(t){let n=String(t);return z.warn({pluginId:e.id,err:n},`plugin.ts compile failed (isolated path)`),r?.(e.id,`compile failed: ${n}`,`module-error`),null}if(!o)return null;let s=[...Object.keys(t.host??{}),`listActivePlugins`];if(typeof t.emitEvent==`function`&&s.push(`emitEvent`),typeof t.subscribeEvent==`function`&&s.push(`subscribeEvent`,`unsubscribeEvent`),t.host&&Object.keys(t.host).length>0||t.listActivePlugins||typeof t.emitEvent==`function`||typeof t.subscribeEvent==`function`){let e=t.host,n=t.pluginId,r=new Map;a.setHostCallDispatcher?.(async(i,o,s)=>{if(o===`listActivePlugins`)return t.listActivePlugins?t.listActivePlugins():[];if(o===`emitEvent`){if(typeof t.emitEvent!=`function`)throw Error(`emitEvent not available (plugin events capability not granted)`);let[e,n]=s;t.emitEvent(e,n);return}if(o===`subscribeEvent`){if(typeof t.subscribeEvent!=`function`)throw Error(`subscribeEvent not available (plugin events capability not granted)`);let[e]=s,i=(e,t,r)=>{a.pushEvent?.(n,{type:e,payload:t,sourcePluginId:r.pluginId})},o=t.subscribeEvent,c=o(e,()=>{},i);r.set(`${n}:${e}`,c);return}if(o===`unsubscribeEvent`){let[e]=s,t=r.get(`${n}:${e}`);t&&(r.delete(`${n}:${e}`),t());return}if(!e||typeof e[o]!=`function`)throw Error(`host method '${o}' not available (not declared or not granted)`);if(!(o in e))throw Error(`host method '${o}' not in whitelist`);let c=e[o];return c(...s)})}try{let n=await a.load(e.id,o,{pluginId:t.pluginId,pluginDir:t.pluginDir,workspaceDir:t.workspaceDir,hostMethods:s,listActivePlugins:!0,emitEvent:typeof t.emitEvent==`function`,subscribeEvent:typeof t.subscribeEvent==`function`,hostExternals:Xl()});if(n===null){if(e.scope===`project`||e.scope===`repository`){let t=`plugin process pool exhausted (project/repository scope requires isolated execution, refusing to downgrade to in-process)`;return z.warn({pluginId:e.id},t),r?.(e.id,t,`module-error`),null}return z.info({pluginId:e.id},`plugin worker pool exhausted, falling back to in-process load`),cu(e,t,r)}return n.hookEvents?.length&&z.warn({pluginId:e.id,hookEvents:n.hookEvents},`plugin declares code hooks but is loaded via the isolated path (tools capability) — code hooks are not proxied over RPC and will be inactive; split hooks into a separate plugin without tools to use the in-process path`),e.manifest.capabilities?.includes(`monitor`)&&z.warn({pluginId:e.id},`plugin declares capabilities:["monitor"] but is loaded via the isolated path (tools capability) — the monitor axis is not proxied over RPC and will be inactive (ecosystem failure signals will be missed); split the monitor into a separate plugin without tools to use the in-process path`),{pluginId:e.id,module:Gu(e.id,n,a),compiledPath:o}}catch(t){let n=String(t);return z.warn({pluginId:e.id,err:n},`plugin.ts worker load failed`),r?.(e.id,`worker load failed: ${n}`,`module-error`),null}}const qu=T(`@x-otto/coding:plugin-event-dispatcher`);var Ju=class{registrations=new Map;subscriptions=new Map;subscriptionSeq=0;emitRateWindow=new Map;constructor(e){this.isCapabilityGranted=e}registerPluginEvents(e,t){let n=new Map;for(let r of t){if(r.type.split(`.`)[0]!==e){qu.warn({pluginId:e,type:r.type},`event type namespace does not match pluginId, skipping registration (fail-closed)`);continue}n.set(r.type,Xu)}this.registrations.set(e,{schemas:n,pluginId:e})}unregisterPluginEvents(e){this.registrations.delete(e)}emit(e,t,n){let r=this.registrations.get(e);if(!r||!r.schemas.has(t)){qu.warn({sourcePluginId:e,type:t},`emit rejected: type not declared in this plugin manifest (fail-closed, R3)`);return}let i=r.schemas.get(t).safeParse(n);if(!i.success){qu.warn({sourcePluginId:e,type:t,error:i.error.message},`emit rejected: payload schema validation failed (fail-closed, R3)`);return}let a=Yu({...n});if(!this.checkEmitRate(e)){qu.warn({sourcePluginId:e,type:t},`emit rejected: rate limit exceeded (R1)`);return}let o=[],s=[],c=Date.now();for(let n of this.subscriptions.values())if(this.isCapabilityGranted(n.subscriberPluginId,`events`)&&this.typeMatches(n.typeFilter,t,n.isWildcard)){if(Date.now()-c>5e3){qu.warn({type:t,remainingSubscriptions:this.subscriptions.size-o.length},`emit: handler total execution timeout, dropping remaining subscriptions`);break}o.push(n.subscriberPluginId);try{n.transport?n.transport(t,a,{pluginId:e}):n.handler(a,{pluginId:e})}catch(e){let r=e instanceof Error?e.message:String(e);s.push(`${n.subscriberPluginId}: ${r}`),qu.warn({subscriberPluginId:n.subscriberPluginId,type:t,err:r},`event handler threw, isolating (R2a, swallowed + warn)`)}}qu.debug({source:e,type:t,payloadSize:JSON.stringify(n).length,deliveredTo:o,errors:s},`event dispatched (audit, R6)`)}subscribe(e,t,n,r){let i=0;for(let t of this.subscriptions.values())t.subscriberPluginId===e&&i++;if(i>=50)return qu.warn({subscriberPluginId:e,current:i,max:50},`subscribe rejected: max subscriptions exceeded (R1)`),()=>{};let a=t.endsWith(`.*`)||t===`*`;if(t===`*`)return qu.warn({subscriberPluginId:e},`subscribe rejected: wildcard "*" not implemented in M2 (R5 gate, runtime reject + warn)`),()=>{};let o=String(++this.subscriptionSeq);return this.subscriptions.set(o,{id:o,subscriberPluginId:e,typeFilter:t,handler:n,isWildcard:a,...r?{transport:r}:{}}),()=>{this.subscriptions.delete(o)}}unregisterPluginSubscriptions(e){let t=[];for(let[n,r]of this.subscriptions)r.subscriberPluginId===e&&t.push(n);for(let e of t)this.subscriptions.delete(e)}typeMatches(e,t,n){if(n){let n=e.slice(0,-2);return t.startsWith(n+`.`)}return e===t}checkEmitRate(e){let t=Date.now(),n=(this.emitRateWindow.get(e)??[]).filter(e=>t-e<6e4);return n.length>=100?!1:(n.push(t),this.emitRateWindow.set(e,n),!0)}};function Yu(e){if(typeof e!=`object`||!e)return e;if(Object.freeze(e),Array.isArray(e))for(let t of e)Yu(t);else for(let t of Object.keys(e)){let n=e[t];typeof n==`object`&&n&&!Object.isFrozen(n)&&Yu(n)}return e}const Xu={safeParse:e=>typeof e==`object`&&e&&!Array.isArray(e)?{success:!0,data:e}:{success:!1,error:{message:`payload must be a plain object`}}};function Zu(e,t){return e.includes(`onStartup`)?!0:e.some(e=>t.has(e))}var Qu=class{axisName=`hooks`;tokensByPlugin=new Map;hookNamesByPlugin=new Map;constructor(e){this.hookRegistry=e}register(e){let t=e.loaded.module.hooks;if(t){let n=il(e.plugin.id,t),r=this.hookRegistry.registerAll(n),i=this.tokensByPlugin.get(e.plugin.id)??[];this.tokensByPlugin.set(e.plugin.id,[...i,...r]);let a=this.hookNamesByPlugin.get(e.plugin.id)??[];a.push(...n.map(e=>e.name)),this.hookNamesByPlugin.set(e.plugin.id,a)}}unregister(e){let t=this.tokensByPlugin.get(e);if(t)for(let e of t)e.dispose();let n=this.hookNamesByPlugin.get(e);if(n)for(let e of n)this.hookRegistry.unregister(e);this.tokensByPlugin.delete(e),this.hookNamesByPlugin.delete(e)}unregisterAll(){for(let e of[...this.tokensByPlugin.keys(),...this.hookNamesByPlugin.keys()])this.unregister(e)}},$u=class{axisName=`monitors`;hookNamesByPlugin=new Map;monitorsByPlugin=new Map;constructor(e,t){this.hookRegistry=e,this.logger=t}register(e){let t=e.loaded.module.monitors;if(!t?.length)return;if(!e.plugin.manifest.capabilities?.includes(`monitor`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares monitors but not capabilities:["monitor"], skipped (fail-closed)`);return}let n=xl(e.plugin.id,t);this.hookRegistry.registerAll(n);let r=this.hookNamesByPlugin.get(e.plugin.id)??[];r.push(...n.map(e=>e.name)),this.hookNamesByPlugin.set(e.plugin.id,r),this.monitorsByPlugin.set(e.plugin.id,t)}unregister(e){let t=this.hookNamesByPlugin.get(e);if(t){for(let e of t)this.hookRegistry.unregister(e);this.hookNamesByPlugin.delete(e)}this.monitorsByPlugin.delete(e)}unregisterAll(){for(let e of[...this.hookNamesByPlugin.keys()])this.unregister(e)}async dispatch(e){for(let[t,n]of this.monitorsByPlugin)for(let r of n)try{await r.onEvent(e)}catch(n){this.logger.warn({pluginId:t,monitorId:r.id,eventType:e.type,err:String(n)},`plugin monitor onEvent threw (host event), isolated`)}}get monitorPluginIds(){return[...this.monitorsByPlugin.keys()]}},ed=class{axisName=`feedback`;feedbackRegisteredSources=new Set;constructor(e,t){this.feedbackRegistry=e,this.logger=t}register(e){let t=e.loaded.module.feedbackProviders;if(!(!t||!this.feedbackRegistry)){if(!e.plugin.manifest.capabilities?.includes(`feedback`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares feedbackProviders but not capabilities:["feedback"], skipped (fail-closed)`);return}this.feedbackRegistry.register(t,e.plugin.id)?this.feedbackRegisteredSources.add(e.plugin.id):this.logger.warn({pluginId:e.plugin.id},`plugin feedbackProviders rejected (already registered by a different plugin)`)}}unregister(e){!this.feedbackRegistry||!this.feedbackRegisteredSources.has(e)||(this.feedbackRegistry.unregister(e),this.feedbackRegisteredSources.delete(e))}unregisterAll(){for(let e of[...this.feedbackRegisteredSources])this.unregister(e)}};const td=T(`@x-otto/coding:plugin-sigil-loader`);function nd(e){return e.startsWith(`!`)||e.startsWith(`#`)}function rd(e){let t=[];for(let n of e){let e=n.manifest.contributes?.sigilEntries;if(e?.length){if(O(n).gated){td.warn({pluginId:n.id},`plugin gated (untrusted), sigilEntries skipped`);continue}for(let r of e){if(nd(r.value)){td.warn({pluginId:n.id,label:r.label},`sigilEntries value starts with '!' or '#' (mode-prefix collision), skipped`);continue}t.push({label:r.label,value:r.value,kind:r.kind,description:r.description,source:n.id,resolverId:r.resolverId?`${n.id}:${r.resolverId}`:void 0})}}}return t}function id(e){for(let t of e)t.manifest.contributes?.inputEntries&&td.warn({pluginId:t.id},`contributes.inputEntries is deprecated (RFC-210); migrate to contributes.sigilEntries (inline array) — the file-path form is no longer loaded`)}function ad(e,t){let n=[];for(let[r,i]of Object.entries(t)){let t=`${e}:${r}`;typeof i==`function`?n.push({id:t,resolve:i}):i&&typeof i.resolve==`function`?n.push({id:t,resolve:i.resolve,timeoutMs:i.timeoutMs,uiHostOnly:i.uiHostOnly}):td.warn({pluginId:e,name:r},`sigilResolvers entry is neither function nor {resolve}, skipped`)}return n}function od(e,t){return t.map(t=>async(n,r)=>(await t(n,r)).filter(e=>!nd(e.value)).map(t=>({...t,source:e})))}function sd(e,t){for(let n of e)n.resolverId&&!t(n.resolverId)&&td.warn({label:n.label,resolverId:n.resolverId,source:n.source},`sigilEntries.resolverId has no matching resolver (declared sigilResolvers missing or capability not granted) — entry will pass through unexpanded at submit`)}var cd=class{axisName=`sigil`;sigilResolverSourcePluginIds=new Set;sigilProviderUnsubsByPlugin=new Map;constructor(e,t,n){this.sigilResolverRegistry=e,this.pluginInput=t,this.logger=n}register(e){let t=e.loaded.module.sigilResolvers,n=e.loaded.module.sigilProviders;if(t&&Object.keys(t).length>0||n?.length){if(!e.plugin.manifest.capabilities?.includes(`input.resolver`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares sigilResolvers/sigilProviders but not capabilities:["input.resolver"], skipped (fail-closed)`);return}if(e.verdict.pendingCapabilities.includes(`input.resolver`)){this.logger.warn({pluginId:e.plugin.id},`plugin capability "input.resolver" declared but not yet granted, skipping sigil axes (fail-closed)`);return}if(t&&this.sigilResolverRegistry){let n=ad(e.plugin.id,t);n.length>0&&(this.sigilResolverRegistry.register(n,e.plugin.id),this.sigilResolverSourcePluginIds.add(e.plugin.id))}if(n?.length&&this.pluginInput){let t=this.sigilProviderUnsubsByPlugin.get(e.plugin.id)??[];for(let r of od(e.plugin.id,n))t.push(this.pluginInput.registerProvider(`@`,r));this.sigilProviderUnsubsByPlugin.set(e.plugin.id,t)}if(this.sigilResolverRegistry){let t=this.sigilResolverRegistry;sd(rd([e.plugin]),e=>t.get(e)!==void 0)}}}unregister(e){this.sigilResolverRegistry&&this.sigilResolverSourcePluginIds.has(e)&&(this.sigilResolverRegistry.unregisterBySource(e),this.sigilResolverSourcePluginIds.delete(e));let t=this.sigilProviderUnsubsByPlugin.get(e);if(t){for(let e of t)try{e()}catch{}this.sigilProviderUnsubsByPlugin.delete(e)}}unregisterAll(){let e=new Set([...this.sigilResolverSourcePluginIds,...this.sigilProviderUnsubsByPlugin.keys()]);for(let t of e)this.unregister(t)}},ld=class{axisName=`computedCommands`;commandsByPlugin=new Map;register(e){let t=e.loaded.module.contributions?.commands;if(t?.length&&e.plugin.scope!==`builtin`){let n=this.commandsByPlugin.get(e.plugin.id)??[];n.push(...pl(e.plugin.id,e.plugin.scope,e.plugin.dir,t)),this.commandsByPlugin.set(e.plugin.id,n)}}unregister(e){this.commandsByPlugin.delete(e)}unregisterAll(){}resetForReload(){this.commandsByPlugin.clear()}getComputedCommands(){return[...this.commandsByPlugin.values()].flat()}},ud=class{axisName=`computedAgents`;profilesByPlugin=new Map;existingAgentNames=new Set;register(e){let t=e.loaded.module.contributions?.agents;if(!t?.length)return;let n=this.profilesByPlugin.get(e.plugin.id)??[];n.push(...ml(t)),this.profilesByPlugin.set(e.plugin.id,n)}unregister(e){this.profilesByPlugin.delete(e)}unregisterAll(){}setExistingAgentNames(e){this.existingAgentNames=e}resetForReload(e){this.profilesByPlugin.clear(),this.existingAgentNames=e}getAppendedAgents(){let e=new Set(this.existingAgentNames),t=[];for(let n of this.profilesByPlugin.values())for(let r of n)e.has(r.name)||(e.add(r.name),t.push(r));return t}},dd=class{axisName=`computedSkills`;skillNamesByPlugin=new Map;constructor(e){this.skillRegistry=e}register(e){let t=e.loaded.module.contributions?.skills;if(!t?.length||!this.skillRegistry)return;let n=this.skillNamesByPlugin.get(e.plugin.id)??[];for(let{definition:r,source:i}of hl(e.plugin.id,e.plugin.dir,t))this.skillRegistry.get(r.metadata.name)||(this.skillRegistry.register(r,i),n.push(r.metadata.name));n.length>0&&this.skillNamesByPlugin.set(e.plugin.id,n)}unregister(e){let t=this.skillNamesByPlugin.get(e);if(t){for(let e of t)this.skillRegistry?.unregister(e);this.skillNamesByPlugin.delete(e)}}unregisterAll(){for(let e of[...this.skillNamesByPlugin.keys()])this.unregister(e)}};const B=T(`@x-otto/coding:plugin-provider-loader`);function fd(e){let t=T(`wire-protocol:${e}`),n=e=>(t,...n)=>e(t,...n);return{debug:n(t.debug.bind(t)),info:n(t.info.bind(t)),warn:n(t.warn.bind(t)),error:n(t.error.bind(t))}}function V(e,t){return`${e}:${t}`}function pd(e){return new Set([...(e.contributes?.providers??[]).filter(e=>e.preserveProviderId===!0&&e.oauthRef).map(e=>e.oauthRef),...e.codeProviderIds??[]])}function md(e,t){let n=pd(t);return new Set((t.contributes?.oauth??[]).map(t=>n.has(t.id)?t.id:V(e,t.id)))}function hd(e,t){return new Set((t.contributes?.providers??[]).filter(e=>e.catalogOnly!==!0&&e.baseUrl&&e.wireApi).map(t=>t.preserveProviderId===!0?t.id:V(e,t.id)))}function gd(e,t,n){return new Set([...n.codeProviderIds??[],...(n.contributes?.providers??[]).filter(e=>e.preserveProviderId===!0).map(e=>e.id)]).has(t)?t:V(e,t)}function _d(e){return`code:${e}`}function vd(e,t,n,r,i,a,o){let s=e.id.indexOf(`/`),c=s>=0?e.id.slice(s+1):e.id;return{id:e.id,name:c,api:n,provider:t,baseUrl:r,reasoning:e.reasoning??!1,input:e.input??[`text`],cost:e.cost,contextWindow:e.contextWindow,maxOutputTokens:e.maxOutput,imageConstraints:i,supportsTools:a,strengths:e.strengths,thinkingLevels:e.thinkingLevels,thinkingMode:e.thinkingMode,responseBodyPolicy:o}}function yd(e,t,n,r,i){return(a,o)=>{let s=e.url.replace(`{baseUrl}`,r??``).replace(`{clientVersion}`,process.env.OTTO_CODEX_CLIENT_VERSION||`1.0.0`),c=e.authScheme??`bearer`,l=c===`x-api-key`||c===`auto`&&o.mode!==`oauth`?{"x-api-key":a}:{authorization:`Bearer ${a}`};return c===`auto`&&o.mode===`oauth`&&o.beta&&e.betaHeaderName&&(l[e.betaHeaderName]=o.beta),{url:s,headers:{...i,...e.headers,...l},mergeProvider:t,modelApi:n,modelIdExclude:e.modelIdExclude}}}function bd(e,t,n,r,i,a){return()=>{let o=r.get(a);if(!o)throw new ft(`wire protocol '${a}' is not registered — is its provider plugin installed and trusted? (RFC-148)`,{code:`WIRE_PROTOCOL_NOT_REGISTERED`});return o.create({resolveAuth:()=>t.resolveAuth(n).then(e=>e??void 0),resolveBaseUrl:async()=>i,headers:e.headers,tokenDerivedHeaders:e.tokenDerivedHeaders,allowAuthHeaderOverride:e.allowAuthHeaderOverride,logger:fd(a)})}}function xd(e,t,n,r,i,a,o){let s=t.contributes?.oauth;if(s?.length&&n)if(t.capabilities?.includes(`provider`))for(let t of s){let s=r.has(t.id)?t.id:V(e,t.id);if(p.includes(t.id)||n.isReservedId(t.id)){a.rejected.push({id:t.id,reason:`oauth id collides with builtin reserved OAuth provider`,pluginId:e}),B.warn({pluginId:e,oauthId:t.id},`plugin oauth id collides with builtin reserved, rejected (R3)`);continue}let c=t.name??i.get(t.id)??t.id,l=t.kind===`pkce`?sa({...t,id:s,name:c,tokenExchangeEncoding:t.tokenExchangeEncoding??`form`,assumesLoopbackAlways:t.assumesLoopbackAlways??!1,subscriptionScoped:t.subscriptionScoped??!1}):oa({...t,id:s,name:c,allowCustomDomain:t.allowCustomDomain??!1});if(o?.has(s))n.replace(l,e);else if(!n.register(l,e)){a.rejected.push({id:t.id,reason:`oauth registration rejected (id already claimed by another plugin or reserved)`,pluginId:e});continue}}else{B.warn({pluginId:e},`plugin declares contributes.oauth but not capabilities:["provider"], skipped (fail-closed)`);for(let t of s)a.rejected.push({id:t.id,reason:`capability "provider" not declared`,pluginId:e})}}function Sd(e,t,n,r,i,a){let o=t.contributes?.providers;if(!o?.length)return;if(!t.capabilities?.includes(`provider`)){B.warn({pluginId:e},`plugin declares contributes.providers but not capabilities:["provider"], skipped (fail-closed)`);for(let t of o)i.rejected.push({id:t.id,reason:`capability "provider" not declared`,pluginId:e});return}let s=new Set;for(let t of o){if(i.registered.includes(t.id)){i.rejected.push({id:t.id,reason:`duplicate provider id in manifest`,pluginId:e}),B.warn({pluginId:e,providerId:t.id},`duplicate provider id in manifest, second entry rejected (review F5)`);continue}if(ue(t.id)){i.rejected.push({id:t.id,reason:`reserved builtin provider id`,pluginId:e}),B.warn({pluginId:e,providerId:t.id},`plugin provider id collides with builtin, rejected (R3)`);continue}let o=t.preserveProviderId===!0,c=o?t.id:V(e,t.id),l=o?t.id:V(e,t.id);if(t.catalogOnly===!0){let a=l;if(t.oauthRef){let n=o?t.oauthRef:V(e,t.oauthRef);if(!r?.get(n)){i.rejected.push({id:t.id,reason:`oauthRef '${t.oauthRef}' not found in current plugin's oauth table (R7)`,pluginId:e}),B.warn({pluginId:e,providerId:t.id,oauthRef:t.oauthRef},`catalog provider oauthRef not found, rejected (R7)`);continue}a=n}if(t.envKey&&!n.authStore.registerEnvKey(l,t.envKey,e)){i.rejected.push({id:t.id,reason:`envKey registration rejected (reserved or claimed)`,pluginId:e});continue}if(!me({id:l,name:t.name,env:t.oauthRef?void 0:t.envKey,requiresIntranet:t.requiresIntranet===!0,probeUrl:t.baseUrl},e)){i.rejected.push({id:t.id,reason:`provider descriptor id already claimed`,pluginId:e}),t.envKey&&n.authStore.unregisterEnvKey(l);continue}if(t.models?.length){let r=t.models.map(e=>vd(e,a,c,t.baseUrl??``,void 0,t.supportsTools,t.responseBodyPolicy)),i=n.modelRegistry.registerWithSource(r,e);for(let t of i)B.warn({pluginId:e,modelId:t},`plugin model id collides, rejected`)}i.registered.push(t.id);continue}let u=l;if(t.oauthRef){let n=o?t.oauthRef:V(e,t.oauthRef);if(!r?.get(n)){i.rejected.push({id:t.id,reason:`oauthRef '${t.oauthRef}' not found in current plugin's oauth table (R7: cross-plugin/invalid ref rejected)`,pluginId:e}),B.warn({pluginId:e,providerId:t.id,oauthRef:t.oauthRef},`provider oauthRef not found in current plugin oauth table, rejected (R7)`);continue}u=n,t.envKey&&B.warn({pluginId:e,providerId:t.id},`provider declares both oauthRef and envKey; ignoring envKey (R2, oauth takes priority)`)}if(t.envKey&&!t.oauthRef&&!n.authStore.registerEnvKey(l,t.envKey,e)){i.rejected.push({id:t.id,reason:`envKey registration rejected (reserved or claimed by another plugin)`,pluginId:e});continue}let d=t.baseUrl,f=t.wireApi;if(!d||!f){i.rejected.push({id:t.id,reason:`baseUrl and wireApi required for non-catalog providers`,pluginId:e});continue}let p=t.modelsEndpoint?yd(t.modelsEndpoint,l,c,t.baseUrl,t.headers):void 0,m=()=>{t.oauthRef&&r&&!s.has(u)&&r.unregister(u)};if(!me({id:l,name:t.name,env:t.oauthRef?void 0:t.envKey,buildModelsRequest:p,requiresIntranet:t.requiresIntranet===!0,probeUrl:t.baseUrl},e)){i.rejected.push({id:t.id,reason:`provider descriptor id already claimed by another plugin`,pluginId:e}),t.envKey&&!t.oauthRef&&n.authStore.unregisterEnvKey(l),m();continue}t.allowAuthHeaderOverride&&B.warn({pluginId:e,providerId:t.id},`provider declares allowAuthHeaderOverride: custom headers may replace auth headers (RFC-270 D3)`);let h=bd(t,n.authStore,u,n.wireProtocolRegistry,d,f);if(!(a?.has(c)?n.providerRegistry.replacePluginProvider(c,h,e):n.providerRegistry.registerPluginProvider(c,h,e))){i.rejected.push({id:t.id,reason:`api already registered by another plugin or reserved`,pluginId:e}),ve(l),t.envKey&&!t.oauthRef&&n.authStore.unregisterEnvKey(l),m();continue}if(t.models?.length){let r=t.models.map(e=>vd(e,u,c,d,t.imageConstraints,t.supportsTools,t.responseBodyPolicy)),i=n.modelRegistry.registerWithSource(r,e);for(let t of i)B.warn({pluginId:e,modelId:t},`plugin model id collides with an existing model, rejected (no silent override)`)}i.registered.push(t.id),t.oauthRef&&s.add(u)}}function Cd(e,t,n,r,i){let a={registered:[],rejected:[]},o=n.authStore.oauth;return xd(e,t,o,pd(t),new Map((t.contributes?.providers??[]).filter(e=>e.oauthRef&&e.name).map(e=>[e.oauthRef,e.name])),a,r),Sd(e,t,n,o,a,i),a}async function wd(e,t,n,r,i){let a=n.authStore.oauth,o=pd(t),s=t.contributes?.oauth;if(s?.length&&a)for(let t of s){let n=o.has(t.id)?t.id:V(e,t.id);r?.has(n)||a.unregister(n)}let c=t.contributes?.providers;if(c?.length){for(let t of c){let r=t.preserveProviderId===!0?t.id:V(e,t.id);ve(r),t.envKey&&!t.oauthRef&&n.authStore.unregisterEnvKey(r)}await n.providerRegistry.unregisterBySource(e,i),n.modelRegistry.unregisterBySource(e)}}var Td=class{axisName=`oauthProviderFactories`;oauthIdsByPlugin=new Map;constructor(e,t){this.authStore=e,this.logger=t}register(e){let t=e.loaded.module.oauthProviderFactories;if(!t||!this.authStore)return;if(!e.plugin.manifest.capabilities?.includes(`provider`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares oauthProviderFactories but not capabilities:["provider"], skipped (fail-closed)`);return}if(e.verdict.pendingCapabilities.includes(`provider`)){this.logger.warn({pluginId:e.plugin.id},`plugin capability "provider" not yet granted, skipping oauthProviderFactories (fail-closed)`);return}let n=new Set((e.plugin.manifest.contributes?.providers??[]).filter(e=>e.preserveProviderId===!0&&e.oauthRef).map(e=>e.oauthRef));for(let[r,i]of Object.entries(t)){let t=vl(e.plugin.id,i);if(!t)continue;let a=n.has(r)?r:V(e.plugin.id,r);if(t.id!==a){this.logger.warn({pluginId:e.plugin.id,name:r,expectedId:a,actualId:t.id},`plugin oauth provider id mismatch with manifest oauthRef/preserveProviderId, skipped`);continue}if(this.authStore.oauth.register(t,e.plugin.id)){let n=this.oauthIdsByPlugin.get(e.plugin.id)??new Set;n.add(t.id),this.oauthIdsByPlugin.set(e.plugin.id,n)}else this.logger.warn({pluginId:e.plugin.id,oauthId:t.id},`plugin oauthProviderFactory rejected (reserved or claimed)`)}}unregister(e){if(!this.authStore)return;let t=this.oauthIdsByPlugin.get(e);if(t){for(let e of t)this.authStore.oauth.unregister(e);this.oauthIdsByPlugin.delete(e)}}unregisterAll(){for(let e of[...this.oauthIdsByPlugin.keys()])this.unregister(e)}},Ed=class{axisName=`providerFactories`;providerSourcePluginIds=new Set;modelSourcePluginIds=new Set;descriptorIdsByPlugin=new Map;constructor(e,t,n){this.providerRegistry=e,this.modelRegistry=t,this.logger=n}register(e){let t=e.loaded.module.providerFactories;if(!t||!this.providerRegistry)return;if(!e.plugin.manifest.capabilities?.includes(`provider`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares providerFactories but not capabilities:["provider"], skipped (fail-closed)`);return}if(e.verdict.pendingCapabilities.includes(`provider`)){this.logger.warn({pluginId:e.plugin.id},`plugin capability "provider" declared but not yet granted, skipping providerFactories (fail-closed, RFC-124 C2)`);return}let n=e.plugin.manifest.codeProviderModelsEndpoints??{},r=e.plugin.manifest.codeProviderModels??{};for(let[i,a]of Object.entries(t)){let t=gd(e.plugin.id,i,e.plugin.manifest);if(!this.providerRegistry.registerPluginProvider(t,_l(e.plugin.id,a),_d(e.plugin.id))){this.logger.warn({pluginId:e.plugin.id,api:t},`plugin providerFactory rejected (reserved builtin or claimed by another plugin)`);continue}this.providerSourcePluginIds.add(e.plugin.id);let o=n[i];if(o)if(me({id:t,buildModelsRequest:yd(o,t,t)},_d(e.plugin.id))){let n=this.descriptorIdsByPlugin.get(e.plugin.id)??new Set;n.add(t),this.descriptorIdsByPlugin.set(e.plugin.id,n)}else this.logger.warn({pluginId:e.plugin.id,api:t},`plugin codeProviderModelsEndpoints descriptor rejected (reserved builtin or claimed by another plugin)`);let s=r[i];if(s?.models?.length&&this.modelRegistry){let n=s.models.map(e=>vd(e,t,t,s.baseUrl,s.imageConstraints,s.supportsTools,s.responseBodyPolicy)),r=this.modelRegistry.registerWithSource(n,_d(e.plugin.id));this.modelSourcePluginIds.add(e.plugin.id),r.length>0&&this.logger.warn({pluginId:e.plugin.id,rejectedModelIds:r},`plugin codeProviderModels contains model ids already claimed by another source, rejected`)}}}async unregister(e){this.providerRegistry&&this.providerSourcePluginIds.has(e)&&(await this.providerRegistry.unregisterBySource(_d(e)),this.providerSourcePluginIds.delete(e)),this.modelRegistry&&this.modelSourcePluginIds.has(e)&&(this.modelRegistry.unregisterBySource(_d(e)),this.modelSourcePluginIds.delete(e));let t=this.descriptorIdsByPlugin.get(e);if(t){for(let e of t)ve(e);this.descriptorIdsByPlugin.delete(e)}}async unregisterAll(){let e=new Set([...this.providerSourcePluginIds,...this.modelSourcePluginIds,...this.descriptorIdsByPlugin.keys()]);for(let t of e)await this.unregister(t)}},Dd=class{axisName=`wireProtocols`;wireProtocolSourcePluginIds=new Set;cacheReportingApisByPlugin=new Map;constructor(e,t){this.wireProtocolRegistry=e,this.logger=t}register(e){let t=e.loaded.module.wireProtocols;if(!(!t||!this.wireProtocolRegistry)){if(!e.plugin.manifest.capabilities?.includes(`wire-protocol`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares wireProtocols but not capabilities:["wire-protocol"], skipped (fail-closed)`);return}if(e.verdict.pendingCapabilities.includes(`wire-protocol`)){this.logger.warn({pluginId:e.plugin.id},`plugin capability "wire-protocol" declared but not yet granted, skipping wireProtocols (fail-closed, RFC-124 C2 pattern)`);return}for(let[n,r]of Object.entries(t))if(this.wireProtocolRegistry.register(n,r,e.plugin.id)){if(this.wireProtocolSourcePluginIds.add(e.plugin.id),r.meta?.reportsCacheTokens){pe(n);let t=this.cacheReportingApisByPlugin.get(e.plugin.id)??new Set;t.add(n),this.cacheReportingApisByPlugin.set(e.plugin.id,t)}}else this.logger.warn({pluginId:e.plugin.id,wireApi:n},`plugin wireProtocol rejected (already registered by another plugin, first-win)`)}}unregister(e){this.wireProtocolRegistry&&this.wireProtocolSourcePluginIds.has(e)&&(this.wireProtocolRegistry.unregisterBySource(e),this.wireProtocolSourcePluginIds.delete(e));let t=this.cacheReportingApisByPlugin.get(e);if(t){for(let e of t)_e(e);this.cacheReportingApisByPlugin.delete(e)}}unregisterAll(){let e=new Set([...this.wireProtocolSourcePluginIds,...this.cacheReportingApisByPlugin.keys()]);for(let t of e)this.unregister(t)}},Od=class{axisName=`tools`;toolSourcePluginIds=new Set;constructor(e,t){this.toolRegistry=e,this.logger=t}register(e){let t=e.loaded.module.tools;if(!t?.length||!this.toolRegistry)return;if(!e.plugin.manifest.capabilities?.includes(`tools`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares tools but not capabilities:["tools"], skipped (fail-closed)`);return}if(e.verdict.pendingCapabilities.includes(`tools`)){this.logger.warn({pluginId:e.plugin.id},`plugin capability "tools" declared but not yet granted, skipping tools (fail-closed, RFC-124 C2)`);return}let n=this.toolRegistry,r={workspaceDir:e.workspaceDir,logger:{info:t=>this.logger.info({pluginId:e.plugin.id},t),warn:t=>this.logger.warn({pluginId:e.plugin.id},t),error:t=>this.logger.error({pluginId:e.plugin.id},t)},host:e.host,storage:e.storage},i=t.map(t=>bl(e.plugin.id,t,r)).filter(e=>e!==null).filter(t=>n.has(t.name)?(this.logger.warn({pluginId:e.plugin.id,tool:t.name},`plugin tool name collides with an existing tool, rejected (R3, no silent override)`),!1):!0);for(let r of i){let i=t.find(e=>e.name===r.name);n.register(r,{preset:i?.preset??`full`,...i?.category&&{category:i.category},...i?.guideline&&{guideline:i.guideline},source:e.plugin.id})}i.length>0&&this.toolSourcePluginIds.add(e.plugin.id)}unregister(e){!this.toolRegistry||!this.toolSourcePluginIds.has(e)||(this.toolRegistry.unregisterBySource(e),this.toolSourcePluginIds.delete(e))}unregisterAll(){for(let e of[...this.toolSourcePluginIds])this.unregister(e)}};const kd=`[plugin]`;function Ad(e,t,n){let r=n.name?.trim()||n.key;return`${kd} ${e}:${t}:${n.key} — ${r}`}function jd(e,t,n){let r=e.subscriber;return!r||r.kind!==`plugin-service`||r.pluginId!==t||r.serviceId!==n?!1:e.name.startsWith(kd)}function Md(e,t,n){let r=`${kd} ${t}:${n}:`;if(!e.name.startsWith(r))return;let i=e.name.slice(r.length),a=i.indexOf(` — `);if(!(a<=0))return i.slice(0,a)}function Nd(e){let{port:t,logger:n,pluginId:r,serviceId:i}=e,a={added:0,updated:0,removed:0},o=new Map;for(let t of e.declared){let e=t?.key?.trim(),a=t?.cron?.trim();if(!e||!a){n.warn({pluginId:r,serviceId:i,key:t?.key},`plugin schedule subscription missing key or cron, skipped (RFC-327 D2)`);continue}if(o.has(e)){n.warn({pluginId:r,serviceId:i,key:e},`duplicate plugin schedule subscription key, later declaration ignored`);continue}o.set(e,{...t,key:e,cron:a})}let s=new Map;for(let e of t.list()){if(!jd(e,r,i))continue;let t=Md(e,r,i);t!==void 0&&s.set(t,e)}for(let[e,c]of o){let o=Ad(r,i,c),l=s.get(e);if(!l){try{t.add({name:o,prompt:`plugin service subscription (${r}:${i}:${e})`,cronExpression:c.cron,recurring:!0,origin:`user`,subscriber:{kind:`plugin-service`,pluginId:r,serviceId:i}}),a.added+=1}catch(t){n.warn({pluginId:r,serviceId:i,key:e,err:t instanceof Error?t.message:String(t)},`failed to register plugin schedule subscription`)}continue}(l.cronExpression!==c.cron||l.name!==o)&&t.update(l.id,{cronExpression:c.cron,name:o})&&(a.updated+=1)}for(let[e,n]of s)o.has(e)||t.remove(n.id)&&(a.removed+=1);return a}function Pd(e){let{port:t,pluginId:n}=e,r=0;for(let e of t.list()){let i=e.subscriber;!i||i.kind!==`plugin-service`||i.pluginId!==n||e.name.startsWith(kd)&&t.remove(e.id)&&(r+=1)}return r}var Fd=class{axisName=`services`;startedByPlugin=new Map;scheduleDeclarations=new Map;constructor(e){this.deps=e}async register(e){let t=e.loaded.module.services;if(!t?.length)return;if(!e.plugin.manifest.capabilities?.includes(`service`)){this.deps.logger.warn({pluginId:e.plugin.id},`plugin declares services but not capabilities:["service"], skipped (fail-closed, RFC-287 D-M3-1)`);return}if(e.verdict.pendingCapabilities.includes(`service`)){this.deps.logger.warn({pluginId:e.plugin.id},`plugin capability "service" declared but not yet granted, skipping services (fail-closed)`);return}let n=e.loaded.compiledPath;if(!n){this.deps.logger.warn({pluginId:e.plugin.id},`plugin declares services but has no compiled entry path; services need a compiled module to run in the service worker (skipped)`);return}let r=this.startedByPlugin.get(e.plugin.id)??[];for(let i of t){if(!i?.id)continue;let t=this.deps.getWorkspaceKey(),a=this.deps.hasStorageCapability(e.plugin.id),{error:o}=await this.deps.pool.start({pluginId:e.plugin.id,serviceId:i.id,compiledPath:n,workspaceDir:this.deps.workspaceDir,workspaceKey:t,factoryCtx:{pluginId:e.plugin.id,pluginDir:e.plugin.dir,workspaceDir:this.deps.workspaceDir,emitEvent:e.plugin.manifest.capabilities?.includes(`events`)===!0,subscribeEvent:e.plugin.manifest.capabilities?.includes(`events`)===!0},hostCapabilities:this.deps.hostCapabilitiesFor(e.plugin.id),storageDir:a?this.deps.storageDirFor(e.plugin.id,t):``,hasStorageCapability:a,bridge:this.deps.bridgeFor(e.plugin.id)});o&&this.deps.logger.warn({pluginId:e.plugin.id,serviceId:i.id,err:o},`plugin service failed to start`),r.push(i.id),this.scheduleDeclarations.set(`${e.plugin.id}:${i.id}`,i.schedules??[]);let s=this.deps.getSchedulePort?.();if(i.schedules?.length){if(!s)this.deps.logger.debug({pluginId:e.plugin.id,serviceId:i.id,count:i.schedules.length},`plugin declares schedule subscriptions but no scheduler in this process, skipped (RFC-327 D2 boundary)`);else if(!o){let t=Nd({port:s,logger:this.deps.logger,pluginId:e.plugin.id,serviceId:i.id,declared:i.schedules});(t.added||t.updated||t.removed)&&this.deps.logger.info({pluginId:e.plugin.id,serviceId:i.id,...t},`plugin schedule subscriptions reconciled`)}}else s&&Nd({port:s,logger:this.deps.logger,pluginId:e.plugin.id,serviceId:i.id,declared:[]})}r.length>0&&this.startedByPlugin.set(e.plugin.id,r)}async unregister(e){if(!this.startedByPlugin.has(e))return;this.startedByPlugin.delete(e);for(let t of[...this.scheduleDeclarations.keys()])t.startsWith(`${e}:`)&&this.scheduleDeclarations.delete(t);let t=this.deps.getSchedulePort?.();if(t){let n=Pd({port:t,pluginId:e});n>0&&this.deps.logger.info({pluginId:e,removed:n},`plugin schedule subscriptions revoked`)}await this.deps.pool.stopPlugin(e)}async unregisterAll(){for(let e of[...this.startedByPlugin.keys()])await this.unregister(e)}reconcileAllSchedules(){let e=this.deps.getSchedulePort?.();if(e)for(let[t,n]of this.startedByPlugin)for(let r of n){let n=this.scheduleDeclarations.get(`${t}:${r}`);if(n===void 0)continue;let i=Nd({port:e,logger:this.deps.logger,pluginId:t,serviceId:r,declared:n});(i.added||i.updated||i.removed)&&this.deps.logger.info({pluginId:t,serviceId:r,...i,source:`scheduler-ready reconcile`},`plugin schedule subscriptions reconciled (M3 scheduler-ready)`)}}},Id=class{axisName=`cliCommands`;commandsByPlugin=new Map;constructor(e){this.logger=e}register(e){let t=e.plugin.manifest.contributes?.cliCommands;if(!t?.length)return;if(!e.plugin.manifest.capabilities?.includes(`cli.command`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares contributes.cliCommands but not capabilities:["cli.command"], skipped (fail-closed)`);return}if(e.verdict.pendingCapabilities.includes(`cli.command`)){this.logger.warn({pluginId:e.plugin.id},`plugin capability "cli.command" declared but not yet granted, skipping cliCommands (fail-closed, RFC-124 C2)`);return}let n=e.loaded.module.cliCommands,r=[];for(let i of t){let t=n?.[i.name];if(typeof t!=`function`){this.logger.warn({pluginId:e.plugin.id,command:i.name},`contributes.cliCommands declares a command with no matching handler in PluginModule.cliCommands, skipped`);continue}r.push({pluginId:e.plugin.id,name:i.name,summary:i.summary,handler:t})}r.length>0&&this.commandsByPlugin.set(e.plugin.id,r)}unregister(e){this.commandsByPlugin.delete(e)}unregisterAll(){this.commandsByPlugin.clear()}getCliCommands(){return[...this.commandsByPlugin.values()].flat()}},Ld=class{axisName=`slashCommands`;commandsByPlugin=new Map;constructor(e){this.logger=e}register(e){let t=e.plugin.manifest.contributes?.slashCommands;if(!t?.length)return;if(!e.plugin.manifest.capabilities?.includes(`tui.command`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares contributes.slashCommands but not capabilities:["tui.command"], skipped (fail-closed)`);return}if(e.verdict.pendingCapabilities.includes(`tui.command`)){this.logger.warn({pluginId:e.plugin.id},`plugin capability "tui.command" declared but not yet granted, skipping slashCommands (fail-closed, RFC-440)`);return}let n=e.loaded.module.slashCommands,r=[];for(let i of t){let t=n?.[i.name];if(typeof t!=`function`){this.logger.warn({pluginId:e.plugin.id,command:i.name},`contributes.slashCommands declares a command with no matching handler in PluginModule.slashCommands, skipped`);continue}r.push({pluginId:e.plugin.id,name:i.name,description:i.description,...i.group?{group:i.group}:{},handler:t})}r.length>0&&this.commandsByPlugin.set(e.plugin.id,r)}unregister(e){this.commandsByPlugin.delete(e)}unregisterAll(){this.commandsByPlugin.clear()}getSlashCommands(){return[...this.commandsByPlugin.values()].flat()}},Rd=class{axisName=`events`;registeredPlugins=new Set;constructor(e,t){this.eventDispatcher=e,this.logger=t}register(e){if(!this.eventDispatcher)return;let t=e.plugin.manifest.contributes?.events;if(!(!t||t.length===0)){if(!e.plugin.manifest.capabilities?.includes(`events`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares contributes.events but not capabilities:["events"], skipped (fail-closed)`);return}this.eventDispatcher.registerPluginEvents(e.plugin.id,t),this.registeredPlugins.add(e.plugin.id)}}unregister(e){this.eventDispatcher&&this.registeredPlugins.has(e)&&(this.eventDispatcher.unregisterPluginEvents(e),this.eventDispatcher.unregisterPluginSubscriptions(e),this.registeredPlugins.delete(e))}unregisterAll(){if(this.eventDispatcher){for(let e of this.registeredPlugins)this.eventDispatcher.unregisterPluginEvents(e),this.eventDispatcher.unregisterPluginSubscriptions(e);this.registeredPlugins.clear()}}};const zd=T(`@x-otto/plugin:config-store`),Bd=/^[a-z0-9]+(?:-[a-z0-9]+)*$/;function Vd(){return C(process.env.OTTO_HOME||r,`plugin-state`)}function Hd(e,t){if(!Bd.test(e))throw Error(`invalid pluginId for config store: ${e} (must be kebab-case)`);if(typeof t!=`string`||t.length===0||t.includes(`/`)||t.includes(`\\`)||t.includes(`..`))throw Error(`invalid workspaceKey for config store: ${t}`);if(c())return{dir:`:memory:/plugin-state/${e}/${t}`,isMemory:!0};let n=w(C(Vd(),e,t));y(n,{recursive:!0});let r=Qe(n),i=Qe(Vd());if(r!==i&&!r.startsWith(i+`/`))throw Error(`config store path escapes plugin-state root: ${r}`);return{dir:r,isMemory:!1}}function Ud(e,t){let n=`${e}.${Ii()}.tmp`,r;try{r=Ye(n,`w`),x(r,t),Ke(r),We(r),r=void 0,$e(n,e)}finally{if(r!==void 0)try{We(r)}catch{}}}var Wd=class{dir;isMemory;configPath;memoryStore={};pluginId;workspaceKey;constructor(e,t){this.pluginId=e,this.workspaceKey=t;let{dir:n,isMemory:r}=Hd(e,t);this.dir=n,this.isMemory=r,this.configPath=C(n,`config.json`)}get(){if(this.isMemory)return{...this.memoryStore};if(!v(this.configPath))return{};try{let e=b(this.configPath,`utf-8`),t=JSON.parse(e);return t&&typeof t==`object`&&!Array.isArray(t)?t:{}}catch(e){return zd.warn({pluginId:this.pluginId,err:String(e)},`failed to read plugin config, using empty`),{}}}set(e){let t=JSON.stringify(e,null,2);if(this.isMemory){this.memoryStore={...e};return}v(this.dir)||y(this.dir,{recursive:!0}),Ud(this.configPath,t)}update(e){let t=this.get();this.set({...t,...e})}clear(){if(this.isMemory){this.memoryStore={};return}try{v(this.configPath)&&x(this.configPath,`{}`)}catch{}}};const Gd=/^[a-z0-9]+(?:-[a-z0-9]+)*$/,Kd=C(r,`plugin-state`);function qd(e){let t=Jd(e);try{return et(t,{recursive:!0,force:!0}),{removed:!v(t),dir:t}}catch{return{removed:!1,dir:t}}}function Jd(e){if(!Gd.test(e))throw Error(`invalid pluginId for scoped storage: ${e} (must be kebab-case)`);return C(Kd,e)}var Yd=class{persistence;baseDir;pluginId;workspaceKey;constructor(e,t){if(this.pluginId=e,this.workspaceKey=t,!Gd.test(e))throw Error(`invalid pluginId for scoped storage: ${e} (must be kebab-case)`);if(typeof t!=`string`||t.length===0||t.includes(`/`)||t.includes(`\\`)||t.includes(`..`))throw Error(`invalid workspaceKey for scoped storage: ${t}`);if(c()){this.baseDir=`:memory:/plugin-state/${e}/${t}`,this.persistence=Ln({type:`memory`});return}let n=w(C(Jd(e),t));y(n,{recursive:!0});let r=Qe(n),i=Qe(Kd);if(r!==i&&!r.startsWith(i+`/`))throw Error(`scoped storage path escapes plugin-state root: ${r}`);this.baseDir=n,this.persistence=Ln({type:`file`,baseDir:n})}async save(e,t){await this.persistence.save({id:e,data:t,version:1,metadata:{}})}async load(e){let t=await this.persistence.load(e);return t?t.data:null}delete(e){return this.persistence.delete(e)}list(){return this.persistence.list()}};function Xd(e){let t=new Set([...e.manifest.codeProviderIds??[],...(e.manifest.contributes?.providers??[]).filter(e=>e.preserveProviderId===!0).map(e=>e.id)]),n=`${e.id}:`;return e=>t.has(e)||e.startsWith(n)}function Zd(e,t,n){let r=e.manifest.capabilities??[],i={},a=!1,o=n.startPluginJob;r.includes(`agent.dispatch`)&&!t.pendingCapabilities.includes(`agent.dispatch`)&&o?(i.startJob=async t=>{let r=n.getSessionId?.();if(!r)throw Error(`agent.dispatch unavailable: no active session to attach the job to`);return{jobId:o({pluginId:e.id,title:t.title,prompt:t.prompt,sessionId:r}).id}},a=!0):r.includes(`agent.dispatch`)&&n.logger.warn({pluginId:e.id,pending:t.pendingCapabilities.includes(`agent.dispatch`)},`plugin declares agent.dispatch but it is not available (not yet granted, or host provides no job dispatcher) — skipping (fail-closed, RFC-287 D2)`);let s=n.getSessionMessages,c=$d(n);r.includes(`session.read`)&&!t.pendingCapabilities.includes(`session.read`)&&s?(i.readTranscript=async t=>{if(!c.isSessionAuthorized(e.id,t.sessionId))throw Error(`session not authorized for this plugin`);let n=s(t.sessionId);if(!n)throw Error(`session not found`);if(!c.tryConsumeRead(e.id))throw Error(`readTranscript quota exceeded for this notification`);return Cu(n,t.sinceIndex??0,500)},a=!0):r.includes(`session.read`)&&n.logger.warn({pluginId:e.id,pending:t.pendingCapabilities.includes(`session.read`)},`plugin declares session.read but it is not available (not yet granted, or host provides no transcript source) — skipping (fail-closed, RFC-318 D2)`);let l=n.completeText;r.includes(`llm.complete`)&&!t.pendingCapabilities.includes(`llm.complete`)&&l?(i.complete=async t=>{if(t.prompt.length>32e3)throw Error(`prompt exceeds 32000 chars limit`);let n=c.tryConsumeLlm(e.id);if(!n.ok)throw Error(`llm.complete quota exceeded (${n.reason})`);let r=Math.min(t.maxTokens??2048,2048);return l(t.prompt,{maxTokens:r})},a=!0):r.includes(`llm.complete`)&&n.logger.warn({pluginId:e.id,pending:t.pendingCapabilities.includes(`llm.complete`)},`plugin declares llm.complete but it is not available (not yet granted, or host provides no model caller) — skipping (fail-closed, RFC-318 D2)`);let u=n.askUser;r.includes(`user.ask`)&&!t.pendingCapabilities.includes(`user.ask`)&&u?(i.ask=async t=>u(e.id,{header:String(t.header??``),question:String(t.question??``),background:String(t.background??``),recommendation:String(t.recommendation??``),...Array.isArray(t.options)?{options:t.options}:{},...t.allowFreeform===void 0?{}:{allowFreeform:!!t.allowFreeform},...t.multiSelect===void 0?{}:{multiSelect:!!t.multiSelect},...Array.isArray(t.evidence)?{evidence:t.evidence.map(String)}:{}}),a=!0):r.includes(`user.ask`)&&n.logger.warn({pluginId:e.id,pending:t.pendingCapabilities.includes(`user.ask`)},`plugin declares user.ask but it is not available (not yet granted, or host provides no UI sink) — skipping (fail-closed, RFC-344 M3)`);let d=n.notifyUser;r.includes(`user.notify`)&&!t.pendingCapabilities.includes(`user.notify`)&&d?(i.notify=async t=>{if(!c.tryConsumeNotify(e.id)){n.logger.debug({pluginId:e.id,code:t.code},`plugin user.notify dropped: rate limit exceeded (silent by design, RFC-327 D3)`);return}let r=t.message.replace(/[\u0000-\u001f\u007f-\u009f\u200e\u200f\u202a-\u202e\u2066-\u2069]/g,` `).slice(0,500);d({pluginId:e.id,level:t.level,code:t.code.slice(0,120),message:r})},a=!0):r.includes(`user.notify`)&&n.logger.warn({pluginId:e.id,pending:t.pendingCapabilities.includes(`user.notify`)},`plugin declares user.notify but it is not available (not yet granted, or host provides no UI sink) — skipping (fail-closed, RFC-327 D3)`);let f=n.getSettingValue;return r.includes(`settings.read`)&&!t.pendingCapabilities.includes(`settings.read`)&&f?(i.getSettings=e=>f(e),a=!0):r.includes(`settings.read`)&&n.logger.warn({pluginId:e.id,pending:t.pendingCapabilities.includes(`settings.read`)},`plugin declares settings.read but it is not available (not yet granted, or host provides no settings source) — skipping (fail-closed, RFC-430 M1)`),a?i:void 0}const Qd=new WeakMap;function $d(e){if(e.capabilityQuota)return e.capabilityQuota;let t=Qd.get(e);return t||(t=new Dl,Qd.set(e,t)),t}const ef=new Map([[`oauthProviderFactories`,`provider`],[`providerFactories`,`provider`],[`wireProtocols`,`wire-protocol`]]);function tf(e){let t=e.manifest.contributes;return!t||typeof t!=`object`?[]:Object.keys(t)}var nf=class e{contributesSnapshot=new Map;static DEACTIVATE_TIMEOUT_MS=5e3;hooksAxis;monitorsAxis;feedbackAxis;sigilAxis;computedCommandsAxis;computedAgentsAxis;computedSkillsAxis;oauthProviderAxis;codeProviderAxis;wireProtocolAxis;toolsAxis;servicesAxis;cliCommandsAxis;slashCommandsAxis;eventsAxis;axisHandlers;firedEvents=new Set;deferredIds=new Set;dirtyPluginIds=new Set;loadedModules=new Map;constructor(e){this.deps=e,this.hooksAxis=new Qu(e.hookRegistry),this.monitorsAxis=new $u(e.hookRegistry,e.logger),this.feedbackAxis=new ed(e.feedbackRegistry,e.logger),this.sigilAxis=new cd(e.sigilResolverRegistry,e.pluginInput,e.logger),this.computedCommandsAxis=new ld,this.computedAgentsAxis=new ud,this.computedSkillsAxis=new dd(e.skillRegistry),this.oauthProviderAxis=new Td(e.authStore,e.logger),this.codeProviderAxis=new Ed(e.providerRegistry,e.modelRegistry,e.logger),this.wireProtocolAxis=new Dd(e.wireProtocolRegistry,e.logger),this.toolsAxis=new Od(e.toolRegistry,e.logger),this.servicesAxis=new Fd({pool:e.servicePool??_u(),logger:e.logger,workspaceDir:e.workspaceDir,getWorkspaceKey:()=>e.getWorkspaceKey?.()??Ui,bridgeFor:t=>{let n=e.activePlugins().find(e=>e.id===t);if(!n)return{};let r=Zd(n,O(n),e);if(!r)return{};let i={};return r.startJob&&(i.startJob=r.startJob),r.readTranscript&&(i.readTranscript=r.readTranscript),r.complete&&(i.complete=r.complete),r.notify&&(i.notify=r.notify),i},hostCapabilitiesFor:t=>{let n=e.activePlugins().find(e=>e.id===t);if(!n)return[];let r=Zd(n,O(n),e);if(!r)return[];let i=[];return r.startJob&&i.push(`startJob`),r.readTranscript&&i.push(`readTranscript`),r.complete&&i.push(`complete`),r.notify&&i.push(`notify`),i},storageDirFor:(e,t)=>new Yd(e,t).baseDir,hasStorageCapability:t=>!!e.activePlugins().find(e=>e.id===t)?.manifest.capabilities?.includes(`storage`),...e.getSchedulePort?{getSchedulePort:e.getSchedulePort}:{}}),this.cliCommandsAxis=new Id(e.logger),this.slashCommandsAxis=new Ld(e.logger),this.eventsAxis=new Rd(e.eventDispatcher,e.logger),(e.servicePool??_u()).setEventDispatcher(e.eventDispatcher),this.axisHandlers=[this.hooksAxis,this.monitorsAxis,this.feedbackAxis,this.sigilAxis,this.computedCommandsAxis,this.computedAgentsAxis,this.computedSkillsAxis,this.oauthProviderAxis,this.codeProviderAxis,this.wireProtocolAxis,this.toolsAxis,this.servicesAxis,this.cliCommandsAxis,this.slashCommandsAxis,this.eventsAxis]}get deferredPluginIds(){return this.deferredIds}emitMonitorEvent(e){return this.monitorsAxis.dispatch(e)}reconcileServiceSchedules(){this.servicesAxis.reconcileAllSchedules()}get monitorPluginIds(){return this.monitorsAxis.monitorPluginIds}async activateOn(e,t){return this.firedEvents.add(e),this.reload(t)}get commands(){return this.computedCommandsAxis.getComputedCommands()}get cliCommands(){return this.cliCommandsAxis.getCliCommands()}get slashCommands(){return this.slashCommandsAxis.getSlashCommands()}async callOnDeactivate(t,n){let r;try{await Promise.race([n(),new Promise((n,i)=>{r=setTimeout(()=>{i(Error(`plugin "${t}" onDeactivate timed out after ${e.DEACTIVATE_TIMEOUT_MS}ms`))},e.DEACTIVATE_TIMEOUT_MS),r.unref?.()})])}catch(e){this.deps.logger.warn({pluginId:t,err:String(e)},`plugin onDeactivate failed or timed out`)}finally{r!==void 0&&clearTimeout(r)}}async unregisterAllAxes(){for(let e of this.axisHandlers)await e.unregisterAll()}registerPluginPlaneEntries(e,t){let n=this.deps.planeRegistry;if(!n)return;let r=e.manifest.version;for(let t of n.revalidatePlugin(e.id,r))this.deps.logger.warn({pluginId:e.id,version:r,registeredVersion:t.registeredVersion,entryId:t.entry.id},`plugin plane entry stale after version change; whitelist re-evaluation required (R6')`);let i=zr(e.manifest),a=this.deps.getWorkspaceKey?.()??Ui,o={id:`plugin:${e.id}`,kind:`plugin`,value:{plane:i,capabilities:e.manifest.capabilities??[]},pluginId:e.id,pluginVersion:r};if(i===`host`){let e={...o,plane:`host`,scope:`process`};n.register(e)}else{let e={...o,plane:`preset`,scope:`workspace`};n.workspace(a).preset.register(e)}let s=t.module.hooks?.waterfall;if(s)for(let t of Object.keys(s))n.workspace(a).preset.register({id:`waterfall:${t}`,kind:`waterfall`,value:{timing:t},pluginId:e.id,pluginVersion:r,plane:`preset`,scope:`workspace`})}async unregisterPluginAxes(e,t,n){let r=[],i=t?O(t):void 0;for(let n of this.axisHandlers){let a=ef.get(n.axisName);if(!(a!==void 0&&t!==void 0&&i!==void 0&&t.manifest.capabilities?.some(e=>e===a)&&!i.gated&&!i.pendingCapabilities.includes(a)))try{await n.unregister(e)}catch(t){r.push(n.axisName),this.deps.logger.warn({pluginId:e,axis:n.axisName,err:t instanceof Error?t.message:String(t)},`plugin axis unregister failed (continuing with remaining axes; plugin marked dirty for full reload next round)`)}}this.deps.planeRegistry?.unregisterByPluginEverywhere(e),$d(this.deps).reset(e),r.length>0&&(this.dirtyPluginIds.add(e),n?.add(e),this.deps.logger.warn({pluginId:e,failedAxes:r},`plugin marked dirty due to axis unregister failures; next reload will force a full reinstall of this plugin`))}pluginSignature(e){let t=O(e),n=`${t.gated?`gated`:`ok`}:${[...t.pendingCapabilities].sort().join(`,`)}`,r=`nofile`;for(let t of[`plugin.ts`,`plugin.tsx`])try{let n=tt(C(e.dir,t));r=`${t}:${n.mtimeMs}:${n.size}`;break}catch{}return`${JSON.stringify(e.manifest)}|${n}|${r}`}async notifyConfigChange(e,t){let n=this.loadedModules.get(e);if(!n)return;let r=n.module.module.hooks?.onConfigChange;if(r)try{await r(t)}catch(t){this.deps.logger.warn({pluginId:e,err:String(t)},`plugin onConfigChange failed, swallowed (R5)`)}}async updatePluginConfig(e,t){new Wd(e,this.deps.getWorkspaceKey?.()??Ui).set(t),await this.notifyConfigChange(e,t)}getPluginConfig(e,t){return Ar(t,new Wd(e,this.deps.getWorkspaceKey?.()??Ui).get())}async reload(e){let t=this.deps.activePlugins(),n=new Map(t.map(e=>[e.id,e])),r=new Map(t.map(e=>[e.id,this.pluginSignature(e)])),i=[],a=new Set,o=new Set;for(let[e,t]of this.loadedModules)n.get(e)?(r.get(e)!==t.signature||this.dirtyPluginIds.has(e))&&(t.module.module.onDeactivate&&i.push({pluginId:e,onDeactivate:t.module.module.onDeactivate}),o.add(e)):(t.module.module.onDeactivate&&i.push({pluginId:e,onDeactivate:t.module.module.onDeactivate}),a.add(e));for(let{pluginId:e,onDeactivate:t}of i)await this.callOnDeactivate(e,t);let s=new Set;for(let e of a)await this.unregisterPluginAxes(e,void 0,s),this.loadedModules.delete(e);for(let e of o)await this.unregisterPluginAxes(e,n.get(e),s);this.computedAgentsAxis.setExistingAgentNames(e);let c=new Set;for(let e of this.deps.activePlugins()){if(!Zu(Rr(e.manifest),this.firedEvents)){c.add(e.id);continue}if(this.loadedModules.get(e.id)&&!o.has(e.id))continue;let t={pluginId:e.id,pluginDir:e.dir,workspaceDir:this.deps.workspaceDir,callMcpTool:(e,t,n)=>this.deps.callMcpTool(e,t,n),logger:{debug:t=>{this.deps.logger.debug({pluginId:e.id},t)},info:t=>{this.deps.logger.info({pluginId:e.id},t),el(e.id,`info`,t)},warn:t=>{this.deps.logger.warn({pluginId:e.id},t),el(e.id,`warn`,t)},error:t=>{this.deps.logger.error({pluginId:e.id},t),el(e.id,`error`,t)}},getWireProtocol:e=>this.deps.wireProtocolRegistry?.get(e),resolveProviderCredential:(()=>{let t=Xd(e);return e=>t(e)?this.deps.providerRegistry?.resolveAccessKey(e)??Promise.resolve(null):Promise.resolve(null)})(),resolveProviderAuth:(()=>{let t=Xd(e);return e=>t(e)?this.deps.providerRegistry?.resolveAuth(e)??Promise.resolve(null):Promise.resolve(null)})(),host:Zd(e,O(e),this.deps),listActivePlugins:()=>this.deps.activePlugins().map(e=>({id:e.id,version:e.manifest.version,capabilities:e.manifest.capabilities??[],contributes:this.contributesSnapshot.get(e.id)??tf(e)})),...e.manifest.contributes?.config?{config:Ar(e.manifest.contributes.config,new Wd(e.id,this.deps.getWorkspaceKey?.()??Ui).get())}:{},...this.deps.eventDispatcher&&(e.manifest.capabilities??[]).includes(`events`)?{emitEvent:(t,n)=>{this.deps.eventDispatcher.emit(e.id,t,{...n})},subscribeEvent:((t,n,r)=>this.deps.eventDispatcher.subscribe(e.id,t,n,r))}:{}},n=this.deps.useIsolatedLoading!==!1&&Wu(e)?await Ku(e,t,void 0,this.deps.onPluginLoadError):await cu(e,t,this.deps.onPluginLoadError);if(!n)continue;let i=O(e);if(i.gated){this.deps.logger.warn({pluginId:e.id},`project plugin not trusted, skipping code axes (fail-closed, RFC-124 C1)`),this.deps.onPluginLoadError?.(e.id,`project plugin not trusted, skipping code axes (fail-closed, RFC-124 C1)`,`not-trusted`);continue}let a;if(e.manifest.capabilities?.includes(`storage`))try{let t=this.deps.getWorkspaceKey?.()??Ui;a=new Yd(e.id,t)}catch(t){this.deps.logger.warn({pluginId:e.id,err:String(t)},`failed to construct scoped storage for plugin, storage capability unavailable`)}let l={plugin:e,verdict:i,loaded:n,host:Zd(e,i,this.deps),workspaceDir:this.deps.workspaceDir,storage:a};for(let e of this.axisHandlers)await e.register(l);if(this.registerPluginPlaneEntries(e,n),n.module.onActivate)try{await n.module.onActivate()}catch(t){this.deps.logger.warn({pluginId:e.id,err:String(t)},`plugin onActivate threw`)}this.contributesSnapshot.set(e.id,tf(e)),this.loadedModules.set(e.id,{module:n,manifest:e.manifest,signature:r.get(e.id)??this.pluginSignature(e)}),s.has(e.id)||this.dirtyPluginIds.delete(e.id)}return this.deferredIds=c,this.computedAgentsAxis.getAppendedAgents()}async cleanup(){for(let[e,t]of this.loadedModules)t.module.module.onDeactivate&&await this.callOnDeactivate(e,t.module.module.onDeactivate);this.loadedModules.clear(),await this.unregisterAllAxes();let e=$d(this.deps);for(let t of this.deps.activePlugins())e.reset(t.id);this.firedEvents.clear()}};const rf=T(`@x-otto/coding:panel-compiler`);function af(e){let t=C(e,`panels`);if(!v(t))return{compiled:[],errors:[],skipped:!0};let n;try{n=Xe(t).filter(e=>e.endsWith(`.tsx`))}catch{return{compiled:[],errors:[],skipped:!0}}if(n.length===0)return{compiled:[],errors:[],skipped:!0};let r=C(e,`panels-dist`);y(r,{recursive:!0});let i=Je(C(ot(),`otto-panel-shims-`)),a=C(i,`react-shim.js`),o=C(i,`ink-shim.js`),s=C(i,`tui-shim.js`);x(a,`const R = globalThis.React
442
+ if (msg.type === '${z.stop}') { toolExecutors.clear(); pluginInstance = null; process.exit(0) }
443
+ })`}`}var Tu=class{pending=new Map;idCounter=0;boundPluginId=``;hostCallDispatcher=null;setHostCallDispatcher(e){this.hostCallDispatcher=e}pushEvent(e){try{this.adapter.send({type:z.eventPush,eventType:e.type,payload:e.payload,sourcePluginId:e.sourcePluginId})}catch{}}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 Eu=T(`@x-otto/coding:plugin-worker-pool`);let Du=null,Ou=null;function ku(){return Ou||(Du||=Je(C(ot(),`otto-plugin-worker-`)),Ou=C(Du,`worker-entry.cjs`),x(Ou,wu(`worker`)),Ou)}var Au=class extends Tu{worker;constructor(){let e=new ra(ku());e.unref(),super({send:t=>e.postMessage(t),onMessage:t=>e.on(`message`,e=>t(e)),onError:t=>e.on(`error`,e=>t(e)),onExit:t=>e.on(`exit`,t),ref:()=>e.ref(),unref:()=>e.unref(),onToolTimeout:(e,t)=>{Eu.warn({tool:e,timeoutMs:t},`plugin tool execution timed out`)},onErrorLog:e=>{Eu.warn({err:String(e)},`plugin worker error`)},onExitLog:e=>{Eu.warn({code:e},`plugin worker exited unexpectedly with pending requests`)},exitErrorMessage:e=>`plugin worker exited unexpectedly (code ${e})`,loadFailedMessage:()=>`plugin worker load failed`,alreadyLoadingMessage:e=>`plugin worker already loading ${e}`}),this.worker=e}async stop(){try{this.worker.postMessage({type:z.stop}),await this.worker.terminate()}catch{}this.clearPending(),this.worker.unref()}},ju=class{workers=new Map;maxConcurrent;hostCallDispatcher=null;constructor(e=8){this.maxConcurrent=e}setHostCallDispatcher(e){this.hostCallDispatcher=e}async load(e,t,n){if(this.workers.size>=this.maxConcurrent)return null;await this.unload(e);let r=new Au;this.hostCallDispatcher&&r.setHostCallDispatcher(this.hostCallDispatcher),this.workers.set(e,r);try{return await r.load(e,t,n)}catch(t){throw this.workers.delete(e),r.stop().catch(()=>{}),t}}async executeTool(e,t,n,r){let i=this.workers.get(e);if(!i)throw Error(`no worker for plugin ${e}`);return i.executeTool(t,n,r)}async resolveSigil(e,t,n,r,i){let a=this.workers.get(e);if(!a)throw Error(`no worker for plugin ${e}`);return a.resolveSigil(t,n,r,i)}async activate(e){let t=this.workers.get(e);if(!t)throw Error(`no worker for plugin ${e}`);return t.activate()}async deactivate(e){let t=this.workers.get(e);if(!t)throw Error(`no worker for plugin ${e}`);return t.deactivate()}async unload(e){let t=this.workers.get(e);t&&(this.workers.delete(e),await t.stop())}pushEvent(e,t){let n=this.workers.get(e);n&&n.pushEvent(t)}async dispose(){let e=[...this.workers.values()];if(this.workers.clear(),Du){try{et(Du,{recursive:!0,force:!0})}catch{}Du=null,Ou=null}await Promise.all(e.map(e=>e.stop().catch(()=>{})))}get size(){return this.workers.size}};const Mu=T(`@x-otto/coding:plugin-process-pool`);let Nu=null,Pu=null;function Fu(){return Pu||(Nu||=Je(C(ot(),`otto-plugin-process-`)),Pu=C(Nu,`process-entry.cjs`),x(Pu,wu(`process`)),Pu)}var Iu=class extends Tu{child;sandboxToDispose;constructor(e){let t=Fu(),n=process.execPath,r=[t],i=n,a=r,o;if(He()){let t=ze({network:`deny`}),s=t.wrap({command:n,args:r,options:{timeout:0,cwd:e},projectRoot:e});i=s.command,a=s.args,o=t}else Mu.warn(`No platform sandbox available for project/repository scope plugin isolation — falling back to plain child_process (still process-isolated, but without OS-level file/network constraints)`);let s=$i(i,a,{cwd:e,stdio:[`ignore`,`ignore`,`pipe`,`ipc`]});s.unref(),super({send:e=>s.send(e),onMessage:e=>s.on(`message`,t=>e(t)),onError:e=>s.on(`error`,t=>e(t)),onExit:e=>s.on(`exit`,e),ref:()=>{s.channel?.ref(),s.stderr?.ref?.()},unref:()=>{s.channel?.unref(),s.stderr?.unref?.()},onToolTimeout:(e,t)=>{Mu.warn({tool:e,timeoutMs:t},`plugin tool execution timed out (isolated process)`)},onErrorLog:e=>{Mu.warn({err:String(e)},`plugin process error`)},onExitLog:e=>{Mu.warn({code:e},`plugin process exited unexpectedly with pending requests`)},exitErrorMessage:e=>`plugin process exited unexpectedly (code ${e})`,loadFailedMessage:()=>`plugin process load failed`,alreadyLoadingMessage:e=>`plugin process already loading ${e}`}),this.child=s,this.sandboxToDispose=o,this.child.stderr?.on(`data`,e=>{Mu.warn({stderr:e.toString().slice(0,500)},`plugin process stderr output`)}),this.child.on(`exit`,()=>{this.sandboxToDispose?.dispose().catch(()=>void 0),this.sandboxToDispose=void 0})}async stop(){try{this.child.send({type:z.stop})}catch{}try{this.child.kill()}catch{}this.clearPending()}},Lu=class{processes=new Map;maxConcurrent;hostCallDispatcher=null;constructor(e=4){this.maxConcurrent=e}setHostCallDispatcher(e){this.hostCallDispatcher=e}async load(e,t,n){if(this.processes.size>=this.maxConcurrent)return null;await this.unload(e);let r=new Iu(n.workspaceDir);this.hostCallDispatcher&&r.setHostCallDispatcher(this.hostCallDispatcher),this.processes.set(e,r);try{return await r.load(e,t,n)}catch(t){throw this.processes.delete(e),r.stop().catch(()=>{}),t}}async executeTool(e,t,n,r){let i=this.processes.get(e);if(!i)throw Error(`no process for plugin ${e}`);return i.executeTool(t,n,r)}async resolveSigil(e,t,n,r,i){let a=this.processes.get(e);if(!a)throw Error(`no process for plugin ${e}`);return a.resolveSigil(t,n,r,i)}async activate(e){let t=this.processes.get(e);if(!t)throw Error(`no process for plugin ${e}`);return t.activate()}async deactivate(e){let t=this.processes.get(e);if(!t)throw Error(`no process for plugin ${e}`);return t.deactivate()}async unload(e){let t=this.processes.get(e);t&&(this.processes.delete(e),await t.stop())}pushEvent(e,t){let n=this.processes.get(e);n&&n.pushEvent(t)}async dispose(){let e=[...this.processes.values()];if(this.processes.clear(),Nu){try{et(Nu,{recursive:!0,force:!0})}catch{}Nu=null,Pu=null}await Promise.all(e.map(e=>e.stop().catch(()=>{})))}get size(){return this.processes.size}};const Ru=T(`@x-otto/coding:plugin-module-loader-isolated`);let zu=null;function Bu(){return zu||=new ju,zu}let Vu=null;function Hu(){return Vu||=new Lu,Vu}async function Uu(){await Promise.all([zu?.dispose()??Promise.resolve(),Vu?.dispose()??Promise.resolve()])}function Wu(e){return e===`project`||e===`repository`?Hu():Bu()}function Gu(e){return!!e.manifest.capabilities?.includes(`tools`)}function Ku(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.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 qu(e,t,n,r){if((e.scope===`project`||e.scope===`repository`)&&!kr(e.dir))return Ru.warn({pluginId:e.id},`project/repository plugin not trusted, skipping isolated code module (fail-closed)`),r?.(e.id,`project/repository plugin not trusted, skipping isolated code module (fail-closed)`,`not-trusted`),null;let i=O(e);if(i.pendingCapabilities.length>0)return Ru.warn({pluginId:e.id,pendingCapabilities:i.pendingCapabilities},`plugin declares high-risk capabilities not yet granted, skipping isolated code module before worker execution (fail-closed, RFC-140 D3)`),r?.(e.id,`declares high-risk capabilities not yet granted: ${i.pendingCapabilities.join(`, `)}`,`capability-not-granted`),null;let a=n??Wu(e.scope),o=su(e.dir);try{o?Ru.info({pluginId:e.id,compiledPath:o},`using prebuilt plugin module (isolated path, RFC-150 D5)`):o=await $l(e.dir)}catch(t){let n=String(t);return Ru.warn({pluginId:e.id,err:n},`plugin.ts compile failed (isolated path)`),r?.(e.id,`compile failed: ${n}`,`module-error`),null}if(!o)return null;let s=[...Object.keys(t.host??{}),`listActivePlugins`];if(typeof t.emitEvent==`function`&&s.push(`emitEvent`),typeof t.subscribeEvent==`function`&&s.push(`subscribeEvent`,`unsubscribeEvent`),t.host&&Object.keys(t.host).length>0||t.listActivePlugins||typeof t.emitEvent==`function`||typeof t.subscribeEvent==`function`){let e=t.host,n=t.pluginId,r=new Map;a.setHostCallDispatcher?.(async(i,o,s)=>{if(o===`listActivePlugins`)return t.listActivePlugins?t.listActivePlugins():[];if(o===`emitEvent`){if(typeof t.emitEvent!=`function`)throw Error(`emitEvent not available (plugin events capability not granted)`);let[e,n]=s;t.emitEvent(e,n);return}if(o===`subscribeEvent`){if(typeof t.subscribeEvent!=`function`)throw Error(`subscribeEvent not available (plugin events capability not granted)`);let[e]=s,i=(e,t,r)=>{a.pushEvent?.(n,{type:e,payload:t,sourcePluginId:r.pluginId})},o=t.subscribeEvent,c=o(e,()=>{},i);r.set(`${n}:${e}`,c);return}if(o===`unsubscribeEvent`){let[e]=s,t=r.get(`${n}:${e}`);t&&(r.delete(`${n}:${e}`),t());return}if(!e||typeof e[o]!=`function`)throw Error(`host method '${o}' not available (not declared or not granted)`);if(!(o in e))throw Error(`host method '${o}' not in whitelist`);let c=e[o];return c(...s)})}try{let n=await a.load(e.id,o,{pluginId:t.pluginId,pluginDir:t.pluginDir,workspaceDir:t.workspaceDir,hostMethods:s,listActivePlugins:!0,emitEvent:typeof t.emitEvent==`function`,subscribeEvent:typeof t.subscribeEvent==`function`,hostExternals:Xl()});if(n===null){if(e.scope===`project`||e.scope===`repository`){let t=`plugin process pool exhausted (project/repository scope requires isolated execution, refusing to downgrade to in-process)`;return Ru.warn({pluginId:e.id},t),r?.(e.id,t,`module-error`),null}return Ru.info({pluginId:e.id},`plugin worker pool exhausted, falling back to in-process load`),cu(e,t,r)}let i=[];if(n.hookEvents?.length&&i.push(`code hooks (module.hooks)`),e.manifest.capabilities?.includes(`monitor`)&&i.push(`monitor`),n.hasSigilProviders&&i.push(`sigilProviders`),i.length>0){let t=`isolated path (tools capability) does not support: ${i.join(`, `)} — these axes are not proxied over RPC and would be silently inactive; split them into a separate plugin without tools to use the in-process path`;return Ru.warn({pluginId:e.id,axes:i},t),r?.(e.id,t,`module-error`),null}return{pluginId:e.id,module:Ku(e.id,n,a),compiledPath:o}}catch(t){let n=String(t);return Ru.warn({pluginId:e.id,err:n},`plugin.ts worker load failed`),r?.(e.id,`worker load failed: ${n}`,`module-error`),null}}const Ju=T(`@x-otto/coding:plugin-event-dispatcher`);var Yu=class{registrations=new Map;subscriptions=new Map;subscriptionSeq=0;emitRateWindow=new Map;constructor(e){this.isCapabilityGranted=e}registerPluginEvents(e,t){let n=new Map;for(let r of t){if(r.type.split(`.`)[0]!==e){Ju.warn({pluginId:e,type:r.type},`event type namespace does not match pluginId, skipping registration (fail-closed)`);continue}n.set(r.type,Zu)}this.registrations.set(e,{schemas:n,pluginId:e})}unregisterPluginEvents(e){this.registrations.delete(e)}emit(e,t,n){let r=this.registrations.get(e);if(!r||!r.schemas.has(t)){Ju.warn({sourcePluginId:e,type:t},`emit rejected: type not declared in this plugin manifest (fail-closed, R3)`);return}let i=r.schemas.get(t).safeParse(n);if(!i.success){Ju.warn({sourcePluginId:e,type:t,error:i.error.message},`emit rejected: payload schema validation failed (fail-closed, R3)`);return}let a=Xu({...n});if(!this.checkEmitRate(e)){Ju.warn({sourcePluginId:e,type:t},`emit rejected: rate limit exceeded (R1)`);return}let o=[],s=[],c=Date.now();for(let n of this.subscriptions.values())if(this.isCapabilityGranted(n.subscriberPluginId,`events`)&&this.typeMatches(n.typeFilter,t,n.isWildcard)){if(Date.now()-c>5e3){Ju.warn({type:t,remainingSubscriptions:this.subscriptions.size-o.length},`emit: handler total execution timeout, dropping remaining subscriptions`);break}o.push(n.subscriberPluginId);try{n.transport?n.transport(t,a,{pluginId:e}):n.handler(a,{pluginId:e})}catch(e){let r=e instanceof Error?e.message:String(e);s.push(`${n.subscriberPluginId}: ${r}`),Ju.warn({subscriberPluginId:n.subscriberPluginId,type:t,err:r},`event handler threw, isolating (R2a, swallowed + warn)`)}}Ju.debug({source:e,type:t,payloadSize:JSON.stringify(n).length,deliveredTo:o,errors:s},`event dispatched (audit, R6)`)}subscribe(e,t,n,r){let i=0;for(let t of this.subscriptions.values())t.subscriberPluginId===e&&i++;if(i>=50)return Ju.warn({subscriberPluginId:e,current:i,max:50},`subscribe rejected: max subscriptions exceeded (R1)`),()=>{};let a=t.endsWith(`.*`)||t===`*`;if(t===`*`)return Ju.warn({subscriberPluginId:e},`subscribe rejected: wildcard "*" not implemented in M2 (R5 gate, runtime reject + warn)`),()=>{};let o=String(++this.subscriptionSeq);return this.subscriptions.set(o,{id:o,subscriberPluginId:e,typeFilter:t,handler:n,isWildcard:a,...r?{transport:r}:{}}),()=>{this.subscriptions.delete(o)}}unregisterPluginSubscriptions(e){let t=[];for(let[n,r]of this.subscriptions)r.subscriberPluginId===e&&t.push(n);for(let e of t)this.subscriptions.delete(e)}typeMatches(e,t,n){if(n){let n=e.slice(0,-2);return t.startsWith(n+`.`)}return e===t}checkEmitRate(e){let t=Date.now(),n=(this.emitRateWindow.get(e)??[]).filter(e=>t-e<6e4);return n.length>=100?!1:(n.push(t),this.emitRateWindow.set(e,n),!0)}};function Xu(e){if(typeof e!=`object`||!e)return e;if(Object.freeze(e),Array.isArray(e))for(let t of e)Xu(t);else for(let t of Object.keys(e)){let n=e[t];typeof n==`object`&&n&&!Object.isFrozen(n)&&Xu(n)}return e}const Zu={safeParse:e=>typeof e==`object`&&e&&!Array.isArray(e)?{success:!0,data:e}:{success:!1,error:{message:`payload must be a plain object`}}};function Qu(e,t){return e.includes(`onStartup`)?!0:e.some(e=>t.has(e))}var $u=class{axisName=`hooks`;tokensByPlugin=new Map;hookNamesByPlugin=new Map;constructor(e){this.hookRegistry=e}register(e){let t=e.loaded.module.hooks;if(t){let n=il(e.plugin.id,t),r=this.hookRegistry.registerAll(n),i=this.tokensByPlugin.get(e.plugin.id)??[];this.tokensByPlugin.set(e.plugin.id,[...i,...r]);let a=this.hookNamesByPlugin.get(e.plugin.id)??[];a.push(...n.map(e=>e.name)),this.hookNamesByPlugin.set(e.plugin.id,a)}}unregister(e){let t=this.tokensByPlugin.get(e);if(t)for(let e of t)e.dispose();let n=this.hookNamesByPlugin.get(e);if(n)for(let e of n)this.hookRegistry.unregister(e);this.tokensByPlugin.delete(e),this.hookNamesByPlugin.delete(e)}unregisterAll(){for(let e of[...this.tokensByPlugin.keys(),...this.hookNamesByPlugin.keys()])this.unregister(e)}},ed=class{axisName=`monitors`;hookNamesByPlugin=new Map;monitorsByPlugin=new Map;constructor(e,t){this.hookRegistry=e,this.logger=t}register(e){let t=e.loaded.module.monitors;if(!t?.length)return;if(!e.plugin.manifest.capabilities?.includes(`monitor`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares monitors but not capabilities:["monitor"], skipped (fail-closed)`);return}let n=xl(e.plugin.id,t);this.hookRegistry.registerAll(n);let r=this.hookNamesByPlugin.get(e.plugin.id)??[];r.push(...n.map(e=>e.name)),this.hookNamesByPlugin.set(e.plugin.id,r),this.monitorsByPlugin.set(e.plugin.id,t)}unregister(e){let t=this.hookNamesByPlugin.get(e);if(t){for(let e of t)this.hookRegistry.unregister(e);this.hookNamesByPlugin.delete(e)}this.monitorsByPlugin.delete(e)}unregisterAll(){for(let e of[...this.hookNamesByPlugin.keys()])this.unregister(e)}async dispatch(e){for(let[t,n]of this.monitorsByPlugin)for(let r of n)try{await r.onEvent(e)}catch(n){this.logger.warn({pluginId:t,monitorId:r.id,eventType:e.type,err:String(n)},`plugin monitor onEvent threw (host event), isolated`)}}get monitorPluginIds(){return[...this.monitorsByPlugin.keys()]}},td=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 nd=T(`@x-otto/coding:plugin-sigil-loader`);function rd(e){return e.startsWith(`!`)||e.startsWith(`#`)}function id(e){let t=[];for(let n of e){let e=n.manifest.contributes?.sigilEntries;if(e?.length){if(O(n).gated){nd.warn({pluginId:n.id},`plugin gated (untrusted), sigilEntries skipped`);continue}for(let r of e){if(rd(r.value)){nd.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 ad(e){for(let t of e)t.manifest.contributes?.inputEntries&&nd.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 od(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}):nd.warn({pluginId:e,name:r},`sigilResolvers entry is neither function nor {resolve}, skipped`)}return n}function sd(e,t){return t.map(t=>async(n,r)=>(await t(n,r)).filter(e=>!rd(e.value)).map(t=>({...t,source:e})))}function cd(e,t){for(let n of e)n.resolverId&&!t(n.resolverId)&&nd.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 ld=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=od(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 sd(e.plugin.id,n))t.push(this.pluginInput.registerProvider(`@`,r));this.sigilProviderUnsubsByPlugin.set(e.plugin.id,t)}if(this.sigilResolverRegistry){let t=this.sigilResolverRegistry;cd(id([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)}},ud=class{axisName=`computedCommands`;commandsByPlugin=new Map;register(e){let t=e.loaded.module.contributions?.commands;if(t?.length&&e.plugin.scope!==`builtin`){let n=this.commandsByPlugin.get(e.plugin.id)??[];n.push(...pl(e.plugin.id,e.plugin.scope,e.plugin.dir,t)),this.commandsByPlugin.set(e.plugin.id,n)}}unregister(e){this.commandsByPlugin.delete(e)}unregisterAll(){}resetForReload(){this.commandsByPlugin.clear()}getComputedCommands(){return[...this.commandsByPlugin.values()].flat()}},dd=class{axisName=`computedAgents`;profilesByPlugin=new Map;existingAgentNames=new Set;register(e){let t=e.loaded.module.contributions?.agents;if(!t?.length)return;let n=this.profilesByPlugin.get(e.plugin.id)??[];n.push(...ml(t)),this.profilesByPlugin.set(e.plugin.id,n)}unregister(e){this.profilesByPlugin.delete(e)}unregisterAll(){}setExistingAgentNames(e){this.existingAgentNames=e}resetForReload(e){this.profilesByPlugin.clear(),this.existingAgentNames=e}getAppendedAgents(){let e=new Set(this.existingAgentNames),t=[];for(let n of this.profilesByPlugin.values())for(let r of n)e.has(r.name)||(e.add(r.name),t.push(r));return t}},fd=class{axisName=`computedSkills`;skillNamesByPlugin=new Map;constructor(e){this.skillRegistry=e}register(e){let t=e.loaded.module.contributions?.skills;if(!t?.length||!this.skillRegistry)return;let n=this.skillNamesByPlugin.get(e.plugin.id)??[];for(let{definition:r,source:i}of hl(e.plugin.id,e.plugin.dir,t))this.skillRegistry.get(r.metadata.name)||(this.skillRegistry.register(r,i),n.push(r.metadata.name));n.length>0&&this.skillNamesByPlugin.set(e.plugin.id,n)}unregister(e){let t=this.skillNamesByPlugin.get(e);if(t){for(let e of t)this.skillRegistry?.unregister(e);this.skillNamesByPlugin.delete(e)}}unregisterAll(){for(let e of[...this.skillNamesByPlugin.keys()])this.unregister(e)}};function pd(e,t,n){return Error(`Invalid baseUrl override for provider "${e}" from ${t}: ${n}`)}function md(e,t,n){if(typeof t!=`string`||t.length===0)throw pd(e,n,`expected a non-empty string`);if(/\s/.test(t))throw pd(e,n,`whitespace is not allowed`);let r;try{r=new URL(t)}catch{throw pd(e,n,`expected an absolute URL`)}if(r.protocol!==`http:`&&r.protocol!==`https:`)throw pd(e,n,`unsupported protocol ${r.protocol}`);if(r.username||r.password)throw pd(e,n,`embedded credentials are not allowed`);if(r.search||r.hash)throw pd(e,n,`query strings and fragments are not allowed`);return r.pathname=r.pathname.replace(/\/+$/,``)||`/`,r.toString().replace(/\/(?=[?#]|$)/,``)}function hd(e){if(e===void 0||e===``)return;if(e.length>65536)throw Error(`OTTO_PROVIDER_OVERRIDES exceeds the 64 KiB limit`);let t;try{t=JSON.parse(e)}catch{throw Error(`OTTO_PROVIDER_OVERRIDES must contain valid JSON`)}if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`OTTO_PROVIDER_OVERRIDES must contain a JSON object`);let n={};for(let[e,r]of Object.entries(t)){if(e.length===0)throw Error(`OTTO_PROVIDER_OVERRIDES contains an empty provider ID`);if(typeof r!=`object`||!r||Array.isArray(r))throw Error(`Invalid override for provider "${e}" from OTTO_PROVIDER_OVERRIDES`);if(Object.keys(r).some(e=>e!==`baseUrl`))throw Error(`Unknown override field for provider "${e}" from OTTO_PROVIDER_OVERRIDES`);let t=r.baseUrl;if(t===void 0)throw Error(`Missing baseUrl for provider "${e}" from OTTO_PROVIDER_OVERRIDES`);n[e]={baseUrl:md(e,t,`OTTO_PROVIDER_OVERRIDES`)}}return n}function gd(e){let t=[{source:`OTTO_PROVIDER_OVERRIDES`,value:e.processOverrides?.[e.providerId]?.baseUrl},{source:`config`,value:e.configOverrides?.[e.providerId]?.baseUrl},{source:`credential`,value:e.credentialBaseUrl},{source:`provider manifest`,value:e.manifestBaseUrl}];for(let n of t)if(n.value!==void 0&&n.value!==null)return md(e.providerId,n.value,n.source);throw Error(`No baseUrl is configured for provider "${e.providerId}"`)}const B=T(`@x-otto/coding:plugin-provider-loader`);function _d(e){let t=T(`wire-protocol:${e}`),n=e=>(t,...n)=>e(t,...n);return{debug:n(t.debug.bind(t)),info:n(t.info.bind(t)),warn:n(t.warn.bind(t)),error:n(t.error.bind(t))}}function V(e,t){return`${e}:${t}`}function vd(e){return new Set([...(e.contributes?.providers??[]).filter(e=>e.preserveProviderId===!0&&e.oauthRef).map(e=>e.oauthRef),...e.codeProviderIds??[]])}function yd(e,t){let n=vd(t);return new Set((t.contributes?.oauth??[]).map(t=>n.has(t.id)?t.id:V(e,t.id)))}function bd(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 xd(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 Sd(e){return`code:${e}`}function Cd(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 wd(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 Td(e,t,n,r,i,a,o,s){return()=>{let c=r.get(o);if(!c)throw new ft(`wire protocol '${o}' is not registered — is its provider plugin installed and trusted? (RFC-148)`,{code:`WIRE_PROTOCOL_NOT_REGISTERED`});return c.create({resolveAuth:()=>t.resolveAuth(n).then(e=>e??void 0),preferResolvedBaseUrl:!0,resolveBaseUrl:async()=>gd({providerId:i,manifestBaseUrl:a,credentialBaseUrl:await t.getBaseUrl(n),configOverrides:s?.(),processOverrides:hd(process.env.OTTO_PROVIDER_OVERRIDES)}),headers:e.headers,tokenDerivedHeaders:e.tokenDerivedHeaders,allowAuthHeaderOverride:e.allowAuthHeaderOverride,logger:_d(o)})}}function Ed(e,t,n,r,i,a,o){let s=t.contributes?.oauth;if(s?.length&&n)if(t.capabilities?.includes(`provider`))for(let t of s){let s=r.has(t.id)?t.id:V(e,t.id);if(p.includes(t.id)||n.isReservedId(t.id)){a.rejected.push({id:t.id,reason:`oauth id collides with builtin reserved OAuth provider`,pluginId:e}),B.warn({pluginId:e,oauthId:t.id},`plugin oauth id collides with builtin reserved, rejected (R3)`);continue}let c=t.name??i.get(t.id)??t.id,l=t.kind===`pkce`?ha({...t,id:s,name:c,tokenExchangeEncoding:t.tokenExchangeEncoding??`form`,assumesLoopbackAlways:t.assumesLoopbackAlways??!1,subscriptionScoped:t.subscriptionScoped??!1}):ma({...t,id:s,name:c,allowCustomDomain:t.allowCustomDomain??!1});if(o?.has(s))n.replace(l,e);else if(!n.register(l,e)){a.rejected.push({id:t.id,reason:`oauth registration rejected (id already claimed by another plugin or reserved)`,pluginId:e});continue}}else{B.warn({pluginId:e},`plugin declares contributes.oauth but not capabilities:["provider"], skipped (fail-closed)`);for(let t of s)a.rejected.push({id:t.id,reason:`capability "provider" not declared`,pluginId:e})}}function Dd(e,t,n,r,i,a){let o=t.contributes?.providers;if(!o?.length)return;if(!t.capabilities?.includes(`provider`)){B.warn({pluginId:e},`plugin declares contributes.providers but not capabilities:["provider"], skipped (fail-closed)`);for(let t of o)i.rejected.push({id:t.id,reason:`capability "provider" not declared`,pluginId:e});return}let s=new Set;for(let t of o){if(i.registered.includes(t.id)){i.rejected.push({id:t.id,reason:`duplicate provider id in manifest`,pluginId:e}),B.warn({pluginId:e,providerId:t.id},`duplicate provider id in manifest, second entry rejected (review F5)`);continue}if(ue(t.id)){i.rejected.push({id:t.id,reason:`reserved builtin provider id`,pluginId:e}),B.warn({pluginId:e,providerId:t.id},`plugin provider id collides with builtin, rejected (R3)`);continue}let o=t.preserveProviderId===!0,c=o?t.id:V(e,t.id),l=o?t.id:V(e,t.id);if(t.catalogOnly===!0){let a=l;if(t.oauthRef){let n=o?t.oauthRef:V(e,t.oauthRef);if(!r?.get(n)){i.rejected.push({id:t.id,reason:`oauthRef '${t.oauthRef}' not found in current plugin's oauth table (R7)`,pluginId:e}),B.warn({pluginId:e,providerId:t.id,oauthRef:t.oauthRef},`catalog provider oauthRef not found, rejected (R7)`);continue}a=n}if(t.envKey&&!n.authStore.registerEnvKey(l,t.envKey,e)){i.rejected.push({id:t.id,reason:`envKey registration rejected (reserved or claimed)`,pluginId:e});continue}if(!me({id:l,name:t.name,env:t.oauthRef?void 0:t.envKey,requiresIntranet:t.requiresIntranet===!0,probeUrl:t.baseUrl},e)){i.rejected.push({id:t.id,reason:`provider descriptor id already claimed`,pluginId:e}),t.envKey&&n.authStore.unregisterEnvKey(l);continue}if(t.models?.length){let r=t.models.map(e=>Cd(e,a,c,t.baseUrl??``,void 0,t.supportsTools,t.responseBodyPolicy)),i=n.modelRegistry.registerWithSource(r,e);for(let t of i)B.warn({pluginId:e,modelId:t},`plugin model id collides, rejected`)}i.registered.push(t.id);continue}let u=l;if(t.oauthRef){let n=o?t.oauthRef:V(e,t.oauthRef);if(!r?.get(n)){i.rejected.push({id:t.id,reason:`oauthRef '${t.oauthRef}' not found in current plugin's oauth table (R7: cross-plugin/invalid ref rejected)`,pluginId:e}),B.warn({pluginId:e,providerId:t.id,oauthRef:t.oauthRef},`provider oauthRef not found in current plugin oauth table, rejected (R7)`);continue}u=n,t.envKey&&B.warn({pluginId:e,providerId:t.id},`provider declares both oauthRef and envKey; ignoring envKey (R2, oauth takes priority)`)}if(t.envKey&&!t.oauthRef&&!n.authStore.registerEnvKey(l,t.envKey,e)){i.rejected.push({id:t.id,reason:`envKey registration rejected (reserved or claimed by another plugin)`,pluginId:e});continue}let d=t.baseUrl,f=t.wireApi;if(!d||!f){i.rejected.push({id:t.id,reason:`baseUrl and wireApi required for non-catalog providers`,pluginId:e});continue}let p=t.modelsEndpoint?wd(t.modelsEndpoint,l,c,t.baseUrl,t.headers):void 0,m=()=>{t.oauthRef&&r&&!s.has(u)&&r.unregister(u)};if(!me({id:l,name:t.name,env:t.oauthRef?void 0:t.envKey,buildModelsRequest:p,requiresIntranet:t.requiresIntranet===!0,probeUrl:t.baseUrl},e)){i.rejected.push({id:t.id,reason:`provider descriptor id already claimed by another plugin`,pluginId:e}),t.envKey&&!t.oauthRef&&n.authStore.unregisterEnvKey(l),m();continue}t.allowAuthHeaderOverride&&B.warn({pluginId:e,providerId:t.id},`provider declares allowAuthHeaderOverride: custom headers may replace auth headers (RFC-270 D3)`);let h=Td(t,n.authStore,u,n.wireProtocolRegistry,l,d,f,n.getProviderOverrides);if(!(a?.has(c)?n.providerRegistry.replacePluginProvider(c,h,e):n.providerRegistry.registerPluginProvider(c,h,e))){i.rejected.push({id:t.id,reason:`api already registered by another plugin or reserved`,pluginId:e}),ve(l),t.envKey&&!t.oauthRef&&n.authStore.unregisterEnvKey(l),m();continue}if(t.models?.length){let r=t.models.map(e=>Cd(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 Od(e,t,n,r,i){let a={registered:[],rejected:[]},o=n.authStore.oauth;return Ed(e,t,o,vd(t),new Map((t.contributes?.providers??[]).filter(e=>e.oauthRef&&e.name).map(e=>[e.oauthRef,e.name])),a,r),Dd(e,t,n,o,a,i),a}async function kd(e,t,n,r,i){let a=n.authStore.oauth,o=vd(t),s=t.contributes?.oauth;if(s?.length&&a)for(let t of s){let n=o.has(t.id)?t.id:V(e,t.id);r?.has(n)||a.unregister(n)}let c=t.contributes?.providers;if(c?.length){for(let t of c){let r=t.preserveProviderId===!0?t.id:V(e,t.id);ve(r),t.envKey&&!t.oauthRef&&n.authStore.unregisterEnvKey(r)}await n.providerRegistry.unregisterBySource(e,i),n.modelRegistry.unregisterBySource(e)}}var Ad=class{axisName=`oauthProviderFactories`;oauthIdsByPlugin=new Map;constructor(e,t){this.authStore=e,this.logger=t}register(e){let t=e.loaded.module.oauthProviderFactories;if(!t||!this.authStore)return;if(!e.plugin.manifest.capabilities?.includes(`provider`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares oauthProviderFactories but not capabilities:["provider"], skipped (fail-closed)`);return}if(e.verdict.pendingCapabilities.includes(`provider`)){this.logger.warn({pluginId:e.plugin.id},`plugin capability "provider" not yet granted, skipping oauthProviderFactories (fail-closed)`);return}let n=new Set((e.plugin.manifest.contributes?.providers??[]).filter(e=>e.preserveProviderId===!0&&e.oauthRef).map(e=>e.oauthRef));for(let[r,i]of Object.entries(t)){let t=vl(e.plugin.id,i);if(!t)continue;let a=n.has(r)?r:V(e.plugin.id,r);if(t.id!==a){this.logger.warn({pluginId:e.plugin.id,name:r,expectedId:a,actualId:t.id},`plugin oauth provider id mismatch with manifest oauthRef/preserveProviderId, skipped`);continue}if(this.authStore.oauth.register(t,e.plugin.id)){let n=this.oauthIdsByPlugin.get(e.plugin.id)??new Set;n.add(t.id),this.oauthIdsByPlugin.set(e.plugin.id,n)}else this.logger.warn({pluginId:e.plugin.id,oauthId:t.id},`plugin oauthProviderFactory rejected (reserved or claimed)`)}}unregister(e){if(!this.authStore)return;let t=this.oauthIdsByPlugin.get(e);if(t){for(let e of t)this.authStore.oauth.unregister(e);this.oauthIdsByPlugin.delete(e)}}unregisterAll(){for(let e of[...this.oauthIdsByPlugin.keys()])this.unregister(e)}},jd=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=xd(e.plugin.id,i,e.plugin.manifest);if(!this.providerRegistry.registerPluginProvider(t,_l(e.plugin.id,a),Sd(e.plugin.id))){this.logger.warn({pluginId:e.plugin.id,api:t},`plugin providerFactory rejected (reserved builtin or claimed by another plugin)`);continue}this.providerSourcePluginIds.add(e.plugin.id);let o=n[i];if(o)if(me({id:t,buildModelsRequest:wd(o,t,t)},Sd(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=>Cd(e,t,t,s.baseUrl,s.imageConstraints,s.supportsTools,s.responseBodyPolicy)),r=this.modelRegistry.registerWithSource(n,Sd(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(Sd(e)),this.providerSourcePluginIds.delete(e)),this.modelRegistry&&this.modelSourcePluginIds.has(e)&&(this.modelRegistry.unregisterBySource(Sd(e)),this.modelSourcePluginIds.delete(e));let t=this.descriptorIdsByPlugin.get(e);if(t){for(let e of t)ve(e);this.descriptorIdsByPlugin.delete(e)}}async unregisterAll(){let e=new Set([...this.providerSourcePluginIds,...this.modelSourcePluginIds,...this.descriptorIdsByPlugin.keys()]);for(let t of e)await this.unregister(t)}},Md=class{axisName=`wireProtocols`;wireProtocolSourcePluginIds=new Set;cacheReportingApisByPlugin=new Map;constructor(e,t){this.wireProtocolRegistry=e,this.logger=t}register(e){let t=e.loaded.module.wireProtocols;if(!(!t||!this.wireProtocolRegistry)){if(!e.plugin.manifest.capabilities?.includes(`wire-protocol`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares wireProtocols but not capabilities:["wire-protocol"], skipped (fail-closed)`);return}if(e.verdict.pendingCapabilities.includes(`wire-protocol`)){this.logger.warn({pluginId:e.plugin.id},`plugin capability "wire-protocol" declared but not yet granted, skipping wireProtocols (fail-closed, RFC-124 C2 pattern)`);return}for(let[n,r]of Object.entries(t))if(this.wireProtocolRegistry.register(n,r,e.plugin.id)){if(this.wireProtocolSourcePluginIds.add(e.plugin.id),r.meta?.reportsCacheTokens){pe(n);let t=this.cacheReportingApisByPlugin.get(e.plugin.id)??new Set;t.add(n),this.cacheReportingApisByPlugin.set(e.plugin.id,t)}}else this.logger.warn({pluginId:e.plugin.id,wireApi:n},`plugin wireProtocol rejected (already registered by another plugin, first-win)`)}}unregister(e){this.wireProtocolRegistry&&this.wireProtocolSourcePluginIds.has(e)&&(this.wireProtocolRegistry.unregisterBySource(e),this.wireProtocolSourcePluginIds.delete(e));let t=this.cacheReportingApisByPlugin.get(e);if(t){for(let e of t)_e(e);this.cacheReportingApisByPlugin.delete(e)}}unregisterAll(){let e=new Set([...this.wireProtocolSourcePluginIds,...this.cacheReportingApisByPlugin.keys()]);for(let t of e)this.unregister(t)}},Nd=class{axisName=`tools`;toolSourcePluginIds=new Set;constructor(e,t){this.toolRegistry=e,this.logger=t}register(e){let t=e.loaded.module.tools;if(!t?.length||!this.toolRegistry)return;if(!e.plugin.manifest.capabilities?.includes(`tools`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares tools but not capabilities:["tools"], skipped (fail-closed)`);return}if(e.verdict.pendingCapabilities.includes(`tools`)){this.logger.warn({pluginId:e.plugin.id},`plugin capability "tools" declared but not yet granted, skipping tools (fail-closed, RFC-124 C2)`);return}let n=this.toolRegistry,r={workspaceDir:e.workspaceDir,logger:{info:t=>this.logger.info({pluginId:e.plugin.id},t),warn:t=>this.logger.warn({pluginId:e.plugin.id},t),error:t=>this.logger.error({pluginId:e.plugin.id},t)},host:e.host,storage:e.storage},i=t.map(t=>bl(e.plugin.id,t,r)).filter(e=>e!==null).filter(t=>n.has(t.name)?(this.logger.warn({pluginId:e.plugin.id,tool:t.name},`plugin tool name collides with an existing tool, rejected (R3, no silent override)`),!1):!0);for(let r of i){let i=t.find(e=>e.name===r.name);n.register(r,{preset:i?.preset??`full`,...i?.category&&{category:i.category},...i?.guideline&&{guideline:i.guideline},source:e.plugin.id})}i.length>0&&this.toolSourcePluginIds.add(e.plugin.id)}unregister(e){!this.toolRegistry||!this.toolSourcePluginIds.has(e)||(this.toolRegistry.unregisterBySource(e),this.toolSourcePluginIds.delete(e))}unregisterAll(){for(let e of[...this.toolSourcePluginIds])this.unregister(e)}};const Pd=`[plugin]`;function Fd(e,t,n){let r=n.name?.trim()||n.key;return`${Pd} ${e}:${t}:${n.key} — ${r}`}function Id(e,t,n){let r=e.subscriber;return!r||r.kind!==`plugin-service`||r.pluginId!==t||r.serviceId!==n?!1:e.name.startsWith(Pd)}function Ld(e,t,n){let r=`${Pd} ${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 Rd(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(!Id(e,r,i))continue;let t=Ld(e,r,i);t!==void 0&&s.set(t,e)}for(let[e,c]of o){let o=Fd(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 zd(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(Pd)&&t.remove(e.id)&&(r+=1)}return r}var Bd=class{axisName=`services`;startedByPlugin=new Map;scheduleDeclarations=new Map;constructor(e){this.deps=e}async register(e){let t=e.loaded.module.services;if(!t?.length)return;if(!e.plugin.manifest.capabilities?.includes(`service`)){this.deps.logger.warn({pluginId:e.plugin.id},`plugin declares services but not capabilities:["service"], skipped (fail-closed, RFC-287 D-M3-1)`);return}if(e.verdict.pendingCapabilities.includes(`service`)){this.deps.logger.warn({pluginId:e.plugin.id},`plugin capability "service" declared but not yet granted, skipping services (fail-closed)`);return}let n=e.loaded.compiledPath;if(!n){this.deps.logger.warn({pluginId:e.plugin.id},`plugin declares services but has no compiled entry path; services need a compiled module to run in the service worker (skipped)`);return}let r=this.startedByPlugin.get(e.plugin.id)??[];for(let i of t){if(!i?.id)continue;let t=this.deps.getWorkspaceKey(),a=this.deps.hasStorageCapability(e.plugin.id),{error:o}=await this.deps.pool.start({pluginId:e.plugin.id,serviceId:i.id,compiledPath:n,workspaceDir:this.deps.workspaceDir,workspaceKey:t,factoryCtx:{pluginId:e.plugin.id,pluginDir:e.plugin.dir,workspaceDir:this.deps.workspaceDir,emitEvent:e.plugin.manifest.capabilities?.includes(`events`)===!0,subscribeEvent:e.plugin.manifest.capabilities?.includes(`events`)===!0},hostCapabilities:this.deps.hostCapabilitiesFor(e.plugin.id),storageDir:a?this.deps.storageDirFor(e.plugin.id,t):``,hasStorageCapability:a,bridge:this.deps.bridgeFor(e.plugin.id)});o&&this.deps.logger.warn({pluginId:e.plugin.id,serviceId:i.id,err:o},`plugin service failed to start`),r.push(i.id),this.scheduleDeclarations.set(`${e.plugin.id}:${i.id}`,i.schedules??[]);let s=this.deps.getSchedulePort?.();if(i.schedules?.length){if(!s)this.deps.logger.debug({pluginId:e.plugin.id,serviceId:i.id,count:i.schedules.length},`plugin declares schedule subscriptions but no scheduler in this process, skipped (RFC-327 D2 boundary)`);else if(!o){let t=Rd({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&&Rd({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=zd({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=Rd({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)`)}}},Vd=class{axisName=`cliCommands`;commandsByPlugin=new Map;constructor(e){this.logger=e}register(e){let t=e.plugin.manifest.contributes?.cliCommands;if(!t?.length)return;if(!e.plugin.manifest.capabilities?.includes(`cli.command`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares contributes.cliCommands but not capabilities:["cli.command"], skipped (fail-closed)`);return}if(e.verdict.pendingCapabilities.includes(`cli.command`)){this.logger.warn({pluginId:e.plugin.id},`plugin capability "cli.command" declared but not yet granted, skipping cliCommands (fail-closed, RFC-124 C2)`);return}let n=e.loaded.module.cliCommands,r=[];for(let i of t){let t=n?.[i.name];if(typeof t!=`function`){this.logger.warn({pluginId:e.plugin.id,command:i.name},`contributes.cliCommands declares a command with no matching handler in PluginModule.cliCommands, skipped`);continue}r.push({pluginId:e.plugin.id,name:i.name,summary:i.summary,handler:t})}r.length>0&&this.commandsByPlugin.set(e.plugin.id,r)}unregister(e){this.commandsByPlugin.delete(e)}unregisterAll(){this.commandsByPlugin.clear()}getCliCommands(){return[...this.commandsByPlugin.values()].flat()}},Hd=class{axisName=`slashCommands`;commandsByPlugin=new Map;constructor(e){this.logger=e}register(e){let t=e.plugin.manifest.contributes?.slashCommands;if(!t?.length)return;if(!e.plugin.manifest.capabilities?.includes(`tui.command`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares contributes.slashCommands but not capabilities:["tui.command"], skipped (fail-closed)`);return}if(e.verdict.pendingCapabilities.includes(`tui.command`)){this.logger.warn({pluginId:e.plugin.id},`plugin capability "tui.command" declared but not yet granted, skipping slashCommands (fail-closed, RFC-440)`);return}let n=e.loaded.module.slashCommands,r=[];for(let i of t){let t=n?.[i.name];if(typeof t!=`function`){this.logger.warn({pluginId:e.plugin.id,command:i.name},`contributes.slashCommands declares a command with no matching handler in PluginModule.slashCommands, skipped`);continue}r.push({pluginId:e.plugin.id,name:i.name,description:i.description,...i.group?{group:i.group}:{},handler:t})}r.length>0&&this.commandsByPlugin.set(e.plugin.id,r)}unregister(e){this.commandsByPlugin.delete(e)}unregisterAll(){this.commandsByPlugin.clear()}getSlashCommands(){return[...this.commandsByPlugin.values()].flat()}},Ud=class{axisName=`events`;registeredPlugins=new Set;constructor(e,t){this.eventDispatcher=e,this.logger=t}register(e){if(!this.eventDispatcher)return;let t=e.plugin.manifest.contributes?.events;if(!(!t||t.length===0)){if(!e.plugin.manifest.capabilities?.includes(`events`)){this.logger.warn({pluginId:e.plugin.id},`plugin declares contributes.events but not capabilities:["events"], skipped (fail-closed)`);return}this.eventDispatcher.registerPluginEvents(e.plugin.id,t),this.registeredPlugins.add(e.plugin.id)}}unregister(e){this.eventDispatcher&&this.registeredPlugins.has(e)&&(this.eventDispatcher.unregisterPluginEvents(e),this.eventDispatcher.unregisterPluginSubscriptions(e),this.registeredPlugins.delete(e))}unregisterAll(){if(this.eventDispatcher){for(let e of this.registeredPlugins)this.eventDispatcher.unregisterPluginEvents(e),this.eventDispatcher.unregisterPluginSubscriptions(e);this.registeredPlugins.clear()}}};const Wd=T(`@x-otto/plugin:config-store`),Gd=/^[a-z0-9]+(?:-[a-z0-9]+)*$/;function Kd(){return C(process.env.OTTO_HOME||r,`plugin-state`)}function qd(e,t){if(!Gd.test(e))throw Error(`invalid pluginId for config store: ${e} (must be kebab-case)`);if(typeof t!=`string`||t.length===0||t.includes(`/`)||t.includes(`\\`)||t.includes(`..`))throw Error(`invalid workspaceKey for config store: ${t}`);if(c())return{dir:`:memory:/plugin-state/${e}/${t}`,isMemory:!0};let n=w(C(Kd(),e,t));y(n,{recursive:!0});let r=Qe(n),i=Qe(Kd());if(r!==i&&!r.startsWith(i+`/`))throw Error(`config store path escapes plugin-state root: ${r}`);return{dir:r,isMemory:!1}}function Jd(e,t){let n=`${e}.${Li()}.tmp`,r;try{r=Ye(n,`w`),x(r,t),Ke(r),We(r),r=void 0,$e(n,e)}finally{if(r!==void 0)try{We(r)}catch{}}}var Yd=class{dir;isMemory;configPath;memoryStore={};pluginId;workspaceKey;constructor(e,t){this.pluginId=e,this.workspaceKey=t;let{dir:n,isMemory:r}=qd(e,t);this.dir=n,this.isMemory=r,this.configPath=C(n,`config.json`)}get(){if(this.isMemory)return{...this.memoryStore};if(!v(this.configPath))return{};try{let e=b(this.configPath,`utf-8`),t=JSON.parse(e);return t&&typeof t==`object`&&!Array.isArray(t)?t:{}}catch(e){return Wd.warn({pluginId:this.pluginId,err:String(e)},`failed to read plugin config, using empty`),{}}}set(e){let t=JSON.stringify(e,null,2);if(this.isMemory){this.memoryStore={...e};return}v(this.dir)||y(this.dir,{recursive:!0}),Jd(this.configPath,t)}update(e){let t=this.get();this.set({...t,...e})}clear(){if(this.isMemory){this.memoryStore={};return}try{v(this.configPath)&&x(this.configPath,`{}`)}catch{}}};const Xd=/^[a-z0-9]+(?:-[a-z0-9]+)*$/,Zd=C(r,`plugin-state`);function Qd(e){let t=$d(e);try{return et(t,{recursive:!0,force:!0}),{removed:!v(t),dir:t}}catch{return{removed:!1,dir:t}}}function $d(e){if(!Xd.test(e))throw Error(`invalid pluginId for scoped storage: ${e} (must be kebab-case)`);return C(Zd,e)}var ef=class{persistence;baseDir;pluginId;workspaceKey;constructor(e,t){if(this.pluginId=e,this.workspaceKey=t,!Xd.test(e))throw Error(`invalid pluginId for scoped storage: ${e} (must be kebab-case)`);if(typeof t!=`string`||t.length===0||t.includes(`/`)||t.includes(`\\`)||t.includes(`..`))throw Error(`invalid workspaceKey for scoped storage: ${t}`);if(c()){this.baseDir=`:memory:/plugin-state/${e}/${t}`,this.persistence=Rn({type:`memory`});return}let n=w(C($d(e),t));y(n,{recursive:!0});let r=Qe(n),i=Qe(Zd);if(r!==i&&!r.startsWith(i+`/`))throw Error(`scoped storage path escapes plugin-state root: ${r}`);this.baseDir=n,this.persistence=Rn({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 tf(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 nf(e,t,n){let r=e.manifest.capabilities??[],i={},a=!1,o=n.getScheduleService;if(r.includes(`schedule`)&&!t.pendingCapabilities.includes(`schedule`)&&o){let e=fa(o);i.scheduleCreate=async t=>e.create(t),i.scheduleList=async()=>e.list(),i.scheduleDelete=async t=>e.delete(t),i.scheduleRun=async t=>{e.run(t)},i.scheduleCancel=async t=>e.cancel(t),a=!0}let s=n.startPluginJob;r.includes(`agent.dispatch`)&&!t.pendingCapabilities.includes(`agent.dispatch`)&&s?(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:s({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 c=n.getSessionMessages,l=af(n);r.includes(`session.read`)&&!t.pendingCapabilities.includes(`session.read`)&&c?(i.readTranscript=async t=>{if(!l.isSessionAuthorized(e.id,t.sessionId))throw Error(`session not authorized for this plugin`);let n=c(t.sessionId);if(!n)throw Error(`session not found`);if(!l.tryConsumeRead(e.id))throw Error(`readTranscript quota exceeded for this notification`);return Cu(n,t.sinceIndex??0,500)},a=!0):r.includes(`session.read`)&&n.logger.warn({pluginId:e.id,pending:t.pendingCapabilities.includes(`session.read`)},`plugin declares session.read but it is not available (not yet granted, or host provides no transcript source) — skipping (fail-closed, RFC-318 D2)`);let u=n.completeText;r.includes(`llm.complete`)&&!t.pendingCapabilities.includes(`llm.complete`)&&u?(i.complete=async t=>{if(t.prompt.length>32e3)throw Error(`prompt exceeds 32000 chars limit`);let n=l.tryConsumeLlm(e.id);if(!n.ok)throw Error(`llm.complete quota exceeded (${n.reason})`);let r=Math.min(t.maxTokens??2048,2048);return u(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 d=n.askUser;r.includes(`user.ask`)&&!t.pendingCapabilities.includes(`user.ask`)&&d?(i.ask=async t=>d(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 f=n.notifyUser;r.includes(`user.notify`)&&!t.pendingCapabilities.includes(`user.notify`)&&f?(i.notify=async t=>{if(!l.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);f({pluginId:e.id,level:t.level,code:t.code.slice(0,120),message:r})},a=!0):r.includes(`user.notify`)&&n.logger.warn({pluginId:e.id,pending:t.pendingCapabilities.includes(`user.notify`)},`plugin declares user.notify but it is not available (not yet granted, or host provides no UI sink) — skipping (fail-closed, RFC-327 D3)`);let p=n.getSettingValue;return r.includes(`settings.read`)&&!t.pendingCapabilities.includes(`settings.read`)&&p?(i.getSettings=e=>p(e),a=!0):r.includes(`settings.read`)&&n.logger.warn({pluginId:e.id,pending:t.pendingCapabilities.includes(`settings.read`)},`plugin declares settings.read but it is not available (not yet granted, or host provides no settings source) — skipping (fail-closed, RFC-430 M1)`),a?i:void 0}const rf=new WeakMap;function af(e){if(e.capabilityQuota)return e.capabilityQuota;let t=rf.get(e);return t||(t=new Dl,rf.set(e,t)),t}const of=new Map([[`oauthProviderFactories`,`provider`],[`providerFactories`,`provider`],[`wireProtocols`,`wire-protocol`]]);function sf(e){let t=e.manifest.contributes;return!t||typeof t!=`object`?[]:Object.keys(t)}var cf=class e{contributesSnapshot=new Map;static DEACTIVATE_TIMEOUT_MS=5e3;hooksAxis;monitorsAxis;feedbackAxis;sigilAxis;computedCommandsAxis;computedAgentsAxis;computedSkillsAxis;oauthProviderAxis;codeProviderAxis;wireProtocolAxis;toolsAxis;servicesAxis;cliCommandsAxis;slashCommandsAxis;eventsAxis;axisHandlers;firedEvents=new Set;deferredIds=new Set;dirtyPluginIds=new Set;loadedModules=new Map;constructor(e){this.deps=e,this.hooksAxis=new $u(e.hookRegistry),this.monitorsAxis=new ed(e.hookRegistry,e.logger),this.feedbackAxis=new td(e.feedbackRegistry,e.logger),this.sigilAxis=new ld(e.sigilResolverRegistry,e.pluginInput,e.logger),this.computedCommandsAxis=new ud,this.computedAgentsAxis=new dd,this.computedSkillsAxis=new fd(e.skillRegistry),this.oauthProviderAxis=new Ad(e.authStore,e.logger),this.codeProviderAxis=new jd(e.providerRegistry,e.modelRegistry,e.logger),this.wireProtocolAxis=new Md(e.wireProtocolRegistry,e.logger),this.toolsAxis=new Nd(e.toolRegistry,e.logger),this.servicesAxis=new Bd({pool:e.servicePool??_u(),logger:e.logger,workspaceDir:e.workspaceDir,getWorkspaceKey:()=>e.getWorkspaceKey?.()??k,bridgeFor:t=>{let n=e.activePlugins().find(e=>e.id===t);if(!n)return{};let r=nf(n,O(n),e);if(!r)return{};let i={};return r.startJob&&(i.startJob=r.startJob),r.readTranscript&&(i.readTranscript=r.readTranscript),r.complete&&(i.complete=r.complete),r.notify&&(i.notify=r.notify),i},hostCapabilitiesFor:t=>{let n=e.activePlugins().find(e=>e.id===t);if(!n)return[];let r=nf(n,O(n),e);if(!r)return[];let i=[];return r.startJob&&i.push(`startJob`),r.readTranscript&&i.push(`readTranscript`),r.complete&&i.push(`complete`),r.notify&&i.push(`notify`),i},storageDirFor:(e,t)=>new ef(e,t).baseDir,hasStorageCapability:t=>!!e.activePlugins().find(e=>e.id===t)?.manifest.capabilities?.includes(`storage`),...e.getSchedulePort?{getSchedulePort:e.getSchedulePort}:{}}),this.cliCommandsAxis=new Vd(e.logger),this.slashCommandsAxis=new Hd(e.logger),this.eventsAxis=new Ud(e.eventDispatcher,e.logger),(e.servicePool??_u()).setEventDispatcher(e.eventDispatcher),this.axisHandlers=[this.hooksAxis,this.monitorsAxis,this.feedbackAxis,this.sigilAxis,this.computedCommandsAxis,this.computedAgentsAxis,this.computedSkillsAxis,this.oauthProviderAxis,this.codeProviderAxis,this.wireProtocolAxis,this.toolsAxis,this.servicesAxis,this.cliCommandsAxis,this.slashCommandsAxis,this.eventsAxis]}get deferredPluginIds(){return this.deferredIds}emitMonitorEvent(e){return this.monitorsAxis.dispatch(e)}reconcileServiceSchedules(){this.servicesAxis.reconcileAllSchedules()}get monitorPluginIds(){return this.monitorsAxis.monitorPluginIds}async activateOn(e,t){return this.firedEvents.add(e),this.reload(t)}get commands(){return this.computedCommandsAxis.getComputedCommands()}get cliCommands(){return this.cliCommandsAxis.getCliCommands()}get slashCommands(){return this.slashCommandsAxis.getSlashCommands()}async callOnDeactivate(t,n){let r;try{await Promise.race([n(),new Promise((n,i)=>{r=setTimeout(()=>{i(Error(`plugin "${t}" onDeactivate timed out after ${e.DEACTIVATE_TIMEOUT_MS}ms`))},e.DEACTIVATE_TIMEOUT_MS),r.unref?.()})])}catch(e){this.deps.logger.warn({pluginId:t,err:String(e)},`plugin onDeactivate failed or timed out`)}finally{r!==void 0&&clearTimeout(r)}}async unregisterAllAxes(){for(let e of this.axisHandlers)await e.unregisterAll()}registerPluginPlaneEntries(e,t){let n=this.deps.planeRegistry;if(!n)return;let r=e.manifest.version;for(let t of n.revalidatePlugin(e.id,r))this.deps.logger.warn({pluginId:e.id,version:r,registeredVersion:t.registeredVersion,entryId:t.entry.id},`plugin plane entry stale after version change; whitelist re-evaluation required (R6')`);let i=Br(e.manifest),a=this.deps.getWorkspaceKey?.()??k,o={id:`plugin:${e.id}`,kind:`plugin`,value:{plane:i,capabilities:e.manifest.capabilities??[]},pluginId:e.id,pluginVersion:r};if(i===`host`){let e={...o,plane:`host`,scope:`process`};n.register(e)}else{let e={...o,plane:`preset`,scope:`workspace`};n.workspace(a).preset.register(e)}let s=t.module.hooks?.waterfall;if(s)for(let t of Object.keys(s))n.workspace(a).preset.register({id:`waterfall:${t}`,kind:`waterfall`,value:{timing:t},pluginId:e.id,pluginVersion:r,plane:`preset`,scope:`workspace`})}async unregisterPluginAxes(e,t,n){let r=[],i=t?O(t):void 0;for(let n of this.axisHandlers){let a=of.get(n.axisName);if(!(a!==void 0&&t!==void 0&&i!==void 0&&t.manifest.capabilities?.some(e=>e===a)&&!i.gated&&!i.pendingCapabilities.includes(a)))try{await n.unregister(e)}catch(t){r.push(n.axisName),this.deps.logger.warn({pluginId:e,axis:n.axisName,err:t instanceof Error?t.message:String(t)},`plugin axis unregister failed (continuing with remaining axes; plugin marked dirty for full reload next round)`)}}this.deps.planeRegistry?.unregisterByPluginEverywhere(e),af(this.deps).reset(e),r.length>0&&(this.dirtyPluginIds.add(e),n?.add(e),this.deps.logger.warn({pluginId:e,failedAxes:r},`plugin marked dirty due to axis unregister failures; next reload will force a full reinstall of this plugin`))}pluginSignature(e){let t=O(e),n=`${t.gated?`gated`:`ok`}:${[...t.pendingCapabilities].sort().join(`,`)}`,r=`nofile`;for(let t of[`plugin.ts`,`plugin.tsx`])try{let n=tt(C(e.dir,t));r=`${t}:${n.mtimeMs}:${n.size}`;break}catch{}return`${JSON.stringify(e.manifest)}|${n}|${r}`}async notifyConfigChange(e,t){let n=this.loadedModules.get(e);if(!n)return;let r=n.module.module.hooks?.onConfigChange;if(r)try{await r(t)}catch(t){this.deps.logger.warn({pluginId:e,err:String(t)},`plugin onConfigChange failed, swallowed (R5)`)}}async updatePluginConfig(e,t){new Yd(e,this.deps.getWorkspaceKey?.()??k).set(t),await this.notifyConfigChange(e,t)}getPluginConfig(e,t){return jr(t,new Yd(e,this.deps.getWorkspaceKey?.()??k).get())}async reload(e){let t=this.deps.activePlugins(),n=new Map(t.map(e=>[e.id,e])),r=new Map(t.map(e=>[e.id,this.pluginSignature(e)])),i=[],a=new Set,o=new Set;for(let[e,t]of this.loadedModules)n.get(e)?(r.get(e)!==t.signature||this.dirtyPluginIds.has(e))&&(t.module.module.onDeactivate&&i.push({pluginId:e,onDeactivate:t.module.module.onDeactivate}),o.add(e)):(t.module.module.onDeactivate&&i.push({pluginId:e,onDeactivate:t.module.module.onDeactivate}),a.add(e));for(let{pluginId:e,onDeactivate:t}of i)await this.callOnDeactivate(e,t);let s=new Set;for(let e of a)await this.unregisterPluginAxes(e,void 0,s),this.loadedModules.delete(e);for(let e of o)await this.unregisterPluginAxes(e,n.get(e),s);this.computedAgentsAxis.setExistingAgentNames(e);let c=new Set;for(let e of this.deps.activePlugins()){if(!Qu(zr(e.manifest),this.firedEvents)){c.add(e.id);continue}if(this.loadedModules.get(e.id)&&!o.has(e.id))continue;let t={pluginId:e.id,pluginDir:e.dir,workspaceDir:this.deps.workspaceDir,callMcpTool:(e,t,n)=>this.deps.callMcpTool(e,t,n),logger:{debug:t=>{this.deps.logger.debug({pluginId:e.id},t)},info:t=>{this.deps.logger.info({pluginId:e.id},t),el(e.id,`info`,t)},warn:t=>{this.deps.logger.warn({pluginId:e.id},t),el(e.id,`warn`,t)},error:t=>{this.deps.logger.error({pluginId:e.id},t),el(e.id,`error`,t)}},getWireProtocol:e=>this.deps.wireProtocolRegistry?.get(e),resolveProviderCredential:(()=>{let t=tf(e);return e=>t(e)?this.deps.providerRegistry?.resolveAccessKey(e)??Promise.resolve(null):Promise.resolve(null)})(),resolveProviderAuth:(()=>{let t=tf(e);return e=>t(e)?this.deps.providerRegistry?.resolveAuth(e)??Promise.resolve(null):Promise.resolve(null)})(),host:nf(e,O(e),this.deps),listActivePlugins:()=>this.deps.activePlugins().map(e=>({id:e.id,version:e.manifest.version,capabilities:e.manifest.capabilities??[],contributes:this.contributesSnapshot.get(e.id)??sf(e)})),...e.manifest.contributes?.config?{config:jr(e.manifest.contributes.config,new Yd(e.id,this.deps.getWorkspaceKey?.()??k).get())}:{},...this.deps.eventDispatcher&&(e.manifest.capabilities??[]).includes(`events`)?{emitEvent:(t,n)=>{this.deps.eventDispatcher.emit(e.id,t,{...n})},subscribeEvent:((t,n,r)=>this.deps.eventDispatcher.subscribe(e.id,t,n,r))}:{}},n=this.deps.useIsolatedLoading!==!1&&Gu(e)?await qu(e,t,void 0,this.deps.onPluginLoadError):await cu(e,t,this.deps.onPluginLoadError);if(!n)continue;let i=O(e);if(i.gated){this.deps.logger.warn({pluginId:e.id},`project plugin not trusted, skipping code axes (fail-closed, RFC-124 C1)`),this.deps.onPluginLoadError?.(e.id,`project plugin not trusted, skipping code axes (fail-closed, RFC-124 C1)`,`not-trusted`);continue}let a;if(e.manifest.capabilities?.includes(`storage`))try{let t=this.deps.getWorkspaceKey?.()??k;a=new ef(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:nf(e,i,this.deps),workspaceDir:this.deps.workspaceDir,storage:a};for(let e of this.axisHandlers)await e.register(l);if(this.registerPluginPlaneEntries(e,n),n.module.onActivate)try{await n.module.onActivate()}catch(t){this.deps.logger.warn({pluginId:e.id,err:String(t)},`plugin onActivate threw`)}this.contributesSnapshot.set(e.id,sf(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=af(this.deps);for(let t of this.deps.activePlugins())e.reset(t.id);this.firedEvents.clear()}};const lf=T(`@x-otto/coding:panel-compiler`);function uf(e){let t=C(e,`panels`);if(!v(t))return{compiled:[],errors:[],skipped:!0};let n;try{n=Xe(t).filter(e=>e.endsWith(`.tsx`))}catch{return{compiled:[],errors:[],skipped:!0}}if(n.length===0)return{compiled:[],errors:[],skipped:!0};let r=C(e,`panels-dist`);y(r,{recursive:!0});let i=Je(C(ot(),`otto-panel-shims-`)),a=C(i,`react-shim.js`),o=C(i,`ink-shim.js`),s=C(i,`tui-shim.js`);x(a,`const R = globalThis.React
444
444
  if (!R) throw new Error('otto panel: globalThis.React 未注入(TUI 须在加载面板前 import panel-globals)')
445
445
  export default R
446
446
  export const useState = R.useState, useEffect = R.useEffect, useCallback = R.useCallback,
@@ -465,34 +465,35 @@ export const ScrollIndicatorBelow = T.ScrollIndicatorBelow
465
465
  export const Tabable = T.Tabable
466
466
  export const useTabable = T.useTabable
467
467
  export const TabScope = T.TabScope
468
- `);let c=[],l=[],{buildSync:u}=Fl();Il();for(let i of n){let n=i.replace(/\.tsx$/,`.mjs`);try{u({entryPoints:[C(t,i)],outfile:C(r,n),bundle:!0,format:`esm`,platform:`node`,alias:{react:a,ink:o,"@x-otto/tui":s},jsx:`transform`,banner:{js:`const { usePluginData } = globalThis.__ottoPanelRuntime || {};const { claim: claimPanelFocus, release: releasePanelFocus, usePanelFocusClaimed, requestClose: requestPanelClose, setHint: setPanelHint } = globalThis.__ottoPanelFocusBridge || { claim(){}, release(){}, usePanelFocusClaimed: () => true, requestClose(){}, setHint(){} };const { getTheme, getFigures } = globalThis.__ottoPanelTheme || { getTheme: () => ({ text: undefined, inactive: '#9498B8', secondary: '#C8CBDB', success: '#7EE095', error: '#FF9592', warning: '#FFC966', special: '#DD78C9', selection: '#4D7CFF', focusBorder: '#4D7CFF', panelBorder: '#9498B8' }), getFigures: () => ({ check: '✓', cross: '✗', pointer: '▶', bullet: '●' }) };const { SPACING, LAYOUT } = globalThis.__ottoPanelSpacing || { SPACING: { none: 0, tight: 1, section: 2, loose: 4 }, LAYOUT: { contentInset: 4, borderInset: 2 } };const { t: t, i18next: panelI18next } = globalThis.__ottoPanelI18n || { t: (k) => k, i18next: { language: 'en' } };const { usePanelBackend } = globalThis.__ottoPanelBackendRuntime || { usePanelBackend: () => ({ call: () => Promise.reject(new Error('otto panel: backend runtime not installed')), cancel(){}, state: undefined, status: 'disabled' }) };`},logLevel:`silent`}),c.push(C(`panels-dist`,n))}catch(t){l.push({entry:i,message:t.message}),rf.warn({pluginDir:e,entry:i,err:String(t)},`panel compile failed`)}}return rf.info({pluginDir:e,compiled:c.length,errors:l.length},`compiled plugin panels`),{compiled:c,errors:l,skipped:!1}}const of=T(`@x-otto/coding:plugin-install`);function sf(e){let t=[];return(async()=>{try{let t=await $l(e);t&&of.info({pluginDir:e,outfile:t},`plugin code module compiled at install time`)}catch(n){let r=n instanceof Error?n.message:String(n);of.warn({pluginDir:e,err:r},`plugin.ts compile failed at install time (fail-soft, will retry at load time)`),t.push(`plugin.ts 编译失败:${r}(不影响安装,otto 启动时会自动重试编译)`)}try{let{errors:n,skipped:r}=af(e);if(!r&&n.length>0)for(let r of n)of.warn({pluginDir:e,entry:r.entry,err:r.message},`plugin panel compile failed at install time`),t.push(`面板 ${r.entry} 编译失败:${r.message}`)}catch(n){let r=n instanceof Error?n.message:String(n);of.warn({pluginDir:e,err:r},`plugin panel compilation crashed unexpectedly at install time`),t.push(`面板编译异常:${r}`)}})().then(()=>t)}function cf(e){try{return qe(e).isSymbolicLink()}catch{return!1}}function lf(e){let t=b(e,`utf8`),n=[],r=!1;for(let e of t.split(`
469
- `)){let t=e.trim();if(t.startsWith(`packages:`)){r=!0;continue}if(r){let e=t.match(/^-\s*['"]?([^'"]+)['"]?(?:\s+#.*)?$/);if(e?.[1]){n.push(e[1]);continue}t.length>0&&!t.startsWith(`-`)&&(r=!1)}}return n}function uf(e,t){let n=w(e,t.endsWith(`/*`)?t.slice(0,-2):t);if(!n.startsWith(e.endsWith(`/`)?e:e+`/`)&&n!==e)return[];if(!t.endsWith(`/*`))return v(n)?[n]:[];if(!v(n))return[];try{return Xe(n,{withFileTypes:!0}).filter(e=>e.isDirectory()).map(e=>C(n,e.name))}catch{return[]}}function df(e,t){let n=o(t);if(!n)return;let r=lf(C(n,`pnpm-workspace.yaml`));for(let t of r)for(let r of uf(n,t)){let t=C(r,`package.json`);if(!v(t))continue;try{if(JSON.parse(b(t,`utf8`)).name===e)return r}catch{}let n=C(r,D);if(v(n))try{if(Mr(b(n,`utf8`),n)?.id===e)return r}catch{}}}function ff(t,n=process.cwd()){let r=[aa(C(n,`__resolve__.js`)).href,import.meta.url];for(let n of r)try{return S(e(n).resolve(`${t}/package.json`))}catch{}return df(t,S(ia(import.meta.url)))??df(t,n)}async function pf(e){let t=ff(e.pkg,e.cwd);if(!t)throw Error(`无法解析包 ${e.pkg}(未安装或不可从当前位置解析)。`);let n=C(t,D);if(!v(n))throw Error(`${e.pkg} 不是 otto 插件:缺 ${D}(RFC-044 自描述)。`);let i=Mr(b(n,`utf8`),n);if(!i)throw Error(`${e.pkg} 的 ${D} 非法(需合法 kebab-case id)。`);let a=e.ottoDir??r,o=C(a,`plugins`,i.id);y(C(a,`plugins`),{recursive:!0});let s=w(t);if(cf(o)){try{if(w(Ze(o))===s){let e=await sf(t);return{id:i.id,packageDir:t,dir:o,created:!1,compileWarnings:e,version:i.version}}}catch{}rt(o)}else if(v(o))if((v(C(o,D))?Mr(b(C(o,D),`utf8`),o):null)?.id===i.id)et(o,{recursive:!0,force:!0});else throw Error(`目标已存在且非本插件,拒绝覆盖:${o}`);nt(s,o);let c=await sf(t);return{id:i.id,packageDir:t,dir:o,created:!0,compileWarnings:c,version:i.version}}async function mf(e){let t=C(e,D);if(!v(t))throw Error(`${e} 不是 otto 插件:缺 ${D}`);let n=Mr(b(t,`utf8`),t);if(!n)throw Error(`${e} 的 ${D} 非法。`);let i=C(r,`plugins`,n.id);y(C(r,`plugins`),{recursive:!0});let a=w(e);if(cf(i)){try{if(w(Ze(i))===a){let t=await sf(e);return{id:n.id,packageDir:e,dir:i,created:!1,compileWarnings:t,version:n.version}}}catch{}rt(i)}else if(v(i))if((v(C(i,D))?Mr(b(C(i,D),`utf8`),i):null)?.id===n.id)et(i,{recursive:!0,force:!0});else throw Error(`目标已存在且非本插件,拒绝覆盖:${i}`);nt(a,i);let o=await sf(e);return{id:n.id,packageDir:e,dir:i,created:!0,compileWarnings:o,version:n.version}}function hf(e,t){return[...e.filter(e=>e.id!==t.id),t]}function gf(e,t){return e.filter(e=>e.id!==t)}async function _f(e,t,n=()=>Date.now()){let r=hf(e.get(`installed_plugins`)??[],{id:t.id,source:t.source,sourceSpec:t.sourceSpec,installedAt:n(),version:t.version,scope:t.scope,capabilities:t.capabilities});await e.persist({installed_plugins:r},`global`)}async function vf(e,t){let n={},r=!1,i=e.get(`installed_plugins`)??[];i.some(e=>e.id===t)&&(n.installed_plugins=gf(i,t),r=!0);let a=e.get(`disabled_plugins`)??[];a.includes(t)&&(n.disabled_plugins=a.filter(e=>e!==t),r=!0);let o=e.get(`plugin_lifecycle`)?.setupDone??[];if(o.some(e=>e.id===t)&&(n.plugin_lifecycle={setupDone:o.filter(e=>e.id!==t)},r=!0),r)if(`installed_plugins`in n){await e.persist({installed_plugins:n.installed_plugins},`global`);let{installed_plugins:t,...r}=n;Object.keys(r).length>0&&await e.persist(r)}else await e.persist(n)}function yf(e,t){let n=[],r=new Set(e.filter(e=>e.scope===`user`).map(e=>e.id)),i=t.filter(e=>e.scope===`global`),a=new Set(i.map(e=>e.id));for(let e of i)r.has(e.id)||n.push({kind:`missing-on-disk`,id:e.id,message:`${e.id}: 清单记录已安装,但磁盘 symlink 缺失,建议重装(otto extension install ${e.id})`});for(let t of e)t.scope===`user`&&!a.has(t.id)&&n.push({kind:`missing-in-registry`,id:t.id,message:`${t.id}: 磁盘已安装,但清单未记录(可能是旧版本 otto 安装的),建议重新安装以补登记`});return n}async function bf(e,t,n,r){try{let i=await pf({pkg:r});t&&await _f(t,{id:i.id,source:`npm`,sourceSpec:r,version:i.version,scope:`global`}),e.info({pluginId:n,missingId:r},`missing plugin dependency auto-installed (RFC-163 D5), will be picked up on next discovery`)}catch(t){e.warn({pluginId:n,missingId:r,err:t instanceof Error?t.message:String(t)},`automatic install of missing plugin dependency failed, manual "otto extension install" may be required (RFC-163 D5)`)}}var xf=class{lastTopoSort;lastEngineIncompatible=new Map;warnedTopoIssues=new Set;warnedEngineIncompatible=new Set;resolve(e){let{compatible:t,incompatible:n}=xr(gr({cwd:e.workspaceDir,homedir:e.homedir??at(),disabled:e.disabledPlugins,bundledDirs:e.bundledDirs}));this.lastEngineIncompatible=n;let r=Vr(t);return this.lastTopoSort=r,r.ordered}async diagnose(e,t,n){for(let[t,r]of this.lastEngineIncompatible)this.warnedEngineIncompatible.has(t)||(e.warn({pluginId:t,requiredRange:r,hostApiVersion:rr},`plugin engines.otto not satisfied by host, skipping plugin (fail-closed, RFC-148 M0)`),n?.({pluginId:t,reason:`version-incompatible`,message:`engines.otto not satisfied (required: ${r}, host: ${rr})`}));this.warnedEngineIncompatible=new Set(this.lastEngineIncompatible.keys());let r=this.lastTopoSort;if(!r)return;let i=new Set([...r.cyclic.keys(),...r.missingDeps.keys()]);for(let[t,i]of r.cyclic)this.warnedTopoIssues.has(t)||(e.warn({pluginId:t,cyclePath:i},`plugin dependency cycle detected, skipping cyclic plugin (fail-closed, RFC-132 D5)`),n?.({pluginId:t,reason:`dependency-cycle`,message:`dependency cycle: ${i.join(` -> `)}`}));for(let[i,a]of r.missingDeps)if(!this.warnedTopoIssues.has(i)){e.warn({pluginId:i,missingDeps:a},`plugin dependencies missing, skipping plugin (fail-closed, RFC-132 D5)`),n?.({pluginId:i,reason:`dependency-missing`,message:`missing dependencies: ${a.join(`, `)}`});for(let n of a)await bf(e,t,i,n)}this.warnedTopoIssues=i}};function Sf(e,t){let{model:r,authStore:i,modelRegistry:a,providerRegistry:o}=e,s=i??re(),c=a??ie(),l=o??se({authStore:s,modelRegistry:c}),u=ce(),d=new Ss(c,s),f=e.modelId,p=r??(f?c.tryResolve(f):void 0);return{authStore:s,modelRegistry:c,providerRegistry:l,wireProtocolRegistry:u,modelCatalogManager:d,defaultModel:p,resolveEffectiveModel:()=>{if(p)return p;if(f){let e=c.tryResolve(f);if(e)return e}let e=t().get(`model`);return(e?c.tryResolve(e)??c.find(e):void 0)??c.getAll().find(e=>e.id!==m)},credentialBackendRegistry:ne(S(n))}}function Cf(e,t){if(typeof e==`object`&&e){let t=e;if(t.listable===!1||t.transient===!0||typeof t.depth==`number`&&t.depth>0)return!0}return wf(t)}function wf(e){let t=e?.trim().toLowerCase();return t?t===`reply with: ok`||t===`say ok and nothing else`||t.startsWith(`reply with only your model name/identifier`)||t.startsWith(`output exactly the word: probe_ok`)||t.startsWith(`you are a trajectory analyst for an ai coding assistant.`)||t.startsWith(`you are drafting a reusable skill for this project`)||t.startsWith(`you are responsible for completing parent task item`):!1}function Tf(e,t,n){let r=(e,r)=>{let i=(r?t.modelRegistry.find(r):void 0)??n();if(!i)throw Error(`configProvider: 无法解析恢复模型(modelId="${r??``}" 未命中、且无默认/settings/注册表模型)`);let a=t.getTools(),o=no(new Set(a.map(e=>e.name)));return{model:i,systemPrompt:``,tools:a,thinkingLevel:`medium`,maxToolTurns:t.maxToolTurns,promptRefresh:e?qo(t.promptManager,t.getDeclarativeAgentProfiles(),e,a):()=>t.promptManager.assemblePreset({preset:`main`},o),workspaceDir:t.workspaceDir}},i=e.storage?.session;if(i&&`dir`in i){let n=c(),a=new _i({dbPath:n?`:memory:`:C(i.dir,`sessions.db`)});t.repoRef&&(t.repoRef.current=a);let o=n?vi():yi({lockDir:C(i.dir,`locks`)}),s=new hi({repo:a,workspaceKey:t.getWorkspaceKey??(()=>Ui),maxLoadEntries:zn,canStartHistory:e=>e.role!==`tool_result`,writeLease:o,stripInactiveReplacements:!0}),l=async e=>(await a.listSessions(e).catch(()=>[])).filter(e=>!Cf(e.config,e.title)).map(e=>({id:e.id,title:e.title?.trim()||e.id.slice(0,8),messageCount:0,createdAt:new Date(e.createdAt),updatedAt:new Date(e.lastActiveAt),status:e.archived?`archived`:`idle`,pinned:e.pinned,pinGroup:e.pinGroup,writeLocked:o.peekLockedByOther(e.id),entryCount:e.entryCount}));return $t({providerRegistry:t.providerRegistry,hookRegistry:t.hookRegistry,logger:t.logger,workspaceDir:t.workspaceDir,clock:t.clock,traceStore:t.traceStore,checkpointStore:t.checkpointStore,memory:t.memory,maxSessions:e.maxSessions,devtools:t.devtools,configProvider:r,residencyGovernor:t.residencyGovernor,getResidencyConfig:t.getResidencyConfig,planeRegistry:t.planeRegistry,semanticReviewer:t.semanticReviewer,storage:{kind:`custom`,persistence:s,autoPersist:!0,...n?{panelStatePersistence:Pn(),pasteStatePersistence:Fn()}:{panelStateDir:C(i.dir,`panel-state`)},writeLeaseManager:{isLockedByOther:e=>o.peekLockedByOther(e),inspect:e=>o.inspect(e),forceRelease:e=>o.forceRelease(e)},coldSessionLister:{listColdSessions:l},onDispose:()=>{o.close(),a.close()}}})}let a=i&&`url`in i?(()=>{let n=Va(e.storage,`session`);return{kind:`remote`,sessionUrl:i.url,fetch:n.fetch??globalThis.fetch,getAuth:n.getAuth,timeoutMs:n.timeoutMs,userId:e.userIdentity?.userId,wsKey:t.getWorkspaceKey}})():void 0;return $t({providerRegistry:t.providerRegistry,hookRegistry:t.hookRegistry,logger:t.logger,workspaceDir:t.workspaceDir,clock:t.clock,traceStore:t.traceStore,checkpointStore:t.checkpointStore,memory:t.memory,maxSessions:e.maxSessions,storage:a,devtools:t.devtools,configProvider:r,residencyGovernor:t.residencyGovernor,planeRegistry:t.planeRegistry,semanticReviewer:t.semanticReviewer})}function Ef(e){return e.map(e=>({name:e.name,description:typeof e.description==`function`?e.description({projectRoot:``}):e.description,parameters:e.parameters}))}function Df(e,t,n){if(e.length===0)return[];if(!n.getTools)return n.logger.warn(`Swarm member "%s" requested %d tools but leaf has no tool directory (getTools not injected); all hidden (fail closed)`,t,e.length),[];let r=Jn(n.getDeclarativeAgentProfiles?.()??[],t),i=r?Bo(r.defaultTools):void 0,a=Wo(n.getTools,void 0,i),o=new Map(a.map(e=>[e.name,e])),s=[],c=new Set;for(let r of e){if(c.has(r.name))continue;c.add(r.name);let e=o.get(r.name);if(!e){n.logger.warn(`Swarm member "%s" tool "%s" not resolvable at leaf (missing from directory or denied by profile allowlist); hidden from model`,t,r.name);continue}s.push(e)}return s}function Of(e,t,n,r){let i=[],a=new Set;for(let o of e){if(a.has(o.name)){n.warn(`Swarm member "%s" duplicate core descriptor "%s"; ignored`,t,o.name);continue}if(o.name!==`handoff_to_agent`){n.warn(`Swarm member "%s" received unknown core tool descriptor "%s"; hidden (fail closed)`,t,o.name);continue}if(o.context.from!==t){n.warn(`Swarm member "%s" handoff descriptor origin mismatch (from="%s"); hidden (fail closed)`,t,o.context.from);continue}if(o.context.allowedTargets.length===0){n.warn(`Swarm member "%s" handoff descriptor has no allowed targets; hidden`,t);continue}a.add(o.name),i.push(Ci(o.context.from,o.context.allowedTargets,r))}return i}function kf(e){return async t=>{let n=Date.now();if(!e.defaultModel)throw Error(`Swarm member turn for agent "${t.agentId}" failed: no default model configured. Configure a model before running swarm/team sessions.`);let r=e.defaultModel,i=Df(t.tools??[],t.agentId,e);t.extraTools?.length&&e.logger.warn(`Swarm member "%s" received %d extraTools via deprecated metadata channel; ignored (use coreTools descriptors)`,t.agentId,t.extraTools.length);let a,o=Of(t.coreTools??[],t.agentId,e.logger,e=>{a||=e}),s=new Set(o.map(e=>e.name)),c=[...o,...i.filter(e=>!s.has(e.name))],l={model:r,systemPrompt:t.systemPrompt??``,messages:[],tools:c,thinkingLevel:t.thinkingLevel??`medium`,maxTokens:t.maxTokens,temperature:t.temperature};l.messages.push({role:`user`,content:[{type:`text`,text:t.prompt}],timestamp:Date.now()});let u=t.sessionId??`swarm:${t.agentId}`,d=t.depth??0,f=new Rt({stream:e.stream,logger:e.logger,agentName:t.agentId,maxToolTurns:t.maxToolTurns,toolHookExecutor:on({hookRegistry:e.hookRegistry,agentName:t.agentId,sessionId:u}),depth:d,parentTaskId:t.parentTaskId}),p=()=>f.abort();t.signal?.aborted?f.abort():t.signal?.addEventListener(`abort`,p,{once:!0});let m=`${u}:${t.agentId}`,h=Yt(f,{id:m,agentName:t.agentId,title:t.agentId,prompt:t.prompt,model:t.model??r.id,origin:`main`,depth:d,abort:()=>f.abort(),messages:l.messages}),g;try{g=await f.run(l)}finally{t.signal?.removeEventListener(`abort`,p),h(),gn.markEnded(m)}return{agentId:t.agentId,messages:l.messages,handoff:t.signal?.aborted?void 0:a,text:g.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
470
- `),tokenUsage:{input:g.usage.inputTokens,output:g.usage.outputTokens,cacheRead:g.usage.cacheReadTokens},durationMs:Date.now()-n}}}function Af(e,t){if(!t.defaultModel)throw Error(`buildSwarmConfig for team "${e.name}" failed: no default model configured.`);return{name:e.name,agents:e.agents,pattern:e.pattern,router:e.router,pipeline:e.pipeline,supervisorId:e.supervisorId,entryAgentId:e.entryAgentId,maxHandoffDepth:e.maxHandoffDepth,runId:t.runId,depth:t.depth??0,parentTaskId:t.parentTaskId,runAgentTurn:t.runAgentTurn??kf(t)}}function jf(e,t,n,r,i,a=0){let o=t.getDeclarativeAgentProfiles(),s=[];for(let c of e.agentNames){if(c.startsWith(`team:`)){let o=c.slice(5).trim();if(i+1>5){t.logger.warn(`Team "%s" nesting exceeds max depth %d, member skipped: %s`,e.name,5,c);continue}if(r.has(o)){t.logger.warn(`Team "%s" nesting cycle detected, member skipped: %s`,e.name,c);continue}let l=t.getDeclarativeTeams().find(e=>e.name===o);if(!l){t.logger.warn(`Team "%s" sub-team not found, member skipped: %s`,e.name,c);continue}let u=jf(l,t,n,new Set([...r,o]),i+1,a+1);if(u.agents.length===0){t.logger.warn(`Team "%s" sub-team "%s" has no resolvable members, skipped`,e.name,o);continue}let d=Af(u,{providerRegistry:t.providerRegistry,hookRegistry:t.hookRegistry,stream:t.stream,logger:t.logger,defaultModel:n,runId:`team:${o}`,depth:a+1,runAgentTurn:t.runAgentTurn});s.push({kind:`team`,id:c,name:o,description:`Nested team: ${o}`,runNested:async(e,t)=>{let n=await wi(d).run(e,{signal:t});return{agentId:c,messages:[],text:n.output,tokenUsage:{input:0,output:0,cacheRead:0},durationMs:n.durationMs}}});continue}let l=Jn(o,c);if(!l){s.push({kind:`agent`,id:c,name:c,description:c,systemPrompt:Gn(c),tools:Ef(t.resolveTools(void 0,void 0)),maxToolTurns:void 0});continue}s.push({kind:`agent`,id:c,name:l.name,description:l.taskTypes[0]??l.name,systemPrompt:l.systemPromptTemplate,tools:Ef(t.resolveTools(void 0,Bo(l.defaultTools))),maxToolTurns:l.defaultMaxToolTurns})}return{name:e.name,pattern:e.pattern,agents:s,pipeline:e.pipeline,supervisorId:e.supervisorId,entryAgentId:e.entryAgentId,maxHandoffDepth:e.maxHandoffDepth,router:e.routerStrategy?{strategy:e.routerStrategy,rules:e.rules?.map(e=>({match:e.keywords,agentId:e.agentId})),fallbackAgentId:e.entryAgentId??s[0]?.id}:void 0}}function Mf(e){return async(t,n,r,i,a)=>{let o=e.getDeclarativeTeams().find(e=>e.name===t);if(!o)return{success:!1,error:`Team not found: ${t}`};let s=e.defaultModel;if(!s)return{success:!1,error:`No model configured for team execution.`};if(o.routerStrategy===`llm`)return{success:!1,error:`Team "${t}": router strategy 'llm' is not supported in declarative teams (it needs a customRouter function). Use 'rule', 'round-robin', or 'random'.`};let c=jf(o,e,s,new Set([t]),0,i??0);if(c.agents.length===0)return{success:!1,error:`Team "${t}" has no resolvable member agents.`};try{let o=await wi(Af(c,{providerRegistry:e.providerRegistry,hookRegistry:e.hookRegistry,stream:e.stream,logger:e.logger,defaultModel:s,runId:`team:${t}`,depth:i,parentTaskId:a,runAgentTurn:e.runAgentTurn})).run(n,{signal:r});return{success:!0,output:o.output,pattern:o.pattern}}catch(e){return{success:!1,error:e instanceof Error?e.message:String(e)}}}}const Nf=`You are describing an image for a text-only AI assistant that cannot see images itself. Produce a concise structured description (aim for well under 500 tokens) covering, when applicable:
468
+ `);let c=[],l=[],{buildSync:u}=Fl();Il();for(let i of n){let n=i.replace(/\.tsx$/,`.mjs`);try{u({entryPoints:[C(t,i)],outfile:C(r,n),bundle:!0,format:`esm`,platform:`node`,alias:{react:a,ink:o,"@x-otto/tui":s},jsx:`transform`,banner:{js:`const { usePluginData } = globalThis.__ottoPanelRuntime || {};const { claim: claimPanelFocus, release: releasePanelFocus, usePanelFocusClaimed, requestClose: requestPanelClose, setHint: setPanelHint } = globalThis.__ottoPanelFocusBridge || { claim(){}, release(){}, usePanelFocusClaimed: () => true, requestClose(){}, setHint(){} };const { getTheme, getFigures } = globalThis.__ottoPanelTheme || { getTheme: () => ({ text: undefined, inactive: '#9498B8', secondary: '#C8CBDB', success: '#7EE095', error: '#FF9592', warning: '#FFC966', special: '#DD78C9', selection: '#4D7CFF', focusBorder: '#4D7CFF', panelBorder: '#9498B8' }), getFigures: () => ({ check: '✓', cross: '✗', pointer: '▶', bullet: '●' }) };const { SPACING, LAYOUT } = globalThis.__ottoPanelSpacing || { SPACING: { none: 0, tight: 1, section: 2, loose: 4 }, LAYOUT: { contentInset: 4, borderInset: 2 } };const { t: t, i18next: panelI18next } = globalThis.__ottoPanelI18n || { t: (k) => k, i18next: { language: 'en' } };const { usePanelBackend } = globalThis.__ottoPanelBackendRuntime || { usePanelBackend: () => ({ call: () => Promise.reject(new Error('otto panel: backend runtime not installed')), cancel(){}, state: undefined, status: 'disabled' }) };`},logLevel:`silent`}),c.push(C(`panels-dist`,n))}catch(t){l.push({entry:i,message:t.message}),lf.warn({pluginDir:e,entry:i,err:String(t)},`panel compile failed`)}}return lf.info({pluginDir:e,compiled:c.length,errors:l.length},`compiled plugin panels`),{compiled:c,errors:l,skipped:!1}}const df=T(`@x-otto/coding:plugin-install`);function ff(e){let t=[];return(async()=>{try{let t=await $l(e);t&&df.info({pluginDir:e,outfile:t},`plugin code module compiled at install time`)}catch(n){let r=n instanceof Error?n.message:String(n);df.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}=uf(e);if(!r&&n.length>0)for(let r of n)df.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);df.warn({pluginDir:e,err:r},`plugin panel compilation crashed unexpectedly at install time`),t.push(`面板编译异常:${r}`)}})().then(()=>t)}function pf(e){try{return qe(e).isSymbolicLink()}catch{return!1}}function mf(e){let t=b(e,`utf8`),n=[],r=!1;for(let e of t.split(`
469
+ `)){let t=e.trim();if(t.startsWith(`packages:`)){r=!0;continue}if(r){let e=t.match(/^-\s*['"]?([^'"]+)['"]?(?:\s+#.*)?$/);if(e?.[1]){n.push(e[1]);continue}t.length>0&&!t.startsWith(`-`)&&(r=!1)}}return n}function hf(e,t){let n=w(e,t.endsWith(`/*`)?t.slice(0,-2):t);if(!n.startsWith(e.endsWith(`/`)?e:e+`/`)&&n!==e)return[];if(!t.endsWith(`/*`))return v(n)?[n]:[];if(!v(n))return[];try{return Xe(n,{withFileTypes:!0}).filter(e=>e.isDirectory()).map(e=>C(n,e.name))}catch{return[]}}function gf(e,t){let n=o(t);if(!n)return;let r=mf(C(n,`pnpm-workspace.yaml`));for(let t of r)for(let r of hf(n,t)){let t=C(r,`package.json`);if(!v(t))continue;try{if(JSON.parse(b(t,`utf8`)).name===e)return r}catch{}let n=C(r,D);if(v(n))try{if(Nr(b(n,`utf8`),n)?.id===e)return r}catch{}}}function _f(t,n=process.cwd()){let r=[aa(C(n,`__resolve__.js`)).href,import.meta.url];for(let n of r)try{return S(e(n).resolve(`${t}/package.json`))}catch{}return gf(t,S(ia(import.meta.url)))??gf(t,n)}async function vf(e){let t=_f(e.pkg,e.cwd);if(!t)throw Error(`无法解析包 ${e.pkg}(未安装或不可从当前位置解析)。`);let n=C(t,D);if(!v(n))throw Error(`${e.pkg} 不是 otto 插件:缺 ${D}(RFC-044 自描述)。`);let i=Nr(b(n,`utf8`),n);if(!i)throw Error(`${e.pkg} 的 ${D} 非法(需合法 kebab-case id)。`);let a=e.ottoDir??r,o=C(a,`plugins`,i.id);y(C(a,`plugins`),{recursive:!0});let s=w(t);if(pf(o)){try{if(w(Ze(o))===s){let e=await ff(t);return{id:i.id,packageDir:t,dir:o,created:!1,compileWarnings:e,version:i.version}}}catch{}rt(o)}else if(v(o))if((v(C(o,D))?Nr(b(C(o,D),`utf8`),o):null)?.id===i.id)et(o,{recursive:!0,force:!0});else throw Error(`目标已存在且非本插件,拒绝覆盖:${o}`);nt(s,o);let c=await ff(t);return{id:i.id,packageDir:t,dir:o,created:!0,compileWarnings:c,version:i.version}}async function yf(e){let t=C(e,D);if(!v(t))throw Error(`${e} 不是 otto 插件:缺 ${D}`);let n=Nr(b(t,`utf8`),t);if(!n)throw Error(`${e} 的 ${D} 非法。`);let i=C(r,`plugins`,n.id);y(C(r,`plugins`),{recursive:!0});let a=w(e);if(pf(i)){try{if(w(Ze(i))===a){let t=await ff(e);return{id:n.id,packageDir:e,dir:i,created:!1,compileWarnings:t,version:n.version}}}catch{}rt(i)}else if(v(i))if((v(C(i,D))?Nr(b(C(i,D),`utf8`),i):null)?.id===n.id)et(i,{recursive:!0,force:!0});else throw Error(`目标已存在且非本插件,拒绝覆盖:${i}`);nt(a,i);let o=await ff(e);return{id:n.id,packageDir:e,dir:i,created:!0,compileWarnings:o,version:n.version}}function bf(e,t){return[...e.filter(e=>e.id!==t.id),t]}function xf(e,t){return e.filter(e=>e.id!==t)}async function Sf(e,t,n=()=>Date.now()){let r=bf(e.get(`installed_plugins`)??[],{id:t.id,source:t.source,sourceSpec:t.sourceSpec,installedAt:n(),version:t.version,scope:t.scope,capabilities:t.capabilities});await e.persist({installed_plugins:r},`global`)}async function Cf(e,t){let n={},r=!1,i=e.get(`installed_plugins`)??[];i.some(e=>e.id===t)&&(n.installed_plugins=xf(i,t),r=!0);let a=e.get(`disabled_plugins`)??[];a.includes(t)&&(n.disabled_plugins=a.filter(e=>e!==t),r=!0);let o=e.get(`plugin_lifecycle`)?.setupDone??[];if(o.some(e=>e.id===t)&&(n.plugin_lifecycle={setupDone:o.filter(e=>e.id!==t)},r=!0),r)if(`installed_plugins`in n){await e.persist({installed_plugins:n.installed_plugins},`global`);let{installed_plugins:t,...r}=n;Object.keys(r).length>0&&await e.persist(r)}else await e.persist(n)}function wf(e,t){let n=[],r=new Set(e.filter(e=>e.scope===`user`).map(e=>e.id)),i=t.filter(e=>e.scope===`global`),a=new Set(i.map(e=>e.id));for(let e of i)r.has(e.id)||n.push({kind:`missing-on-disk`,id:e.id,message:`${e.id}: 清单记录已安装,但磁盘 symlink 缺失,建议重装(otto extension install ${e.id})`});for(let t of e)t.scope===`user`&&!a.has(t.id)&&n.push({kind:`missing-in-registry`,id:t.id,message:`${t.id}: 磁盘已安装,但清单未记录(可能是旧版本 otto 安装的),建议重新安装以补登记`});return n}async function Tf(e,t,n,r){try{let i=await vf({pkg:r});t&&await Sf(t,{id:i.id,source:`npm`,sourceSpec:r,version:i.version,scope:`global`}),e.info({pluginId:n,missingId:r},`missing plugin dependency auto-installed (RFC-163 D5), will be picked up on next discovery`)}catch(t){e.warn({pluginId:n,missingId:r,err:t instanceof Error?t.message:String(t)},`automatic install of missing plugin dependency failed, manual "otto extension install" may be required (RFC-163 D5)`)}}var Ef=class{lastTopoSort;lastEngineIncompatible=new Map;warnedTopoIssues=new Set;warnedEngineIncompatible=new Set;resolve(e){let{compatible:t,incompatible:n}=Sr(_r({cwd:e.workspaceDir,homedir:e.homedir??at(),disabled:e.disabledPlugins,bundledDirs:e.bundledDirs}));this.lastEngineIncompatible=n;let r=Hr(t);return this.lastTopoSort=r,r.ordered}async diagnose(e,t,n){for(let[t,r]of this.lastEngineIncompatible)this.warnedEngineIncompatible.has(t)||(e.warn({pluginId:t,requiredRange:r,hostApiVersion:ir},`plugin engines.otto not satisfied by host, skipping plugin (fail-closed, RFC-148 M0)`),n?.({pluginId:t,reason:`version-incompatible`,message:`engines.otto not satisfied (required: ${r}, host: ${ir})`}));this.warnedEngineIncompatible=new Set(this.lastEngineIncompatible.keys());let r=this.lastTopoSort;if(!r)return;let i=new Set([...r.cyclic.keys(),...r.missingDeps.keys()]);for(let[t,i]of r.cyclic)this.warnedTopoIssues.has(t)||(e.warn({pluginId:t,cyclePath:i},`plugin dependency cycle detected, skipping cyclic plugin (fail-closed, RFC-132 D5)`),n?.({pluginId:t,reason:`dependency-cycle`,message:`dependency cycle: ${i.join(` -> `)}`}));for(let[i,a]of r.missingDeps)if(!this.warnedTopoIssues.has(i)){e.warn({pluginId:i,missingDeps:a},`plugin dependencies missing, skipping plugin (fail-closed, RFC-132 D5)`),n?.({pluginId:i,reason:`dependency-missing`,message:`missing dependencies: ${a.join(`, `)}`});for(let n of a)await Tf(e,t,i,n)}this.warnedTopoIssues=i}};function Df(e,t){let{model:r,authStore:i,modelRegistry:a,providerRegistry:o}=e,s=i??re(),c=a??ie(),l=o??se({authStore:s,modelRegistry:c}),u=ce(),d=new Ss(c,s),f=e.modelId,p=r??(f?c.tryResolve(f):void 0);return{authStore:s,modelRegistry:c,providerRegistry:l,wireProtocolRegistry:u,modelCatalogManager:d,defaultModel:p,resolveEffectiveModel:()=>{if(p)return p;if(f){let e=c.tryResolve(f);if(e)return e}let e=t().get(`model`);return(e?c.tryResolve(e)??c.find(e):void 0)??c.getAll().find(e=>e.id!==m)},credentialBackendRegistry:ne(S(n))}}function Of(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 kf(t)}function kf(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 Af(e,t,n){let r=(e,r)=>{let i=(r?t.modelRegistry.find(r):void 0)??n();if(!i)throw Error(`configProvider: 无法解析恢复模型(modelId="${r??``}" 未命中、且无默认/settings/注册表模型)`);let a=t.getTools(),o=no(new Set(a.map(e=>e.name)));return{model:i,systemPrompt:``,tools:a,thinkingLevel:`medium`,maxToolTurns:t.maxToolTurns,promptRefresh:e?qo(t.promptManager,t.getDeclarativeAgentProfiles(),e,a):()=>t.promptManager.assemblePreset({preset:`main`},o),workspaceDir:t.workspaceDir}},i=e.storage?.session;if(i&&`dir`in i){let n=c(),a=new vi({dbPath:n?`:memory:`:C(i.dir,`sessions.db`)});t.repoRef&&(t.repoRef.current=a);let o=n?yi():bi({lockDir:C(i.dir,`locks`)}),s=new gi({repo:a,workspaceKey:t.getWorkspaceKey??(()=>k),maxLoadEntries:Bn,canStartHistory:e=>e.role!==`tool_result`,writeLease:o,stripInactiveReplacements:!0}),l=async e=>(await a.listSessions(e).catch(()=>[])).filter(e=>!Of(e.config,e.title)).map(e=>({id:e.id,title:e.title?.trim()||e.id.slice(0,8),messageCount:0,createdAt:new Date(e.createdAt),updatedAt:new Date(e.lastActiveAt),status:e.archived?`archived`:`idle`,pinned:e.pinned,pinGroup:e.pinGroup,writeLocked:o.peekLockedByOther(e.id),entryCount:e.entryCount}));return en({providerRegistry:t.providerRegistry,hookRegistry:t.hookRegistry,logger:t.logger,workspaceDir:t.workspaceDir,clock:t.clock,traceStore:t.traceStore,checkpointStore:t.checkpointStore,memory:t.memory,maxSessions:e.maxSessions,devtools:t.devtools,configProvider:r,residencyGovernor:t.residencyGovernor,getResidencyConfig:t.getResidencyConfig,planeRegistry:t.planeRegistry,semanticReviewer:t.semanticReviewer,storage:{kind:`custom`,persistence:s,autoPersist:!0,...n?{panelStatePersistence:Fn(),pasteStatePersistence:In()}:{panelStateDir:C(i.dir,`panel-state`)},writeLeaseManager:{isLockedByOther:e=>o.peekLockedByOther(e),inspect:e=>o.inspect(e),forceRelease:e=>o.forceRelease(e)},coldSessionLister:{listColdSessions:l},onDispose:()=>{o.close(),a.close()}}})}let a=i&&`url`in i?(()=>{let n=Va(e.storage,`session`);return{kind:`remote`,sessionUrl:i.url,fetch:n.fetch??globalThis.fetch,getAuth:n.getAuth,timeoutMs:n.timeoutMs,userId:e.userIdentity?.userId,wsKey:t.getWorkspaceKey}})():void 0;return en({providerRegistry:t.providerRegistry,hookRegistry:t.hookRegistry,logger:t.logger,workspaceDir:t.workspaceDir,clock:t.clock,traceStore:t.traceStore,checkpointStore:t.checkpointStore,memory:t.memory,maxSessions:e.maxSessions,storage:a,devtools:t.devtools,configProvider:r,residencyGovernor:t.residencyGovernor,planeRegistry:t.planeRegistry,semanticReviewer:t.semanticReviewer})}function jf(e){return e.map(e=>({name:e.name,description:typeof e.description==`function`?e.description({projectRoot:``}):e.description,parameters:e.parameters}))}function Mf(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?Bo(r.defaultTools):void 0,a=Wo(n.getTools,void 0,i),o=new Map(a.map(e=>[e.name,e])),s=[],c=new Set;for(let r of e){if(c.has(r.name))continue;c.add(r.name);let e=o.get(r.name);if(!e){n.logger.warn(`Swarm member "%s" tool "%s" not resolvable at leaf (missing from directory or denied by profile allowlist); hidden from model`,t,r.name);continue}s.push(e)}return s}function Nf(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(wi(o.context.from,o.context.allowedTargets,r))}return i}function Pf(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=Mf(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=Nf(t.coreTools??[],t.agentId,e.logger,e=>{a||=e}),s=new Set(o.map(e=>e.name)),c=[...o,...i.filter(e=>!s.has(e.name))],l={model:r,systemPrompt:t.systemPrompt??``,messages:[],tools:c,thinkingLevel:t.thinkingLevel??`medium`,maxTokens:t.maxTokens,temperature:t.temperature};l.messages.push({role:`user`,content:[{type:`text`,text:t.prompt}],timestamp:Date.now()});let u=t.sessionId??`swarm:${t.agentId}`,d=t.depth??0,f=new Rt({stream:e.stream,logger:e.logger,agentName:t.agentId,maxToolTurns:t.maxToolTurns,toolHookExecutor:sn({hookRegistry:e.hookRegistry,agentName:t.agentId,sessionId:u}),depth:d,parentTaskId:t.parentTaskId}),p=()=>f.abort();t.signal?.aborted?f.abort():t.signal?.addEventListener(`abort`,p,{once:!0});let m=`${u}:${t.agentId}`,h=Xt(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(),_n.markEnded(m)}return{agentId:t.agentId,messages:l.messages,handoff:t.signal?.aborted?void 0:a,text:g.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
470
+ `),tokenUsage:{input:g.usage.inputTokens,output:g.usage.outputTokens,cacheRead:g.usage.cacheReadTokens},durationMs:Date.now()-n}}}function Ff(e,t){if(!t.defaultModel)throw Error(`buildSwarmConfig for team "${e.name}" failed: no default model configured.`);return{name:e.name,agents:e.agents,pattern:e.pattern,router:e.router,pipeline:e.pipeline,supervisorId:e.supervisorId,entryAgentId:e.entryAgentId,maxHandoffDepth:e.maxHandoffDepth,runId:t.runId,depth:t.depth??0,parentTaskId:t.parentTaskId,runAgentTurn:t.runAgentTurn??Pf(t)}}function If(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=If(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=Ff(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 Ti(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:Kn(c),tools:jf(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:jf(t.resolveTools(void 0,Bo(l.defaultTools))),maxToolTurns:l.defaultMaxToolTurns})}return{name:e.name,pattern:e.pattern,agents:s,pipeline:e.pipeline,supervisorId:e.supervisorId,entryAgentId:e.entryAgentId,maxHandoffDepth:e.maxHandoffDepth,router:e.routerStrategy?{strategy:e.routerStrategy,rules:e.rules?.map(e=>({match:e.keywords,agentId:e.agentId})),fallbackAgentId:e.entryAgentId??s[0]?.id}:void 0}}function Lf(e){return async(t,n,r,i,a)=>{let o=e.getDeclarativeTeams().find(e=>e.name===t);if(!o)return{success:!1,error:`Team not found: ${t}`};let s=e.defaultModel;if(!s)return{success:!1,error:`No model configured for team execution.`};if(o.routerStrategy===`llm`)return{success:!1,error:`Team "${t}": router strategy 'llm' is not supported in declarative teams (it needs a customRouter function). Use 'rule', 'round-robin', or 'random'.`};let c=If(o,e,s,new Set([t]),0,i??0);if(c.agents.length===0)return{success:!1,error:`Team "${t}" has no resolvable member agents.`};try{let o=await Ti(Ff(c,{providerRegistry:e.providerRegistry,hookRegistry:e.hookRegistry,stream:e.stream,logger:e.logger,defaultModel:s,runId:`team:${t}`,depth:i,parentTaskId:a,runAgentTurn:e.runAgentTurn})).run(n,{signal:r});return{success:!0,output:o.output,pattern:o.pattern}}catch(e){return{success:!1,error:e instanceof Error?e.message:String(e)}}}}const Rf=`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:
471
471
  - Overall layout (columns/sections, relative position and proportions)
472
472
  - Color palette (primary/secondary colors as hex codes)
473
473
  - Text content and font-size hierarchy (headings vs body)
474
474
  - Interactive component inventory (buttons, inputs, nav items, etc.)
475
475
  - Key size ratios/dimensions
476
476
 
477
- If the image is not a UI/design screenshot, give a normal concise description instead. Do not speculate beyond what's visible.`;var Pf=class{cache=new Map;constructor(e){this.deps=e}describeImages=async(e,t)=>{let n=await this.resolveVisionModel();return n?Promise.all(e.map(e=>this.describeOne(n,e,t))):e.map(()=>null)};async resolveVisionModel(){let e=this.deps.getModelRegistry(),t=this.deps.getVisionSlotCandidates()??[];for(let n of t){let t=e.tryResolve(n);if(t&&await this.isUsable(t))return t}for(let t of e.getAll())if(t.strengths?.includes(`vision`)&&await this.isUsable(t))return t}async isUsable(e){try{return(await this.deps.isModelUsable(e)).usable}catch{return!1}}async describeOne(e,t,n){let r=this.hashImage(t.source),i=this.cache.get(r);if(i)return this.formatDescription(e,i.description);try{let i=await this.callVisionModel(e,t,n);return i?(this.rememberInCache(r,i),this.formatDescription(e,i)):null}catch(t){return this.deps.logger.debug({error:t,modelId:e.id},`vision delegate describe failed`),null}}async callVisionModel(e,t,n){let r=this.deps.providerRegistry.get(e.api),i={role:`user`,timestamp:Date.now(),content:[{type:`text`,text:t.contextHint?`${Nf}\n\nContext: ${t.contextHint}`:Nf},{type:`image`,mime:t.mime,source:t.source}]},a=new AbortController,o=setTimeout(()=>a.abort(),3e4),s=n?AbortSignal.any([n,a.signal]):a.signal;try{return(await te(e,r,{model:e,systemPrompt:``,messages:[i],maxTokens:800},{signal:s})).content.filter(e=>e.type===`text`).map(e=>e.text).join(``).trim()||void 0}finally{clearTimeout(o)}}formatDescription(e,t){return`[image seen by vision model ${e.id}]\n${t}`}hashImage(e){return Fi(`sha256`).update(e).digest(`hex`)}rememberInCache(e,t){if(this.cache.size>=100){let e=this.cache.keys().next().value;e!==void 0&&this.cache.delete(e)}this.cache.set(e,{description:t})}};function Ff(e){let t=e?.slots?.vision;if(t)return Array.isArray(t)?t:[t]}function If(e,t){globalThis[e]||Object.defineProperty(globalThis,e,{value:Object.freeze(t()),writable:!1,configurable:!1})}var Lf=class{_callMcpTool=null;get callMcpTool(){if(!this._callMcpTool)throw Error(`PanelRuntime not installed — call installPanelRuntime() during App startup`);return this._callMcpTool}install(e){this._callMcpTool=e,If(`__ottoPanelRuntime`,()=>({callMcpTool:(e,t,n)=>this.callMcpTool(e,t,n),usePluginData:Rf(this)}))}};function Rf(e){return function(t,n,r=5e3){let i=globalThis.React;if(!i||typeof i.useState!=`function`)throw Error(`usePluginData requires React runtime. Panel components must be rendered in a React (Ink) context.`);let[a,o]=i.useState(void 0),[s,c]=i.useState(!0),[l,u]=i.useState(void 0),d=i.useCallback(async()=>{c(!0);try{let r=await e.callMcpTool(t,n,{});if(r.isError){u(`MCP tool returned error`);return}let i=r.content?.find(e=>e.type===`text`);if(i?.text){try{o(JSON.parse(i.text))}catch{o(i.text)}u(void 0)}else o(void 0),u(`MCP tool returned no text content`)}catch(e){u(e instanceof Error?e.message:String(e))}finally{c(!1)}},[t,n]);return i.useEffect(()=>{d();let e=setInterval(()=>void d(),r);return()=>clearInterval(e)},[d,r]),{data:a,loading:s,error:l,callTool:i.useCallback(async(n,r)=>{try{return{success:!(await e.callMcpTool(t,n,r??{})).isError}}catch(e){return{success:!1,error:e instanceof Error?e.message:String(e)}}},[t])}}}const zf=new Lf;function Bf(e){zf.install(e)}const Vf=`backend/`;function Hf(e){return e.startsWith(Vf)?e:`${Vf}${e}`}var Uf=class{fns=null;get(){return this.fns}install(e){this.fns=e,If(`__ottoPanelBackendRuntime`,()=>({usePanelBackend:Gf(this)}))}};function Wf(){return globalThis.__ottoCurrentPanelPluginId}function Gf(e){return function(){let t=globalThis.React;if(!t||typeof t.useState!=`function`)throw Error(`usePanelBackend requires React runtime. Panel components must be rendered in a React (Ink) context.`);let n=Wf(),r=e.get(),[i,a]=t.useState(void 0),[o,s]=t.useState(n&&r?r.getStatus(n):`disabled`);return t.useEffect(()=>{if(!n||!r)return;s(r.getStatus(n));let e=r.subscribeState(n,e=>{a(e)}),t=r.onStatusChange(n,s);return()=>{e(),t()}},[n]),{call:t.useCallback(async(e,t,i)=>{if(!n||!r)throw Error(`usePanelBackend: no plugin context available (panel must be rendered inside a plugin detail view with backend runtime installed)`);return r.call(n,Hf(e),t,i)},[n]),cancel:t.useCallback(e=>{!n||!r||r.cancel(n,e)},[n]),state:i,status:o}}}const Kf=new Uf;function qf(e){Kf.install(e)}function Jf(){let e=process.env.LC_ALL||process.env.LC_MESSAGES||process.env.LANG||``;return/zh/i.test(e)?`zh`:`en`}function Yf(e){return!e||e===`auto`?Jf():e}var Xf=class{loadedPluginIds=[];previousSnapshot=[];constructor(e){this.deps=e}async reload(){let e=0,t=0,n=[],r=new Map;for(let e of this.deps.activePlugins()){let i=!!e.manifest.contributes?.oauth?.length,a=!!e.manifest.contributes?.providers?.length;if(!i&&!a)continue;let o=O(e);if(o.gated){this.deps.logger.warn({pluginId:e.id},`project plugin not trusted, skipping declarative providers (fail-closed, RFC-124 C1)`),t+=(e.manifest.contributes?.providers?.length??0)+(e.manifest.contributes?.oauth?.length??0);continue}if(o.pendingCapabilities.includes(`provider`)){this.deps.logger.warn({pluginId:e.id},`plugin capability "provider" declared but not yet granted, skipping declarative providers (fail-closed, RFC-124 C2)`),t+=(e.manifest.contributes?.providers?.length??0)+(e.manifest.contributes?.oauth?.length??0),n.push(e.id);continue}r.set(e.id,e.manifest)}let i=e=>JSON.stringify(e),a=[],o=new Map,s=new Map;for(let e of this.previousSnapshot){let t=r.get(e.id);if(t!==void 0&&i(t)!==i(e.manifest)){let n=md(e.id,e.manifest),r=md(e.id,t),i=new Set([...n].filter(e=>r.has(e)));i.size>0&&o.set(e.id,i);let a=hd(e.id,e.manifest),c=hd(e.id,t),l=new Set([...a].filter(e=>c.has(e)));l.size>0&&s.set(e.id,l)}}for(let e of this.previousSnapshot){let t=r.get(e.id);(t===void 0||i(t)!==i(e.manifest))&&await wd(e.id,e.manifest,this.deps,o.get(e.id),s.get(e.id))}let c=new Map(this.previousSnapshot.map(e=>[e.id,i(e.manifest)]));for(let[n,l]of r){if(c.get(n)===i(l)){a.push({id:n,manifest:l}),e+=l.contributes?.providers?.length??0;continue}let r=Cd(n,l,this.deps,o.get(n),s.get(n));e+=r.registered.length,t+=r.rejected.length;for(let e of r.rejected)this.deps.onProviderRejected?.(e);a.push({id:n,manifest:l})}return this.previousSnapshot=a,this.loadedPluginIds=a.map(e=>e.id),{registered:e,rejected:t,pendingCapabilityPluginIds:n}}get activePluginIds(){return this.loadedPluginIds}async cleanup(){for(let{id:e,manifest:t}of this.previousSnapshot)await wd(e,t,this.deps);this.previousSnapshot=[],this.loadedPluginIds=[]}};function Zf(e,n){if(!e)return{devtools:null,logSubscription:null};let r=new t;return{devtools:r,logSubscription:pt(e=>{if(typeof e==`object`&&e&&`name`in e&&`level`in e&&`msg`in e){let t=e;t.name===n&&r.sendLog(t)}})}}var Qf=class{registry;auditLog;constructor(e,t){let n=Ne(e.getAll());this.auditLog=new xe,this.registry=Me({toolSets:n}),t.register(Ae(this.registry,this.auditLog))}};const $f=T(`@x-otto/coding:plugin-context-sources`),ep=64*1024;function tp(e,t,n){let r=w(t,n);if(!Ac(r,t)){$f.warn({pluginId:e,file:n},`contextSources.content.file resolves outside plugin dir, skipped`);return}try{let e=b(r,`utf8`);return Buffer.byteLength(e,`utf8`)>ep?`${e.slice(0,ep)}\n<!-- truncated -->`:e}catch(t){$f.warn({pluginId:e,file:n,err:String(t)},`contextSources.content.file read failed, skipped`);return}}function np(e){let t=[];for(let n of e){if(O(n).gated)continue;let e=n.manifest.contributes?.contextSources;if(e?.length){if(!n.manifest.capabilities?.includes(`context`)){$f.warn({pluginId:n.id},`plugin declares contextSources but not capabilities:["context"], skipped (fail-closed)`);continue}for(let r of e)t.push({id:`${n.id}:${r.id}`,priority:r.priority,contribute:()=>{let e=typeof r.content==`string`?r.content:tp(n.id,n.dir,r.content.file);if(e!=null)return`<!-- plugin:${n.id} -->\n${e}`}})}}return t}function rp(e,t,n){let r=0;for(let i of t)try{e.register(i),r+=1}catch(e){n.warn({sourceId:i.id,err:e instanceof Error?e.message:String(e)},`plugin context source skipped: duplicate id (builtin or another plugin already registered it)`)}return r}function ip(e){xn(),bn(void 0,e.repoRoot);let t=(t,n)=>{e.hasSession(n.sessionId)&&e.emitHook(t,n).catch(n=>{e.logger.warn({err:n instanceof Error?n.message:String(n),timing:t},`Failed to emit process lifecycle hook`)})};return[E.onSpawn(n=>{e.logger.info({id:n.id,pid:n.pid,command:n.command,port:n.port},`Background process started`),t(`process.spawned`,{sessionId:n.config.sessionId,processId:n.id,pid:n.pid,command:n.command,port:n.port})}),E.onExit(n=>{e.logger.info({id:n.id,pid:n.pid,status:n.status},`Background process exited`),t(`process.exited`,{sessionId:n.config.sessionId,processId:n.id,pid:n.pid,command:n.command,status:n.status})})]}const ap=2e4,op=(e,t)=>{let n=ea(`git`,[...e],{cwd:t,timeout:1e4,encoding:`utf-8`,maxBuffer:4194304});return n.error||n.status!==0?null:n.stdout??``};function sp(e){return e.length<=ap?e:`${e.slice(0,ap)}\n[...truncated ${e.length-ap} chars...]`}function cp(e,t,n,r){let i=w(e),a=ct(t)?t:w(i,t);if(a!==i&&!a.startsWith(`${i}/`)||!v(a)||!tt(a).isFile())return null;let o;try{o=b(a,`utf-8`)}catch{return null}if(o.includes(`\0`))return null;let s=o.split(`
478
- `),c=Math.max(1,n);if(c>s.length)return null;let l=Math.min(s.length,r>0?r:n);return sp(s.slice(c-1,l).join(`
479
- `))}function lp(e,t,n,r=14){let i=n([`grep`,`-nE`,`(function|class|interface|type|enum|const|let|var|def|fn|struct|func)[[:space:]]+${t.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}`],e);if(i===null||!i.trim())return null;let a=/^(.+?):(\d+):/.exec(i.split(`
480
- `)[0]??``);if(!a)return null;let o=parseInt(a[2],10);return cp(e,a[1],o,o+r)}function up(e){let t=e?.gitRunner??op;return[{id:`file-range`,resolve:(e,t)=>{let n=/^([\w./-]+):(\d+)(?:-(\d+))?$/.exec(e);if(!n)return``;let r=cp(t.workspaceDir,n[1],parseInt(n[2],10),n[3]?parseInt(n[3],10):0);if(r===null)return``;let i=n[1],a=i.includes(`.`)?i.split(`.`).pop()??``:``;return`\n\n${i}:${n[3]?`${n[2]}-${n[3]}`:n[2]}:\n\`\`\`${a}\n${r}\n\`\`\`\n`}},{id:`def`,resolve:(e,n)=>{let r=lp(n.workspaceDir,e,t);return r===null?``:`\n\n@def:${e}:\n\`\`\`\n${r}\n\`\`\`\n`}}]}function dp(e){return{sandbox:new oo(e.logger),memoryGovernor:new Ut({logger:e.logger}),residencyGovernor:new Gt,fleetMonitor:new Vt({logger:e.logger}),permissionSync:new ao({logger:e.logger,getToolRegistry:e.getToolRegistry,getPermissionRegistry:e.getPermissionRegistry}),hookRegistry:e.hookRegistry??ta({preset:`default`,onHookTimeout:e.onHookTimeout})}}function fp(e){let t=Zf(e.inspect,e.loggerName),n=t.devtools,r=t.logSubscription,i=new Ei({workspaceDir:e.workspaceDir,projectConfigPath:e.projectConfigPath,projectConfigTrusted:()=>Ni(e.workspaceDir,{interactive:e.interactive})});return i.on(`change`,t=>{e.onSettingsApplied(t),e.permissionSync.sync(t),e.sandbox.applySetting(e.sandbox.resolveConfig(t));let n=t.proxy,r=n?.enabled!==!1&&n?.url?n.url:void 0;bt(r),gt(r),e.getI18nRegistry().setLocale(Yf(t.language))}),{devtools:n,logSubscription:r,settings:i}}function pp(e){let t=new Pf({getModelRegistry:e.getModelRegistry,providerRegistry:e.providerRegistry,getVisionSlotCandidates:()=>Ff(e.getSettings().get(`model_slots`)),isModelUsable:e.isModelUsable,logger:e.logger});return{visionDelegateService:t,sessionConfigResolver:new Jo({settings:e.getSettings(),promptManager:e.promptManager,getModelRegistry:e.getModelRegistry,getTools:e.getTools,getDeclarativeAgentProfiles:e.getDeclarativeAgentProfiles,defaultModel:e.defaultModel,explicitModelSpec:e.explicitModelId,hasCredential:t=>e.providerRegistry.hasCredential(t),isModelUsable:e.isModelUsable,maxToolTurns:e.maxToolTurns,maxToolTurnExtensions:e.maxToolTurnExtensions,promptOutputTokenBudget:e.promptOutputTokenBudget,promptWallClockBudgetMs:e.promptWallClockBudgetMs,sessionCostBudgetUSD:e.sessionCostBudgetUSD,stallDetection:e.stallDetection,workspaceDir:e.workspaceDir,getWorkspaceId:()=>e.getWorkspaceRef()?.id??e.workspaceId,logger:e.logger,describeImages:t.describeImages,getResilienceConfig:e.getResilienceConfig})}}function mp(e){let t=Tf(e.options,{hookRegistry:e.hookRegistry,providerRegistry:e.providerRegistry,modelRegistry:e.getModelRegistry(),logger:e.logger,workspaceDir:e.workspaceDir,getTools:e.getTools,getDeclarativeAgentProfiles:e.getDeclarativeAgentProfiles,getWorkspaceKey:()=>e.getWorkspaceRef()?.key,repoRef:e.repoRef,maxToolTurns:e.maxToolTurns,promptManager:e.promptManager,memory:e.memory,traceStore:e.traceStore,checkpointStore:e.checkpointStore,clock:e.clock,devtools:e.devtools??void 0,residencyGovernor:e.residencyGovernor,getResidencyConfig:e.getResidencyConfig,planeRegistry:e.planeRegistry,semanticReviewer:e.semanticReviewer},e.resolveEffectiveModel),n=t.sessions;return{agentRuntime:t,codingSessionPool:n,swarmAgentRunner:kf({hookRegistry:e.hookRegistry,stream:n.stream,logger:e.logger,defaultModel:e.defaultModel,getTools:e.getTools,getDeclarativeAgentProfiles:e.getDeclarativeAgentProfiles}),defaultModel:e.defaultModel}}function hp(e){let{runSession:t,abortTask:n}=ys({logger:e.logger,getSession:e.getSession,createSession:e.createSession,removeSession:e.removeSession}),r=new Si({hookRegistry:e.hookRegistry,runSession:t,abortTask:n,runAgentTurn:e.swarmAgentRunner,workflowConfig:e.workflowConfig});return{orchestrator:r,runSession:t,runTeam:Mf({logger:e.logger,providerRegistry:e.providerRegistry,hookRegistry:e.hookRegistry,stream:e.stream,defaultModel:e.defaultModel,getDeclarativeTeams:e.getDeclarativeTeams,getDeclarativeAgentProfiles:e.getDeclarativeAgentProfiles,resolveTools:(t,n)=>e.sessionConfigResolver.resolveTools(t,n),runAgentTurn:e=>r.runAgentTurn(e)}),writeTodos:ca()}}function gp(e){Bf(e.callMcpTool);let t=new Yc({mcpController:e.mcpController,getActivePlugins:e.getActivePlugins});return qf({call:(e,n,r,i)=>t.call(e,n,r,i),cancel:(e,n)=>{t.cancel(e,n)},subscribeState:(e,n)=>t.subscribeState(e,n),getStatus:e=>t.getStatus(e),onStatusChange:(e,n)=>t.onStatusChange(e,n)}),{panelBackendController:t}}function _p(e){let t=new Ju((t,n)=>{let r=e.activePlugins().find(e=>e.id===t);return r?(r.manifest.capabilities??[]).includes(n):!1}),n=new nf({hookRegistry:e.hookRegistry,skillRegistry:e.skillRegistry,providerRegistry:e.providerRegistry,wireProtocolRegistry:e.wireProtocolRegistry,modelRegistry:e.modelRegistry,authStore:e.authStore,toolRegistry:e.toolRegistry,feedbackRegistry:e.feedbackRegistry,sigilResolverRegistry:e.sigilResolverRegistry,pluginInput:e.pluginInput,workspaceDir:e.workspaceDir,activePlugins:e.activePlugins,callMcpTool:e.callMcpTool,logger:e.logger,eventDispatcher:t,startPluginJob:e.startPluginJob,getSessionId:e.getPluginJobSessionId,getWorkspaceKey:e.getWorkspaceKey,getSessionMessages:e.getSessionMessages,completeText:e.completeText,capabilityQuota:e.capabilityQuota,askUser:e.askUser,onPluginLoadError:e.onPluginLoadError,...e.getSchedulePort?{getSchedulePort:e.getSchedulePort}:{},...e.getSettingValue?{getSettingValue:e.getSettingValue}:{},...e.notifyUser?{notifyUser:e.notifyUser}:{},...e.planeRegistry?{planeRegistry:e.planeRegistry}:{}}),r=new Xf({providerRegistry:e.providerRegistry,authStore:e.authStore,modelRegistry:e.modelRegistry,wireProtocolRegistry:e.wireProtocolRegistry,activePlugins:e.activePlugins,logger:e.logger,...e.onPluginLoadError?{onProviderRejected:t=>e.onPluginLoadError(t.pluginId,`provider entry "${t.id}" rejected: ${t.reason}`,`provider-rejected`)}:{}});return e.i18nRegistry.register(Fc(e.activePlugins())),{pluginModuleManager:n,pluginProviderManager:r,capabilityReloader:new qc(e.settings,e.mcpController,e.skillRegistryForReloader,n,r,e.toolRegistry,e.modelCatalogManager,e.workspaceDir,e.getActivePluginsForReloader,e.i18nRegistry,e.getCompatTrustGated)}}function vp(e){return{toolsSyncCoordinator:new rc({sessionConfigResolver:e.sessionConfigResolver,getSession:e.getSession,listSessionIds:e.listSessionIds,logger:e.logger}),pluginContributionsFacade:new vc({getWorkspaceDir:()=>e.workspaceDir,settings:e.settings,getActivePlugins:e.getActivePlugins,pluginModuleManager:e.pluginModuleManager,mcpController:e.mcpController,compatProducts:e.compatProducts})}}function yp(e){let t=new Set(e.hookRegistry.getRegistered().map(e=>e.name)),n=new Qf(e.toolRegistry,e.hookRegistry),r=new po(e.settings,e.toolRegistry,e.logger,e.workspaceDir,e.getResilienceConfig,e.compatProducts);return{permissionRegistry:n.registry,auditLog:n.auditLog,mcpController:r,preExistingHooks:t}}function bp(e){return new vo({settings:e.settings,mcp:e.mcpController,skills:e.skillRegistry,getAgentProfiles:()=>e.declarativeAgentProfiles,getPlugins:()=>gr({cwd:e.workspaceDir,homedir:e.pluginHomedir,bundledDirs:e.pluginBundledDirs}),processRuntime:E,onPluginToggle:e.onPluginToggle})}function xp(e){e.pluginInput.register(lr()),e.pluginInput.registerProvider(`@`,dr({cwd:e.workspaceDir})),e.sigilResolvers.register(up(),`builtin`),e.sigilResolvers.register([{id:`shortcut`,resolve:t=>{let n=(e.settings.get(`shortcuts`)??[]).find(e=>e.name===t);return n?n.text:``}}],`builtin`);let t=rd(e.activePlugins());t.length>0&&e.pluginInput.register(t),id(e.activePlugins());for(let t of np(e.activePlugins()))rp(e.agentRuntime.contextSources,[t],e.logger);return e.registerHooks(),{ownedHookNames:e.hookRegistry.getRegistered().map(e=>e.name).filter(t=>!e.preExistingHooks.has(t)),processRegistryUnsubs:ip({hasSession:t=>!!e.codingSessionPoolGet(t),emitHook:(t,n)=>e.hookRegistry.emit(t,n),logger:e.logger,repoRoot:e.workspaceDir})}}async function Sp(e,t,n){t()||(await e.load(),n(!0))}function Cp(e){for(let t of e)try{t.apply()}catch(e){throw Error(`deferred config step "${t.label}" failed: ${e.message}`,{cause:e})}}function wp(e){let t=typeof e==`function`?{getPermissionMode:e}:e;return async(e,n,r,i)=>{if(t.getPermissionMode()===`bypass`)return`allow`;if(t.isSemanticReviewEnabled?.()===!0&&t.createLlmReviewer){let a=t.resolveReviewModel?.();if(a)return await t.createLlmReviewer(a)(e,n,r,i)}return`abstain`}}function Tp(e,t,n,r){return{workspaceDir:t,processOwner:e.processOwnerId,orchestrator:e.orchestrator,writeTodos:e.writeTodos,skillProvider:n,enableLsp:r,sandbox:e.sandbox,autoMemory:e.autoMemory,reloadMemory:e.reloadMemory,archiveRecall:e.archiveRecall,runTeam:e.runTeam,runSession:e.runSession,fileStateManager:e.fileStateManager,learningStore:e.learningStore,localLearningStore:e.localLearningStore,sessions:e.sessions,listModels:e.listModels,startJob:e.startJob,schedule:ha(e.getScheduleService),searchEcosystem:e.searchEcosystem}}function Ep(e){let{orchestrator:t,writeTodos:n,skillProvider:r,autoMemory:i,reloadMemory:a,archiveRecall:o}=e,s=e.processOwner,c=s?{register:e=>{let t=E.registerChild({command:e.command,cwd:e.cwd,logPath:e.logPath,port:e.port,url:e.url,owner:{type:`app`,id:s},sessionId:e.sessionId,category:`shell`,label:e.command,lifecycle:`evictable`},e.child);return{id:t.id,sessionId:e.sessionId,pid:t.pid??-1,command:t.command,status:t.status===`running`?`running`:t.status===`exited`?`exited`:`killed`,logPath:t.logPath,port:t.port,url:t.url,startedAt:t.lastUsed}},get:e=>{let t=E.get(e);return t?{id:t.id,sessionId:t.config.sessionId??``,pid:t.pid??-1,command:t.command,status:t.status===`running`?`running`:t.status===`exited`?`exited`:`killed`,logPath:t.logPath,port:t.port,url:t.url,startedAt:t.lastUsed}:void 0},getForSession:(e,t)=>{let n=E.getForSession(e,t);return n?{id:n.id,sessionId:e,pid:n.pid??-1,command:n.command,status:n.status===`running`?`running`:n.status===`exited`?`exited`:`killed`,logPath:n.logPath,port:n.port,url:n.url,startedAt:n.lastUsed}:void 0},listForSession:e=>E.listForSession(e).map(t=>({id:t.id,sessionId:e,pid:t.pid??-1,command:t.command,status:t.status===`running`?`running`:t.status===`exited`?`exited`:`killed`,logPath:t.logPath,port:t.port,url:t.url,startedAt:t.lastUsed})),kill:e=>E.kill(e),updateDetectedService:(e,t)=>E.updateDetectedService(e,t)}:{register:e=>{let t=E.registerChild({command:e.command,cwd:e.cwd,logPath:e.logPath,port:e.port,url:e.url,owner:{type:`app`,id:`default`},sessionId:e.sessionId,category:`shell`,label:e.command,lifecycle:`evictable`},e.child);return{id:t.id,sessionId:e.sessionId,pid:t.pid??-1,command:t.command,status:t.status===`running`?`running`:t.status===`exited`?`exited`:`killed`,logPath:t.logPath,port:t.port,url:t.url,startedAt:t.lastUsed}},get:e=>{let t=E.get(e);return t?{id:t.id,sessionId:t.config.sessionId??``,pid:t.pid??-1,command:t.command,status:t.status===`running`?`running`:t.status===`exited`?`exited`:`killed`,logPath:t.logPath,port:t.port,url:t.url,startedAt:t.lastUsed}:void 0},getForSession:(e,t)=>{let n=E.getForSession(e,t);return n?{id:n.id,sessionId:e,pid:n.pid??-1,command:n.command,status:n.status===`running`?`running`:n.status===`exited`?`exited`:`killed`,logPath:n.logPath,port:n.port,url:n.url,startedAt:n.lastUsed}:void 0},listForSession:e=>E.listForSession(e).map(t=>({id:t.id,sessionId:e,pid:t.pid??-1,command:t.command,status:t.status===`running`?`running`:t.status===`exited`?`exited`:`killed`,logPath:t.logPath,port:t.port,url:t.url,startedAt:t.lastUsed})),kill:e=>E.kill(e),updateDetectedService:(e,t)=>E.updateDetectedService(e,t)};return{orchestration:{dispatchTask:t.dispatchTask,getTask:t.getTask,listTasks:t.listTasks,updateTask:t.updateTask,getBackgroundOutput:t.getBackgroundOutput,cancelBackground:t.cancelBackground,writeTodos:n,startJob:e.startJob},agents:{callAgent:t.callAgent},fork:{fork:async(t,n,r)=>({ok:!0,value:(await e.runSession({prompt:t,sessionMode:`ephemeral`,depth:n,signal:r})).text})},skills:r?{loadSkill:e=>r.load(e),executeSkill:(e,t)=>r.execute(e,t)}:void 0,memory:i?{recordMemory:async e=>{await i.record(e,e.scope),e.scope===`project-shared`&&a&&await a()},readMemory:e=>i.read(e),archive:o?{read:e=>o.readArchive(e),list:e=>o.listArchives(e)}:void 0}:void 0,team:{runTeam:e.runTeam},session:{manager:{list:async()=>e.sessions.list().map(e=>({id:e.id,title:e.id,messageCount:e.messageCount})),create:async()=>({id:(await e.sessions.create()).id}),remove:async t=>e.sessions.remove(t),compact:async t=>{let n=e.sessions.get(t);return n?(await n.compactNow(),!0):!1}}},features:{listModels:e.listModels,grill:(t,n)=>{let r=e.sessions.get(t);return r?r.requestGrill(n):Promise.resolve({answer:n.recommendation,acceptedRecommendation:!0,resolvedBy:`auto_recommendation`})},enableLsp:e.enableLsp,sandbox:e.sandbox,processRegistry:c,captureFileState:async t=>{let n=await e.fileStateManager.capture({workspaceDir:e.workspaceDir,recentFiles:t.recentFiles,planStatus:t.planStatus});return{success:!0,summary:e.fileStateManager.formatSnapshot(n),timestamp:n.timestamp}},learn:async t=>{let{lesson:n,deduped:r}=await(t.scope===`local`?e.localLearningStore??e.learningStore:e.learningStore).saveDeduped({tags:t.tags,trigger:t.trigger,insight:t.insight,sourceSessionId:t.sessionId});return{success:!0,lessonId:n.id,deduped:r}}},schedule:e.schedule?{create:e.schedule.create,list:e.schedule.list,delete:e.schedule.delete,run:e.schedule.run,cancel:e.schedule.cancel}:void 0,capabilityGap:e.searchEcosystem?{search:e.searchEcosystem,...e.capabilityGapRecorder?{recorder:e.capabilityGapRecorder}:{}}:void 0}}function Dp(e,t){return k({name:A.toolGuidance.name,timing:`system.prompt.transform`,priority:A.toolGuidance.priority,handle:async(n,r)=>{let i=e.buildToolGuidance(t());if(i){let e=_a(A.toolGuidance.name,i);r.systemPrompt=`${r.systemPrompt}\n\n${e}`}}})}function Op(e){let t=C(e,`docs/rfc/RFC-284-core-pack/content.txt`);if(!v(t))return;let n=b(t,`utf8`).trim();return n.length>0?n:void 0}function kp(e){let t=C(e,`docs/rfc/RFC-284-governance-plan.json`);if(!v(t))return new Map;let n=JSON.parse(b(t,`utf8`));return new Map((n.decisions??[]).map(e=>[e.key,e]))}function Ap(e){return new Set(e.toLowerCase().split(/[^\p{L}\p{N}._/-]+/u).filter(e=>e.length>=3))}function jp(e){let t=0;for(let n of e)/[\u3000-\u9fff\uff00-\uffef]/.test(n)&&t++;return Math.ceil(t+(e.length-t)/4)}function Mp(e,t){let n=Ap(t);if(n.size===0)return 0;let r=0,i=e.tags??[];for(let e of i)n.has(e.toLowerCase())&&(r+=3);let a=Ap(`${e.trigger} ${e.insight}`);for(let e of n)a.has(e)&&(r+=1);return r}function Np(e){return e.size>0?{mode:`governance`,decisions:e}:{mode:`safe-default`}}function Pp(e){return!!e.contentHash&&jt({tags:e.tags??[],trigger:e.trigger,insight:e.insight})===e.contentHash}function Fp(e){return!(!Pp(e)||e.supersededBy||(e.relevantHitCount??0)<1)}function Ip(e,t,n){if(!n)return;let r=Np(t),i=e.map(e=>{if(r.mode===`governance`){let t=`workspace:${e.id}`,n=r.decisions.get(t);if(!n||n.class!==`fact`||n.state!==`active`||n.supersededBy)return}else if(!Fp(e))return;let t=Mp(e,n);if(t<=0)return;let i=r.mode===`safe-default`&&e.class===`fact`?2:0,a=`[${e.tags.join(`, `)}] ${e.trigger} → ${e.insight}`;return{lesson:e,score:t,priority:t+i,text:a,tokens:jp(a)}}).filter(e=>!!e).sort((e,t)=>t.priority-e.priority||e.tokens-t.tokens||e.lesson.id.localeCompare(t.lesson.id)),a=[],o=0;for(let e of i)if(!(o+e.tokens>1024)&&(a.push(e),o+=e.tokens,a.length>=3))break;if(a.length!==0)return{text:[`### Relevant Lesson Hints`,`Query-specific volatile hints selected from RFC-284 fact lessons:`,...a.map((e,t)=>`${t+1}. workspace:${e.lesson.id} score=${e.score} ${e.text}`)].join(`
481
- `),hitIds:a.map(e=>e.lesson.id),lessons:a.map(e=>e.lesson)}}function Lp(e){return[...e].sort((e,t)=>(t.relevantHitCount??0)-(e.relevantHitCount??0)||(t.createdAt??0)-(e.createdAt??0))}function Rp(e,t,n,r={},i){let a=r.workspaceDir??process.cwd(),o=dn({name:A.agentKnowledge.name,compute:async()=>{let r=Op(a),o=r?_a(A.agentKnowledge.name,r):void 0,s=n?await n.list():[],c;if(o){let e=s.length>0?await t.loadRuntimeLessonsTemplate()??void 0:void 0;c=[o,s.length>0?Kn(Lp(s),e):``].filter(e=>e.length>0).join(`
477
+ If the image is not a UI/design screenshot, give a normal concise description instead. Do not speculate beyond what's visible.`;var zf=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?`${Rf}\n\nContext: ${t.contextHint}`:Rf},{type:`image`,mime:t.mime,source:t.source}]},a=new AbortController,o=setTimeout(()=>a.abort(),3e4),s=n?AbortSignal.any([n,a.signal]):a.signal;try{return(await te(e,r,{model:e,systemPrompt:``,messages:[i],maxTokens:800},{signal:s})).content.filter(e=>e.type===`text`).map(e=>e.text).join(``).trim()||void 0}finally{clearTimeout(o)}}formatDescription(e,t){return`[image seen by vision model ${e.id}]\n${t}`}hashImage(e){return Ii(`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 Bf(e){let t=e?.slots?.vision;if(t)return Array.isArray(t)?t:[t]}function Vf(e,t){globalThis[e]||Object.defineProperty(globalThis,e,{value:Object.freeze(t()),writable:!1,configurable:!1})}var Hf=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,Vf(`__ottoPanelRuntime`,()=>({callMcpTool:(e,t,n)=>this.callMcpTool(e,t,n),usePluginData:Uf(this)}))}};function Uf(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 Wf=new Hf;function Gf(e){Wf.install(e)}const Kf=`backend/`;function qf(e){return e.startsWith(Kf)?e:`${Kf}${e}`}var Jf=class{fns=null;get(){return this.fns}install(e){this.fns=e,Vf(`__ottoPanelBackendRuntime`,()=>({usePanelBackend:Xf(this)}))}};function Yf(){return globalThis.__ottoCurrentPanelPluginId}function Xf(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=Yf(),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,qf(e),t,i)},[n]),cancel:t.useCallback(e=>{!n||!r||r.cancel(n,e)},[n]),state:i,status:o}}}const Zf=new Jf;function Qf(e){Zf.install(e)}function $f(){let e=process.env.LC_ALL||process.env.LC_MESSAGES||process.env.LANG||``;return/zh/i.test(e)?`zh`:`en`}function ep(e){return!e||e===`auto`?$f():e}var tp=class{loadedPluginIds=[];previousSnapshot=[];constructor(e){this.deps=e}async reload(){let e=0,t=0,n=[],r=new Map;for(let e of this.deps.activePlugins()){let i=!!e.manifest.contributes?.oauth?.length,a=!!e.manifest.contributes?.providers?.length;if(!i&&!a)continue;let o=O(e);if(o.gated){this.deps.logger.warn({pluginId:e.id},`project plugin not trusted, skipping declarative providers (fail-closed, RFC-124 C1)`),t+=(e.manifest.contributes?.providers?.length??0)+(e.manifest.contributes?.oauth?.length??0);continue}if(o.pendingCapabilities.includes(`provider`)){this.deps.logger.warn({pluginId:e.id},`plugin capability "provider" declared but not yet granted, skipping declarative providers (fail-closed, RFC-124 C2)`),t+=(e.manifest.contributes?.providers?.length??0)+(e.manifest.contributes?.oauth?.length??0),n.push(e.id);continue}r.set(e.id,e.manifest)}let i=e=>JSON.stringify(e),a=[],o=new Map,s=new Map;for(let e of this.previousSnapshot){let t=r.get(e.id);if(t!==void 0&&i(t)!==i(e.manifest)){let n=yd(e.id,e.manifest),r=yd(e.id,t),i=new Set([...n].filter(e=>r.has(e)));i.size>0&&o.set(e.id,i);let a=bd(e.id,e.manifest),c=bd(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 kd(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=Od(n,l,this.deps,o.get(n),s.get(n));e+=r.registered.length,t+=r.rejected.length;for(let e of r.rejected)this.deps.onProviderRejected?.(e);a.push({id:n,manifest:l})}return this.previousSnapshot=a,this.loadedPluginIds=a.map(e=>e.id),{registered:e,rejected:t,pendingCapabilityPluginIds:n}}get activePluginIds(){return this.loadedPluginIds}async cleanup(){for(let{id:e,manifest:t}of this.previousSnapshot)await kd(e,t,this.deps);this.previousSnapshot=[],this.loadedPluginIds=[]}};function np(e,n){if(!e)return{devtools:null,logSubscription:null};let r=new t;return{devtools:r,logSubscription:pt(e=>{if(typeof e==`object`&&e&&`name`in e&&`level`in e&&`msg`in e){let t=e;t.name===n&&r.sendLog(t)}})}}var rp=class{registry;auditLog;constructor(e,t){let n=Ne(e.getAll());this.auditLog=new xe,this.registry=Me({toolSets:n}),t.register(Ae(this.registry,this.auditLog))}};const ip=T(`@x-otto/coding:plugin-context-sources`),ap=64*1024;function op(e,t,n){let r=w(t,n);if(!Ac(r,t)){ip.warn({pluginId:e,file:n},`contextSources.content.file resolves outside plugin dir, skipped`);return}try{let e=b(r,`utf8`);return Buffer.byteLength(e,`utf8`)>ap?`${e.slice(0,ap)}\n<!-- truncated -->`:e}catch(t){ip.warn({pluginId:e,file:n,err:String(t)},`contextSources.content.file read failed, skipped`);return}}function sp(e){let t=[];for(let n of e){if(O(n).gated)continue;let e=n.manifest.contributes?.contextSources;if(e?.length){if(!n.manifest.capabilities?.includes(`context`)){ip.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:op(n.id,n.dir,r.content.file);if(e!=null)return`<!-- plugin:${n.id} -->\n${e}`}})}}return t}function cp(e,t,n){let r=0;for(let i of t)try{e.register(i),r+=1}catch(e){n.warn({sourceId:i.id,err:e instanceof Error?e.message:String(e)},`plugin context source skipped: duplicate id (builtin or another plugin already registered it)`)}return r}function lp(e){Sn();let t=e.jobStateDir?new Ut(e.jobStateDir):void 0;t&&hn.setStateStore(t),xn(void 0,e.repoRoot,t);let n=(t,n)=>{e.hasSession(n.sessionId)&&e.emitHook(t,n).catch(n=>{e.logger.warn({err:n instanceof Error?n.message:String(n),timing:t},`Failed to emit process lifecycle hook`)})};return[E.onSpawn(t=>{e.logger.info({id:t.id,pid:t.pid,command:t.command,port:t.port},`Background process started`),n(`process.spawned`,{sessionId:t.config.sessionId,processId:t.id,pid:t.pid,command:t.command,port:t.port})}),E.onExit(t=>{e.logger.info({id:t.id,pid:t.pid,status:t.status},`Background process exited`),n(`process.exited`,{sessionId:t.config.sessionId,processId:t.id,pid:t.pid,command:t.command,status:t.status})})]}const up=2e4,dp=(e,t)=>{let n=ea(`git`,[...e],{cwd:t,timeout:1e4,encoding:`utf-8`,maxBuffer:4194304});return n.error||n.status!==0?null:n.stdout??``};function fp(e){return e.length<=up?e:`${e.slice(0,up)}\n[...truncated ${e.length-up} chars...]`}function pp(e,t,n,r){let i=w(e),a=ct(t)?t:w(i,t);if(a!==i&&!a.startsWith(`${i}/`)||!v(a)||!tt(a).isFile())return null;let o;try{o=b(a,`utf-8`)}catch{return null}if(o.includes(`\0`))return null;let s=o.split(`
478
+ `),c=Math.max(1,n);if(c>s.length)return null;let l=Math.min(s.length,r>0?r:n);return fp(s.slice(c-1,l).join(`
479
+ `))}function mp(e,t,n,r=14){let i=n([`grep`,`-nE`,`(function|class|interface|type|enum|const|let|var|def|fn|struct|func)[[:space:]]+${t.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}`],e);if(i===null||!i.trim())return null;let a=/^(.+?):(\d+):/.exec(i.split(`
480
+ `)[0]??``);if(!a)return null;let o=parseInt(a[2],10);return pp(e,a[1],o,o+r)}function hp(e){let t=e?.gitRunner??dp;return[{id:`file-range`,resolve:(e,t)=>{let n=/^([\w./-]+):(\d+)(?:-(\d+))?$/.exec(e);if(!n)return``;let r=pp(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=mp(n.workspaceDir,e,t);return r===null?``:`\n\n@def:${e}:\n\`\`\`\n${r}\n\`\`\`\n`}}]}function gp(e){return{sandbox:new oo(e.logger),memoryGovernor:new Wt({logger:e.logger}),residencyGovernor:new Kt,fleetMonitor:new Vt({logger:e.logger}),permissionSync:new ao({logger:e.logger,getToolRegistry:e.getToolRegistry,getPermissionRegistry:e.getPermissionRegistry}),hookRegistry:e.hookRegistry??ta({preset:`default`,onHookTimeout:e.onHookTimeout})}}function _p(e){let t=np(e.inspect,e.loggerName),n=t.devtools,r=t.logSubscription,i=new Di({workspaceDir:e.workspaceDir,projectConfigPath:e.projectConfigPath,projectConfigTrusted:()=>Pi(e.workspaceDir,{interactive:e.interactive})});return i.on(`change`,t=>{e.onSettingsApplied(t),e.permissionSync.sync(t),e.sandbox.applySetting(e.sandbox.resolveConfig(t));let n=t.proxy,r=n?.enabled!==!1&&n?.url?n.url:void 0;bt(r),gt(r),e.getI18nRegistry().setLocale(ep(t.language))}),{devtools:n,logSubscription:r,settings:i}}function vp(e){let t=new zf({getModelRegistry:e.getModelRegistry,providerRegistry:e.providerRegistry,getVisionSlotCandidates:()=>Bf(e.getSettings().get(`model_slots`)),isModelUsable:e.isModelUsable,logger:e.logger});return{visionDelegateService:t,sessionConfigResolver:new Jo({settings:e.getSettings(),promptManager:e.promptManager,getModelRegistry:e.getModelRegistry,getTools:e.getTools,getDeclarativeAgentProfiles:e.getDeclarativeAgentProfiles,defaultModel:e.defaultModel,explicitModelSpec:e.explicitModelId,hasCredential:t=>e.providerRegistry.hasCredential(t),isModelUsable:e.isModelUsable,maxToolTurns:e.maxToolTurns,maxToolTurnExtensions:e.maxToolTurnExtensions,promptOutputTokenBudget:e.promptOutputTokenBudget,promptWallClockBudgetMs:e.promptWallClockBudgetMs,sessionCostBudgetUSD:e.sessionCostBudgetUSD,stallDetection:e.stallDetection,workspaceDir:e.workspaceDir,getWorkspaceId:()=>e.getWorkspaceRef()?.id??e.workspaceId,logger:e.logger,describeImages:t.describeImages,getResilienceConfig:e.getResilienceConfig})}}function yp(e){let t=Af(e.options,{hookRegistry:e.hookRegistry,providerRegistry:e.providerRegistry,modelRegistry:e.getModelRegistry(),logger:e.logger,workspaceDir:e.workspaceDir,getTools:e.getTools,getDeclarativeAgentProfiles:e.getDeclarativeAgentProfiles,getWorkspaceKey:()=>e.getWorkspaceRef()?.key,repoRef:e.repoRef,maxToolTurns:e.maxToolTurns,promptManager:e.promptManager,memory:e.memory,traceStore:e.traceStore,checkpointStore:e.checkpointStore,clock:e.clock,devtools:e.devtools??void 0,residencyGovernor:e.residencyGovernor,getResidencyConfig:e.getResidencyConfig,planeRegistry:e.planeRegistry,semanticReviewer:e.semanticReviewer},e.resolveEffectiveModel),n=t.sessions;return{agentRuntime:t,codingSessionPool:n,swarmAgentRunner:Pf({hookRegistry:e.hookRegistry,stream:n.stream,logger:e.logger,defaultModel:e.defaultModel,getTools:e.getTools,getDeclarativeAgentProfiles:e.getDeclarativeAgentProfiles}),defaultModel:e.defaultModel}}function bp(e){let{runSession:t,abortTask:n}=ys({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:Lf({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:ga()}}function xp(e){Gf(e.callMcpTool);let t=new Yc({mcpController:e.mcpController,getActivePlugins:e.getActivePlugins});return Qf({call:(e,n,r,i)=>t.call(e,n,r,i),cancel:(e,n)=>{t.cancel(e,n)},subscribeState:(e,n)=>t.subscribeState(e,n),getStatus:e=>t.getStatus(e),onStatusChange:(e,n)=>t.onStatusChange(e,n)}),{panelBackendController:t}}function Sp(e){let t=new Yu((t,n)=>{let r=e.activePlugins().find(e=>e.id===t);return r?(r.manifest.capabilities??[]).includes(n):!1}),n=new cf({hookRegistry:e.hookRegistry,skillRegistry:e.skillRegistry,providerRegistry:e.providerRegistry,wireProtocolRegistry:e.wireProtocolRegistry,modelRegistry:e.modelRegistry,authStore:e.authStore,toolRegistry:e.toolRegistry,feedbackRegistry:e.feedbackRegistry,sigilResolverRegistry:e.sigilResolverRegistry,pluginInput:e.pluginInput,workspaceDir:e.workspaceDir,activePlugins:e.activePlugins,callMcpTool:e.callMcpTool,logger:e.logger,eventDispatcher:t,startPluginJob:e.startPluginJob,getSessionId:e.getPluginJobSessionId,getWorkspaceKey:e.getWorkspaceKey,getSessionMessages:e.getSessionMessages,completeText:e.completeText,capabilityQuota:e.capabilityQuota,askUser:e.askUser,onPluginLoadError:e.onPluginLoadError,...e.getSchedulePort?{getSchedulePort:e.getSchedulePort}:{},...e.getSettingValue?{getSettingValue:e.getSettingValue}:{},...e.notifyUser?{notifyUser:e.notifyUser}:{},...e.planeRegistry?{planeRegistry:e.planeRegistry}:{}}),r=new tp({providerRegistry:e.providerRegistry,authStore:e.authStore,modelRegistry:e.modelRegistry,wireProtocolRegistry:e.wireProtocolRegistry,getProviderOverrides:()=>e.settings.get(`provider_overrides`),activePlugins:e.activePlugins,logger:e.logger,...e.onPluginLoadError?{onProviderRejected:t=>e.onPluginLoadError(t.pluginId,`provider entry "${t.id}" rejected: ${t.reason}`,`provider-rejected`)}:{}});return e.i18nRegistry.register(Fc(e.activePlugins())),{pluginModuleManager:n,pluginProviderManager:r,capabilityReloader:new qc(e.settings,e.mcpController,e.skillRegistryForReloader,n,r,e.toolRegistry,e.modelCatalogManager,e.workspaceDir,e.getActivePluginsForReloader,e.i18nRegistry,e.getCompatTrustGated)}}function Cp(e){return{toolsSyncCoordinator:new rc({sessionConfigResolver:e.sessionConfigResolver,getSession:e.getSession,listSessionIds:e.listSessionIds,logger:e.logger}),pluginContributionsFacade:new vc({getWorkspaceDir:()=>e.workspaceDir,settings:e.settings,getActivePlugins:e.getActivePlugins,pluginModuleManager:e.pluginModuleManager,mcpController:e.mcpController,compatProducts:e.compatProducts})}}function wp(e){let t=new Set(e.hookRegistry.getRegistered().map(e=>e.name)),n=new rp(e.toolRegistry,e.hookRegistry),r=new po(e.settings,e.toolRegistry,e.logger,e.workspaceDir,e.getResilienceConfig,e.compatProducts);return{permissionRegistry:n.registry,auditLog:n.auditLog,mcpController:r,preExistingHooks:t}}function Tp(e){return new vo({settings:e.settings,mcp:e.mcpController,skills:e.skillRegistry,getAgentProfiles:()=>e.declarativeAgentProfiles,getPlugins:()=>_r({cwd:e.workspaceDir,homedir:e.pluginHomedir,bundledDirs:e.pluginBundledDirs}),processRuntime:E,onPluginToggle:e.onPluginToggle})}function Ep(e){e.pluginInput.register(ur()),e.pluginInput.registerProvider(`@`,fr({cwd:e.workspaceDir})),e.sigilResolvers.register(hp(),`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=id(e.activePlugins());t.length>0&&e.pluginInput.register(t),ad(e.activePlugins());for(let t of sp(e.activePlugins()))cp(e.agentRuntime.contextSources,[t],e.logger);return e.registerHooks(),{ownedHookNames:e.hookRegistry.getRegistered().map(e=>e.name).filter(t=>!e.preExistingHooks.has(t)),processRegistryUnsubs:lp({hasSession:t=>!!e.codingSessionPoolGet(t),emitHook:(t,n)=>e.hookRegistry.emit(t,n),logger:e.logger,repoRoot:e.workspaceDir,jobStateDir:c()?void 0:`${r}/jobs/state`})}}async function Dp(e,t,n){t()||(await e.load(),n(!0))}function Op(e){for(let t of e)try{t.apply()}catch(e){throw Error(`deferred config step "${t.label}" failed: ${e.message}`,{cause:e})}}function kp(e){let t=typeof e==`function`?{getPermissionMode:e}:e;return async(e,n,r,i)=>{if(t.getPermissionMode()===`bypass`)return`allow`;if(t.isSemanticReviewEnabled?.()===!0&&t.createLlmReviewer){let a=t.resolveReviewModel?.();if(a)return await t.createLlmReviewer(a)(e,n,r,i)}return`abstain`}}function Ap(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,validateScheduleModelId:e.validateScheduleModelId,startJob:e.startJob,schedule:fa(e.getScheduleService,{validateModelId:e.validateScheduleModelId}),searchEcosystem:e.searchEcosystem}}function jp(e){let{orchestrator:t,writeTodos:n,skillProvider:r,autoMemory:i,reloadMemory:a,archiveRecall:o}=e,s=e.processOwner,c=s?{register:e=>{let t=E.registerChild({command:e.command,cwd:e.cwd,logPath:e.logPath,port:e.port,url:e.url,owner:{type:`app`,id:s},sessionId:e.sessionId,category:`shell`,label:e.command,lifecycle:`evictable`},e.child);return{id:t.id,sessionId:e.sessionId,pid:t.pid??-1,command:t.command,status:t.status===`running`?`running`:t.status===`exited`?`exited`:`killed`,logPath:t.logPath,port:t.port,url:t.url,startedAt:t.lastUsed}},get:e=>{let t=E.get(e);return t?{id:t.id,sessionId:t.config.sessionId??``,pid:t.pid??-1,command:t.command,status:t.status===`running`?`running`:t.status===`exited`?`exited`:`killed`,logPath:t.logPath,port:t.port,url:t.url,startedAt:t.lastUsed}:void 0},getForSession:(e,t)=>{let n=E.getForSession(e,t);return n?{id:n.id,sessionId:e,pid:n.pid??-1,command:n.command,status:n.status===`running`?`running`:n.status===`exited`?`exited`:`killed`,logPath:n.logPath,port:n.port,url:n.url,startedAt:n.lastUsed}:void 0},listForSession:e=>E.listForSession(e).map(t=>({id:t.id,sessionId:e,pid:t.pid??-1,command:t.command,status:t.status===`running`?`running`:t.status===`exited`?`exited`:`killed`,logPath:t.logPath,port:t.port,url:t.url,startedAt:t.lastUsed})),kill:e=>E.kill(e),updateDetectedService:(e,t)=>E.updateDetectedService(e,t)}:{register:e=>{let t=E.registerChild({command:e.command,cwd:e.cwd,logPath:e.logPath,port:e.port,url:e.url,owner:{type:`app`,id:`default`},sessionId:e.sessionId,category:`shell`,label:e.command,lifecycle:`evictable`},e.child);return{id:t.id,sessionId:e.sessionId,pid:t.pid??-1,command:t.command,status:t.status===`running`?`running`:t.status===`exited`?`exited`:`killed`,logPath:t.logPath,port:t.port,url:t.url,startedAt:t.lastUsed}},get:e=>{let t=E.get(e);return t?{id:t.id,sessionId:t.config.sessionId??``,pid:t.pid??-1,command:t.command,status:t.status===`running`?`running`:t.status===`exited`?`exited`:`killed`,logPath:t.logPath,port:t.port,url:t.url,startedAt:t.lastUsed}:void 0},getForSession:(e,t)=>{let n=E.getForSession(e,t);return n?{id:n.id,sessionId:e,pid:n.pid??-1,command:n.command,status:n.status===`running`?`running`:n.status===`exited`?`exited`:`killed`,logPath:n.logPath,port:n.port,url:n.url,startedAt:n.lastUsed}:void 0},listForSession:e=>E.listForSession(e).map(t=>({id:t.id,sessionId:e,pid:t.pid??-1,command:t.command,status:t.status===`running`?`running`:t.status===`exited`?`exited`:`killed`,logPath:t.logPath,port:t.port,url:t.url,startedAt:t.lastUsed})),kill:e=>E.kill(e),updateDetectedService:(e,t)=>E.updateDetectedService(e,t)};return{orchestration:{dispatchTask:t.dispatchTask,getTask:t.getTask,listTasks:t.listTasks,updateTask:t.updateTask,getBackgroundOutput:t.getBackgroundOutput,cancelBackground:t.cancelBackground,writeTodos:n,startJob:e.startJob},agents:{callAgent:t.callAgent},fork:{fork:async(t,n,r)=>({ok:!0,value:(await e.runSession({prompt:t,sessionMode:`ephemeral`,depth:n,signal:r})).text})},skills:r?{loadSkill:e=>r.load(e),executeSkill:(e,t)=>r.execute(e,t)}:void 0,memory:i?{recordMemory:async e=>{await i.record(e,e.scope),e.scope===`project-shared`&&a&&await a()},readMemory:e=>i.read(e),archive:o?{read:e=>o.readArchive(e),list:e=>o.listArchives(e)}:void 0}:void 0,team:{runTeam:e.runTeam},session:{manager:{list:async()=>e.sessions.list().map(e=>({id:e.id,title:e.id,messageCount:e.messageCount})),create:async()=>({id:(await e.sessions.create()).id}),remove:async t=>e.sessions.remove(t),compact:async t=>{let n=e.sessions.get(t);return n?(await n.compactNow(),!0):!1}}},features:{listModels:e.listModels,grill:(t,n)=>{let r=e.sessions.get(t);return r?r.requestGrill(n):Promise.resolve({answer:n.recommendation,acceptedRecommendation:!0,resolvedBy:`auto_recommendation`})},enableLsp:e.enableLsp,sandbox:e.sandbox,processRegistry:c,captureFileState:async t=>{let n=await e.fileStateManager.capture({workspaceDir:e.workspaceDir,recentFiles:t.recentFiles,planStatus:t.planStatus});return{success:!0,summary:e.fileStateManager.formatSnapshot(n),timestamp:n.timestamp}},learn:async t=>{let{lesson:n,deduped:r}=await(t.scope===`local`?e.localLearningStore??e.learningStore:e.learningStore).saveDeduped({tags:t.tags,trigger:t.trigger,insight:t.insight,sourceSessionId:t.sessionId});return{success:!0,lessonId:n.id,deduped:r}}},schedule:e.schedule?{create:e.schedule.create,list:e.schedule.list,delete:e.schedule.delete,run:e.schedule.run,cancel:e.schedule.cancel}:void 0,capabilityGap:e.searchEcosystem?{search:e.searchEcosystem,...e.capabilityGapRecorder?{recorder:e.capabilityGapRecorder}:{}}:void 0}}function Mp(e,t){return A({name:j.toolGuidance.name,timing:`system.prompt.transform`,priority:j.toolGuidance.priority,handle:async(n,r)=>{let i=e.buildToolGuidance(t());if(i){let e=_a(j.toolGuidance.name,i);r.systemPrompt=`${r.systemPrompt}\n\n${e}`}}})}function Np(e){let t=C(e,`docs/rfc/RFC-284-core-pack/content.txt`);if(!v(t))return;let n=b(t,`utf8`).trim();return n.length>0?n:void 0}function Pp(e){let t=C(e,`docs/rfc/RFC-284-governance-plan.json`);if(!v(t))return new Map;let n=JSON.parse(b(t,`utf8`));return new Map((n.decisions??[]).map(e=>[e.key,e]))}function Fp(e){return new Set(e.toLowerCase().split(/[^\p{L}\p{N}._/-]+/u).filter(e=>e.length>=3))}function Ip(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 Lp(e,t){let n=Fp(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=Fp(`${e.trigger} ${e.insight}`);for(let e of n)a.has(e)&&(r+=1);return r}function Rp(e){return e.size>0?{mode:`governance`,decisions:e}:{mode:`safe-default`}}function zp(e){return!!e.contentHash&&jt({tags:e.tags??[],trigger:e.trigger,insight:e.insight})===e.contentHash}function Bp(e){return!(!zp(e)||e.supersededBy||(e.relevantHitCount??0)<1)}function Vp(e,t,n){if(!n)return;let r=Rp(t),i=e.map(e=>{if(r.mode===`governance`){let t=`workspace:${e.id}`,n=r.decisions.get(t);if(!n||n.class!==`fact`||n.state!==`active`||n.supersededBy)return}else if(!Bp(e))return;let t=Lp(e,n);if(t<=0)return;let i=r.mode===`safe-default`&&e.class===`fact`?2:0,a=`[${e.tags.join(`, `)}] ${e.trigger} → ${e.insight}`;return{lesson:e,score:t,priority:t+i,text:a,tokens:Ip(a)}}).filter(e=>!!e).sort((e,t)=>t.priority-e.priority||e.tokens-t.tokens||e.lesson.id.localeCompare(t.lesson.id)),a=[],o=0;for(let e of i)if(!(o+e.tokens>1024)&&(a.push(e),o+=e.tokens,a.length>=3))break;if(a.length!==0)return{text:[`### Relevant Lesson Hints`,`Query-specific volatile hints selected from RFC-284 fact lessons:`,...a.map((e,t)=>`${t+1}. workspace:${e.lesson.id} score=${e.score} ${e.text}`)].join(`
481
+ `),hitIds:a.map(e=>e.lesson.id),lessons:a.map(e=>e.lesson)}}function Hp(e){return[...e].sort((e,t)=>(t.relevantHitCount??0)-(e.relevantHitCount??0)||(t.createdAt??0)-(e.createdAt??0))}function Up(e,t,n,r={},i){let a=r.workspaceDir??process.cwd(),o=fn({name:j.agentKnowledge.name,compute:async()=>{let r=Np(a),o=r?_a(j.agentKnowledge.name,r):void 0,s=n?await n.list():[],c;if(o){let e=s.length>0?await t.loadRuntimeLessonsTemplate()??void 0:void 0;c=[o,s.length>0?qn(Hp(s),e):``].filter(e=>e.length>0).join(`
482
482
 
483
- `)||void 0}else{let n=Lp([...await e.list(),...s]);n.length>0&&(c=Kn(n,await t.loadRuntimeLessonsTemplate()??void 0)||void 0)}let l;if(i){let e=i.getMemoryPrompt().trim();e&&(l=e.replace(/^<agent_memory>\s*/,``).replace(/\s*<\/agent_memory>\s*$/,``).trim()||void 0)}if(!l&&!c)return;let u=[`<agent_knowledge>`];return l&&(u.push(`<memory>`),u.push(l),u.push(`</memory>`)),c&&(u.push(`<lessons>`),u.push(c),u.push(`</lessons>`)),u.push(`</agent_knowledge>`),u.join(`
484
- `)}}),s=k({name:`lesson-relevant-hints`,timing:`system.prompt.transform`,priority:A.agentKnowledge.priority+1,handle:async(t,n)=>{if(!t.userText)return;let i=r.governanceDecisions??kp(a),o=Ip(await e.list(),i,t.userText);o&&(await e.recordRelevantHits(o.hitIds),r.evolutionSignals?.appendRelevantHits(o.lessons),n.systemTail=[...n.systemTail??[],_a(A.lessonRelevantHints.name,o.text)])}});return[...o,s]}function zp(e){return dn({name:A.skillCatalog.name,compute:()=>{let t=e.buildCatalog();if(t)return`${t}\n\nUse the skill tool with a skill name to load its full instructions.`}})}const Bp={enabled:!1,minExecutions:3,minSuccessRate:.5,maxInternalized:3};function Vp(e,...t){let n=e.split(/[\\/]+/);return n.some((e,r)=>t.every((e,t)=>n[r+t]===e))}function Hp(e){return Vp(e.root,`.claude`,`skills`)||e.type===`plugin`?!1:e.type===`project`?Vp(e.root,`.otto`,`skills`):!0}function Up(e,t,n){if(!n.enabled||n.minExecutions<=0||n.maxInternalized<=0)return[];let r=new Map(t.map(e=>[e.name,e]));return e.filter(e=>Hp(e.source)).map(e=>{let t=r.get(e.definition.metadata.name);if(!t||t.executions<n.minExecutions)return;let i=t.successes/t.executions;if(!(i<n.minSuccessRate))return{skill:e,aggregate:t,successRate:i}}).filter(e=>!!e).sort((e,t)=>t.aggregate.executions-e.aggregate.executions||e.skill.definition.metadata.name.localeCompare(t.skill.definition.metadata.name)).slice(0,n.maxInternalized)}const Wp=`
485
- [内化摘录被截断:正文尾部指令(如「每次结束时…」类)可能缺失,完整指令经 skill 工具按需取回]`;function Gp(e){let t=e.split(`
483
+ `)||void 0}else{let n=Hp([...await e.list(),...s]);n.length>0&&(c=qn(n,await t.loadRuntimeLessonsTemplate()??void 0)||void 0)}let l;if(i){let e=i.getMemoryPrompt().trim();e&&(l=e.replace(/^<agent_memory>\s*/,``).replace(/\s*<\/agent_memory>\s*$/,``).trim()||void 0)}if(!l&&!c)return;let u=[`<agent_knowledge>`];return l&&(u.push(`<memory>`),u.push(l),u.push(`</memory>`)),c&&(u.push(`<lessons>`),u.push(c),u.push(`</lessons>`)),u.push(`</agent_knowledge>`),u.join(`
484
+ `)}}),s=A({name:`lesson-relevant-hints`,timing:`system.prompt.transform`,priority:j.agentKnowledge.priority+1,handle:async(t,n)=>{if(!t.userText)return;let i=r.governanceDecisions??Pp(a),o=Vp(await e.list(),i,t.userText);o&&(await e.recordRelevantHits(o.hitIds),r.evolutionSignals?.appendRelevantHits(o.lessons),n.systemTail=[...n.systemTail??[],_a(j.lessonRelevantHints.name,o.text)])}});return[...o,s]}function Wp(e){return fn({name:j.skillCatalog.name,compute:()=>{let t=e.buildCatalog();if(t)return`${t}\n\nUse the skill tool with a skill name to load its full instructions.`}})}const Gp={enabled:!1,minExecutions:3,minSuccessRate:.5,maxInternalized:3};function Kp(e,...t){let n=e.split(/[\\/]+/);return n.some((e,r)=>t.every((e,t)=>n[r+t]===e))}function qp(e){return Kp(e.root,`.claude`,`skills`)||e.type===`plugin`?!1:e.type===`project`?Kp(e.root,`.otto`,`skills`):!0}function Jp(e,t,n){if(!n.enabled||n.minExecutions<=0||n.maxInternalized<=0)return[];let r=new Map(t.map(e=>[e.name,e]));return e.filter(e=>qp(e.source)).map(e=>{let t=r.get(e.definition.metadata.name);if(!t||t.executions<n.minExecutions)return;let i=t.successes/t.executions;if(!(i<n.minSuccessRate))return{skill:e,aggregate:t,successRate:i}}).filter(e=>!!e).sort((e,t)=>t.aggregate.executions-e.aggregate.executions||e.skill.definition.metadata.name.localeCompare(t.skill.definition.metadata.name)).slice(0,n.maxInternalized)}const Yp=`
485
+ [内化摘录被截断:正文尾部指令(如「每次结束时…」类)可能缺失,完整指令经 skill 工具按需取回]`;function Xp(e){let t=e.split(`
486
486
  `),n=t.findIndex(e=>/^#+\s/.test(e));return(n>0?t.slice(0,n):t.slice(0,3)).join(`
487
- `).trim()}function Kp(e,t){let n=Gp(e);if(n===``)return``;if(ya(n)<=t)return n;let r=n.split(/\n\s*\n/).map(e=>e.trim()).filter(e=>e.length>0),i=t-ya(Wp),a=[],o=0;for(let e of r){let t=ya(e);if(o+t>i)break;a.push(e),o+=t}if(a.length>0)return a.join(`
487
+ `).trim()}function Zp(e,t){let n=Xp(e);if(n===``)return``;if(ya(n)<=t)return n;let r=n.split(/\n\s*\n/).map(e=>e.trim()).filter(e=>e.length>0),i=t-ya(Yp),a=[],o=0;for(let e of r){let t=ya(e);if(o+t>i)break;a.push(e),o+=t}if(a.length>0)return a.join(`
488
488
 
489
- `)+Wp;let[s]=r;return s===void 0?``:va({id:`internalize`,content:s},t).content}function qp(e){return[k({name:A.internalize.name,timing:`system.prompt.transform`,priority:A.internalize.priority,handle:async(t,n)=>{let r=e.getConfig();if(!r.enabled)return;let i=Up(e.registry.getAvailable(),e.registry.getAllSkillUsage(),r);if(i.length===0)return;let a=i.map(e=>{let{name:t}=e.skill.definition.metadata;return{candidate:e,name:t,excerpt:Kp(e.skill.definition.body,A.internalize.budgetBytes)}}).filter(e=>e.excerpt!==``);if(a.length===0)return;let o=[`## Internalized Skills`,`高频 skill 的指令核心(内化自 skill usage 信号,RFC-383;完整指令经 skill 工具按需取回):`,...a.map(({name:e,excerpt:t})=>`### Internalized Skill: ${e}\n${t}`)].join(`
489
+ `)+Yp;let[s]=r;return s===void 0?``:va({id:`internalize`,content:s},t).content}function Qp(e){return[A({name:j.internalize.name,timing:`system.prompt.transform`,priority:j.internalize.priority,handle:async(t,n)=>{let r=e.getConfig();if(!r.enabled)return;let i=Jp(e.registry.getAvailable(),e.registry.getAllSkillUsage(),r);if(i.length===0)return;let a=i.map(e=>{let{name:t}=e.skill.definition.metadata;return{candidate:e,name:t,excerpt:Zp(e.skill.definition.body,j.internalize.budgetBytes)}}).filter(e=>e.excerpt!==``);if(a.length===0)return;let o=[`## Internalized Skills`,`高频 skill 的指令核心(内化自 skill usage 信号,RFC-383;完整指令经 skill 工具按需取回):`,...a.map(({name:e,excerpt:t})=>`### Internalized Skill: ${e}\n${t}`)].join(`
490
490
 
491
- `);n.systemTail=[...n.systemTail??[],_a(A.internalize.name,o)];for(let{candidate:n,excerpt:r}of a)e.evolutionSignals?.append({kind:`internalize`,key:n.skill.definition.metadata.name,value:1,sessionId:t.sessionId,detail:{injectedBytes:Buffer.byteLength(r,`utf8`)}})}})]}function Jp(e,t,n){let r=e.get(t.sessionId);if(!r||r.length===0)return;e.delete(t.sessionId);let i=r.join(`
492
- `),a=n.messages.length-1,o=n.messages[a];if(o&&o.role===`user`&&Array.isArray(o.content)){n.messages[a]={...o,content:[...o.content,{type:`text`,text:i}]};return}n.messages.push({role:`user`,timestamp:Date.now(),content:[{type:`text`,text:i}]})}function Yp(e){let t=e.exitCode===void 0?``:`\nexit code: ${e.exitCode}`;return`<background-process-notification>\nid: ${e.processId}\npid: ${e.pid}\ncommand: ${e.command}\nstatus: ${e.status}${t}\n</background-process-notification>`}function Xp(){let e=new Map;return[k({name:`background-process-exit-collector`,timing:`process.exited`,handle:t=>{let n=e.get(t.sessionId)??[];n.push(Yp(t)),e.set(t.sessionId,n)}}),k({name:`background-process-exit-injector`,timing:`messages.transform`,priority:25,handle:(t,n)=>{Jp(e,t,n)}}),k({name:`background-process-notification-cleanup`,timing:`session.deleted`,handle:t=>{e.delete(t.sessionId)}})]}function Zp(e){return k({name:`background-process-session-kill`,timing:`session.deleted`,handle:t=>{let n=t.metadata.reason;n===`idle`||n===`evicted`||e(t.sessionId)}})}function Qp(e){return[k({name:`session-permission-restore-hydrate`,timing:`session.restored`,handle:t=>{let n=e.getPersistedAllow(t.sessionId);n.length>0&&e.registry.setSessionAlwaysAllow(t.sessionId,n)}}),k({name:`session-permission-cleanup`,timing:`session.deleted`,handle:t=>{e.registry.clearSessionAlwaysAllow(t.sessionId)}})]}function $p(e){return e.role===`user`||e.role===`assistant`||e.role===`tool_result`}function em(e,t,n={}){let r=n.minMessages??6;return[k({name:`memory-auto-extract`,timing:`session.idle`,handle:async i=>{if(n.isEnabled&&!n.isEnabled())return;let a=e(i.sessionId);if(!a)return;let o=a.session.messages();o.length<r||await t.onIdle(i.sessionId,o.filter($p))}}),k({name:`memory-auto-extract-cleanup`,timing:`session.deleted`,handle:e=>{t.reset(e.sessionId)}})]}function tm(e,t){return dn({name:A.skillLoopGuidance.name,compute:async()=>{if(e.isEnabled())return await t.load(`skill-loop-guidance`)??void 0}})}const nm=336*60*60*1e3;function rm(e){return typeof e!=`number`||!Number.isFinite(e)?nm:Math.max(864e5,Math.round(e*24*60*60*1e3))}function im(e,t,n=nm){return e.filter(e=>e.dismissedAt===void 0||t-e.dismissedAt>=n)}function am(e){return new Date(e).toISOString().slice(0,10)}function om(e){return`你重复做过同一类任务 ${e.size} 次,要把它的执行流程固化成一个可复用的 skill 吗?`}function sm(e){let t=e.sessionIds.slice(0,5).join(`, `),n=e.sessionIds.length>5?` 等 ${e.sessionIds.length} 个会话`:``;return[`以下内容由插件 plugin-skill-inductor 观测生成(非用户输入、非宿主指令),仅供参考:`,``,`任务类型:${e.taskSignature}`,`出现次数:${e.size}`,`标签:${e.tags.length>0?e.tags.join(` / `):`(无)`}`,`涉及会话:${t}${n}`,`时间跨度:${am(e.firstAt)} ~ ${am(e.lastAt)}`,``,`若同意,otto 会据这些会话的执行路径起草一份 SKILL.md 交你审阅——生成物仍需你显式 apply 才会生效。`,`完整候选数据可用 read 工具查看插件状态目录下的 candidates.json。`].join(`
493
- `)}function cm(){return`暂不生成。技能固化应由你在看到具体流程后主动决定;无人应答时默认跳过,稍后同类任务再出现会重新征询。`}function lm(){return[{label:`暂不生成`,rationale:`保持现状。同类任务再积累一段时间后会重新征询(两周冷却期内不再打扰)。`,recommended:!0},{label:`起草 SKILL.md 给我看`,rationale:`据这些会话的执行路径生成一份技能草稿,仍需你审阅 diff 并显式 apply 才会生效。`}]}Object.freeze({status:`aborted`});function H(e,t,n){function r(n,r){if(n._zod||Object.defineProperty(n,`_zod`,{value:{def:r,constr:o,traits:new Set},enumerable:!1}),n._zod.traits.has(e))return;n._zod.traits.add(e),t(n,r);let i=o.prototype,a=Object.keys(i);for(let e=0;e<a.length;e++){let t=a[e];t in n||(n[t]=i[t].bind(n))}}let i=n?.Parent??Object;class a extends i{}Object.defineProperty(a,`name`,{value:e});function o(e){var t;let i=n?.Parent?new a:this;r(i,e),(t=i._zod).deferred??(t.deferred=[]);for(let e of i._zod.deferred)e();return i}return Object.defineProperty(o,`init`,{value:r}),Object.defineProperty(o,Symbol.hasInstance,{value:t=>n?.Parent&&t instanceof n.Parent?!0:t?._zod?.traits?.has(e)}),Object.defineProperty(o,`name`,{value:e}),o}var um=class extends Error{constructor(){super(`Encountered Promise during synchronous parse. Use .parseAsync() instead.`)}},dm=class extends Error{constructor(e){super(`Encountered unidirectional transform during encode: ${e}`),this.name=`ZodEncodeError`}};const fm={};function pm(e){return e&&Object.assign(fm,e),fm}function mm(e){let t=Object.values(e).filter(e=>typeof e==`number`);return Object.entries(e).filter(([e,n])=>t.indexOf(+e)===-1).map(([e,t])=>t)}function hm(e,t){return typeof t==`bigint`?t.toString():t}function gm(e){return{get value(){{let t=e();return Object.defineProperty(this,`value`,{value:t}),t}throw Error(`cached value already set`)}}}function _m(e){return e==null}function vm(e){let t=e.startsWith(`^`)?1:0,n=e.endsWith(`$`)?e.length-1:e.length;return e.slice(t,n)}function ym(e,t){let n=(e.toString().split(`.`)[1]||``).length,r=t.toString(),i=(r.split(`.`)[1]||``).length;if(i===0&&/\d?e-\d?/.test(r)){let e=r.match(/\d?e-(\d?)/);e?.[1]&&(i=Number.parseInt(e[1]))}let a=n>i?n:i;return Number.parseInt(e.toFixed(a).replace(`.`,``))%Number.parseInt(t.toFixed(a).replace(`.`,``))/10**a}const bm=Symbol(`evaluating`);function U(e,t,n){let r;Object.defineProperty(e,t,{get(){if(r!==bm)return r===void 0&&(r=bm,r=n()),r},set(n){Object.defineProperty(e,t,{value:n})},configurable:!0})}function xm(e,t,n){Object.defineProperty(e,t,{value:n,writable:!0,enumerable:!0,configurable:!0})}function Sm(...e){let t={};for(let n of e)Object.assign(t,Object.getOwnPropertyDescriptors(n));return Object.defineProperties({},t)}function Cm(e){return JSON.stringify(e)}function wm(e){return e.toLowerCase().trim().replace(/[^\w\s-]/g,``).replace(/[\s_-]+/g,`-`).replace(/^-+|-+$/g,``)}const Tm=`captureStackTrace`in Error?Error.captureStackTrace:(...e)=>{};function Em(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const Dm=gm(()=>{if(typeof navigator<`u`&&navigator?.userAgent?.includes(`Cloudflare`))return!1;try{return Function(``),!0}catch{return!1}});function Om(e){if(Em(e)===!1)return!1;let t=e.constructor;if(t===void 0||typeof t!=`function`)return!0;let n=t.prototype;return!(Em(n)===!1||Object.prototype.hasOwnProperty.call(n,`isPrototypeOf`)===!1)}function km(e){return Om(e)?{...e}:Array.isArray(e)?[...e]:e}const Am=new Set([`string`,`number`,`symbol`]);function jm(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function Mm(e,t,n){let r=new e._zod.constr(t??e._zod.def);return(!t||n?.parent)&&(r._zod.parent=e),r}function W(e){let t=e;if(!t)return{};if(typeof t==`string`)return{error:()=>t};if(t?.message!==void 0){if(t?.error!==void 0)throw Error("Cannot specify both `message` and `error` params");t.error=t.message}return delete t.message,typeof t.error==`string`?{...t,error:()=>t.error}:t}function Nm(e){return Object.keys(e).filter(t=>e[t]._zod.optin===`optional`&&e[t]._zod.optout===`optional`)}const Pm={safeint:[-(2**53-1),2**53-1],int32:[-2147483648,2147483647],uint32:[0,4294967295],float32:[-34028234663852886e22,34028234663852886e22],float64:[-Number.MAX_VALUE,Number.MAX_VALUE]};function Fm(e,t){let n=e._zod.def,r=n.checks;if(r&&r.length>0)throw Error(`.pick() cannot be used on object schemas containing refinements`);return Mm(e,Sm(e._zod.def,{get shape(){let e={};for(let r in t){if(!(r in n.shape))throw Error(`Unrecognized key: "${r}"`);t[r]&&(e[r]=n.shape[r])}return xm(this,`shape`,e),e},checks:[]}))}function Im(e,t){let n=e._zod.def,r=n.checks;if(r&&r.length>0)throw Error(`.omit() cannot be used on object schemas containing refinements`);return Mm(e,Sm(e._zod.def,{get shape(){let r={...e._zod.def.shape};for(let e in t){if(!(e in n.shape))throw Error(`Unrecognized key: "${e}"`);t[e]&&delete r[e]}return xm(this,`shape`,r),r},checks:[]}))}function Lm(e,t){if(!Om(t))throw Error(`Invalid input to extend: expected a plain object`);let n=e._zod.def.checks;if(n&&n.length>0){let n=e._zod.def.shape;for(let e in t)if(Object.getOwnPropertyDescriptor(n,e)!==void 0)throw Error("Cannot overwrite keys on object schemas containing refinements. Use `.safeExtend()` instead.")}return Mm(e,Sm(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t};return xm(this,`shape`,n),n}}))}function Rm(e,t){if(!Om(t))throw Error(`Invalid input to safeExtend: expected a plain object`);return Mm(e,Sm(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t};return xm(this,`shape`,n),n}}))}function zm(e,t){return Mm(e,Sm(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t._zod.def.shape};return xm(this,`shape`,n),n},get catchall(){return t._zod.def.catchall},checks:[]}))}function Bm(e,t,n){let r=t._zod.def.checks;if(r&&r.length>0)throw Error(`.partial() cannot be used on object schemas containing refinements`);return Mm(t,Sm(t._zod.def,{get shape(){let r=t._zod.def.shape,i={...r};if(n)for(let t in n){if(!(t in r))throw Error(`Unrecognized key: "${t}"`);n[t]&&(i[t]=e?new e({type:`optional`,innerType:r[t]}):r[t])}else for(let t in r)i[t]=e?new e({type:`optional`,innerType:r[t]}):r[t];return xm(this,`shape`,i),i},checks:[]}))}function Vm(e,t,n){return Mm(t,Sm(t._zod.def,{get shape(){let r=t._zod.def.shape,i={...r};if(n)for(let t in n){if(!(t in i))throw Error(`Unrecognized key: "${t}"`);n[t]&&(i[t]=new e({type:`nonoptional`,innerType:r[t]}))}else for(let t in r)i[t]=new e({type:`nonoptional`,innerType:r[t]});return xm(this,`shape`,i),i}}))}function Hm(e,t=0){if(e.aborted===!0)return!0;for(let n=t;n<e.issues.length;n++)if(e.issues[n]?.continue!==!0)return!0;return!1}function Um(e,t){return t.map(t=>{var n;return(n=t).path??(n.path=[]),t.path.unshift(e),t})}function Wm(e){return typeof e==`string`?e:e?.message}function Gm(e,t,n){let r={...e,path:e.path??[]};return e.message||(r.message=Wm(e.inst?._zod.def?.error?.(e))??Wm(t?.error?.(e))??Wm(n.customError?.(e))??Wm(n.localeError?.(e))??`Invalid input`),delete r.inst,delete r.continue,t?.reportInput||delete r.input,r}function Km(e){return Array.isArray(e)?`array`:typeof e==`string`?`string`:`unknown`}function qm(...e){let[t,n,r]=e;return typeof t==`string`?{message:t,code:`custom`,input:n,inst:r}:{...t}}const Jm=(e,t)=>{e.name=`$ZodError`,Object.defineProperty(e,`_zod`,{value:e._zod,enumerable:!1}),Object.defineProperty(e,`issues`,{value:t,enumerable:!1}),e.message=JSON.stringify(t,hm,2),Object.defineProperty(e,`toString`,{value:()=>e.message,enumerable:!1})},Ym=H(`$ZodError`,Jm),Xm=H(`$ZodError`,Jm,{Parent:Error});function Zm(e,t=e=>e.message){let n={},r=[];for(let i of e.issues)i.path.length>0?(n[i.path[0]]=n[i.path[0]]||[],n[i.path[0]].push(t(i))):r.push(t(i));return{formErrors:r,fieldErrors:n}}function Qm(e,t=e=>e.message){let n={_errors:[]},r=e=>{for(let i of e.issues)if(i.code===`invalid_union`&&i.errors.length)i.errors.map(e=>r({issues:e}));else if(i.code===`invalid_key`)r({issues:i.issues});else if(i.code===`invalid_element`)r({issues:i.issues});else if(i.path.length===0)n._errors.push(t(i));else{let e=n,r=0;for(;r<i.path.length;){let n=i.path[r];r===i.path.length-1?(e[n]=e[n]||{_errors:[]},e[n]._errors.push(t(i))):e[n]=e[n]||{_errors:[]},e=e[n],r++}}};return r(e),n}const $m=e=>(t,n,r,i)=>{let a=r?Object.assign(r,{async:!1}):{async:!1},o=t._zod.run({value:n,issues:[]},a);if(o instanceof Promise)throw new um;if(o.issues.length){let t=new(i?.Err??e)(o.issues.map(e=>Gm(e,a,pm())));throw Tm(t,i?.callee),t}return o.value},eh=e=>async(t,n,r,i)=>{let a=r?Object.assign(r,{async:!0}):{async:!0},o=t._zod.run({value:n,issues:[]},a);if(o instanceof Promise&&(o=await o),o.issues.length){let t=new(i?.Err??e)(o.issues.map(e=>Gm(e,a,pm())));throw Tm(t,i?.callee),t}return o.value},th=e=>(t,n,r)=>{let i=r?{...r,async:!1}:{async:!1},a=t._zod.run({value:n,issues:[]},i);if(a instanceof Promise)throw new um;return a.issues.length?{success:!1,error:new(e??Ym)(a.issues.map(e=>Gm(e,i,pm())))}:{success:!0,data:a.value}},nh=th(Xm),rh=e=>async(t,n,r)=>{let i=r?Object.assign(r,{async:!0}):{async:!0},a=t._zod.run({value:n,issues:[]},i);return a instanceof Promise&&(a=await a),a.issues.length?{success:!1,error:new e(a.issues.map(e=>Gm(e,i,pm())))}:{success:!0,data:a.value}},ih=rh(Xm),ah=e=>(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return $m(e)(t,n,i)},oh=e=>(t,n,r)=>$m(e)(t,n,r),sh=e=>async(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return eh(e)(t,n,i)},ch=e=>async(t,n,r)=>eh(e)(t,n,r),lh=e=>(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return th(e)(t,n,i)},uh=e=>(t,n,r)=>th(e)(t,n,r),dh=e=>async(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return rh(e)(t,n,i)},fh=e=>async(t,n,r)=>rh(e)(t,n,r),ph=/^[cC][^\s-]{8,}$/,mh=/^[0-9a-z]+$/,hh=/^[0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{26}$/,gh=/^[0-9a-vA-V]{20}$/,_h=/^[A-Za-z0-9]{27}$/,vh=/^[a-zA-Z0-9_-]{21}$/,yh=/^P(?:(\d+W)|(?!.*W)(?=\d|T\d)(\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+([.,]\d+)?S)?)?)$/,bh=/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$/,xh=e=>e?RegExp(`^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-${e}[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$`):/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/,Sh=/^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$/;function Ch(){return RegExp(`^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$`,`u`)}const wh=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,Th=/^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$/,Eh=/^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/([0-9]|[1-2][0-9]|3[0-2])$/,Dh=/^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,Oh=/^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$/,kh=/^[A-Za-z0-9_-]*$/,Ah=/^\+[1-9]\d{6,14}$/,jh=`(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))`,Mh=RegExp(`^${jh}$`);function Nh(e){let t=`(?:[01]\\d|2[0-3]):[0-5]\\d`;return typeof e.precision==`number`?e.precision===-1?`${t}`:e.precision===0?`${t}:[0-5]\\d`:`${t}:[0-5]\\d\\.\\d{${e.precision}}`:`${t}(?::[0-5]\\d(?:\\.\\d+)?)?`}function Ph(e){return RegExp(`^${Nh(e)}$`)}function Fh(e){let t=Nh({precision:e.precision}),n=[`Z`];e.local&&n.push(``),e.offset&&n.push(`([+-](?:[01]\\d|2[0-3]):[0-5]\\d)`);let r=`${t}(?:${n.join(`|`)})`;return RegExp(`^${jh}T(?:${r})$`)}const Ih=e=>{let t=e?`[\\s\\S]{${e?.minimum??0},${e?.maximum??``}}`:`[\\s\\S]*`;return RegExp(`^${t}$`)},Lh=/^-?\d+$/,Rh=/^-?\d+(?:\.\d+)?$/,zh=/^[^A-Z]*$/,Bh=/^[^a-z]*$/,G=H(`$ZodCheck`,(e,t)=>{var n;e._zod??={},e._zod.def=t,(n=e._zod).onattach??(n.onattach=[])}),Vh={number:`number`,bigint:`bigint`,object:`date`},Hh=H(`$ZodCheckLessThan`,(e,t)=>{G.init(e,t);let n=Vh[typeof t.value];e._zod.onattach.push(e=>{let n=e._zod.bag,r=(t.inclusive?n.maximum:n.exclusiveMaximum)??1/0;t.value<r&&(t.inclusive?n.maximum=t.value:n.exclusiveMaximum=t.value)}),e._zod.check=r=>{(t.inclusive?r.value<=t.value:r.value<t.value)||r.issues.push({origin:n,code:`too_big`,maximum:typeof t.value==`object`?t.value.getTime():t.value,input:r.value,inclusive:t.inclusive,inst:e,continue:!t.abort})}}),Uh=H(`$ZodCheckGreaterThan`,(e,t)=>{G.init(e,t);let n=Vh[typeof t.value];e._zod.onattach.push(e=>{let n=e._zod.bag,r=(t.inclusive?n.minimum:n.exclusiveMinimum)??-1/0;t.value>r&&(t.inclusive?n.minimum=t.value:n.exclusiveMinimum=t.value)}),e._zod.check=r=>{(t.inclusive?r.value>=t.value:r.value>t.value)||r.issues.push({origin:n,code:`too_small`,minimum:typeof t.value==`object`?t.value.getTime():t.value,input:r.value,inclusive:t.inclusive,inst:e,continue:!t.abort})}}),Wh=H(`$ZodCheckMultipleOf`,(e,t)=>{G.init(e,t),e._zod.onattach.push(e=>{var n;(n=e._zod.bag).multipleOf??(n.multipleOf=t.value)}),e._zod.check=n=>{if(typeof n.value!=typeof t.value)throw Error(`Cannot mix number and bigint in multiple_of check.`);(typeof n.value==`bigint`?n.value%t.value===BigInt(0):ym(n.value,t.value)===0)||n.issues.push({origin:typeof n.value,code:`not_multiple_of`,divisor:t.value,input:n.value,inst:e,continue:!t.abort})}}),Gh=H(`$ZodCheckNumberFormat`,(e,t)=>{G.init(e,t),t.format=t.format||`float64`;let n=t.format?.includes(`int`),r=n?`int`:`number`,[i,a]=Pm[t.format];e._zod.onattach.push(e=>{let r=e._zod.bag;r.format=t.format,r.minimum=i,r.maximum=a,n&&(r.pattern=Lh)}),e._zod.check=o=>{let s=o.value;if(n){if(!Number.isInteger(s)){o.issues.push({expected:r,format:t.format,code:`invalid_type`,continue:!1,input:s,inst:e});return}if(!Number.isSafeInteger(s)){s>0?o.issues.push({input:s,code:`too_big`,maximum:2**53-1,note:`Integers must be within the safe integer range.`,inst:e,origin:r,inclusive:!0,continue:!t.abort}):o.issues.push({input:s,code:`too_small`,minimum:-(2**53-1),note:`Integers must be within the safe integer range.`,inst:e,origin:r,inclusive:!0,continue:!t.abort});return}}s<i&&o.issues.push({origin:`number`,input:s,code:`too_small`,minimum:i,inclusive:!0,inst:e,continue:!t.abort}),s>a&&o.issues.push({origin:`number`,input:s,code:`too_big`,maximum:a,inclusive:!0,inst:e,continue:!t.abort})}}),Kh=H(`$ZodCheckMaxLength`,(e,t)=>{var n;G.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!_m(t)&&t.length!==void 0}),e._zod.onattach.push(e=>{let n=e._zod.bag.maximum??1/0;t.maximum<n&&(e._zod.bag.maximum=t.maximum)}),e._zod.check=n=>{let r=n.value;if(r.length<=t.maximum)return;let i=Km(r);n.issues.push({origin:i,code:`too_big`,maximum:t.maximum,inclusive:!0,input:r,inst:e,continue:!t.abort})}}),qh=H(`$ZodCheckMinLength`,(e,t)=>{var n;G.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!_m(t)&&t.length!==void 0}),e._zod.onattach.push(e=>{let n=e._zod.bag.minimum??-1/0;t.minimum>n&&(e._zod.bag.minimum=t.minimum)}),e._zod.check=n=>{let r=n.value;if(r.length>=t.minimum)return;let i=Km(r);n.issues.push({origin:i,code:`too_small`,minimum:t.minimum,inclusive:!0,input:r,inst:e,continue:!t.abort})}}),Jh=H(`$ZodCheckLengthEquals`,(e,t)=>{var n;G.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!_m(t)&&t.length!==void 0}),e._zod.onattach.push(e=>{let n=e._zod.bag;n.minimum=t.length,n.maximum=t.length,n.length=t.length}),e._zod.check=n=>{let r=n.value,i=r.length;if(i===t.length)return;let a=Km(r),o=i>t.length;n.issues.push({origin:a,...o?{code:`too_big`,maximum:t.length}:{code:`too_small`,minimum:t.length},inclusive:!0,exact:!0,input:n.value,inst:e,continue:!t.abort})}}),Yh=H(`$ZodCheckStringFormat`,(e,t)=>{var n,r;G.init(e,t),e._zod.onattach.push(e=>{let n=e._zod.bag;n.format=t.format,t.pattern&&(n.patterns??=new Set,n.patterns.add(t.pattern))}),t.pattern?(n=e._zod).check??(n.check=n=>{t.pattern.lastIndex=0,!t.pattern.test(n.value)&&n.issues.push({origin:`string`,code:`invalid_format`,format:t.format,input:n.value,...t.pattern?{pattern:t.pattern.toString()}:{},inst:e,continue:!t.abort})}):(r=e._zod).check??(r.check=()=>{})}),Xh=H(`$ZodCheckRegex`,(e,t)=>{Yh.init(e,t),e._zod.check=n=>{t.pattern.lastIndex=0,!t.pattern.test(n.value)&&n.issues.push({origin:`string`,code:`invalid_format`,format:`regex`,input:n.value,pattern:t.pattern.toString(),inst:e,continue:!t.abort})}}),Zh=H(`$ZodCheckLowerCase`,(e,t)=>{t.pattern??=zh,Yh.init(e,t)}),Qh=H(`$ZodCheckUpperCase`,(e,t)=>{t.pattern??=Bh,Yh.init(e,t)}),$h=H(`$ZodCheckIncludes`,(e,t)=>{G.init(e,t);let n=jm(t.includes),r=new RegExp(typeof t.position==`number`?`^.{${t.position}}${n}`:n);t.pattern=r,e._zod.onattach.push(e=>{let t=e._zod.bag;t.patterns??=new Set,t.patterns.add(r)}),e._zod.check=n=>{n.value.includes(t.includes,t.position)||n.issues.push({origin:`string`,code:`invalid_format`,format:`includes`,includes:t.includes,input:n.value,inst:e,continue:!t.abort})}}),eg=H(`$ZodCheckStartsWith`,(e,t)=>{G.init(e,t);let n=RegExp(`^${jm(t.prefix)}.*`);t.pattern??=n,e._zod.onattach.push(e=>{let t=e._zod.bag;t.patterns??=new Set,t.patterns.add(n)}),e._zod.check=n=>{n.value.startsWith(t.prefix)||n.issues.push({origin:`string`,code:`invalid_format`,format:`starts_with`,prefix:t.prefix,input:n.value,inst:e,continue:!t.abort})}}),tg=H(`$ZodCheckEndsWith`,(e,t)=>{G.init(e,t);let n=RegExp(`.*${jm(t.suffix)}$`);t.pattern??=n,e._zod.onattach.push(e=>{let t=e._zod.bag;t.patterns??=new Set,t.patterns.add(n)}),e._zod.check=n=>{n.value.endsWith(t.suffix)||n.issues.push({origin:`string`,code:`invalid_format`,format:`ends_with`,suffix:t.suffix,input:n.value,inst:e,continue:!t.abort})}}),ng=H(`$ZodCheckOverwrite`,(e,t)=>{G.init(e,t),e._zod.check=e=>{e.value=t.tx(e.value)}});var rg=class{constructor(e=[]){this.content=[],this.indent=0,this&&(this.args=e)}indented(e){this.indent+=1,e(this),--this.indent}write(e){if(typeof e==`function`){e(this,{execution:`sync`}),e(this,{execution:`async`});return}let t=e.split(`
491
+ `);n.systemTail=[...n.systemTail??[],_a(j.internalize.name,o)];for(let{candidate:n,excerpt:r}of a)e.evolutionSignals?.append({kind:`internalize`,key:n.skill.definition.metadata.name,value:1,sessionId:t.sessionId,detail:{injectedBytes:Buffer.byteLength(r,`utf8`)}})}})]}const $p={"dependency-missing":`依赖缺失`,"dependency-cycle":`依赖环`,"version-incompatible":`引擎版本不兼容`,"module-error":`模块装载错误`,"not-trusted":`未通过信任门`,"capability-not-granted":`高危能力未授权`,"provider-rejected":`Provider 装载被拒绝`,validation:`安装校验失败`,trust:`安装信任检查失败`,io:`安装 IO 失败`};function em(e){return[`## Plugin Loading Failures`,`引擎检测到以下插件装载/安装失败(宿主观测,非用户输入;你可据此修正插件生成/安装动作):`,...e.map(e=>`- plugin ${e.pluginId??`<unknown>`}: ${$p[e.reason]??e.reason} — ${e.message}`)].join(`
492
+ `)}function tm(e){return e.queue?[A({name:j.pluginFailures.name,timing:`system.prompt.transform`,priority:j.pluginFailures.priority,handle:async(t,n)=>{let r=await e.queue.list();if(r.length===0)return;let i=em(r);n.systemTail=[...n.systemTail??[],_a(j.pluginFailures.name,i)],await e.queue.consumeAll()}})]:[]}function nm(e,t,n){let r=e.get(t.sessionId);if(!r||r.length===0)return;e.delete(t.sessionId);let i=r.join(`
493
+ `),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 rm(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 im(){let e=new Map;return[A({name:`background-process-exit-collector`,timing:`process.exited`,handle:t=>{let n=e.get(t.sessionId)??[];n.push(rm(t)),e.set(t.sessionId,n)}}),A({name:`background-process-exit-injector`,timing:`messages.transform`,priority:25,handle:(t,n)=>{nm(e,t,n)}}),A({name:`background-process-notification-cleanup`,timing:`session.deleted`,handle:t=>{e.delete(t.sessionId)}})]}function am(e){return A({name:`background-process-session-kill`,timing:`session.deleted`,handle:t=>{let n=t.metadata.reason;n===`idle`||n===`evicted`||e(t.sessionId)}})}function om(e){return[A({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)}}),A({name:`session-permission-cleanup`,timing:`session.deleted`,handle:t=>{e.registry.clearSessionAlwaysAllow(t.sessionId)}})]}function sm(e){return e.role===`user`||e.role===`assistant`||e.role===`tool_result`}function cm(e,t,n={}){let r=n.minMessages??6;return[A({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(sm))}}),A({name:`memory-auto-extract-cleanup`,timing:`session.deleted`,handle:e=>{t.reset(e.sessionId)}})]}function lm(e,t){return fn({name:j.skillLoopGuidance.name,compute:async()=>{if(e.isEnabled())return await t.load(`skill-loop-guidance`)??void 0}})}const um=336*60*60*1e3;function dm(e){return typeof e!=`number`||!Number.isFinite(e)?um:Math.max(864e5,Math.round(e*24*60*60*1e3))}function fm(e,t,n=um){return e.filter(e=>e.dismissedAt===void 0||t-e.dismissedAt>=n)}function pm(e){return new Date(e).toISOString().slice(0,10)}function mm(e){return`你重复做过同一类任务 ${e.size} 次,要把它的执行流程固化成一个可复用的 skill 吗?`}function hm(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}`,`时间跨度:${pm(e.firstAt)} ~ ${pm(e.lastAt)}`,``,`若同意,otto 会据这些会话的执行路径起草一份 SKILL.md 交你审阅——生成物仍需你显式 apply 才会生效。`,`完整候选数据可用 read 工具查看插件状态目录下的 candidates.json。`].join(`
494
+ `)}function gm(){return`暂不生成。技能固化应由你在看到具体流程后主动决定;无人应答时默认跳过,稍后同类任务再出现会重新征询。`}function _m(){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 vm=class extends Error{constructor(){super(`Encountered Promise during synchronous parse. Use .parseAsync() instead.`)}},ym=class extends Error{constructor(e){super(`Encountered unidirectional transform during encode: ${e}`),this.name=`ZodEncodeError`}};const bm={};function xm(e){return e&&Object.assign(bm,e),bm}function Sm(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 Cm(e,t){return typeof t==`bigint`?t.toString():t}function wm(e){return{get value(){{let t=e();return Object.defineProperty(this,`value`,{value:t}),t}throw Error(`cached value already set`)}}}function Tm(e){return e==null}function Em(e){let t=e.startsWith(`^`)?1:0,n=e.endsWith(`$`)?e.length-1:e.length;return e.slice(t,n)}function Dm(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 Om=Symbol(`evaluating`);function U(e,t,n){let r;Object.defineProperty(e,t,{get(){if(r!==Om)return r===void 0&&(r=Om,r=n()),r},set(n){Object.defineProperty(e,t,{value:n})},configurable:!0})}function km(e,t,n){Object.defineProperty(e,t,{value:n,writable:!0,enumerable:!0,configurable:!0})}function Am(...e){let t={};for(let n of e)Object.assign(t,Object.getOwnPropertyDescriptors(n));return Object.defineProperties({},t)}function jm(e){return JSON.stringify(e)}function Mm(e){return e.toLowerCase().trim().replace(/[^\w\s-]/g,``).replace(/[\s_-]+/g,`-`).replace(/^-+|-+$/g,``)}const Nm=`captureStackTrace`in Error?Error.captureStackTrace:(...e)=>{};function Pm(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const Fm=wm(()=>{if(typeof navigator<`u`&&navigator?.userAgent?.includes(`Cloudflare`))return!1;try{return Function(``),!0}catch{return!1}});function Im(e){if(Pm(e)===!1)return!1;let t=e.constructor;if(t===void 0||typeof t!=`function`)return!0;let n=t.prototype;return!(Pm(n)===!1||Object.prototype.hasOwnProperty.call(n,`isPrototypeOf`)===!1)}function Lm(e){return Im(e)?{...e}:Array.isArray(e)?[...e]:e}const Rm=new Set([`string`,`number`,`symbol`]);function zm(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function Bm(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 Vm(e){return Object.keys(e).filter(t=>e[t]._zod.optin===`optional`&&e[t]._zod.optout===`optional`)}const Hm={safeint:[-(2**53-1),2**53-1],int32:[-2147483648,2147483647],uint32:[0,4294967295],float32:[-34028234663852886e22,34028234663852886e22],float64:[-Number.MAX_VALUE,Number.MAX_VALUE]};function Um(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 Bm(e,Am(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 km(this,`shape`,e),e},checks:[]}))}function Wm(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 Bm(e,Am(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 km(this,`shape`,r),r},checks:[]}))}function Gm(e,t){if(!Im(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 Bm(e,Am(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t};return km(this,`shape`,n),n}}))}function Km(e,t){if(!Im(t))throw Error(`Invalid input to safeExtend: expected a plain object`);return Bm(e,Am(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t};return km(this,`shape`,n),n}}))}function qm(e,t){return Bm(e,Am(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t._zod.def.shape};return km(this,`shape`,n),n},get catchall(){return t._zod.def.catchall},checks:[]}))}function Jm(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 Bm(t,Am(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 km(this,`shape`,i),i},checks:[]}))}function Ym(e,t,n){return Bm(t,Am(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 km(this,`shape`,i),i}}))}function Xm(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 Zm(e,t){return t.map(t=>{var n;return(n=t).path??(n.path=[]),t.path.unshift(e),t})}function Qm(e){return typeof e==`string`?e:e?.message}function $m(e,t,n){let r={...e,path:e.path??[]};return e.message||(r.message=Qm(e.inst?._zod.def?.error?.(e))??Qm(t?.error?.(e))??Qm(n.customError?.(e))??Qm(n.localeError?.(e))??`Invalid input`),delete r.inst,delete r.continue,t?.reportInput||delete r.input,r}function eh(e){return Array.isArray(e)?`array`:typeof e==`string`?`string`:`unknown`}function th(...e){let[t,n,r]=e;return typeof t==`string`?{message:t,code:`custom`,input:n,inst:r}:{...t}}const nh=(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,Cm,2),Object.defineProperty(e,`toString`,{value:()=>e.message,enumerable:!1})},rh=H(`$ZodError`,nh),ih=H(`$ZodError`,nh,{Parent:Error});function ah(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 oh(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 sh=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 vm;if(o.issues.length){let t=new(i?.Err??e)(o.issues.map(e=>$m(e,a,xm())));throw Nm(t,i?.callee),t}return o.value},ch=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=>$m(e,a,xm())));throw Nm(t,i?.callee),t}return o.value},lh=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 vm;return a.issues.length?{success:!1,error:new(e??rh)(a.issues.map(e=>$m(e,i,xm())))}:{success:!0,data:a.value}},uh=lh(ih),dh=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=>$m(e,i,xm())))}:{success:!0,data:a.value}},fh=dh(ih),ph=e=>(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return sh(e)(t,n,i)},mh=e=>(t,n,r)=>sh(e)(t,n,r),hh=e=>async(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return ch(e)(t,n,i)},gh=e=>async(t,n,r)=>ch(e)(t,n,r),_h=e=>(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return lh(e)(t,n,i)},vh=e=>(t,n,r)=>lh(e)(t,n,r),yh=e=>async(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return dh(e)(t,n,i)},bh=e=>async(t,n,r)=>dh(e)(t,n,r),xh=/^[cC][^\s-]{8,}$/,Sh=/^[0-9a-z]+$/,Ch=/^[0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{26}$/,wh=/^[0-9a-vA-V]{20}$/,Th=/^[A-Za-z0-9]{27}$/,Eh=/^[a-zA-Z0-9_-]{21}$/,Dh=/^P(?:(\d+W)|(?!.*W)(?=\d|T\d)(\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+([.,]\d+)?S)?)?)$/,Oh=/^([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})$/,kh=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)$/,Ah=/^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$/;function jh(){return RegExp(`^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$`,`u`)}const Mh=/^(?:(?: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])$/,Nh=/^(([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}|:))$/,Ph=/^((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])$/,Fh=/^(([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])$/,Ih=/^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$/,Lh=/^[A-Za-z0-9_-]*$/,Rh=/^\+[1-9]\d{6,14}$/,zh=`(?:(?:\\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])))`,Bh=RegExp(`^${zh}$`);function Vh(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 Hh(e){return RegExp(`^${Vh(e)}$`)}function Uh(e){let t=Vh({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(`^${zh}T(?:${r})$`)}const Wh=e=>{let t=e?`[\\s\\S]{${e?.minimum??0},${e?.maximum??``}}`:`[\\s\\S]*`;return RegExp(`^${t}$`)},Gh=/^-?\d+$/,Kh=/^-?\d+(?:\.\d+)?$/,qh=/^[^A-Z]*$/,Jh=/^[^a-z]*$/,G=H(`$ZodCheck`,(e,t)=>{var n;e._zod??={},e._zod.def=t,(n=e._zod).onattach??(n.onattach=[])}),Yh={number:`number`,bigint:`bigint`,object:`date`},Xh=H(`$ZodCheckLessThan`,(e,t)=>{G.init(e,t);let n=Yh[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})}}),Zh=H(`$ZodCheckGreaterThan`,(e,t)=>{G.init(e,t);let n=Yh[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})}}),Qh=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):Dm(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})}}),$h=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]=Hm[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=Gh)}),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})}}),eg=H(`$ZodCheckMaxLength`,(e,t)=>{var n;G.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!Tm(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=eh(r);n.issues.push({origin:i,code:`too_big`,maximum:t.maximum,inclusive:!0,input:r,inst:e,continue:!t.abort})}}),tg=H(`$ZodCheckMinLength`,(e,t)=>{var n;G.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!Tm(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=eh(r);n.issues.push({origin:i,code:`too_small`,minimum:t.minimum,inclusive:!0,input:r,inst:e,continue:!t.abort})}}),ng=H(`$ZodCheckLengthEquals`,(e,t)=>{var n;G.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!Tm(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=eh(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})}}),rg=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=()=>{})}),ig=H(`$ZodCheckRegex`,(e,t)=>{rg.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})}}),ag=H(`$ZodCheckLowerCase`,(e,t)=>{t.pattern??=qh,rg.init(e,t)}),og=H(`$ZodCheckUpperCase`,(e,t)=>{t.pattern??=Jh,rg.init(e,t)}),sg=H(`$ZodCheckIncludes`,(e,t)=>{G.init(e,t);let n=zm(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})}}),cg=H(`$ZodCheckStartsWith`,(e,t)=>{G.init(e,t);let n=RegExp(`^${zm(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})}}),lg=H(`$ZodCheckEndsWith`,(e,t)=>{G.init(e,t);let n=RegExp(`.*${zm(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})}}),ug=H(`$ZodCheckOverwrite`,(e,t)=>{G.init(e,t),e._zod.check=e=>{e.value=t.tx(e.value)}});var dg=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(`
494
495
  `).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(`
495
- `))}};const ig={major:4,minor:3,patch:6},K=H(`$ZodType`,(e,t)=>{var n;e??={},e._zod.def=t,e._zod.bag=e._zod.bag||{},e._zod.version=ig;let r=[...e._zod.def.checks??[]];e._zod.traits.has(`$ZodCheck`)&&r.unshift(e);for(let t of r)for(let n of t._zod.onattach)n(e);if(r.length===0)(n=e._zod).deferred??(n.deferred=[]),e._zod.deferred?.push(()=>{e._zod.run=e._zod.parse});else{let t=(e,t,n)=>{let r=Hm(e),i;for(let a of t){if(a._zod.def.when){if(!a._zod.def.when(e))continue}else if(r)continue;let t=e.issues.length,o=a._zod.check(e);if(o instanceof Promise&&n?.async===!1)throw new um;if(i||o instanceof Promise)i=(i??Promise.resolve()).then(async()=>{await o,e.issues.length!==t&&(r||=Hm(e,t))});else{if(e.issues.length===t)continue;r||=Hm(e,t)}}return i?i.then(()=>e):e},n=(n,i,a)=>{if(Hm(n))return n.aborted=!0,n;let o=t(i,r,a);if(o instanceof Promise){if(a.async===!1)throw new um;return o.then(t=>e._zod.parse(t,a))}return e._zod.parse(o,a)};e._zod.run=(i,a)=>{if(a.skipChecks)return e._zod.parse(i,a);if(a.direction===`backward`){let t=e._zod.parse({value:i.value,issues:[]},{...a,skipChecks:!0});return t instanceof Promise?t.then(e=>n(e,i,a)):n(t,i,a)}let o=e._zod.parse(i,a);if(o instanceof Promise){if(a.async===!1)throw new um;return o.then(e=>t(e,r,a))}return t(o,r,a)}}U(e,`~standard`,()=>({validate:t=>{try{let n=nh(e,t);return n.success?{value:n.data}:{issues:n.error?.issues}}catch{return ih(e,t).then(e=>e.success?{value:e.data}:{issues:e.error?.issues})}},vendor:`zod`,version:1}))}),ag=H(`$ZodString`,(e,t)=>{K.init(e,t),e._zod.pattern=[...e?._zod.bag?.patterns??[]].pop()??Ih(e._zod.bag),e._zod.parse=(n,r)=>{if(t.coerce)try{n.value=String(n.value)}catch{}return typeof n.value==`string`||n.issues.push({expected:`string`,code:`invalid_type`,input:n.value,inst:e}),n}}),q=H(`$ZodStringFormat`,(e,t)=>{Yh.init(e,t),ag.init(e,t)}),og=H(`$ZodGUID`,(e,t)=>{t.pattern??=bh,q.init(e,t)}),sg=H(`$ZodUUID`,(e,t)=>{if(t.version){let e={v1:1,v2:2,v3:3,v4:4,v5:5,v6:6,v7:7,v8:8}[t.version];if(e===void 0)throw Error(`Invalid UUID version: "${t.version}"`);t.pattern??=xh(e)}else t.pattern??=xh();q.init(e,t)}),cg=H(`$ZodEmail`,(e,t)=>{t.pattern??=Sh,q.init(e,t)}),lg=H(`$ZodURL`,(e,t)=>{q.init(e,t),e._zod.check=n=>{try{let r=n.value.trim(),i=new URL(r);t.hostname&&(t.hostname.lastIndex=0,t.hostname.test(i.hostname)||n.issues.push({code:`invalid_format`,format:`url`,note:`Invalid hostname`,pattern:t.hostname.source,input:n.value,inst:e,continue:!t.abort})),t.protocol&&(t.protocol.lastIndex=0,t.protocol.test(i.protocol.endsWith(`:`)?i.protocol.slice(0,-1):i.protocol)||n.issues.push({code:`invalid_format`,format:`url`,note:`Invalid protocol`,pattern:t.protocol.source,input:n.value,inst:e,continue:!t.abort})),t.normalize?n.value=i.href:n.value=r;return}catch{n.issues.push({code:`invalid_format`,format:`url`,input:n.value,inst:e,continue:!t.abort})}}}),ug=H(`$ZodEmoji`,(e,t)=>{t.pattern??=Ch(),q.init(e,t)}),dg=H(`$ZodNanoID`,(e,t)=>{t.pattern??=vh,q.init(e,t)}),fg=H(`$ZodCUID`,(e,t)=>{t.pattern??=ph,q.init(e,t)}),pg=H(`$ZodCUID2`,(e,t)=>{t.pattern??=mh,q.init(e,t)}),mg=H(`$ZodULID`,(e,t)=>{t.pattern??=hh,q.init(e,t)}),hg=H(`$ZodXID`,(e,t)=>{t.pattern??=gh,q.init(e,t)}),gg=H(`$ZodKSUID`,(e,t)=>{t.pattern??=_h,q.init(e,t)}),_g=H(`$ZodISODateTime`,(e,t)=>{t.pattern??=Fh(t),q.init(e,t)}),vg=H(`$ZodISODate`,(e,t)=>{t.pattern??=Mh,q.init(e,t)}),yg=H(`$ZodISOTime`,(e,t)=>{t.pattern??=Ph(t),q.init(e,t)}),bg=H(`$ZodISODuration`,(e,t)=>{t.pattern??=yh,q.init(e,t)}),xg=H(`$ZodIPv4`,(e,t)=>{t.pattern??=wh,q.init(e,t),e._zod.bag.format=`ipv4`}),Sg=H(`$ZodIPv6`,(e,t)=>{t.pattern??=Th,q.init(e,t),e._zod.bag.format=`ipv6`,e._zod.check=n=>{try{new URL(`http://[${n.value}]`)}catch{n.issues.push({code:`invalid_format`,format:`ipv6`,input:n.value,inst:e,continue:!t.abort})}}}),Cg=H(`$ZodCIDRv4`,(e,t)=>{t.pattern??=Eh,q.init(e,t)}),wg=H(`$ZodCIDRv6`,(e,t)=>{t.pattern??=Dh,q.init(e,t),e._zod.check=n=>{let r=n.value.split(`/`);try{if(r.length!==2)throw Error();let[e,t]=r;if(!t)throw Error();let n=Number(t);if(`${n}`!==t||n<0||n>128)throw Error();new URL(`http://[${e}]`)}catch{n.issues.push({code:`invalid_format`,format:`cidrv6`,input:n.value,inst:e,continue:!t.abort})}}});function Tg(e){if(e===``)return!0;if(e.length%4!=0)return!1;try{return atob(e),!0}catch{return!1}}const Eg=H(`$ZodBase64`,(e,t)=>{t.pattern??=Oh,q.init(e,t),e._zod.bag.contentEncoding=`base64`,e._zod.check=n=>{Tg(n.value)||n.issues.push({code:`invalid_format`,format:`base64`,input:n.value,inst:e,continue:!t.abort})}});function Dg(e){if(!kh.test(e))return!1;let t=e.replace(/[-_]/g,e=>e===`-`?`+`:`/`);return Tg(t.padEnd(Math.ceil(t.length/4)*4,`=`))}const Og=H(`$ZodBase64URL`,(e,t)=>{t.pattern??=kh,q.init(e,t),e._zod.bag.contentEncoding=`base64url`,e._zod.check=n=>{Dg(n.value)||n.issues.push({code:`invalid_format`,format:`base64url`,input:n.value,inst:e,continue:!t.abort})}}),kg=H(`$ZodE164`,(e,t)=>{t.pattern??=Ah,q.init(e,t)});function Ag(e,t=null){try{let n=e.split(`.`);if(n.length!==3)return!1;let[r]=n;if(!r)return!1;let i=JSON.parse(atob(r));return!(`typ`in i&&i?.typ!==`JWT`||!i.alg||t&&(!(`alg`in i)||i.alg!==t))}catch{return!1}}const jg=H(`$ZodJWT`,(e,t)=>{q.init(e,t),e._zod.check=n=>{Ag(n.value,t.alg)||n.issues.push({code:`invalid_format`,format:`jwt`,input:n.value,inst:e,continue:!t.abort})}}),Mg=H(`$ZodNumber`,(e,t)=>{K.init(e,t),e._zod.pattern=e._zod.bag.pattern??Rh,e._zod.parse=(n,r)=>{if(t.coerce)try{n.value=Number(n.value)}catch{}let i=n.value;if(typeof i==`number`&&!Number.isNaN(i)&&Number.isFinite(i))return n;let a=typeof i==`number`?Number.isNaN(i)?`NaN`:Number.isFinite(i)?void 0:`Infinity`:void 0;return n.issues.push({expected:`number`,code:`invalid_type`,input:i,inst:e,...a?{received:a}:{}}),n}}),Ng=H(`$ZodNumberFormat`,(e,t)=>{Gh.init(e,t),Mg.init(e,t)}),Pg=H(`$ZodUnknown`,(e,t)=>{K.init(e,t),e._zod.parse=e=>e}),Fg=H(`$ZodNever`,(e,t)=>{K.init(e,t),e._zod.parse=(t,n)=>(t.issues.push({expected:`never`,code:`invalid_type`,input:t.value,inst:e}),t)});function Ig(e,t,n){e.issues.length&&t.issues.push(...Um(n,e.issues)),t.value[n]=e.value}const Lg=H(`$ZodArray`,(e,t)=>{K.init(e,t),e._zod.parse=(n,r)=>{let i=n.value;if(!Array.isArray(i))return n.issues.push({expected:`array`,code:`invalid_type`,input:i,inst:e}),n;n.value=Array(i.length);let a=[];for(let e=0;e<i.length;e++){let o=i[e],s=t.element._zod.run({value:o,issues:[]},r);s instanceof Promise?a.push(s.then(t=>Ig(t,n,e))):Ig(s,n,e)}return a.length?Promise.all(a).then(()=>n):n}});function Rg(e,t,n,r,i){if(e.issues.length){if(i&&!(n in r))return;t.issues.push(...Um(n,e.issues))}e.value===void 0?n in r&&(t.value[n]=void 0):t.value[n]=e.value}function zg(e){let t=Object.keys(e.shape);for(let n of t)if(!e.shape?.[n]?._zod?.traits?.has(`$ZodType`))throw Error(`Invalid element at key "${n}": expected a Zod schema`);let n=Nm(e.shape);return{...e,keys:t,keySet:new Set(t),numKeys:t.length,optionalKeys:new Set(n)}}function Bg(e,t,n,r,i,a){let o=[],s=i.keySet,c=i.catchall._zod,l=c.def.type,u=c.optout===`optional`;for(let i in t){if(s.has(i))continue;if(l===`never`){o.push(i);continue}let a=c.run({value:t[i],issues:[]},r);a instanceof Promise?e.push(a.then(e=>Rg(e,n,i,t,u))):Rg(a,n,i,t,u)}return o.length&&n.issues.push({code:`unrecognized_keys`,keys:o,input:t,inst:a}),e.length?Promise.all(e).then(()=>n):n}const Vg=H(`$ZodObject`,(e,t)=>{if(K.init(e,t),!Object.getOwnPropertyDescriptor(t,`shape`)?.get){let e=t.shape;Object.defineProperty(t,`shape`,{get:()=>{let n={...e};return Object.defineProperty(t,`shape`,{value:n}),n}})}let n=gm(()=>zg(t));U(e._zod,`propValues`,()=>{let e=t.shape,n={};for(let t in e){let r=e[t]._zod;if(r.values){n[t]??(n[t]=new Set);for(let e of r.values)n[t].add(e)}}return n});let r=Em,i=t.catchall,a;e._zod.parse=(t,o)=>{a??=n.value;let s=t.value;if(!r(s))return t.issues.push({expected:`object`,code:`invalid_type`,input:s,inst:e}),t;t.value={};let c=[],l=a.shape;for(let e of a.keys){let n=l[e],r=n._zod.optout===`optional`,i=n._zod.run({value:s[e],issues:[]},o);i instanceof Promise?c.push(i.then(n=>Rg(n,t,e,s,r))):Rg(i,t,e,s,r)}return i?Bg(c,s,t,o,n.value,e):c.length?Promise.all(c).then(()=>t):t}}),Hg=H(`$ZodObjectJIT`,(e,t)=>{Vg.init(e,t);let n=e._zod.parse,r=gm(()=>zg(t)),i=e=>{let t=new rg([`shape`,`payload`,`ctx`]),n=r.value,i=e=>{let t=Cm(e);return`shape[${t}]._zod.run({ value: input[${t}], issues: [] }, ctx)`};t.write(`const input = payload.value;`);let a=Object.create(null),o=0;for(let e of n.keys)a[e]=`key_${o++}`;t.write(`const newResult = {};`);for(let r of n.keys){let n=a[r],o=Cm(r),s=e[r]?._zod?.optout===`optional`;t.write(`const ${n} = ${i(r)};`),s?t.write(`
496
+ `))}};const fg={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=fg;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=Xm(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 vm;if(i||o instanceof Promise)i=(i??Promise.resolve()).then(async()=>{await o,e.issues.length!==t&&(r||=Xm(e,t))});else{if(e.issues.length===t)continue;r||=Xm(e,t)}}return i?i.then(()=>e):e},n=(n,i,a)=>{if(Xm(n))return n.aborted=!0,n;let o=t(i,r,a);if(o instanceof Promise){if(a.async===!1)throw new vm;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 vm;return o.then(e=>t(e,r,a))}return t(o,r,a)}}U(e,`~standard`,()=>({validate:t=>{try{let n=uh(e,t);return n.success?{value:n.data}:{issues:n.error?.issues}}catch{return fh(e,t).then(e=>e.success?{value:e.data}:{issues:e.error?.issues})}},vendor:`zod`,version:1}))}),pg=H(`$ZodString`,(e,t)=>{K.init(e,t),e._zod.pattern=[...e?._zod.bag?.patterns??[]].pop()??Wh(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)=>{rg.init(e,t),pg.init(e,t)}),mg=H(`$ZodGUID`,(e,t)=>{t.pattern??=Oh,q.init(e,t)}),hg=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??=kh(e)}else t.pattern??=kh();q.init(e,t)}),gg=H(`$ZodEmail`,(e,t)=>{t.pattern??=Ah,q.init(e,t)}),_g=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})}}}),vg=H(`$ZodEmoji`,(e,t)=>{t.pattern??=jh(),q.init(e,t)}),yg=H(`$ZodNanoID`,(e,t)=>{t.pattern??=Eh,q.init(e,t)}),bg=H(`$ZodCUID`,(e,t)=>{t.pattern??=xh,q.init(e,t)}),xg=H(`$ZodCUID2`,(e,t)=>{t.pattern??=Sh,q.init(e,t)}),Sg=H(`$ZodULID`,(e,t)=>{t.pattern??=Ch,q.init(e,t)}),Cg=H(`$ZodXID`,(e,t)=>{t.pattern??=wh,q.init(e,t)}),wg=H(`$ZodKSUID`,(e,t)=>{t.pattern??=Th,q.init(e,t)}),Tg=H(`$ZodISODateTime`,(e,t)=>{t.pattern??=Uh(t),q.init(e,t)}),Eg=H(`$ZodISODate`,(e,t)=>{t.pattern??=Bh,q.init(e,t)}),Dg=H(`$ZodISOTime`,(e,t)=>{t.pattern??=Hh(t),q.init(e,t)}),Og=H(`$ZodISODuration`,(e,t)=>{t.pattern??=Dh,q.init(e,t)}),kg=H(`$ZodIPv4`,(e,t)=>{t.pattern??=Mh,q.init(e,t),e._zod.bag.format=`ipv4`}),Ag=H(`$ZodIPv6`,(e,t)=>{t.pattern??=Nh,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})}}}),jg=H(`$ZodCIDRv4`,(e,t)=>{t.pattern??=Ph,q.init(e,t)}),Mg=H(`$ZodCIDRv6`,(e,t)=>{t.pattern??=Fh,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 Ng(e){if(e===``)return!0;if(e.length%4!=0)return!1;try{return atob(e),!0}catch{return!1}}const Pg=H(`$ZodBase64`,(e,t)=>{t.pattern??=Ih,q.init(e,t),e._zod.bag.contentEncoding=`base64`,e._zod.check=n=>{Ng(n.value)||n.issues.push({code:`invalid_format`,format:`base64`,input:n.value,inst:e,continue:!t.abort})}});function Fg(e){if(!Lh.test(e))return!1;let t=e.replace(/[-_]/g,e=>e===`-`?`+`:`/`);return Ng(t.padEnd(Math.ceil(t.length/4)*4,`=`))}const Ig=H(`$ZodBase64URL`,(e,t)=>{t.pattern??=Lh,q.init(e,t),e._zod.bag.contentEncoding=`base64url`,e._zod.check=n=>{Fg(n.value)||n.issues.push({code:`invalid_format`,format:`base64url`,input:n.value,inst:e,continue:!t.abort})}}),Lg=H(`$ZodE164`,(e,t)=>{t.pattern??=Rh,q.init(e,t)});function Rg(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 zg=H(`$ZodJWT`,(e,t)=>{q.init(e,t),e._zod.check=n=>{Rg(n.value,t.alg)||n.issues.push({code:`invalid_format`,format:`jwt`,input:n.value,inst:e,continue:!t.abort})}}),Bg=H(`$ZodNumber`,(e,t)=>{K.init(e,t),e._zod.pattern=e._zod.bag.pattern??Kh,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}}),Vg=H(`$ZodNumberFormat`,(e,t)=>{$h.init(e,t),Bg.init(e,t)}),Hg=H(`$ZodUnknown`,(e,t)=>{K.init(e,t),e._zod.parse=e=>e}),Ug=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 Wg(e,t,n){e.issues.length&&t.issues.push(...Zm(n,e.issues)),t.value[n]=e.value}const Gg=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=>Wg(t,n,e))):Wg(s,n,e)}return a.length?Promise.all(a).then(()=>n):n}});function Kg(e,t,n,r,i){if(e.issues.length){if(i&&!(n in r))return;t.issues.push(...Zm(n,e.issues))}e.value===void 0?n in r&&(t.value[n]=void 0):t.value[n]=e.value}function qg(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=Vm(e.shape);return{...e,keys:t,keySet:new Set(t),numKeys:t.length,optionalKeys:new Set(n)}}function Jg(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=>Kg(e,n,i,t,u))):Kg(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 Yg=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=wm(()=>qg(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=Pm,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=>Kg(n,t,e,s,r))):Kg(i,t,e,s,r)}return i?Jg(c,s,t,o,n.value,e):c.length?Promise.all(c).then(()=>t):t}}),Xg=H(`$ZodObjectJIT`,(e,t)=>{Yg.init(e,t);let n=e._zod.parse,r=wm(()=>qg(t)),i=e=>{let t=new dg([`shape`,`payload`,`ctx`]),n=r.value,i=e=>{let t=jm(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=jm(r),s=e[r]?._zod?.optout===`optional`;t.write(`const ${n} = ${i(r)};`),s?t.write(`
496
497
  if (${n}.issues.length) {
497
498
  if (${o} in input) {
498
499
  payload.issues = payload.issues.concat(${n}.issues.map(iss => ({
@@ -526,15 +527,15 @@ If the image is not a UI/design screenshot, give a normal concise description in
526
527
  newResult[${o}] = ${n}.value;
527
528
  }
528
529
 
529
- `)}t.write(`payload.value = newResult;`),t.write(`return payload;`);let s=t.compile();return(t,n)=>s(e,t,n)},a,o=Em,s=!fm.jitless,c=s&&Dm.value,l=t.catchall,u;e._zod.parse=(d,f)=>{u??=r.value;let p=d.value;return o(p)?s&&c&&f?.async===!1&&f.jitless!==!0?(a||=i(t.shape),d=a(d,f),l?Bg([],p,d,f,u,e):d):n(d,f):(d.issues.push({expected:`object`,code:`invalid_type`,input:p,inst:e}),d)}});function Ug(e,t,n,r){for(let n of e)if(n.issues.length===0)return t.value=n.value,t;let i=e.filter(e=>!Hm(e));return i.length===1?(t.value=i[0].value,i[0]):(t.issues.push({code:`invalid_union`,input:t.value,inst:n,errors:e.map(e=>e.issues.map(e=>Gm(e,r,pm())))}),t)}const Wg=H(`$ZodUnion`,(e,t)=>{K.init(e,t),U(e._zod,`optin`,()=>t.options.some(e=>e._zod.optin===`optional`)?`optional`:void 0),U(e._zod,`optout`,()=>t.options.some(e=>e._zod.optout===`optional`)?`optional`:void 0),U(e._zod,`values`,()=>{if(t.options.every(e=>e._zod.values))return new Set(t.options.flatMap(e=>Array.from(e._zod.values)))}),U(e._zod,`pattern`,()=>{if(t.options.every(e=>e._zod.pattern)){let e=t.options.map(e=>e._zod.pattern);return RegExp(`^(${e.map(e=>vm(e.source)).join(`|`)})$`)}});let n=t.options.length===1,r=t.options[0]._zod.run;e._zod.parse=(i,a)=>{if(n)return r(i,a);let o=!1,s=[];for(let e of t.options){let t=e._zod.run({value:i.value,issues:[]},a);if(t instanceof Promise)s.push(t),o=!0;else{if(t.issues.length===0)return t;s.push(t)}}return o?Promise.all(s).then(t=>Ug(t,i,e,a)):Ug(s,i,e,a)}}),Gg=H(`$ZodIntersection`,(e,t)=>{K.init(e,t),e._zod.parse=(e,n)=>{let r=e.value,i=t.left._zod.run({value:r,issues:[]},n),a=t.right._zod.run({value:r,issues:[]},n);return i instanceof Promise||a instanceof Promise?Promise.all([i,a]).then(([t,n])=>qg(e,t,n)):qg(e,i,a)}});function Kg(e,t){if(e===t||e instanceof Date&&t instanceof Date&&+e==+t)return{valid:!0,data:e};if(Om(e)&&Om(t)){let n=Object.keys(t),r=Object.keys(e).filter(e=>n.indexOf(e)!==-1),i={...e,...t};for(let n of r){let r=Kg(e[n],t[n]);if(!r.valid)return{valid:!1,mergeErrorPath:[n,...r.mergeErrorPath]};i[n]=r.data}return{valid:!0,data:i}}if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return{valid:!1,mergeErrorPath:[]};let n=[];for(let r=0;r<e.length;r++){let i=e[r],a=t[r],o=Kg(i,a);if(!o.valid)return{valid:!1,mergeErrorPath:[r,...o.mergeErrorPath]};n.push(o.data)}return{valid:!0,data:n}}return{valid:!1,mergeErrorPath:[]}}function qg(e,t,n){let r=new Map,i;for(let n of t.issues)if(n.code===`unrecognized_keys`){i??=n;for(let e of n.keys)r.has(e)||r.set(e,{}),r.get(e).l=!0}else e.issues.push(n);for(let t of n.issues)if(t.code===`unrecognized_keys`)for(let e of t.keys)r.has(e)||r.set(e,{}),r.get(e).r=!0;else e.issues.push(t);let a=[...r].filter(([,e])=>e.l&&e.r).map(([e])=>e);if(a.length&&i&&e.issues.push({...i,keys:a}),Hm(e))return e;let o=Kg(t.value,n.value);if(!o.valid)throw Error(`Unmergable intersection. Error path: ${JSON.stringify(o.mergeErrorPath)}`);return e.value=o.data,e}const Jg=H(`$ZodEnum`,(e,t)=>{K.init(e,t);let n=mm(t.entries),r=new Set(n);e._zod.values=r,e._zod.pattern=RegExp(`^(${n.filter(e=>Am.has(typeof e)).map(e=>typeof e==`string`?jm(e):e.toString()).join(`|`)})$`),e._zod.parse=(t,i)=>{let a=t.value;return r.has(a)||t.issues.push({code:`invalid_value`,values:n,input:a,inst:e}),t}}),Yg=H(`$ZodTransform`,(e,t)=>{K.init(e,t),e._zod.parse=(n,r)=>{if(r.direction===`backward`)throw new dm(e.constructor.name);let i=t.transform(n.value,n);if(r.async)return(i instanceof Promise?i:Promise.resolve(i)).then(e=>(n.value=e,n));if(i instanceof Promise)throw new um;return n.value=i,n}});function Xg(e,t){return e.issues.length&&t===void 0?{issues:[],value:void 0}:e}const Zg=H(`$ZodOptional`,(e,t)=>{K.init(e,t),e._zod.optin=`optional`,e._zod.optout=`optional`,U(e._zod,`values`,()=>t.innerType._zod.values?new Set([...t.innerType._zod.values,void 0]):void 0),U(e._zod,`pattern`,()=>{let e=t.innerType._zod.pattern;return e?RegExp(`^(${vm(e.source)})?$`):void 0}),e._zod.parse=(e,n)=>{if(t.innerType._zod.optin===`optional`){let r=t.innerType._zod.run(e,n);return r instanceof Promise?r.then(t=>Xg(t,e.value)):Xg(r,e.value)}return e.value===void 0?e:t.innerType._zod.run(e,n)}}),Qg=H(`$ZodExactOptional`,(e,t)=>{Zg.init(e,t),U(e._zod,`values`,()=>t.innerType._zod.values),U(e._zod,`pattern`,()=>t.innerType._zod.pattern),e._zod.parse=(e,n)=>t.innerType._zod.run(e,n)}),$g=H(`$ZodNullable`,(e,t)=>{K.init(e,t),U(e._zod,`optin`,()=>t.innerType._zod.optin),U(e._zod,`optout`,()=>t.innerType._zod.optout),U(e._zod,`pattern`,()=>{let e=t.innerType._zod.pattern;return e?RegExp(`^(${vm(e.source)}|null)$`):void 0}),U(e._zod,`values`,()=>t.innerType._zod.values?new Set([...t.innerType._zod.values,null]):void 0),e._zod.parse=(e,n)=>e.value===null?e:t.innerType._zod.run(e,n)}),e_=H(`$ZodDefault`,(e,t)=>{K.init(e,t),e._zod.optin=`optional`,U(e._zod,`values`,()=>t.innerType._zod.values),e._zod.parse=(e,n)=>{if(n.direction===`backward`)return t.innerType._zod.run(e,n);if(e.value===void 0)return e.value=t.defaultValue,e;let r=t.innerType._zod.run(e,n);return r instanceof Promise?r.then(e=>t_(e,t)):t_(r,t)}});function t_(e,t){return e.value===void 0&&(e.value=t.defaultValue),e}const n_=H(`$ZodPrefault`,(e,t)=>{K.init(e,t),e._zod.optin=`optional`,U(e._zod,`values`,()=>t.innerType._zod.values),e._zod.parse=(e,n)=>(n.direction===`backward`||e.value===void 0&&(e.value=t.defaultValue),t.innerType._zod.run(e,n))}),r_=H(`$ZodNonOptional`,(e,t)=>{K.init(e,t),U(e._zod,`values`,()=>{let e=t.innerType._zod.values;return e?new Set([...e].filter(e=>e!==void 0)):void 0}),e._zod.parse=(n,r)=>{let i=t.innerType._zod.run(n,r);return i instanceof Promise?i.then(t=>i_(t,e)):i_(i,e)}});function i_(e,t){return!e.issues.length&&e.value===void 0&&e.issues.push({code:`invalid_type`,expected:`nonoptional`,input:e.value,inst:t}),e}const a_=H(`$ZodCatch`,(e,t)=>{K.init(e,t),U(e._zod,`optin`,()=>t.innerType._zod.optin),U(e._zod,`optout`,()=>t.innerType._zod.optout),U(e._zod,`values`,()=>t.innerType._zod.values),e._zod.parse=(e,n)=>{if(n.direction===`backward`)return t.innerType._zod.run(e,n);let r=t.innerType._zod.run(e,n);return r instanceof Promise?r.then(r=>(e.value=r.value,r.issues.length&&(e.value=t.catchValue({...e,error:{issues:r.issues.map(e=>Gm(e,n,pm()))},input:e.value}),e.issues=[]),e)):(e.value=r.value,r.issues.length&&(e.value=t.catchValue({...e,error:{issues:r.issues.map(e=>Gm(e,n,pm()))},input:e.value}),e.issues=[]),e)}}),o_=H(`$ZodPipe`,(e,t)=>{K.init(e,t),U(e._zod,`values`,()=>t.in._zod.values),U(e._zod,`optin`,()=>t.in._zod.optin),U(e._zod,`optout`,()=>t.out._zod.optout),U(e._zod,`propValues`,()=>t.in._zod.propValues),e._zod.parse=(e,n)=>{if(n.direction===`backward`){let r=t.out._zod.run(e,n);return r instanceof Promise?r.then(e=>s_(e,t.in,n)):s_(r,t.in,n)}let r=t.in._zod.run(e,n);return r instanceof Promise?r.then(e=>s_(e,t.out,n)):s_(r,t.out,n)}});function s_(e,t,n){return e.issues.length?(e.aborted=!0,e):t._zod.run({value:e.value,issues:e.issues},n)}const c_=H(`$ZodReadonly`,(e,t)=>{K.init(e,t),U(e._zod,`propValues`,()=>t.innerType._zod.propValues),U(e._zod,`values`,()=>t.innerType._zod.values),U(e._zod,`optin`,()=>t.innerType?._zod?.optin),U(e._zod,`optout`,()=>t.innerType?._zod?.optout),e._zod.parse=(e,n)=>{if(n.direction===`backward`)return t.innerType._zod.run(e,n);let r=t.innerType._zod.run(e,n);return r instanceof Promise?r.then(l_):l_(r)}});function l_(e){return e.value=Object.freeze(e.value),e}const u_=H(`$ZodCustom`,(e,t)=>{G.init(e,t),K.init(e,t),e._zod.parse=(e,t)=>e,e._zod.check=n=>{let r=n.value,i=t.fn(r);if(i instanceof Promise)return i.then(t=>d_(t,n,r,e));d_(i,n,r,e)}});function d_(e,t,n,r){if(!e){let e={code:`custom`,input:n,inst:r,path:[...r._zod.def.path??[]],continue:!r._zod.def.abort};r._zod.def.params&&(e.params=r._zod.def.params),t.issues.push(qm(e))}}var f_,p_=class{constructor(){this._map=new WeakMap,this._idmap=new Map}add(e,...t){let n=t[0];return this._map.set(e,n),n&&typeof n==`object`&&`id`in n&&this._idmap.set(n.id,e),this}clear(){return this._map=new WeakMap,this._idmap=new Map,this}remove(e){let t=this._map.get(e);return t&&typeof t==`object`&&`id`in t&&this._idmap.delete(t.id),this._map.delete(e),this}get(e){let t=e._zod.parent;if(t){let n={...this.get(t)??{}};delete n.id;let r={...n,...this._map.get(e)};return Object.keys(r).length?r:void 0}return this._map.get(e)}has(e){return this._map.has(e)}};function m_(){return new p_}(f_=globalThis).__zod_globalRegistry??(f_.__zod_globalRegistry=m_());const h_=globalThis.__zod_globalRegistry;function g_(e,t){return new e({type:`string`,...W(t)})}function __(e,t){return new e({type:`string`,format:`email`,check:`string_format`,abort:!1,...W(t)})}function v_(e,t){return new e({type:`string`,format:`guid`,check:`string_format`,abort:!1,...W(t)})}function y_(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,...W(t)})}function b_(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,version:`v4`,...W(t)})}function x_(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,version:`v6`,...W(t)})}function S_(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,version:`v7`,...W(t)})}function C_(e,t){return new e({type:`string`,format:`url`,check:`string_format`,abort:!1,...W(t)})}function w_(e,t){return new e({type:`string`,format:`emoji`,check:`string_format`,abort:!1,...W(t)})}function T_(e,t){return new e({type:`string`,format:`nanoid`,check:`string_format`,abort:!1,...W(t)})}function E_(e,t){return new e({type:`string`,format:`cuid`,check:`string_format`,abort:!1,...W(t)})}function D_(e,t){return new e({type:`string`,format:`cuid2`,check:`string_format`,abort:!1,...W(t)})}function O_(e,t){return new e({type:`string`,format:`ulid`,check:`string_format`,abort:!1,...W(t)})}function k_(e,t){return new e({type:`string`,format:`xid`,check:`string_format`,abort:!1,...W(t)})}function A_(e,t){return new e({type:`string`,format:`ksuid`,check:`string_format`,abort:!1,...W(t)})}function j_(e,t){return new e({type:`string`,format:`ipv4`,check:`string_format`,abort:!1,...W(t)})}function M_(e,t){return new e({type:`string`,format:`ipv6`,check:`string_format`,abort:!1,...W(t)})}function N_(e,t){return new e({type:`string`,format:`cidrv4`,check:`string_format`,abort:!1,...W(t)})}function P_(e,t){return new e({type:`string`,format:`cidrv6`,check:`string_format`,abort:!1,...W(t)})}function F_(e,t){return new e({type:`string`,format:`base64`,check:`string_format`,abort:!1,...W(t)})}function I_(e,t){return new e({type:`string`,format:`base64url`,check:`string_format`,abort:!1,...W(t)})}function L_(e,t){return new e({type:`string`,format:`e164`,check:`string_format`,abort:!1,...W(t)})}function R_(e,t){return new e({type:`string`,format:`jwt`,check:`string_format`,abort:!1,...W(t)})}function z_(e,t){return new e({type:`string`,format:`datetime`,check:`string_format`,offset:!1,local:!1,precision:null,...W(t)})}function B_(e,t){return new e({type:`string`,format:`date`,check:`string_format`,...W(t)})}function V_(e,t){return new e({type:`string`,format:`time`,check:`string_format`,precision:null,...W(t)})}function H_(e,t){return new e({type:`string`,format:`duration`,check:`string_format`,...W(t)})}function U_(e,t){return new e({type:`number`,checks:[],...W(t)})}function W_(e,t){return new e({type:`number`,check:`number_format`,abort:!1,format:`safeint`,...W(t)})}function G_(e){return new e({type:`unknown`})}function K_(e,t){return new e({type:`never`,...W(t)})}function q_(e,t){return new Hh({check:`less_than`,...W(t),value:e,inclusive:!1})}function J_(e,t){return new Hh({check:`less_than`,...W(t),value:e,inclusive:!0})}function Y_(e,t){return new Uh({check:`greater_than`,...W(t),value:e,inclusive:!1})}function X_(e,t){return new Uh({check:`greater_than`,...W(t),value:e,inclusive:!0})}function Z_(e,t){return new Wh({check:`multiple_of`,...W(t),value:e})}function Q_(e,t){return new Kh({check:`max_length`,...W(t),maximum:e})}function $_(e,t){return new qh({check:`min_length`,...W(t),minimum:e})}function ev(e,t){return new Jh({check:`length_equals`,...W(t),length:e})}function tv(e,t){return new Xh({check:`string_format`,format:`regex`,...W(t),pattern:e})}function nv(e){return new Zh({check:`string_format`,format:`lowercase`,...W(e)})}function rv(e){return new Qh({check:`string_format`,format:`uppercase`,...W(e)})}function iv(e,t){return new $h({check:`string_format`,format:`includes`,...W(t),includes:e})}function av(e,t){return new eg({check:`string_format`,format:`starts_with`,...W(t),prefix:e})}function ov(e,t){return new tg({check:`string_format`,format:`ends_with`,...W(t),suffix:e})}function sv(e){return new ng({check:`overwrite`,tx:e})}function cv(e){return sv(t=>t.normalize(e))}function lv(){return sv(e=>e.trim())}function uv(){return sv(e=>e.toLowerCase())}function dv(){return sv(e=>e.toUpperCase())}function fv(){return sv(e=>wm(e))}function pv(e,t,n){return new e({type:`array`,element:t,...W(n)})}function mv(e,t,n){return new e({type:`custom`,check:`custom`,fn:t,...W(n)})}function hv(e){let t=gv(n=>(n.addIssue=e=>{if(typeof e==`string`)n.issues.push(qm(e,n.value,t._zod.def));else{let r=e;r.fatal&&(r.continue=!1),r.code??=`custom`,r.input??=n.value,r.inst??=t,r.continue??=!t._zod.def.abort,n.issues.push(qm(r))}},e(n.value,n)));return t}function gv(e,t){let n=new G({check:`custom`,...W(t)});return n._zod.check=e,n}function _v(e){let t=e?.target??`draft-2020-12`;return t===`draft-4`&&(t=`draft-04`),t===`draft-7`&&(t=`draft-07`),{processors:e.processors??{},metadataRegistry:e?.metadata??h_,target:t,unrepresentable:e?.unrepresentable??`throw`,override:e?.override??(()=>{}),io:e?.io??`output`,counter:0,seen:new Map,cycles:e?.cycles??`ref`,reused:e?.reused??`inline`,external:e?.external??void 0}}function J(e,t,n={path:[],schemaPath:[]}){var r;let i=e._zod.def,a=t.seen.get(e);if(a)return a.count++,n.schemaPath.includes(e)&&(a.cycle=n.path),a.schema;let o={schema:{},count:1,cycle:void 0,path:n.path};t.seen.set(e,o);let s=e._zod.toJSONSchema?.();if(s)o.schema=s;else{let r={...n,schemaPath:[...n.schemaPath,e],path:n.path};if(e._zod.processJSONSchema)e._zod.processJSONSchema(t,o.schema,r);else{let n=o.schema,a=t.processors[i.type];if(!a)throw Error(`[toJSONSchema]: Non-representable type encountered: ${i.type}`);a(e,t,n,r)}let a=e._zod.parent;a&&(o.ref||=a,J(a,t,r),t.seen.get(a).isParent=!0)}let c=t.metadataRegistry.get(e);return c&&Object.assign(o.schema,c),t.io===`input`&&Y(e)&&(delete o.schema.examples,delete o.schema.default),t.io===`input`&&o.schema._prefault&&((r=o.schema).default??(r.default=o.schema._prefault)),delete o.schema._prefault,t.seen.get(e).schema}function vv(e,t){let n=e.seen.get(t);if(!n)throw Error(`Unprocessed schema. This is a bug in Zod.`);let r=new Map;for(let t of e.seen.entries()){let n=e.metadataRegistry.get(t[0])?.id;if(n){let e=r.get(n);if(e&&e!==t[0])throw Error(`Duplicate schema id "${n}" detected during JSON Schema conversion. Two different schemas cannot share the same id when converted together.`);r.set(n,t[0])}}let i=t=>{let r=e.target===`draft-2020-12`?`$defs`:`definitions`;if(e.external){let n=e.external.registry.get(t[0])?.id,i=e.external.uri??(e=>e);if(n)return{ref:i(n)};let a=t[1].defId??t[1].schema.id??`schema${e.counter++}`;return t[1].defId=a,{defId:a,ref:`${i(`__shared`)}#/${r}/${a}`}}if(t[1]===n)return{ref:`#`};let i=`#/${r}/`,a=t[1].schema.id??`__schema${e.counter++}`;return{defId:a,ref:i+a}},a=e=>{if(e[1].schema.$ref)return;let t=e[1],{ref:n,defId:r}=i(e);t.def={...t.schema},r&&(t.defId=r);let a=t.schema;for(let e in a)delete a[e];a.$ref=n};if(e.cycles===`throw`)for(let t of e.seen.entries()){let e=t[1];if(e.cycle)throw Error(`Cycle detected: #/${e.cycle?.join(`/`)}/<root>
530
+ `)}t.write(`payload.value = newResult;`),t.write(`return payload;`);let s=t.compile();return(t,n)=>s(e,t,n)},a,o=Pm,s=!bm.jitless,c=s&&Fm.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?Jg([],p,d,f,u,e):d):n(d,f):(d.issues.push({expected:`object`,code:`invalid_type`,input:p,inst:e}),d)}});function Zg(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=>!Xm(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=>$m(e,r,xm())))}),t)}const Qg=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=>Em(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=>Zg(t,i,e,a)):Zg(s,i,e,a)}}),$g=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])=>t_(e,t,n)):t_(e,i,a)}});function e_(e,t){if(e===t||e instanceof Date&&t instanceof Date&&+e==+t)return{valid:!0,data:e};if(Im(e)&&Im(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=e_(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=e_(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 t_(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}),Xm(e))return e;let o=e_(t.value,n.value);if(!o.valid)throw Error(`Unmergable intersection. Error path: ${JSON.stringify(o.mergeErrorPath)}`);return e.value=o.data,e}const n_=H(`$ZodEnum`,(e,t)=>{K.init(e,t);let n=Sm(t.entries),r=new Set(n);e._zod.values=r,e._zod.pattern=RegExp(`^(${n.filter(e=>Rm.has(typeof e)).map(e=>typeof e==`string`?zm(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}}),r_=H(`$ZodTransform`,(e,t)=>{K.init(e,t),e._zod.parse=(n,r)=>{if(r.direction===`backward`)throw new ym(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 vm;return n.value=i,n}});function i_(e,t){return e.issues.length&&t===void 0?{issues:[],value:void 0}:e}const a_=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(`^(${Em(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=>i_(t,e.value)):i_(r,e.value)}return e.value===void 0?e:t.innerType._zod.run(e,n)}}),o_=H(`$ZodExactOptional`,(e,t)=>{a_.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)}),s_=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(`^(${Em(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)}),c_=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=>l_(e,t)):l_(r,t)}});function l_(e,t){return e.value===void 0&&(e.value=t.defaultValue),e}const u_=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))}),d_=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=>f_(t,e)):f_(i,e)}});function f_(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 p_=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=>$m(e,n,xm()))},input:e.value}),e.issues=[]),e)):(e.value=r.value,r.issues.length&&(e.value=t.catchValue({...e,error:{issues:r.issues.map(e=>$m(e,n,xm()))},input:e.value}),e.issues=[]),e)}}),m_=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=>h_(e,t.in,n)):h_(r,t.in,n)}let r=t.in._zod.run(e,n);return r instanceof Promise?r.then(e=>h_(e,t.out,n)):h_(r,t.out,n)}});function h_(e,t,n){return e.issues.length?(e.aborted=!0,e):t._zod.run({value:e.value,issues:e.issues},n)}const g_=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(__):__(r)}});function __(e){return e.value=Object.freeze(e.value),e}const v_=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=>y_(t,n,r,e));y_(i,n,r,e)}});function y_(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(th(e))}}var b_,x_=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 S_(){return new x_}(b_=globalThis).__zod_globalRegistry??(b_.__zod_globalRegistry=S_());const C_=globalThis.__zod_globalRegistry;function w_(e,t){return new e({type:`string`,...W(t)})}function T_(e,t){return new e({type:`string`,format:`email`,check:`string_format`,abort:!1,...W(t)})}function E_(e,t){return new e({type:`string`,format:`guid`,check:`string_format`,abort:!1,...W(t)})}function D_(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,...W(t)})}function O_(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,version:`v4`,...W(t)})}function k_(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,version:`v6`,...W(t)})}function A_(e,t){return new e({type:`string`,format:`uuid`,check:`string_format`,abort:!1,version:`v7`,...W(t)})}function j_(e,t){return new e({type:`string`,format:`url`,check:`string_format`,abort:!1,...W(t)})}function M_(e,t){return new e({type:`string`,format:`emoji`,check:`string_format`,abort:!1,...W(t)})}function N_(e,t){return new e({type:`string`,format:`nanoid`,check:`string_format`,abort:!1,...W(t)})}function P_(e,t){return new e({type:`string`,format:`cuid`,check:`string_format`,abort:!1,...W(t)})}function F_(e,t){return new e({type:`string`,format:`cuid2`,check:`string_format`,abort:!1,...W(t)})}function I_(e,t){return new e({type:`string`,format:`ulid`,check:`string_format`,abort:!1,...W(t)})}function L_(e,t){return new e({type:`string`,format:`xid`,check:`string_format`,abort:!1,...W(t)})}function R_(e,t){return new e({type:`string`,format:`ksuid`,check:`string_format`,abort:!1,...W(t)})}function z_(e,t){return new e({type:`string`,format:`ipv4`,check:`string_format`,abort:!1,...W(t)})}function B_(e,t){return new e({type:`string`,format:`ipv6`,check:`string_format`,abort:!1,...W(t)})}function V_(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 U_(e,t){return new e({type:`string`,format:`base64`,check:`string_format`,abort:!1,...W(t)})}function W_(e,t){return new e({type:`string`,format:`base64url`,check:`string_format`,abort:!1,...W(t)})}function G_(e,t){return new e({type:`string`,format:`e164`,check:`string_format`,abort:!1,...W(t)})}function K_(e,t){return new e({type:`string`,format:`jwt`,check:`string_format`,abort:!1,...W(t)})}function q_(e,t){return new e({type:`string`,format:`datetime`,check:`string_format`,offset:!1,local:!1,precision:null,...W(t)})}function J_(e,t){return new e({type:`string`,format:`date`,check:`string_format`,...W(t)})}function Y_(e,t){return new e({type:`string`,format:`time`,check:`string_format`,precision:null,...W(t)})}function X_(e,t){return new e({type:`string`,format:`duration`,check:`string_format`,...W(t)})}function Z_(e,t){return new e({type:`number`,checks:[],...W(t)})}function Q_(e,t){return new e({type:`number`,check:`number_format`,abort:!1,format:`safeint`,...W(t)})}function $_(e){return new e({type:`unknown`})}function ev(e,t){return new e({type:`never`,...W(t)})}function tv(e,t){return new Xh({check:`less_than`,...W(t),value:e,inclusive:!1})}function nv(e,t){return new Xh({check:`less_than`,...W(t),value:e,inclusive:!0})}function rv(e,t){return new Zh({check:`greater_than`,...W(t),value:e,inclusive:!1})}function iv(e,t){return new Zh({check:`greater_than`,...W(t),value:e,inclusive:!0})}function av(e,t){return new Qh({check:`multiple_of`,...W(t),value:e})}function ov(e,t){return new eg({check:`max_length`,...W(t),maximum:e})}function sv(e,t){return new tg({check:`min_length`,...W(t),minimum:e})}function cv(e,t){return new ng({check:`length_equals`,...W(t),length:e})}function lv(e,t){return new ig({check:`string_format`,format:`regex`,...W(t),pattern:e})}function uv(e){return new ag({check:`string_format`,format:`lowercase`,...W(e)})}function dv(e){return new og({check:`string_format`,format:`uppercase`,...W(e)})}function fv(e,t){return new sg({check:`string_format`,format:`includes`,...W(t),includes:e})}function pv(e,t){return new cg({check:`string_format`,format:`starts_with`,...W(t),prefix:e})}function mv(e,t){return new lg({check:`string_format`,format:`ends_with`,...W(t),suffix:e})}function hv(e){return new ug({check:`overwrite`,tx:e})}function gv(e){return hv(t=>t.normalize(e))}function _v(){return hv(e=>e.trim())}function vv(){return hv(e=>e.toLowerCase())}function yv(){return hv(e=>e.toUpperCase())}function bv(){return hv(e=>Mm(e))}function xv(e,t,n){return new e({type:`array`,element:t,...W(n)})}function Sv(e,t,n){return new e({type:`custom`,check:`custom`,fn:t,...W(n)})}function Cv(e){let t=wv(n=>(n.addIssue=e=>{if(typeof e==`string`)n.issues.push(th(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(th(r))}},e(n.value,n)));return t}function wv(e,t){let n=new G({check:`custom`,...W(t)});return n._zod.check=e,n}function Tv(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??C_,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 Ev(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>
530
531
 
531
- Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.`)}for(let n of e.seen.entries()){let r=n[1];if(t===n[0]){a(n);continue}if(e.external){let r=e.external.registry.get(n[0])?.id;if(t!==n[0]&&r){a(n);continue}}if(e.metadataRegistry.get(n[0])?.id){a(n);continue}if(r.cycle){a(n);continue}if(r.count>1&&e.reused===`ref`){a(n);continue}}}function yv(e,t){let n=e.seen.get(t);if(!n)throw Error(`Unprocessed schema. This is a bug in Zod.`);let r=t=>{let n=e.seen.get(t);if(n.ref===null)return;let i=n.def??n.schema,a={...i},o=n.ref;if(n.ref=null,o){r(o);let n=e.seen.get(o),s=n.schema;if(s.$ref&&(e.target===`draft-07`||e.target===`draft-04`||e.target===`openapi-3.0`)?(i.allOf=i.allOf??[],i.allOf.push(s)):Object.assign(i,s),Object.assign(i,a),t._zod.parent===o)for(let e in i)e===`$ref`||e===`allOf`||e in a||delete i[e];if(s.$ref&&n.def)for(let e in i)e===`$ref`||e===`allOf`||e in n.def&&JSON.stringify(i[e])===JSON.stringify(n.def[e])&&delete i[e]}let s=t._zod.parent;if(s&&s!==o){r(s);let t=e.seen.get(s);if(t?.schema.$ref&&(i.$ref=t.schema.$ref,t.def))for(let e in i)e===`$ref`||e===`allOf`||e in t.def&&JSON.stringify(i[e])===JSON.stringify(t.def[e])&&delete i[e]}e.override({zodSchema:t,jsonSchema:i,path:n.path??[]})};for(let t of[...e.seen.entries()].reverse())r(t[0]);let i={};if(e.target===`draft-2020-12`?i.$schema=`https://json-schema.org/draft/2020-12/schema`:e.target===`draft-07`?i.$schema=`http://json-schema.org/draft-07/schema#`:e.target===`draft-04`?i.$schema=`http://json-schema.org/draft-04/schema#`:e.target,e.external?.uri){let n=e.external.registry.get(t)?.id;if(!n)throw Error("Schema is missing an `id` property");i.$id=e.external.uri(n)}Object.assign(i,n.def??n.schema);let a=e.external?.defs??{};for(let t of e.seen.entries()){let e=t[1];e.def&&e.defId&&(a[e.defId]=e.def)}e.external||Object.keys(a).length>0&&(e.target===`draft-2020-12`?i.$defs=a:i.definitions=a);try{let n=JSON.parse(JSON.stringify(i));return Object.defineProperty(n,`~standard`,{value:{...t[`~standard`],jsonSchema:{input:xv(t,`input`,e.processors),output:xv(t,`output`,e.processors)}},enumerable:!1,writable:!1}),n}catch{throw Error(`Error converting schema to JSON.`)}}function Y(e,t){let n=t??{seen:new Set};if(n.seen.has(e))return!1;n.seen.add(e);let r=e._zod.def;if(r.type===`transform`)return!0;if(r.type===`array`)return Y(r.element,n);if(r.type===`set`)return Y(r.valueType,n);if(r.type===`lazy`)return Y(r.getter(),n);if(r.type===`promise`||r.type===`optional`||r.type===`nonoptional`||r.type===`nullable`||r.type===`readonly`||r.type===`default`||r.type===`prefault`)return Y(r.innerType,n);if(r.type===`intersection`)return Y(r.left,n)||Y(r.right,n);if(r.type===`record`||r.type===`map`)return Y(r.keyType,n)||Y(r.valueType,n);if(r.type===`pipe`)return Y(r.in,n)||Y(r.out,n);if(r.type===`object`){for(let e in r.shape)if(Y(r.shape[e],n))return!0;return!1}if(r.type===`union`){for(let e of r.options)if(Y(e,n))return!0;return!1}if(r.type===`tuple`){for(let e of r.items)if(Y(e,n))return!0;return!!(r.rest&&Y(r.rest,n))}return!1}const bv=(e,t={})=>n=>{let r=_v({...n,processors:t});return J(e,r),vv(r,e),yv(r,e)},xv=(e,t,n={})=>r=>{let{libraryOptions:i,target:a}=r??{},o=_v({...i??{},target:a,io:t,processors:n});return J(e,o),vv(o,e),yv(o,e)},Sv={guid:`uuid`,url:`uri`,datetime:`date-time`,json_string:`json-string`,regex:``},Cv=(e,t,n,r)=>{let i=n;i.type=`string`;let{minimum:a,maximum:o,format:s,patterns:c,contentEncoding:l}=e._zod.bag;if(typeof a==`number`&&(i.minLength=a),typeof o==`number`&&(i.maxLength=o),s&&(i.format=Sv[s]??s,i.format===``&&delete i.format,s===`time`&&delete i.format),l&&(i.contentEncoding=l),c&&c.size>0){let e=[...c];e.length===1?i.pattern=e[0].source:e.length>1&&(i.allOf=[...e.map(e=>({...t.target===`draft-07`||t.target===`draft-04`||t.target===`openapi-3.0`?{type:`string`}:{},pattern:e.source}))])}},wv=(e,t,n,r)=>{let i=n,{minimum:a,maximum:o,format:s,multipleOf:c,exclusiveMaximum:l,exclusiveMinimum:u}=e._zod.bag;typeof s==`string`&&s.includes(`int`)?i.type=`integer`:i.type=`number`,typeof u==`number`&&(t.target===`draft-04`||t.target===`openapi-3.0`?(i.minimum=u,i.exclusiveMinimum=!0):i.exclusiveMinimum=u),typeof a==`number`&&(i.minimum=a,typeof u==`number`&&t.target!==`draft-04`&&(u>=a?delete i.minimum:delete i.exclusiveMinimum)),typeof l==`number`&&(t.target===`draft-04`||t.target===`openapi-3.0`?(i.maximum=l,i.exclusiveMaximum=!0):i.exclusiveMaximum=l),typeof o==`number`&&(i.maximum=o,typeof l==`number`&&t.target!==`draft-04`&&(l<=o?delete i.maximum:delete i.exclusiveMaximum)),typeof c==`number`&&(i.multipleOf=c)},Tv=(e,t,n,r)=>{n.not={}},Ev=(e,t,n,r)=>{let i=e._zod.def,a=mm(i.entries);a.every(e=>typeof e==`number`)&&(n.type=`number`),a.every(e=>typeof e==`string`)&&(n.type=`string`),n.enum=a},Dv=(e,t,n,r)=>{if(t.unrepresentable===`throw`)throw Error(`Custom types cannot be represented in JSON Schema`)},Ov=(e,t,n,r)=>{if(t.unrepresentable===`throw`)throw Error(`Transforms cannot be represented in JSON Schema`)},kv=(e,t,n,r)=>{let i=n,a=e._zod.def,{minimum:o,maximum:s}=e._zod.bag;typeof o==`number`&&(i.minItems=o),typeof s==`number`&&(i.maxItems=s),i.type=`array`,i.items=J(a.element,t,{...r,path:[...r.path,`items`]})},Av=(e,t,n,r)=>{let i=n,a=e._zod.def;i.type=`object`,i.properties={};let o=a.shape;for(let e in o)i.properties[e]=J(o[e],t,{...r,path:[...r.path,`properties`,e]});let s=new Set(Object.keys(o)),c=new Set([...s].filter(e=>{let n=a.shape[e]._zod;return t.io===`input`?n.optin===void 0:n.optout===void 0}));c.size>0&&(i.required=Array.from(c)),a.catchall?._zod.def.type===`never`?i.additionalProperties=!1:a.catchall?a.catchall&&(i.additionalProperties=J(a.catchall,t,{...r,path:[...r.path,`additionalProperties`]})):t.io===`output`&&(i.additionalProperties=!1)},jv=(e,t,n,r)=>{let i=e._zod.def,a=i.inclusive===!1,o=i.options.map((e,n)=>J(e,t,{...r,path:[...r.path,a?`oneOf`:`anyOf`,n]}));a?n.oneOf=o:n.anyOf=o},Mv=(e,t,n,r)=>{let i=e._zod.def,a=J(i.left,t,{...r,path:[...r.path,`allOf`,0]}),o=J(i.right,t,{...r,path:[...r.path,`allOf`,1]}),s=e=>`allOf`in e&&Object.keys(e).length===1;n.allOf=[...s(a)?a.allOf:[a],...s(o)?o.allOf:[o]]},Nv=(e,t,n,r)=>{let i=e._zod.def,a=J(i.innerType,t,r),o=t.seen.get(e);t.target===`openapi-3.0`?(o.ref=i.innerType,n.nullable=!0):n.anyOf=[a,{type:`null`}]},Pv=(e,t,n,r)=>{let i=e._zod.def;J(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},Fv=(e,t,n,r)=>{let i=e._zod.def;J(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType,n.default=JSON.parse(JSON.stringify(i.defaultValue))},Iv=(e,t,n,r)=>{let i=e._zod.def;J(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType,t.io===`input`&&(n._prefault=JSON.parse(JSON.stringify(i.defaultValue)))},Lv=(e,t,n,r)=>{let i=e._zod.def;J(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType;let o;try{o=i.catchValue(void 0)}catch{throw Error(`Dynamic catch values are not supported in JSON Schema`)}n.default=o},Rv=(e,t,n,r)=>{let i=e._zod.def,a=t.io===`input`?i.in._zod.def.type===`transform`?i.out:i.in:i.out;J(a,t,r);let o=t.seen.get(e);o.ref=a},zv=(e,t,n,r)=>{let i=e._zod.def;J(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType,n.readOnly=!0},Bv=(e,t,n,r)=>{let i=e._zod.def;J(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},Vv=H(`ZodISODateTime`,(e,t)=>{_g.init(e,t),$.init(e,t)});function Hv(e){return z_(Vv,e)}const Uv=H(`ZodISODate`,(e,t)=>{vg.init(e,t),$.init(e,t)});function Wv(e){return B_(Uv,e)}const Gv=H(`ZodISOTime`,(e,t)=>{yg.init(e,t),$.init(e,t)});function Kv(e){return V_(Gv,e)}const qv=H(`ZodISODuration`,(e,t)=>{bg.init(e,t),$.init(e,t)});function Jv(e){return H_(qv,e)}const Yv=(e,t)=>{Ym.init(e,t),e.name=`ZodError`,Object.defineProperties(e,{format:{value:t=>Qm(e,t)},flatten:{value:t=>Zm(e,t)},addIssue:{value:t=>{e.issues.push(t),e.message=JSON.stringify(e.issues,hm,2)}},addIssues:{value:t=>{e.issues.push(...t),e.message=JSON.stringify(e.issues,hm,2)}},isEmpty:{get(){return e.issues.length===0}}})};H(`ZodError`,Yv);const X=H(`ZodError`,Yv,{Parent:Error}),Xv=$m(X),Zv=eh(X),Qv=th(X),$v=rh(X),ey=ah(X),ty=oh(X),ny=sh(X),ry=ch(X),iy=lh(X),ay=uh(X),oy=dh(X),sy=fh(X),Z=H(`ZodType`,(e,t)=>(K.init(e,t),Object.assign(e[`~standard`],{jsonSchema:{input:xv(e,`input`),output:xv(e,`output`)}}),e.toJSONSchema=bv(e,{}),e.def=t,e.type=t.type,Object.defineProperty(e,`_def`,{value:t}),e.check=(...n)=>e.clone(Sm(t,{checks:[...t.checks??[],...n.map(e=>typeof e==`function`?{_zod:{check:e,def:{check:`custom`},onattach:[]}}:e)]}),{parent:!0}),e.with=e.check,e.clone=(t,n)=>Mm(e,t,n),e.brand=()=>e,e.register=((t,n)=>(t.add(e,n),e)),e.parse=(t,n)=>Xv(e,t,n,{callee:e.parse}),e.safeParse=(t,n)=>Qv(e,t,n),e.parseAsync=async(t,n)=>Zv(e,t,n,{callee:e.parseAsync}),e.safeParseAsync=async(t,n)=>$v(e,t,n),e.spa=e.safeParseAsync,e.encode=(t,n)=>ey(e,t,n),e.decode=(t,n)=>ty(e,t,n),e.encodeAsync=async(t,n)=>ny(e,t,n),e.decodeAsync=async(t,n)=>ry(e,t,n),e.safeEncode=(t,n)=>iy(e,t,n),e.safeDecode=(t,n)=>ay(e,t,n),e.safeEncodeAsync=async(t,n)=>oy(e,t,n),e.safeDecodeAsync=async(t,n)=>sy(e,t,n),e.refine=(t,n)=>e.check(mb(t,n)),e.superRefine=t=>e.check(hb(t)),e.overwrite=t=>e.check(sv(t)),e.optional=()=>Xy(e),e.exactOptional=()=>Qy(e),e.nullable=()=>eb(e),e.nullish=()=>Xy(eb(e)),e.nonoptional=t=>ob(e,t),e.array=()=>Ry(e),e.or=t=>Hy([e,t]),e.and=t=>Wy(e,t),e.transform=t=>ub(e,Jy(t)),e.default=t=>nb(e,t),e.prefault=t=>ib(e,t),e.catch=t=>cb(e,t),e.pipe=t=>ub(e,t),e.readonly=()=>fb(e),e.describe=t=>{let n=e.clone();return h_.add(n,{description:t}),n},Object.defineProperty(e,`description`,{get(){return h_.get(e)?.description},configurable:!0}),e.meta=(...t)=>{if(t.length===0)return h_.get(e);let n=e.clone();return h_.add(n,t[0]),n},e.isOptional=()=>e.safeParse(void 0).success,e.isNullable=()=>e.safeParse(null).success,e.apply=t=>t(e),e)),cy=H(`_ZodString`,(e,t)=>{ag.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Cv(e,t,n,r);let n=e._zod.bag;e.format=n.format??null,e.minLength=n.minimum??null,e.maxLength=n.maximum??null,e.regex=(...t)=>e.check(tv(...t)),e.includes=(...t)=>e.check(iv(...t)),e.startsWith=(...t)=>e.check(av(...t)),e.endsWith=(...t)=>e.check(ov(...t)),e.min=(...t)=>e.check($_(...t)),e.max=(...t)=>e.check(Q_(...t)),e.length=(...t)=>e.check(ev(...t)),e.nonempty=(...t)=>e.check($_(1,...t)),e.lowercase=t=>e.check(nv(t)),e.uppercase=t=>e.check(rv(t)),e.trim=()=>e.check(lv()),e.normalize=(...t)=>e.check(cv(...t)),e.toLowerCase=()=>e.check(uv()),e.toUpperCase=()=>e.check(dv()),e.slugify=()=>e.check(fv())}),ly=H(`ZodString`,(e,t)=>{ag.init(e,t),cy.init(e,t),e.email=t=>e.check(__(uy,t)),e.url=t=>e.check(C_(py,t)),e.jwt=t=>e.check(R_(Oy,t)),e.emoji=t=>e.check(w_(my,t)),e.guid=t=>e.check(v_(dy,t)),e.uuid=t=>e.check(y_(fy,t)),e.uuidv4=t=>e.check(b_(fy,t)),e.uuidv6=t=>e.check(x_(fy,t)),e.uuidv7=t=>e.check(S_(fy,t)),e.nanoid=t=>e.check(T_(hy,t)),e.guid=t=>e.check(v_(dy,t)),e.cuid=t=>e.check(E_(gy,t)),e.cuid2=t=>e.check(D_(_y,t)),e.ulid=t=>e.check(O_(vy,t)),e.base64=t=>e.check(F_(Ty,t)),e.base64url=t=>e.check(I_(Ey,t)),e.xid=t=>e.check(k_(yy,t)),e.ksuid=t=>e.check(A_(by,t)),e.ipv4=t=>e.check(j_(xy,t)),e.ipv6=t=>e.check(M_(Sy,t)),e.cidrv4=t=>e.check(N_(Cy,t)),e.cidrv6=t=>e.check(P_(wy,t)),e.e164=t=>e.check(L_(Dy,t)),e.datetime=t=>e.check(Hv(t)),e.date=t=>e.check(Wv(t)),e.time=t=>e.check(Kv(t)),e.duration=t=>e.check(Jv(t))});function Q(e){return g_(ly,e)}const $=H(`ZodStringFormat`,(e,t)=>{q.init(e,t),cy.init(e,t)}),uy=H(`ZodEmail`,(e,t)=>{cg.init(e,t),$.init(e,t)}),dy=H(`ZodGUID`,(e,t)=>{og.init(e,t),$.init(e,t)}),fy=H(`ZodUUID`,(e,t)=>{sg.init(e,t),$.init(e,t)}),py=H(`ZodURL`,(e,t)=>{lg.init(e,t),$.init(e,t)}),my=H(`ZodEmoji`,(e,t)=>{ug.init(e,t),$.init(e,t)}),hy=H(`ZodNanoID`,(e,t)=>{dg.init(e,t),$.init(e,t)}),gy=H(`ZodCUID`,(e,t)=>{fg.init(e,t),$.init(e,t)}),_y=H(`ZodCUID2`,(e,t)=>{pg.init(e,t),$.init(e,t)}),vy=H(`ZodULID`,(e,t)=>{mg.init(e,t),$.init(e,t)}),yy=H(`ZodXID`,(e,t)=>{hg.init(e,t),$.init(e,t)}),by=H(`ZodKSUID`,(e,t)=>{gg.init(e,t),$.init(e,t)}),xy=H(`ZodIPv4`,(e,t)=>{xg.init(e,t),$.init(e,t)}),Sy=H(`ZodIPv6`,(e,t)=>{Sg.init(e,t),$.init(e,t)}),Cy=H(`ZodCIDRv4`,(e,t)=>{Cg.init(e,t),$.init(e,t)}),wy=H(`ZodCIDRv6`,(e,t)=>{wg.init(e,t),$.init(e,t)}),Ty=H(`ZodBase64`,(e,t)=>{Eg.init(e,t),$.init(e,t)}),Ey=H(`ZodBase64URL`,(e,t)=>{Og.init(e,t),$.init(e,t)}),Dy=H(`ZodE164`,(e,t)=>{kg.init(e,t),$.init(e,t)}),Oy=H(`ZodJWT`,(e,t)=>{jg.init(e,t),$.init(e,t)}),ky=H(`ZodNumber`,(e,t)=>{Mg.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>wv(e,t,n,r),e.gt=(t,n)=>e.check(Y_(t,n)),e.gte=(t,n)=>e.check(X_(t,n)),e.min=(t,n)=>e.check(X_(t,n)),e.lt=(t,n)=>e.check(q_(t,n)),e.lte=(t,n)=>e.check(J_(t,n)),e.max=(t,n)=>e.check(J_(t,n)),e.int=t=>e.check(My(t)),e.safe=t=>e.check(My(t)),e.positive=t=>e.check(Y_(0,t)),e.nonnegative=t=>e.check(X_(0,t)),e.negative=t=>e.check(q_(0,t)),e.nonpositive=t=>e.check(J_(0,t)),e.multipleOf=(t,n)=>e.check(Z_(t,n)),e.step=(t,n)=>e.check(Z_(t,n)),e.finite=()=>e;let n=e._zod.bag;e.minValue=Math.max(n.minimum??-1/0,n.exclusiveMinimum??-1/0)??null,e.maxValue=Math.min(n.maximum??1/0,n.exclusiveMaximum??1/0)??null,e.isInt=(n.format??``).includes(`int`)||Number.isSafeInteger(n.multipleOf??.5),e.isFinite=!0,e.format=n.format??null});function Ay(e){return U_(ky,e)}const jy=H(`ZodNumberFormat`,(e,t)=>{Ng.init(e,t),ky.init(e,t)});function My(e){return W_(jy,e)}const Ny=H(`ZodUnknown`,(e,t)=>{Pg.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(e,t,n)=>void 0});function Py(){return G_(Ny)}const Fy=H(`ZodNever`,(e,t)=>{Fg.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Tv(e,t,n,r)});function Iy(e){return K_(Fy,e)}const Ly=H(`ZodArray`,(e,t)=>{Lg.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>kv(e,t,n,r),e.element=t.element,e.min=(t,n)=>e.check($_(t,n)),e.nonempty=t=>e.check($_(1,t)),e.max=(t,n)=>e.check(Q_(t,n)),e.length=(t,n)=>e.check(ev(t,n)),e.unwrap=()=>e.element});function Ry(e,t){return pv(Ly,e,t)}const zy=H(`ZodObject`,(e,t)=>{Hg.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Av(e,t,n,r),U(e,`shape`,()=>t.shape),e.keyof=()=>Ky(Object.keys(e._zod.def.shape)),e.catchall=t=>e.clone({...e._zod.def,catchall:t}),e.passthrough=()=>e.clone({...e._zod.def,catchall:Py()}),e.loose=()=>e.clone({...e._zod.def,catchall:Py()}),e.strict=()=>e.clone({...e._zod.def,catchall:Iy()}),e.strip=()=>e.clone({...e._zod.def,catchall:void 0}),e.extend=t=>Lm(e,t),e.safeExtend=t=>Rm(e,t),e.merge=t=>zm(e,t),e.pick=t=>Fm(e,t),e.omit=t=>Im(e,t),e.partial=(...t)=>Bm(Yy,e,t[0]),e.required=(...t)=>Vm(ab,e,t[0])});function By(e,t){return new zy({type:`object`,shape:e??{},...W(t)})}const Vy=H(`ZodUnion`,(e,t)=>{Wg.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>jv(e,t,n,r),e.options=t.options});function Hy(e,t){return new Vy({type:`union`,options:e,...W(t)})}const Uy=H(`ZodIntersection`,(e,t)=>{Gg.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Mv(e,t,n,r)});function Wy(e,t){return new Uy({type:`intersection`,left:e,right:t})}const Gy=H(`ZodEnum`,(e,t)=>{Jg.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Ev(e,t,n,r),e.enum=t.entries,e.options=Object.values(t.entries);let n=new Set(Object.keys(t.entries));e.extract=(e,r)=>{let i={};for(let r of e)if(n.has(r))i[r]=t.entries[r];else throw Error(`Key ${r} not found in enum`);return new Gy({...t,checks:[],...W(r),entries:i})},e.exclude=(e,r)=>{let i={...t.entries};for(let t of e)if(n.has(t))delete i[t];else throw Error(`Key ${t} not found in enum`);return new Gy({...t,checks:[],...W(r),entries:i})}});function Ky(e,t){return new Gy({type:`enum`,entries:Array.isArray(e)?Object.fromEntries(e.map(e=>[e,e])):e,...W(t)})}const qy=H(`ZodTransform`,(e,t)=>{Yg.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Ov(e,t,n,r),e._zod.parse=(n,r)=>{if(r.direction===`backward`)throw new dm(e.constructor.name);n.addIssue=r=>{if(typeof r==`string`)n.issues.push(qm(r,n.value,t));else{let t=r;t.fatal&&(t.continue=!1),t.code??=`custom`,t.input??=n.value,t.inst??=e,n.issues.push(qm(t))}};let i=t.transform(n.value,n);return i instanceof Promise?i.then(e=>(n.value=e,n)):(n.value=i,n)}});function Jy(e){return new qy({type:`transform`,transform:e})}const Yy=H(`ZodOptional`,(e,t)=>{Zg.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Bv(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Xy(e){return new Yy({type:`optional`,innerType:e})}const Zy=H(`ZodExactOptional`,(e,t)=>{Qg.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Bv(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Qy(e){return new Zy({type:`optional`,innerType:e})}const $y=H(`ZodNullable`,(e,t)=>{$g.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Nv(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function eb(e){return new $y({type:`nullable`,innerType:e})}const tb=H(`ZodDefault`,(e,t)=>{e_.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Fv(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeDefault=e.unwrap});function nb(e,t){return new tb({type:`default`,innerType:e,get defaultValue(){return typeof t==`function`?t():km(t)}})}const rb=H(`ZodPrefault`,(e,t)=>{n_.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Iv(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function ib(e,t){return new rb({type:`prefault`,innerType:e,get defaultValue(){return typeof t==`function`?t():km(t)}})}const ab=H(`ZodNonOptional`,(e,t)=>{r_.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Pv(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function ob(e,t){return new ab({type:`nonoptional`,innerType:e,...W(t)})}const sb=H(`ZodCatch`,(e,t)=>{a_.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Lv(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeCatch=e.unwrap});function cb(e,t){return new sb({type:`catch`,innerType:e,catchValue:typeof t==`function`?t:()=>t})}const lb=H(`ZodPipe`,(e,t)=>{o_.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Rv(e,t,n,r),e.in=t.in,e.out=t.out});function ub(e,t){return new lb({type:`pipe`,in:e,out:t})}const db=H(`ZodReadonly`,(e,t)=>{c_.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>zv(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function fb(e){return new db({type:`readonly`,innerType:e})}const pb=H(`ZodCustom`,(e,t)=>{u_.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Dv(e,t,n,r)});function mb(e,t={}){return mv(pb,e,t)}function hb(e){return hv(e)}const gb=[`plugin-skill-inductor`],_b=By({id:Q().min(1).max(64),taskSignature:Q().min(1).max(200),tags:Ry(Q().max(32)).max(5),sessionIds:Ry(Q().max(64)).max(50),size:Ay().int().min(1).max(1e3),firstAt:Ay().int().nonnegative(),lastAt:Ay().int().nonnegative(),dismissedAt:Ay().int().nonnegative().optional()});function vb(e,t){if(typeof t!=`string`||t.length===0||t.includes(`/`)||t.includes(`\\`)||t.includes(`..`))throw Error(`invalid workspaceKey for candidate file: ${t}`);return C(Jd(e),t,`candidates.json`)}function yb(e){if(!gb.includes(e.pluginId))return[];let t;try{let n=vb(e.pluginId,e.workspaceKey);if(!v(n))return[];t=b(n,`utf8`)}catch{return[]}let n;try{n=JSON.parse(t)?.data?.items}catch{return[]}if(!Array.isArray(n))return[];let r=[];for(let e of n){let t=_b.safeParse(e);t.success&&r.push(t.data)}return r}function bb(e){return(e.selectedOptionLabels??[]).includes(`起草 SKILL.md 给我看`)}async function xb(e){let t;try{t=await e.requestGrill({header:`技能沉淀提议`,question:om(e.brief),background:sm(e.brief),recommendation:cm(),options:lm(),askedBy:`skill-loop`})}catch(t){return e.logger?.warn(`skill-loop proposal failed: ${t instanceof Error?t.message:String(t)}`),`error`}return bb(t)?`accepted`:Sb(e)?`dismissed`:(e.logger?.warn(`skill-loop: failed to persist dismissal, candidate may resurface`),`error`)}function Sb(e){if(c())return!0;let t=vb(e.pluginId,e.workspaceKey),n=`${t}.host.tmp`;try{let r=JSON.parse(b(t,`utf8`)),i=r?.data?.items;if(!Array.isArray(i))return!1;let a=i.find(t=>t?.id===e.brief.id);return a?(a.dismissedAt=e.now,x(n,JSON.stringify(r)),$e(n,t),!0):!1}catch{try{rt(n)}catch{}return!1}}const Cb=gb[0],wb=Ui;async function Tb(e,t){if(!e.isEnabled())return`disabled`;let n=e.now?e.now():Date.now();try{let n=e.getMinMessages?.();e.notifyServices({type:`session.idle`,sessionId:t,...typeof n==`number`?{options:{minMessages:n}}:{}})}catch(t){e.logger.warn({err:String(t)},`skill-loop: notifying inductor service failed (extraction skipped this round)`)}let r;try{r=im(yb({pluginId:Cb,workspaceKey:e.getWorkspaceKey()??Ui}),n,rm(e.getCooldownDays?.()))}catch(t){return e.logger.warn({err:String(t)},`skill-loop: reading candidates failed`),`no-candidates`}if(r.length===0)return`no-candidates`;let i=e.getRequestGrill(t);if(!i)return`no-session`;let a=r[0];if(!a)return`no-candidates`;let o=await xb({requestGrill:i,brief:a,pluginId:Cb,workspaceKey:e.getWorkspaceKey()??Ui,now:n,logger:{warn:t=>e.logger.warn(t)}});return o===`accepted`&&(e.logger.info({sessionId:t,candidateId:a.id},`skill-loop: user accepted candidate`),e.onAccepted?.({sessionId:t,brief:a})),o}function Eb(e){return[k({name:`skill-loop`,timing:`session.idle`,handle:async t=>{try{await Tb(e,t.sessionId)}catch(t){e.logger.warn({err:String(t)},`skill-loop: unexpected failure`)}}})]}const Db=`[sandbox-escalation]`;function Ob(e){return k({name:`sandbox-guard`,timing:`tool.execute.before`,priority:6,enabled:!0,handle:(t,n)=>{if(n.cancelled)return;let r=e.getContext();if(!r||t.readonly)return;let i=t.args,a=t.paths?[...t.paths]:[],o=i?.command;if(typeof o==`string`&&a.push(...Fe(o)),a.length===0)return;let s=typeof i?.targetDir==`string`?i.targetDir:`.`,c=w(r.projectRoot,s),l=Se({writePaths:a.map(e=>w(c,e))},r);if(l.verdict===`deny`){n.cancelled=!0,n.decision=`deny`,n.decisionReason=l.reason??`sandbox policy`,n.cancelReason=`Sandbox denied: ${n.decisionReason}`;return}if(l.verdict===`ask`){if(r.autoAllowBashIfSandboxed===!0&&t.toolName===`bash`&&n.decision!==`deny`&&n.decision!==`ask`)return;n.decision!==`deny`&&(n.decision=`ask`,n.decisionReason=`${Db} ${l.reason??`requires approval`}`)}}})}function kb(e){return k({name:`skill-invocation`,timing:`tool.execute.after`,priority:50,handle(t){let{registry:n,resolveCwd:r,logger:i}=e;if(!n||t.toolName!==`bash`)return;let a=typeof t.args?.command==`string`?t.args.command:``;if(!a)return;let o=typeof t.args?.targetDir==`string`?t.args.targetDir:void 0,s=r?.(o);if(s)try{n.detectImplicitInvocation(a,s)}catch(e){i.warn?.({err:e instanceof Error?e.message:String(e)},`Skill invocation detection failed (ignored)`)}}})}function Ab(e){return e?(e.endsWith(`
532
+ 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 Dv(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:kv(t,`input`,e.processors),output:kv(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 Ov=(e,t={})=>n=>{let r=Tv({...n,processors:t});return J(e,r),Ev(r,e),Dv(r,e)},kv=(e,t,n={})=>r=>{let{libraryOptions:i,target:a}=r??{},o=Tv({...i??{},target:a,io:t,processors:n});return J(e,o),Ev(o,e),Dv(o,e)},Av={guid:`uuid`,url:`uri`,datetime:`date-time`,json_string:`json-string`,regex:``},jv=(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=Av[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}))])}},Mv=(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)},Nv=(e,t,n,r)=>{n.not={}},Pv=(e,t,n,r)=>{let i=e._zod.def,a=Sm(i.entries);a.every(e=>typeof e==`number`)&&(n.type=`number`),a.every(e=>typeof e==`string`)&&(n.type=`string`),n.enum=a},Fv=(e,t,n,r)=>{if(t.unrepresentable===`throw`)throw Error(`Custom types cannot be represented in JSON Schema`)},Iv=(e,t,n,r)=>{if(t.unrepresentable===`throw`)throw Error(`Transforms cannot be represented in JSON Schema`)},Lv=(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`]})},Rv=(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)},zv=(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},Bv=(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]]},Vv=(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`}]},Hv=(e,t,n,r)=>{let i=e._zod.def;J(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},Uv=(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))},Wv=(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)))},Gv=(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},Kv=(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},qv=(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},Jv=(e,t,n,r)=>{let i=e._zod.def;J(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},Yv=H(`ZodISODateTime`,(e,t)=>{Tg.init(e,t),$.init(e,t)});function Xv(e){return q_(Yv,e)}const Zv=H(`ZodISODate`,(e,t)=>{Eg.init(e,t),$.init(e,t)});function Qv(e){return J_(Zv,e)}const $v=H(`ZodISOTime`,(e,t)=>{Dg.init(e,t),$.init(e,t)});function ey(e){return Y_($v,e)}const ty=H(`ZodISODuration`,(e,t)=>{Og.init(e,t),$.init(e,t)});function ny(e){return X_(ty,e)}const ry=(e,t)=>{rh.init(e,t),e.name=`ZodError`,Object.defineProperties(e,{format:{value:t=>oh(e,t)},flatten:{value:t=>ah(e,t)},addIssue:{value:t=>{e.issues.push(t),e.message=JSON.stringify(e.issues,Cm,2)}},addIssues:{value:t=>{e.issues.push(...t),e.message=JSON.stringify(e.issues,Cm,2)}},isEmpty:{get(){return e.issues.length===0}}})};H(`ZodError`,ry);const X=H(`ZodError`,ry,{Parent:Error}),iy=sh(X),ay=ch(X),oy=lh(X),sy=dh(X),cy=ph(X),ly=mh(X),uy=hh(X),dy=gh(X),fy=_h(X),py=vh(X),my=yh(X),hy=bh(X),Z=H(`ZodType`,(e,t)=>(K.init(e,t),Object.assign(e[`~standard`],{jsonSchema:{input:kv(e,`input`),output:kv(e,`output`)}}),e.toJSONSchema=Ov(e,{}),e.def=t,e.type=t.type,Object.defineProperty(e,`_def`,{value:t}),e.check=(...n)=>e.clone(Am(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)=>Bm(e,t,n),e.brand=()=>e,e.register=((t,n)=>(t.add(e,n),e)),e.parse=(t,n)=>iy(e,t,n,{callee:e.parse}),e.safeParse=(t,n)=>oy(e,t,n),e.parseAsync=async(t,n)=>ay(e,t,n,{callee:e.parseAsync}),e.safeParseAsync=async(t,n)=>sy(e,t,n),e.spa=e.safeParseAsync,e.encode=(t,n)=>cy(e,t,n),e.decode=(t,n)=>ly(e,t,n),e.encodeAsync=async(t,n)=>uy(e,t,n),e.decodeAsync=async(t,n)=>dy(e,t,n),e.safeEncode=(t,n)=>fy(e,t,n),e.safeDecode=(t,n)=>py(e,t,n),e.safeEncodeAsync=async(t,n)=>my(e,t,n),e.safeDecodeAsync=async(t,n)=>hy(e,t,n),e.refine=(t,n)=>e.check(Sb(t,n)),e.superRefine=t=>e.check(Cb(t)),e.overwrite=t=>e.check(hv(t)),e.optional=()=>ib(e),e.exactOptional=()=>ob(e),e.nullable=()=>cb(e),e.nullish=()=>ib(cb(e)),e.nonoptional=t=>mb(e,t),e.array=()=>Ky(e),e.or=t=>Xy([e,t]),e.and=t=>Qy(e,t),e.transform=t=>vb(e,nb(t)),e.default=t=>ub(e,t),e.prefault=t=>fb(e,t),e.catch=t=>gb(e,t),e.pipe=t=>vb(e,t),e.readonly=()=>bb(e),e.describe=t=>{let n=e.clone();return C_.add(n,{description:t}),n},Object.defineProperty(e,`description`,{get(){return C_.get(e)?.description},configurable:!0}),e.meta=(...t)=>{if(t.length===0)return C_.get(e);let n=e.clone();return C_.add(n,t[0]),n},e.isOptional=()=>e.safeParse(void 0).success,e.isNullable=()=>e.safeParse(null).success,e.apply=t=>t(e),e)),gy=H(`_ZodString`,(e,t)=>{pg.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>jv(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(lv(...t)),e.includes=(...t)=>e.check(fv(...t)),e.startsWith=(...t)=>e.check(pv(...t)),e.endsWith=(...t)=>e.check(mv(...t)),e.min=(...t)=>e.check(sv(...t)),e.max=(...t)=>e.check(ov(...t)),e.length=(...t)=>e.check(cv(...t)),e.nonempty=(...t)=>e.check(sv(1,...t)),e.lowercase=t=>e.check(uv(t)),e.uppercase=t=>e.check(dv(t)),e.trim=()=>e.check(_v()),e.normalize=(...t)=>e.check(gv(...t)),e.toLowerCase=()=>e.check(vv()),e.toUpperCase=()=>e.check(yv()),e.slugify=()=>e.check(bv())}),_y=H(`ZodString`,(e,t)=>{pg.init(e,t),gy.init(e,t),e.email=t=>e.check(T_(vy,t)),e.url=t=>e.check(j_(xy,t)),e.jwt=t=>e.check(K_(Iy,t)),e.emoji=t=>e.check(M_(Sy,t)),e.guid=t=>e.check(E_(yy,t)),e.uuid=t=>e.check(D_(by,t)),e.uuidv4=t=>e.check(O_(by,t)),e.uuidv6=t=>e.check(k_(by,t)),e.uuidv7=t=>e.check(A_(by,t)),e.nanoid=t=>e.check(N_(Cy,t)),e.guid=t=>e.check(E_(yy,t)),e.cuid=t=>e.check(P_(wy,t)),e.cuid2=t=>e.check(F_(Ty,t)),e.ulid=t=>e.check(I_(Ey,t)),e.base64=t=>e.check(U_(Ny,t)),e.base64url=t=>e.check(W_(Py,t)),e.xid=t=>e.check(L_(Dy,t)),e.ksuid=t=>e.check(R_(Oy,t)),e.ipv4=t=>e.check(z_(ky,t)),e.ipv6=t=>e.check(B_(Ay,t)),e.cidrv4=t=>e.check(V_(jy,t)),e.cidrv6=t=>e.check(H_(My,t)),e.e164=t=>e.check(G_(Fy,t)),e.datetime=t=>e.check(Xv(t)),e.date=t=>e.check(Qv(t)),e.time=t=>e.check(ey(t)),e.duration=t=>e.check(ny(t))});function Q(e){return w_(_y,e)}const $=H(`ZodStringFormat`,(e,t)=>{q.init(e,t),gy.init(e,t)}),vy=H(`ZodEmail`,(e,t)=>{gg.init(e,t),$.init(e,t)}),yy=H(`ZodGUID`,(e,t)=>{mg.init(e,t),$.init(e,t)}),by=H(`ZodUUID`,(e,t)=>{hg.init(e,t),$.init(e,t)}),xy=H(`ZodURL`,(e,t)=>{_g.init(e,t),$.init(e,t)}),Sy=H(`ZodEmoji`,(e,t)=>{vg.init(e,t),$.init(e,t)}),Cy=H(`ZodNanoID`,(e,t)=>{yg.init(e,t),$.init(e,t)}),wy=H(`ZodCUID`,(e,t)=>{bg.init(e,t),$.init(e,t)}),Ty=H(`ZodCUID2`,(e,t)=>{xg.init(e,t),$.init(e,t)}),Ey=H(`ZodULID`,(e,t)=>{Sg.init(e,t),$.init(e,t)}),Dy=H(`ZodXID`,(e,t)=>{Cg.init(e,t),$.init(e,t)}),Oy=H(`ZodKSUID`,(e,t)=>{wg.init(e,t),$.init(e,t)}),ky=H(`ZodIPv4`,(e,t)=>{kg.init(e,t),$.init(e,t)}),Ay=H(`ZodIPv6`,(e,t)=>{Ag.init(e,t),$.init(e,t)}),jy=H(`ZodCIDRv4`,(e,t)=>{jg.init(e,t),$.init(e,t)}),My=H(`ZodCIDRv6`,(e,t)=>{Mg.init(e,t),$.init(e,t)}),Ny=H(`ZodBase64`,(e,t)=>{Pg.init(e,t),$.init(e,t)}),Py=H(`ZodBase64URL`,(e,t)=>{Ig.init(e,t),$.init(e,t)}),Fy=H(`ZodE164`,(e,t)=>{Lg.init(e,t),$.init(e,t)}),Iy=H(`ZodJWT`,(e,t)=>{zg.init(e,t),$.init(e,t)}),Ly=H(`ZodNumber`,(e,t)=>{Bg.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Mv(e,t,n,r),e.gt=(t,n)=>e.check(rv(t,n)),e.gte=(t,n)=>e.check(iv(t,n)),e.min=(t,n)=>e.check(iv(t,n)),e.lt=(t,n)=>e.check(tv(t,n)),e.lte=(t,n)=>e.check(nv(t,n)),e.max=(t,n)=>e.check(nv(t,n)),e.int=t=>e.check(By(t)),e.safe=t=>e.check(By(t)),e.positive=t=>e.check(rv(0,t)),e.nonnegative=t=>e.check(iv(0,t)),e.negative=t=>e.check(tv(0,t)),e.nonpositive=t=>e.check(nv(0,t)),e.multipleOf=(t,n)=>e.check(av(t,n)),e.step=(t,n)=>e.check(av(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 Ry(e){return Z_(Ly,e)}const zy=H(`ZodNumberFormat`,(e,t)=>{Vg.init(e,t),Ly.init(e,t)});function By(e){return Q_(zy,e)}const Vy=H(`ZodUnknown`,(e,t)=>{Hg.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(e,t,n)=>void 0});function Hy(){return $_(Vy)}const Uy=H(`ZodNever`,(e,t)=>{Ug.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Nv(e,t,n,r)});function Wy(e){return ev(Uy,e)}const Gy=H(`ZodArray`,(e,t)=>{Gg.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Lv(e,t,n,r),e.element=t.element,e.min=(t,n)=>e.check(sv(t,n)),e.nonempty=t=>e.check(sv(1,t)),e.max=(t,n)=>e.check(ov(t,n)),e.length=(t,n)=>e.check(cv(t,n)),e.unwrap=()=>e.element});function Ky(e,t){return xv(Gy,e,t)}const qy=H(`ZodObject`,(e,t)=>{Xg.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Rv(e,t,n,r),U(e,`shape`,()=>t.shape),e.keyof=()=>eb(Object.keys(e._zod.def.shape)),e.catchall=t=>e.clone({...e._zod.def,catchall:t}),e.passthrough=()=>e.clone({...e._zod.def,catchall:Hy()}),e.loose=()=>e.clone({...e._zod.def,catchall:Hy()}),e.strict=()=>e.clone({...e._zod.def,catchall:Wy()}),e.strip=()=>e.clone({...e._zod.def,catchall:void 0}),e.extend=t=>Gm(e,t),e.safeExtend=t=>Km(e,t),e.merge=t=>qm(e,t),e.pick=t=>Um(e,t),e.omit=t=>Wm(e,t),e.partial=(...t)=>Jm(rb,e,t[0]),e.required=(...t)=>Ym(pb,e,t[0])});function Jy(e,t){return new qy({type:`object`,shape:e??{},...W(t)})}const Yy=H(`ZodUnion`,(e,t)=>{Qg.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>zv(e,t,n,r),e.options=t.options});function Xy(e,t){return new Yy({type:`union`,options:e,...W(t)})}const Zy=H(`ZodIntersection`,(e,t)=>{$g.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Bv(e,t,n,r)});function Qy(e,t){return new Zy({type:`intersection`,left:e,right:t})}const $y=H(`ZodEnum`,(e,t)=>{n_.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Pv(e,t,n,r),e.enum=t.entries,e.options=Object.values(t.entries);let n=new Set(Object.keys(t.entries));e.extract=(e,r)=>{let i={};for(let r of e)if(n.has(r))i[r]=t.entries[r];else throw Error(`Key ${r} not found in enum`);return new $y({...t,checks:[],...W(r),entries:i})},e.exclude=(e,r)=>{let i={...t.entries};for(let t of e)if(n.has(t))delete i[t];else throw Error(`Key ${t} not found in enum`);return new $y({...t,checks:[],...W(r),entries:i})}});function eb(e,t){return new $y({type:`enum`,entries:Array.isArray(e)?Object.fromEntries(e.map(e=>[e,e])):e,...W(t)})}const tb=H(`ZodTransform`,(e,t)=>{r_.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Iv(e,t,n,r),e._zod.parse=(n,r)=>{if(r.direction===`backward`)throw new ym(e.constructor.name);n.addIssue=r=>{if(typeof r==`string`)n.issues.push(th(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(th(t))}};let i=t.transform(n.value,n);return i instanceof Promise?i.then(e=>(n.value=e,n)):(n.value=i,n)}});function nb(e){return new tb({type:`transform`,transform:e})}const rb=H(`ZodOptional`,(e,t)=>{a_.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Jv(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function ib(e){return new rb({type:`optional`,innerType:e})}const ab=H(`ZodExactOptional`,(e,t)=>{o_.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Jv(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function ob(e){return new ab({type:`optional`,innerType:e})}const sb=H(`ZodNullable`,(e,t)=>{s_.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Vv(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function cb(e){return new sb({type:`nullable`,innerType:e})}const lb=H(`ZodDefault`,(e,t)=>{c_.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Uv(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeDefault=e.unwrap});function ub(e,t){return new lb({type:`default`,innerType:e,get defaultValue(){return typeof t==`function`?t():Lm(t)}})}const db=H(`ZodPrefault`,(e,t)=>{u_.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Wv(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function fb(e,t){return new db({type:`prefault`,innerType:e,get defaultValue(){return typeof t==`function`?t():Lm(t)}})}const pb=H(`ZodNonOptional`,(e,t)=>{d_.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Hv(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function mb(e,t){return new pb({type:`nonoptional`,innerType:e,...W(t)})}const hb=H(`ZodCatch`,(e,t)=>{p_.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Gv(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeCatch=e.unwrap});function gb(e,t){return new hb({type:`catch`,innerType:e,catchValue:typeof t==`function`?t:()=>t})}const _b=H(`ZodPipe`,(e,t)=>{m_.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Kv(e,t,n,r),e.in=t.in,e.out=t.out});function vb(e,t){return new _b({type:`pipe`,in:e,out:t})}const yb=H(`ZodReadonly`,(e,t)=>{g_.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>qv(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function bb(e){return new yb({type:`readonly`,innerType:e})}const xb=H(`ZodCustom`,(e,t)=>{v_.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Fv(e,t,n,r)});function Sb(e,t={}){return Sv(xb,e,t)}function Cb(e){return Cv(e)}const wb=[`plugin-skill-inductor`],Tb=Jy({id:Q().min(1).max(64),taskSignature:Q().min(1).max(200),tags:Ky(Q().max(32)).max(5),sessionIds:Ky(Q().max(64)).max(50),size:Ry().int().min(1).max(1e3),firstAt:Ry().int().nonnegative(),lastAt:Ry().int().nonnegative(),dismissedAt:Ry().int().nonnegative().optional()});function Eb(e,t){if(typeof t!=`string`||t.length===0||t.includes(`/`)||t.includes(`\\`)||t.includes(`..`))throw Error(`invalid workspaceKey for candidate file: ${t}`);return C($d(e),t,`candidates.json`)}function Db(e){if(!wb.includes(e.pluginId))return[];let t;try{let n=Eb(e.pluginId,e.workspaceKey);if(!v(n))return[];t=b(n,`utf8`)}catch{return[]}let n;try{n=JSON.parse(t)?.data?.items}catch{return[]}if(!Array.isArray(n))return[];let r=[];for(let e of n){let t=Tb.safeParse(e);t.success&&r.push(t.data)}return r}function Ob(e){return(e.selectedOptionLabels??[]).includes(`起草 SKILL.md 给我看`)}async function kb(e){let t;try{t=await e.requestGrill({header:`技能沉淀提议`,question:mm(e.brief),background:hm(e.brief),recommendation:gm(),options:_m(),askedBy:`skill-loop`})}catch(t){return e.logger?.warn(`skill-loop proposal failed: ${t instanceof Error?t.message:String(t)}`),`error`}return Ob(t)?`accepted`:Ab(e)?`dismissed`:(e.logger?.warn(`skill-loop: failed to persist dismissal, candidate may resurface`),`error`)}function Ab(e){if(c())return!0;let t=Eb(e.pluginId,e.workspaceKey),n=`${t}.host.tmp`;try{let r=JSON.parse(b(t,`utf8`)),i=r?.data?.items;if(!Array.isArray(i))return!1;let a=i.find(t=>t?.id===e.brief.id);return a?(a.dismissedAt=e.now,x(n,JSON.stringify(r)),$e(n,t),!0):!1}catch{try{rt(n)}catch{}return!1}}const jb=wb[0],Mb=k;async function Nb(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=fm(Db({pluginId:jb,workspaceKey:e.getWorkspaceKey()??k}),n,dm(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 kb({requestGrill:i,brief:a,pluginId:jb,workspaceKey:e.getWorkspaceKey()??k,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 Pb(e){return[A({name:`skill-loop`,timing:`session.idle`,handle:async t=>{try{await Nb(e,t.sessionId)}catch(t){e.logger.warn({err:String(t)},`skill-loop: unexpected failure`)}}})]}const Fb=`[sandbox-escalation]`;function Ib(e){return A({name:`sandbox-guard`,timing:`tool.execute.before`,priority:6,enabled:!0,handle:(t,n)=>{if(n.cancelled)return;let r=e.getContext();if(!r||t.readonly)return;let i=t.args,a=t.paths?[...t.paths]:[],o=i?.command;if(typeof o==`string`&&a.push(...Fe(o)),a.length===0)return;let s=typeof i?.targetDir==`string`?i.targetDir:`.`,c=w(r.projectRoot,s),l=Se({writePaths:a.map(e=>w(c,e))},r);if(l.verdict===`deny`){n.cancelled=!0,n.decision=`deny`,n.decisionReason=l.reason??`sandbox policy`,n.cancelReason=`Sandbox denied: ${n.decisionReason}`;return}if(l.verdict===`ask`){if(r.autoAllowBashIfSandboxed===!0&&t.toolName===`bash`&&n.decision!==`deny`&&n.decision!==`ask`)return;n.decision!==`deny`&&(n.decision=`ask`,n.decisionReason=`${Fb} ${l.reason??`requires approval`}`)}}})}function Lb(e){return A({name:`skill-invocation`,timing:`tool.execute.after`,priority:50,handle(t){let{registry:n,resolveCwd:r,logger:i}=e;if(!n||t.toolName!==`bash`)return;let a=typeof t.args?.command==`string`?t.args.command:``;if(!a)return;let o=typeof t.args?.targetDir==`string`?t.args.targetDir:void 0,s=r?.(o);if(s)try{n.detectImplicitInvocation(a,s)}catch(e){i.warn?.({err:e instanceof Error?e.message:String(e)},`Skill invocation detection failed (ignored)`)}}})}function Rb(e){return e?(e.endsWith(`
532
533
  `)?e.slice(0,-1):e).split(`
533
- `).length:0}function jb(e){let{toolCallId:t,args:n}=e,r=typeof n.path==`string`?n.path:void 0;if(!r)return null;let i=typeof n.oldContent==`string`?n.oldContent:void 0,a=typeof n.newContent==`string`?n.newContent:void 0;if(i!==void 0&&a!==void 0){let e=Ab(i),n=Ab(a);return{path:r,operation:`edit`,oldContent:i,newContent:a,addedLines:Math.max(0,n-e),removedLines:Math.max(0,e-n),timestamp:Date.now(),toolCallId:t}}let o=typeof n.content==`string`?n.content:void 0;return o===void 0?null:{path:r,operation:`write`,newContent:o,addedLines:Ab(o),removedLines:0,timestamp:Date.now(),toolCallId:t}}function Mb(e={}){let{onFileEdited:t,getOnFileEdited:n,dedupCache:r}=e;return k({name:`edit-files-panel`,timing:`tool.execute.after`,priority:90,handle(e){let i=n?.()??t;if(!i||e.readonly)return;let a=jb(e);if(!a)return;let o=a.toolCallId;if(r){if(r.has(o))return;r.add(o)}i(a)}})}function Nb(e){let t=[`id: ${e.jobId}`,`title: ${e.title}`,`status: ${e.status}`];return e.summary&&t.push(`summary: ${e.summary}`),e.outputPath&&t.push(`output_file: ${e.outputPath}`),e.worktree&&(t.push(`worktree_path: ${e.worktree.path}`),e.worktree.branch&&t.push(`worktree_branch: ${e.worktree.branch}`)),`<delegate-notification>\n${t.join(`
534
- `)}\n</delegate-notification>`}function Pb(){let e=new Map,t=new Set;return{hooks:[k({name:`agent-job-notification-injector`,timing:`messages.transform`,priority:25,handle:(t,n)=>{Jp(e,t,n)}}),k({name:`agent-job-notification-cleanup`,timing:`session.deleted`,handle:n=>{if(e.delete(n.sessionId),t.add(n.sessionId),t.size>200){let e=t.values().next().value;e!==void 0&&t.delete(e)}}})],notify:(n,r)=>{if(t.has(n))return;let i=e.get(n)??[];i.push(Nb(r)),e.set(n,i)}}}const Fb=By({taskSignature:Q().min(1).max(200),outcome:Ky([`success`,`partial`,`failure`]),at:Ay().int().nonnegative(),steps:Ry(By({tool:Q().max(64)})).max(20)});function Ib(e,t){return C(Jd(e),t,`episodes.json`)}function Lb(e,t){let n;try{let r=Ib(e,t);if(!v(r))return{total:0,success:0,recent:[]};n=b(r,`utf8`)}catch{return{total:0,success:0,recent:[]}}let r;try{r=JSON.parse(n)?.data?.items}catch{return{total:0,success:0,recent:[]}}if(!Array.isArray(r))return{total:0,success:0,recent:[]};let i=0,a=[];for(let e of r){let t=Fb.safeParse(e);t.success&&(t.data.outcome===`success`&&(i+=1),a.push({signature:t.data.taskSignature,at:t.data.at}))}let o=a.sort((e,t)=>t.at-e.at).slice(0,5).map(e=>e.signature);return{total:a.length,success:i,recent:o}}function Rb(e){let t=gb[0],n={pluginInstalled:e.pluginInstalled,episodeCount:0,successCount:0,candidateCount:0,pendingCount:0,coolingCount:0,recentSignatures:[],pending:[],nextProposalHint:null};if(!e.pluginInstalled)return n;let r=Lb(t,e.workspaceKey),i=yb({pluginId:t,workspaceKey:e.workspaceKey}),a=rm(e.cooldownDays),o=im(i,e.now,a);return{pluginInstalled:!0,episodeCount:r.total,successCount:r.success,candidateCount:i.length,pendingCount:o.length,coolingCount:i.length-o.length,recentSignatures:r.recent,pending:o.slice(0,5),nextProposalHint:zb({pending:o.length,success:r.success,minClusterSize:e.minClusterSize??3})}}function zb(e){return e.pending>0?null:e.success===0?`no-episodes`:e.success<e.minClusterSize?`not-enough-successes`:`no-cluster-yet`}const Bb=By({tool:Q().min(1).max(64),intent:Q().max(160)}),Vb=By({taskSignature:Q().min(1).max(200),steps:Ry(Bb).max(20),outcome:Ky([`success`,`partial`,`failure`]),sessionId:Q().max(64),at:Ay().int().nonnegative()});function Hb(e){let t=e.limit??8,n;try{let t=C(Jd(e.pluginId),e.workspaceKey,`episodes.json`);if(!v(t))return[];n=b(t,`utf8`)}catch{return[]}let r;try{r=JSON.parse(n)?.data?.items}catch{return[]}if(!Array.isArray(r))return[];let i=new Set(e.sessionIds),a=[];for(let e of r){let n=Vb.safeParse(e);if(n.success&&i.has(n.data.sessionId)&&n.data.outcome===`success`&&(a.push({sessionId:n.data.sessionId,outcome:n.data.outcome,steps:n.data.steps}),a.length>=t))break}return a}function Ub(e){return e.length===0?`(No recorded execution paths are available for these sessions.)`:e.map((e,t)=>{let n=e.steps.map((e,t)=>` ${t+1}. ${e.tool} — ${e.intent}`).join(`
534
+ `).length:0}function zb(e){let{toolCallId:t,args:n}=e,r=typeof n.path==`string`?n.path:void 0;if(!r)return null;let i=typeof n.oldContent==`string`?n.oldContent:void 0,a=typeof n.newContent==`string`?n.newContent:void 0;if(i!==void 0&&a!==void 0){let e=Rb(i),n=Rb(a);return{path:r,operation:`edit`,oldContent:i,newContent:a,addedLines:Math.max(0,n-e),removedLines:Math.max(0,e-n),timestamp:Date.now(),toolCallId:t}}let o=typeof n.content==`string`?n.content:void 0;return o===void 0?null:{path:r,operation:`write`,newContent:o,addedLines:Rb(o),removedLines:0,timestamp:Date.now(),toolCallId:t}}function Bb(e={}){let{onFileEdited:t,getOnFileEdited:n,dedupCache:r}=e;return A({name:`edit-files-panel`,timing:`tool.execute.after`,priority:90,handle(e){let i=n?.()??t;if(!i||e.readonly)return;let a=zb(e);if(!a)return;let o=a.toolCallId;if(r){if(r.has(o))return;r.add(o)}i(a)}})}function Vb(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(`
535
+ `)}\n</delegate-notification>`}function Hb(){let e=new Map,t=new Set;return{hooks:[A({name:`agent-job-notification-injector`,timing:`messages.transform`,priority:25,handle:(t,n)=>{nm(e,t,n)}}),A({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(Vb(r)),e.set(n,i)}}}const Ub=Jy({taskSignature:Q().min(1).max(200),outcome:eb([`success`,`partial`,`failure`]),at:Ry().int().nonnegative(),steps:Ky(Jy({tool:Q().max(64)})).max(20)});function Wb(e,t){return C($d(e),t,`episodes.json`)}function Gb(e,t){let n;try{let r=Wb(e,t);if(!v(r))return{total:0,success:0,recent:[]};n=b(r,`utf8`)}catch{return{total:0,success:0,recent:[]}}let r;try{r=JSON.parse(n)?.data?.items}catch{return{total:0,success:0,recent:[]}}if(!Array.isArray(r))return{total:0,success:0,recent:[]};let i=0,a=[];for(let e of r){let t=Ub.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 Kb(e){let t=wb[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=Gb(t,e.workspaceKey),i=Db({pluginId:t,workspaceKey:e.workspaceKey}),a=dm(e.cooldownDays),o=fm(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:qb({pending:o.length,success:r.success,minClusterSize:e.minClusterSize??3})}}function qb(e){return e.pending>0?null:e.success===0?`no-episodes`:e.success<e.minClusterSize?`not-enough-successes`:`no-cluster-yet`}const Jb=Jy({tool:Q().min(1).max(64),intent:Q().max(160)}),Yb=Jy({taskSignature:Q().min(1).max(200),steps:Ky(Jb).max(20),outcome:eb([`success`,`partial`,`failure`]),sessionId:Q().max(64),at:Ry().int().nonnegative()});function Xb(e){let t=e.limit??8,n;try{let t=C($d(e.pluginId),e.workspaceKey,`episodes.json`);if(!v(t))return[];n=b(t,`utf8`)}catch{return[]}let r;try{r=JSON.parse(n)?.data?.items}catch{return[]}if(!Array.isArray(r))return[];let i=new Set(e.sessionIds),a=[];for(let e of r){let n=Yb.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 Zb(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(`
535
536
  `);return`Run ${t+1} (session ${e.sessionId}):\n${n||` (no steps recorded)`}`}).join(`
536
537
 
537
- `)}function Wb(e,t=[]){let n=e.sessionIds.join(`, `);return`You are drafting a reusable skill for this project, based on a recurring task pattern that otto observed.
538
+ `)}function Qb(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.
538
539
 
539
540
  ## The pattern
540
541
 
@@ -548,7 +549,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
548
549
  These are the actual tool sequences otto observed for this task type. They are your evidence —
549
550
  you do not need to (and cannot) go looking for the original sessions.
550
551
 
551
- ${Ub(t)}
552
+ ${Zb(t)}
552
553
 
553
554
  ## What to do
554
555
 
@@ -586,8 +587,8 @@ If the recorded paths turn out to be too varied, too thin, or not actually the s
586
587
  library permanently; skipping costs nothing — otto will offer again if the pattern recurs.
587
588
 
588
589
  The draft you produce is a proposal: it will be reviewed as a diff and only takes effect if the
589
- user explicitly applies it.`}function Gb(e){return`Draft skill: ${e.taskSignature.length>60?`${e.taskSignature.slice(0,60)}…`:e.taskSignature}`}function Kb(e){try{let t=Hb({pluginId:e.pluginId,workspaceKey:e.workspaceKey,sessionIds:e.brief.sessionIds});return{jobId:e.startJob({title:Gb(e.brief),prompt:Wb(e.brief,t),sessionId:e.sessionId}).id}}catch(t){e.logger?.warn(`skill-loop: failed to start skill draft job: ${t instanceof Error?t.message:String(t)}`);return}}function qb(e){e.hookRegistry.register(Dp(e.toolRegistry,e.getDefaultToolPreset)),e.hookRegistry.register(Oe(e.failureSignals)),e.hookRegistry.register(ke(e.failureSignals)),e.hookRegistry.registerAll(e.contextSourcesBuildHooks(e.workspaceDir,e.memory)),e.memory&&e.hookRegistry.registerAll(nn(e.memory)),e.hookRegistry.registerAll(an({getTodoList:t=>e.getSession(t)?.session.getTodoList()}));let t=/-milestone\.md$/,n=/^Status:\s*Done\b/m;e.hookRegistry.registerAll(en({isDocSyncTrigger:e=>{let r=typeof e.args.path==`string`?e.args.path:``;if(!t.test(r))return!1;let i=typeof e.args.newContent==`string`?e.args.newContent:typeof e.args.content==`string`?e.args.content:``;return n.test(i)}})),e.hookRegistry.registerAll(Rp(e.learningStore,e.promptManager,e.localLearningStore,{evolutionSignals:e.evolutionSignals,workspaceDir:e.workspaceDir},e.memory)),e.skillRegistry&&(e.hookRegistry.registerAll(zp(e.skillRegistry)),e.hookRegistry.registerAll(qp({registry:e.skillRegistry,evolutionSignals:e.evolutionSignals,getConfig:()=>{let t=e.settings.get(`skill_internalization`);return{enabled:t?.enabled===!0,minExecutions:t?.min_executions??Bp.minExecutions,minSuccessRate:t?.min_success_rate??Bp.minSuccessRate,maxInternalized:t?.max_internalized??Bp.maxInternalized}}})),e.hookRegistry.register(kb({registry:e.skillRegistry,resolveCwd:t=>t?w(e.workspaceDir,t):e.workspaceDir,logger:e.logger}))),e.hookRegistry.registerAll(e.claudeHooks),e.hookRegistry.registerAll(Xp()),e.hookRegistry.on(`session.deleted`,`rfc047-notification-detach`,t=>e.notificationDispatcher.detach(t.sessionId));let r=Pb();e.hookRegistry.registerAll(r.hooks),e.hookRegistry.register(Zp(e=>{E.killAllForSession(e)})),e.hookRegistry.registerAll(Qp({registry:e.permissionRegistry,getPersistedAllow:t=>e.codingSessionPool.getSessionPermissionAllow(t)})),e.hookRegistry.register(Ob({getContext:()=>{let t=Pe(e.workspaceDir,at());if(!e.sandbox.enabled)return{mode:`bypass`,projectRoot:e.workspaceDir,writableRoots:[],deniedRoots:t,networkAllowed:!0};let n=e.settings.get(`permission_mode`)??`auto`;return{mode:n,projectRoot:e.workspaceDir,writableRoots:Te(n,e.workspaceDir,ot(),e.sandbox.writablePaths),deniedRoots:t,networkAllowed:e.sandbox.isNetworkAllowed,autoAllowBashIfSandboxed:e.sandbox.autoAllowBashIfSandboxed}}})),e.hookRegistry.registerAll(em(t=>e.getSession(t),e.memoryAutoExtractor,{isEnabled:()=>e.settings.get(`memory_auto_extract`)?.enabled===!0||process.env.OTTO_MEMORY_AUTO_EXTRACT===`1`}));let i=()=>e.settings.get(`skill_loop`)?.enabled===!0||process.env.OTTO_SKILL_LOOP===`1`;return e.hookRegistry.registerAll(tm({isEnabled:i},e.promptManager)),e.hookRegistry.registerAll(Eb({isEnabled:i,getMinMessages:()=>e.settings.get(`skill_loop`)?.min_messages,getCooldownDays:()=>e.settings.get(`skill_loop`)?.dismiss_cooldown_days,notifyServices:e.notifyPluginServices,getWorkspaceKey:e.getWorkspaceKey,getRequestGrill:t=>{let n=e.getSession(t);return n?e=>n.requestGrill({...e,askedBy:`skill-loop`}):void 0},onAccepted:({sessionId:t,brief:n})=>{Kb({startJob:t=>e.startSkillDraftJob({...t,origin:`user`}),brief:n,sessionId:t,pluginId:Cb,workspaceKey:e.getWorkspaceKey()??wb,logger:{warn:t=>e.logger.warn(t)}})},logger:e.logger})),e.hookRegistry.register(Mb({getOnFileEdited:e.getEditFileCallback,dedupCache:e.editFilesDedup})),{agentJobNotify:r.notify}}function Jb(e,t,n,r){return Tp({processOwnerId:e.processOwnerId,orchestrator:e.orchestrator,writeTodos:e.writeTodos,sandbox:t=>e.sandbox.isBypassed(t?.command)?void 0:e.sandbox.current??void 0,autoMemory:e.storage.autoMemory,reloadMemory:e.storage.memory?()=>e.storage.memory.loadMemory():void 0,archiveRecall:e.storage.memory,runTeam:e.runTeam,runSession:e.runSession,fileStateManager:e.fileStateManager,learningStore:e.learningStore,localLearningStore:e.localLearningStore,sessions:{list:()=>e.listSessions(),create:()=>e.createSession(),remove:t=>e.removeSession(t),get:t=>e.getSession(t)},listModels:t=>e.buildModelCatalog(t),startJob:t=>({jobId:e.agentJobs.start({...t,origin:`main`}).id}),getScheduleService:()=>e.scheduleServiceInstance,searchEcosystem:e.searchEcosystem,capabilityGapRecorder:e.capabilityGapRecorder},t,n,r)}function Yb(e,t){return Be(t,Ep(Jb(e,t,e.skillRegistry?Bn(e.skillRegistry,t):void 0,!1))).getAvailable(e.defaultToolPreset)}function Xb(e){return e.toolRegistry.getAvailable(e.defaultToolPreset).filter(e=>e.name.startsWith(`mcp__`))}function Zb(e,t){let n=t.skillProvider??(e.skillRegistry?Bn(e.skillRegistry,e.workspaceDir):void 0);t.sandbox&&e.sandbox.pin(t.sandbox);let r={registerChild(e,t){return{pid:E.registerChild(e,t).pid??0}}};return Be(e.workspaceDir,{...Ep(Jb(e,e.workspaceDir,n,t.lsp===!0)),processTracker:r})}function Qb(e){e.agentJobNotify=qb({hookRegistry:e.hookRegistry,toolRegistry:e.toolRegistry,getDefaultToolPreset:()=>e.defaultToolPreset,failureSignals:e.failureSignals,contextSourcesBuildHooks:(t,n)=>e.agentRuntime.contextSources.sealAndBuildHooks(t,n),workspaceDir:e.workspaceDir,memory:e.storage.memory,learningStore:e.learningStore,localLearningStore:e.localLearningStore,evolutionSignals:e.evolutionSignals,promptManager:e.promptManager,skillRegistry:e.skillRegistry,notificationDispatcher:e.notificationDispatcher,permissionRegistry:e.permissionRegistry,codingSessionPool:e.codingSessionPool,sandbox:e.sandbox,settings:e.settings,getEditFileCallback:()=>e.editFileCallback,editFilesDedup:e._editFilesDedup,memoryAutoExtractor:e.memoryAutoExtractor,getSession:t=>e.getSession(t),notifyPluginServices:t=>e.notifyPluginServices(t),getWorkspaceKey:()=>e.workspaceRef?.key,startSkillDraftJob:t=>e.agentJobs.start(t),claudeHooks:e.compatProducts?.hooks??[],logger:e.logger}).agentJobNotify}function $b(e){return{async readFile(e){try{return await Zi(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return null;throw e}},async writeFile(e,t){await Yi(S(e),{recursive:!0}),await Mn(e,t)},async writeFileExclusive(e,t){await Yi(S(e),{recursive:!0});try{let n=await Xi(e,`wx`);try{await n.writeFile(t,`utf8`)}finally{await n.close()}return!0}catch(e){if(e.code===`EEXIST`)return!1;throw e}},genId:e?.genId??Gi,now:e?.now??(()=>new Date().toISOString())}}function ex(e){return t=>{e?.({type:`plugin.load-failed`,...t})}}function tx(e){return new Tt({persist:Ft(`${r}/signals`),logWarn:(t,n)=>e.warn({err:n},t)})}function nx(e,t){return{record:n=>{e.record(n),t?.({type:`capability_gap.reported`,...n})}}}async function rx(e,t){let n=await e.restoreFromLog();return n>0&&t?.(n),n}async function ix(e){if(e.ensureNotDisposed(),await e.ensureSettingsLoaded(),await rx(e.evolutionSignals,t=>e.logger.info({count:t},`signal log restored %d records`)),!e.workspaceRef&&!e.pendingWorkspaceInit&&!e.parentWorkspaceExisted)try{let t=Wi($b()),n=e._workspaceId?{id:e._workspaceId}:void 0,r=await t.resolveLocal(e.workspaceDir,{...n,autoCreate:!(e._interactive&&!n)});`kind`in r&&r.kind===`uninitialized`?e.pendingWorkspaceInit={root:r.root}:`kind`in r&&r.kind===`parentWorkspaceExisted`?e.parentWorkspaceExisted={parentRoot:r.parentRoot,currentRoot:r.currentRoot,marker:r.marker}:e.workspaceRef=r}catch(t){e.logger.warn({err:t,workspaceDir:e.workspaceDir},`Workspace resolution failed; continuing without workspace identity. Sessions previously saved under a workspace key will not be restored.`)}e.storage.autoMemory&&await e.storage.autoMemory.load(),await St(`skills/agents/teams discovery + plugin module load`,async()=>{if(e.skillRegistry){await e.skillRegistry.discover();for(let t of e.settings.get(`disabled_skills`)??[])e.skillRegistry.disable(t);let t=new Set(e.settings.get(`disabled_plugins`)??[]);if(t.size>0)for(let[n,r]of e.skillRegistry.getAll())r.source?.type===`plugin`&&r.source.id&&t.has(r.source.id)&&e.skillRegistry.disable(n)}e.declarativeAgentProfiles=await zc(e.workspaceDir,{plugins:e.activePlugins(),claudeProjectAgentsAllowed:e.compatProducts?!e.compatProducts.trustVerdict.gated:void 0}),e.declarativeTeams=await Gc(e.workspaceDir);let t=await e.pluginModuleManager.reload(new Set(e.declarativeAgentProfiles.map(e=>e.name)));e.declarativeAgentProfiles.push(...t),e._pendingProviderCapabilities=(await e.pluginProviderManager.reload()).pendingCapabilityPluginIds,await e.diagnoseTopoSortIssues()});let t=()=>St(`mcpController.start()`,()=>e.mcpController.start()).then(t=>(e.syncSessionTools(),e.onMcpStartupSettled?e.onMcpStartupSettled(t):e.pendingMcpStartupResult=t,t)).catch(t=>(e.logger.warn({err:t instanceof Error?t.message:String(t)},`mcpController.start() failed unexpectedly (non-blocking path)`),{connected:0,failed:0}));e._interactive?t():await t(),e.pendingWorkspaceInit?e.logger.info({workspaceDir:e.workspaceDir},`Workspace identity pending trust confirmation; session restore deferred`):e.parentWorkspaceExisted?e.logger.info({workspaceDir:e.workspaceDir,parentRoot:e.parentWorkspaceExisted.parentRoot},`Parent workspace detected; waiting for user choice (adopt parent or create new)`):e._interactive?await St(`completeWorkspaceDependentStartup (session restoreAll)`,()=>ax(e)):St(`sweepOrphanTraceFiles (headless)`,()=>fx(e)),e._memoryGovernor.setCallbacks({onWarning:()=>{let t=e.getActiveSession();t&&t.compactNow().catch(t=>{e.logger.warn({err:t instanceof Error?t.message:String(t)},`[memory-governor] headless compactNow (soft degrade) failed`)})},onCritical:t=>{let n=process.env.OTTO_HEADLESS_OOM_POLICY??`log-only`;e.logger.error({policy:n,level:t.level,usedPct:t.usedPct,heapUsed:t.heapUsed},`[memory-governor] critical memory threshold reached (headless/service)`),n===`graceful-exit`&&px(e).finally(()=>process.exit(1))},onSample:t=>{e._residencyGovernor.setLevel(t.level);let n=performance.getEntriesByType(`measure`).length;n>5e4&&(performance.clearMeasures(),performance.clearMarks(),e.logger.warn({measureCount:n},`[memory-governor] user-timing buffer exceeded guard threshold — cleared (likely a dev-mode library leaking performance.measure; see a7eaa826)`));let r=e.getActiveSession()?.id;r&&e.storage.traceStore.append(r,{ts:t.ts,sessionId:r,kind:`lifecycle`,node:`process.memory.sample`,payload:{pid:process.pid,level:t.level,heapUsed:t.heapUsed,heapSizeLimit:t.heapSizeLimit,usedPct:Number(t.usedPct.toFixed(2)),rss:t.rss,external:t.external}}).catch(t=>{e.logger.warn({err:t instanceof Error?t.message:String(t)},`[memory-governor] trace sample append failed`)})}}),e._memoryGovernor.start(),e._fleetMonitor.setCallbacks({onSample:t=>{let n=e.getActiveSession()?.id;n&&e.storage.traceStore.append(n,{ts:t.ts,sessionId:n,kind:`lifecycle`,node:`process.fleet.sample`,payload:{pid:process.pid,processCount:t.processCount,totalRssMb:t.totalRssMb,suspectedOrphanCount:t.suspectedOrphanCount,maxGeneration:t.maxGeneration}}).catch(t=>{e.logger.warn({err:t instanceof Error?t.message:String(t)},`[fleet-monitor] trace sample append failed`)})}}),e._fleetMonitor.start(),vt(`app.start() internal phases complete`),e.logger.info(`App started`)}async function ax(e){if(e.workspaceRef&&e.planeRegistry.migrateWorkspaceGrid(`default`,e.workspaceRef.key),e.codingSessionPool.autoPersist){let t=await e.codingSessionPool.restoreAll();if(t>0){e.logger.info({count:t},`Sessions restored from storage`);for(let t of e.listSessions()){let n=e.getSession(t.id);n&&e.notificationDispatcher.attach(n)}}}fx(e)}function ox(e){return!!e.pendingWorkspaceInit}function sx(e){return!!e.parentWorkspaceExisted}async function cx(e){let t=e.parentWorkspaceExisted;if(!t)return e.workspaceRef;e.parentWorkspaceExisted=void 0;try{return e.workspaceRef=await Wi($b()).resolveLocal(t.parentRoot),await ax(e),e.workspaceRef}catch(n){e.parentWorkspaceExisted=t,e.logger.warn({err:n,parentRoot:t.parentRoot},`Failed to adopt parent workspace; continuing without workspace identity. Will retry on next startup.`);return}}async function lx(e){let t=e.parentWorkspaceExisted;if(!t)return e.workspaceRef;e.parentWorkspaceExisted=void 0;try{return e.workspaceRef=await Wi($b()).createLocal(t.currentRoot),await ax(e),e.workspaceRef}catch(n){e.parentWorkspaceExisted=t,e.logger.warn({err:n,currentRoot:t.currentRoot},`Failed to create new workspace; continuing without workspace identity. Will retry on next startup.`);return}}async function ux(e){let t=e.pendingWorkspaceInit;if(!t)return e.workspaceRef;e.pendingWorkspaceInit=void 0;try{return e.workspaceRef=await Wi($b()).createLocal(t.root),await ax(e),e.workspaceRef}catch(n){e.pendingWorkspaceInit=t,e.logger.warn({err:n,root:t.root},`Workspace identity creation failed; continuing without workspace identity. Will retry on next startup.`);return}}async function dx(e,t){let n=e.workspaceRef?.root;if(!n)return!1;let r=$b(),i=await Ki(n,r);if(!i)return!1;if(!t&&i.memorySyncEnabled){try{await e.storage.autoMemory?.load()}catch{}try{await e.learningStore.refresh()}catch{}}let a=t?{...i,memorySyncEnabled:!0}:{id:i.id,name:i.name,createdAt:i.createdAt};return await Ji(n,a,r),e.workspaceRef={key:qi(a.id),id:a.id,root:n,...a.memorySyncEnabled?{memorySyncEnabled:!0}:{}},!0}async function fx(e){let t=e.sessionStorageDir,n=e.sessionRepoRef?.current;if(!t||!n)return;let r=process.env.OTTO_TRACE_SWEEP;if(r!==`off`)try{let{sweepOrphanTraces:i}=await import(`./trace-orphan-sweeper-BdEIlLfB.js`),a=new Set(await n.listAllSessionIds());for(let t of e.codingSessionPool.listSessions())a.add(t.id);await i({dirs:[C(t,`trace`),C(t,`checkpoint`)],liveSessionIds:a,logger:e.logger,mode:r===`dry-run`?`dry-run`:`delete`})}catch(t){e.logger.warn({err:t instanceof Error?t.message:String(t)},`Orphan trace sweep failed`)}}async function px(e){if(e.disposed)return;e.disposed=!0;let t=[],n=async(e,n)=>{try{await n()}catch(n){t.push(Error(`stop:${e}: ${n.message}`))}};e.codingSessionPool.autoPersist&&await n(`saveSessions`,()=>e.codingSessionPool.saveAll()),await n(`processRegistryUnsubs`,()=>{for(let t of e.processRegistryUnsubs)t();e.processRegistryUnsubs.length=0}),await n(`bgProcesses`,()=>E.killAllForOwner(`app`,e.processOwnerId)),await n(`mcpController`,()=>e.mcpController.stop()),await n(`processRuntime`,()=>E.killAll()),await n(`scheduleService`,()=>e.scheduleServiceInstance?.stop()),await n(`memoryGovernor`,()=>e._memoryGovernor.dispose()),await n(`fleetMonitor`,()=>e._fleetMonitor.dispose()),await n(`agentJobs`,()=>e.agentJobServiceInstance?.dispose()),await n(`settings`,()=>e.settings.dispose()),await n(`toolRegistry`,()=>e.toolRegistry.dispose()),await n(`orchestrator`,()=>e.orchestrator.dispose()),await n(`notification`,()=>e.notificationDispatcher.dispose()),await n(`agentRuntime`,()=>e.agentRuntime.dispose()),await n(`hooks`,()=>{for(let t of e.ownedHookNames)e.hookRegistry.unregister(t);e.ownedHookNames.length=0}),await n(`pluginModules`,()=>e.pluginModuleManager.cleanup()),await n(`pluginProviders`,()=>e.pluginProviderManager.cleanup()),await n(`pluginWorkers`,()=>Hu()),await n(`pluginServices`,()=>vu()),await n(`sandbox`,()=>e.sandbox.dispose()),e.devtools&&await n(`devtools`,()=>e.devtools.stop()),await n(`logSub`,()=>{e.globalLogSubscription&&=(e.globalLogSubscription(),null)}),await n(`traceStore`,()=>e.storage.traceStore.close?.()),await n(`checkpointStore`,()=>e.storage.checkpointStore.close?.()),await n(`signalLog`,()=>e.evolutionSignals.close()),await n(`authStore`,()=>e._authStore.dispose()),await n(`planeRegistry`,()=>e.planeRegistry.dispose()),t.length>0&&e.logger.warn({count:t.length,errors:t.map(e=>e.message)},`stop: %d subsystems reported errors`),e.logger.info(`App stopped`)}function mx(e){return e.filter(e=>e.type===`text`).map(e=>e.text).join(`
590
- `)}function hx(e){return typeof e==`string`?e:mx(e)}function gx(e){return mx(e)}function _x(e){return mx(e)}function vx(e){let{sessionId:t,entries:n,signals:r=[]}=e,i=[],a=0,o=-1,s=e=>{i.push({sessionId:t,seq:a++,...e})};for(let e of n){if(e.type===`message`){let t=e.message;if(t.role===`system`||t.role===`system_notification`)continue;if(t.role===`user`){o+=1,s({kind:`turn.start`,at:e.timestamp,turnIndex:o}),s({kind:`user.message`,at:e.timestamp,turnIndex:o,text:hx(t.content)});continue}if(t.role===`assistant`){s({kind:`assistant.message`,at:e.timestamp,turnIndex:o,text:gx(t.content),model:t.model,usage:{input:t.usage.inputTokens,output:t.usage.outputTokens},stopReason:t.stopReason});for(let n of ba(t))s(yx(n,e.timestamp,o));continue}if(t.role===`tool_result`){s({kind:`tool.result`,at:e.timestamp,turnIndex:o,toolCallId:t.toolCallId,toolName:t.toolName,isError:t.isError,summary:_x(t.content)});continue}continue}if(e.type===`compaction`){if(e.replacementStripped)continue;s({kind:`compaction`,at:e.timestamp,boundaryId:e.id,summary:e.summary,compactedCount:e.compactedCount});continue}}for(let e of r)e.sessionId===t&&s({kind:`signal`,at:e.at,signalKind:e.kind,key:e.key,value:e.value,...e.detail===void 0?{}:{detail:e.detail}});return i}function yx(e,t,n){return{kind:`tool.call`,at:t,turnIndex:n,toolCallId:e.id,toolName:e.name,arguments:e.arguments}}function bx(e){let t=[...e.records].sort((e,t)=>e.seq-t.seq),n=0,r=0;for(let i of t){let t=i;if(e.redact){try{t=e.redact(i)}catch{r+=1;continue}if(t===void 0){r+=1;continue}}e.output.write(`${JSON.stringify(t)}\n`),n+=1}return{written:n,suppressed:r}}function xx(e,t,n){return e.filter(e=>(t==null||e.seq>t)&&e.seq<n)}async function Sx(e){let t=await e.repo.getEntryCount(e.sessionId),n=xx(await e.repo.loadEntries(e.sessionId,e.sinceSeq),e.sinceSeq,t);for(let t of n){if(t.type!==`compaction`)continue;let n=t.data?.summary;if(typeof n!=`string`||n.length===0)throw Error(`轨迹导出失败:会话 ${e.sessionId.slice(0,8)} 的 compaction 条目 ${t.entryId.slice(0,8)} 缺 summary(blob 完整性 fail-fast)。`)}let r=n.map(e=>xi(e));return{...bx({records:vx({sessionId:e.sessionId,entries:r,signals:e.signals??[]}),redact:e.redact,output:e.output}),upperSeq:t,entryCount:n.length}}function Cx(){let e=[];return{lines:e,write(t){return e.push(t),!0}}}async function wx(e,t,n={}){let r=t.sessionRepoRef.current;if(!r)throw Error(`轨迹导出仅支持关系化 SQLite 后端(sessions.db)。当前后端不支持。`);let i=t.evolutionSignals.list();if(n.output)return Sx({sessionId:e,repo:r,redact:n.redact,output:n.output,signals:i});let a=Cx();return{...await Sx({sessionId:e,repo:r,redact:n.redact,output:a,signals:i}),lines:a.lines}}async function Tx(e){let t=await e.capabilityReloader.reload();return e.applyResults({agentProfiles:t.agentProfiles,teamDeclarations:t.teamDeclarations,pendingProviderCapabilities:t.pendingProviderCapabilities}),await e.diagnoseTopoSortIssues(),e.syncSessionTools(),e.panelBackendController.notifyReload(),{mcpTools:t.mcpTools,models:t.models,agents:t.agents,teams:t.teamCount,pendingProviderCapabilities:t.pendingProviderCapabilities,i18nEntries:t.i18nEntries,agentProfiles:t.agentProfiles,teamDeclarations:t.teamDeclarations,...t.reloadFailures?{reloadFailures:t.reloadFailures}:{}}}let Ex=0;function Dx(e){let t=`__ottoResidencyDiagnostics`,n=globalThis;n[t]||Object.defineProperty(n,t,{configurable:!1,enumerable:!1,writable:!1,value:Object.freeze({getResidency:()=>e.getResidencyDiagnostics()})})}var Ox=class{processOwnerId=`app-${++Ex}`;get processOwner(){return this.processOwnerId}settings;toolRegistry;hookRegistry;planeRegistry=new Ht;providerRegistry;wireProtocolRegistry;agentRuntime;codingSessionPool;permissionRegistry;auditLog;logger;sessionRepoRef;sessionStorageDir;get workspaceDir(){return this.workspaceRef?.root??this._workspaceDir}_workspaceDir;_workspaceId;_interactive;_shadow;_pluginHomedir;_pluginBundledDirs;workspaceRef;pendingWorkspaceInit;parentWorkspaceExisted;maxSessions;maxToolTurns;maxToolTurnExtensions;promptOutputTokenBudget;promptWallClockBudgetMs;sessionCostBudgetUSD;stallDetection;devtools=null;editFileCallback=void 0;_editFilesDedup=new Set;storage;userMemory=new Ct({store:(()=>{let e=new Dt(at());return c()?Pt(e):e})()});completeText;clock;fileStateManager;learningStore;localLearningStore;memoryAutoExtractor;promptManager;orchestrator;runSession;writeTodos;sessionConfigResolver;session;model;notifications;permissions;runTeam;skillRegistry;i18nRegistry;_pendingProviderCapabilities=[];get pendingProviderCapabilities(){return this._pendingProviderCapabilities}declarativeAgentProfiles=[];compatProducts;extensions;pluginInput=pr();sigilResolvers=new bo;expandSigilChips(e,t){return ko(e,this.sigilResolvers,{workspaceDir:this.workspaceDir},{...t,lookupResolverId:e=>{for(let t of this.pluginInput.getAll())if(t.value===e&&t.resolverId)return t.resolverId}})}feedbackRegistry=new yo;getShortcuts(){return this.settings.get(`shortcuts`)??[]}async saveShortcut(e,t,n){let r=e.trim();if(!r||!/^[A-Za-z0-9_-]+$/.test(r))throw Error(`invalid shortcut name: ${JSON.stringify(e)}`);if(!t.trim())throw Error(`shortcut text cannot be empty`);let i=this.getShortcuts();if(i.some(e=>e.name===r&&e.name!==n))throw Error(`shortcut name already exists: ${r}`);let a=[...n?i.filter(e=>e.name!==n):i,{name:r,text:t}];await this.settings.persist({shortcuts:a},`project`)}async deleteShortcut(e){let t=this.getShortcuts(),n=t.filter(t=>t.name!==e);n.length!==t.length&&await this.settings.persist({shortcuts:n},`project`)}declarativeTeams=[];mcpController;panelBackendController;get mcpManager(){return this.mcpController.manager}disposed=!1;ownedHookNames=[];failureSignals=new be;diagnoser=new ye(this.failureSignals);pluginHealthTracker=wl();pluginCapabilityQuota=new Dl;inquiryCenter=new kl;userAskRenderer;userAskSeq=0;processRegistryUnsubs=[];settingsLoaded=!1;lastSettingsConfig=null;_resilienceOverride;_resilienceConfig;defaultToolPreset=`full`;permissionSync;sandbox;_memoryGovernor;_residencyGovernor;_fleetMonitor;get tools(){return this.toolRegistry.getAvailable(this.defaultToolPreset)}agentJobNotify;agentJobServiceInstance;scheduleServiceInstance;searchEcosystem;evolutionSignals;notificationDispatcher;presenceTracker;followUpPendingProbe;toolsSyncCoordinator;onMcpStartupSettled;pendingMcpStartupResult;setMcpStartupCallback(e){this.onMcpStartupSettled=e,this.pendingMcpStartupResult&&=(e(this.pendingMcpStartupResult),void 0)}pluginContributionsFacade;buildToolsForWorkspace(e){return Yb(this,e)}connectorTools(){return Xb(this)}get agentJobs(){return this.agentJobServiceInstance||=hs({workspaceDir:this.workspaceDir,agentJobNotify:this.agentJobNotify,buildToolsForWorkspace:e=>this.buildToolsForWorkspace(e),connectorTools:()=>this.connectorTools(),settings:this.settings,modelRegistry:this.modelRegistry,stream:this.codingSessionPool.stream,logger:this.logger,hookRegistry:this.hookRegistry}),this.agentJobServiceInstance}setScheduleService(e){this.scheduleServiceInstance=e,this.pluginModuleManager?.reconcileServiceSchedules()}setEcosystemSearch(e){this.searchEcosystem!==e&&(this.searchEcosystem=e,this.reloadCapabilities().catch(e=>{this.logger.warn({err:e instanceof Error?e.message:String(e)},`Failed to refresh capability_gap after ecosystem search injection`)}))}get memoryGovernor(){return this._memoryGovernor}get fleetMonitor(){return this._fleetMonitor}get modelRegistry(){return this._modelRegistry}get authStore(){return this._authStore}modelCatalogManager;_modelRegistry;_authStore;getAllModels(){return this.model.getAllModels()}resolveModel(e){return this.model.resolveModel(e)}listProviders(){return this.model.listProviders()}registerHook(e){Es(this,e)}unregisterHook(e){return Ds(this,e)}async hydrateModelCache(){return this.model.hydrateModelCache()}getSessionAvailableModels(e){return this.model.getSessionAvailableModels(e)}async refreshModels(){return this.model.refreshModels()}async reloadCapabilities(){let{agentProfiles:e,teamDeclarations:t,...n}=await Tx({capabilityReloader:this.capabilityReloader,applyResults:e=>{this.declarativeAgentProfiles=e.agentProfiles,this.declarativeTeams=e.teamDeclarations,this._pendingProviderCapabilities=e.pendingProviderCapabilities},diagnoseTopoSortIssues:()=>this.diagnoseTopoSortIssues(),syncSessionTools:()=>this.syncSessionTools(),panelBackendController:this.panelBackendController});return n}syncSessionTools(){return this.toolsSyncCoordinator.resync()}syncSessionToolsFor(e){return this.toolsSyncCoordinator.resyncOne(e)}pluginTopology=new xf;pluginModuleManager;capabilityGapStore=new Le;capabilityGapRecorder;pluginProviderManager;capabilityReloader;computedPluginCommands(){return this.pluginContributionsFacade.computedPluginCommands()}pluginCliCommands(){return this.pluginContributionsFacade.pluginCliCommands()}pluginSlashCommands(){return this.pluginContributionsFacade.pluginSlashCommands()}get sessionManager(){return this.codingSessionPool}getResidencyDiagnostics(){return this.codingSessionPool.getResidencyDiagnostics()}globalLogSubscription=null;constructor(e){let{inspect:t,logger:n,projectConfigPath:r,maxSessions:i,maxToolTurns:a,maxToolTurnExtensions:o,promptOutputTokenBudget:s,promptWallClockBudgetMs:l,sessionCostBudgetUSD:u,stallDetection:d,workspaceDir:f,workspaceId:p,pluginHomedir:m,pluginBundledDirs:h}=e;this.maxSessions=i??gi,this.maxToolTurns=a??Wt.maxToolTurns,this.maxToolTurnExtensions=o,this.promptOutputTokenBudget=s,this.promptWallClockBudgetMs=l,this.sessionCostBudgetUSD=u,this.stallDetection=d,this._workspaceDir=f??process.cwd(),this._workspaceId=p,this._interactive=e.interactive??!1,this._shadow=e.shadow??c(),this._pluginHomedir=m??at(),this._pluginBundledDirs=h??[],this._resilienceOverride=e.resilience,this.logger=T(n.name,{level:n.level,destination:n.destination}),this.evolutionSignals=tx(this.logger);let g={};this.sessionRepoRef=g,this.sessionStorageDir=e.storage?.session&&`dir`in e.storage.session?e.storage.session.dir:void 0;let _=dp({logger:this.logger,hookRegistry:e.hookRegistry,getToolRegistry:()=>this.toolRegistry,getPermissionRegistry:()=>this.permissionRegistry,onHookTimeout:({hookName:e,timeoutMs:t})=>{let n=nl(e);n&&this.pluginHealthTracker.recordHookTimeout(n,e)}});this.sandbox=_.sandbox,this._memoryGovernor=_.memoryGovernor,this._residencyGovernor=_.residencyGovernor,this._fleetMonitor=_.fleetMonitor,this.permissionSync=_.permissionSync,this.hookRegistry=_.hookRegistry;let te=Sf(e,()=>this.settings);this._authStore=te.authStore,this._modelRegistry=te.modelRegistry,this.providerRegistry=te.providerRegistry,this.wireProtocolRegistry=te.wireProtocolRegistry,this.modelCatalogManager=te.modelCatalogManager;let ne=te.defaultModel,re=te.resolveEffectiveModel,ie=e.modelId,ae=$a({options:e,workspaceDir:this.workspaceDir,providerRegistry:this.providerRegistry,defaultModel:ne,resolveEffectiveModel:re,repoRef:g,getWorkspaceRef:()=>this.workspaceRef,onMemoryConflict:e.onMemoryConflict,getActiveSessionBytes:()=>{let e=this.codingSessionPool?.active?.session;return e instanceof mi?e.estimatedContentBytes:void 0},getRealInputTokens:()=>this.codingSessionPool?.active?.getLastTotalInputTokens(),getToolRegistry:()=>this.toolRegistry,getEffectiveMaxBytes:()=>{let e=this.codingSessionPool;if(e)return e.getResidencyDiagnostics().maxBytesPerSession},getCoverageThresholds:Ya(()=>this.settings.get(`residency`)),...Ja(e=>this.codingSessionPool?.getSession?.(e)?.session,()=>this.codingSessionPool?.active?.session)});this.storage={storageHost:ae.storageHost,autoMemory:ae.autoMemory,memory:ae.memory,traceStore:ae.traceStore,traceLive:ae.traceLive,checkpointStore:ae.checkpointStore,remoteMemoryConfigured:!!(e.storage?.remote?.getAuth&&e.storage?.session&&`url`in e.storage.session),remoteSessionConfigured:!!(e.storage?.session&&`url`in e.storage.session)},this.clock=ae.clock;let se=fp({inspect:t,loggerName:n.name,workspaceDir:this.workspaceDir,projectConfigPath:r,interactive:this._interactive,permissionSync:this.permissionSync,sandbox:this.sandbox,onSettingsApplied:e=>{this.settingsLoaded=!0,e.tool_preset&&(this.defaultToolPreset=e.tool_preset)},getI18nRegistry:()=>this.i18nRegistry});this.devtools=se.devtools,this.globalLogSubscription=se.logSubscription,this.settings=se.settings;let ce=bs({getConfig:()=>this.settings.get(`notification`),getCwd:()=>this.workspaceDir,isFollowUpPending:()=>this.followUpPendingProbe?.()??!1,emitHookNotification:e=>void this.hookRegistry.emit(`notification`,e)});this.notificationDispatcher=ce.dispatcher,this.presenceTracker=ce.presenceTracker,this.compatProducts=io(this.workspaceDir,this.activePlugins());let le=this.settings,ue=ro({skillProvider:e.skillProvider,workspaceDir:this.workspaceDir,activePlugins:()=>this.activePlugins(),resolveEffectiveModel:re,providerRegistry:this.providerRegistry,prompt:e.prompt,compatProducts:this.compatProducts,memoryStore:ae.memoryStore,evolutionSignals:this.evolutionSignals,memoryAutoExtractConfig:{enabled:!0,get everyNTurns(){return le.get(`memory_auto_extract`)?.every_n_turns},get maxLessons(){return le.get(`memory_auto_extract`)?.max_lessons},get similarityThreshold(){return le.get(`memory_auto_extract`)?.similarity_threshold},get minRelevantHits(){return le.get(`memory_auto_extract`)?.min_relevant_hits}}});this.skillRegistry=ue.skillRegistry,this.fileStateManager=ue.fileStateManager,this.learningStore=ue.learningStore,this.localLearningStore=ue.localLearningStore,this.memoryAutoExtractor=ue.memoryAutoExtractor,this.completeText=ue.completeText,this.promptManager=ue.promptManager;let de=oe(this._authStore,`delegation`),fe=pp({getModelRegistry:()=>this.modelRegistry,providerRegistry:this.providerRegistry,authStore:this._authStore,getSettings:()=>this.settings,promptManager:this.promptManager,getTools:()=>this.tools,getDeclarativeAgentProfiles:()=>this.getEnabledAgentProfiles(),defaultModel:ne,explicitModelId:ie,isModelUsable:de,maxToolTurns:this.maxToolTurns,maxToolTurnExtensions:this.maxToolTurnExtensions,promptOutputTokenBudget:this.promptOutputTokenBudget,promptWallClockBudgetMs:this.promptWallClockBudgetMs,sessionCostBudgetUSD:this.sessionCostBudgetUSD,stallDetection:this.stallDetection,workspaceDir:this.workspaceDir,getWorkspaceRef:()=>this.workspaceRef,workspaceId:this._workspaceId,logger:this.logger,getResilienceConfig:()=>this.getResilienceConfig()}),pe=fe.visionDelegateService;this.sessionConfigResolver=fe.sessionConfigResolver;let me=mp({options:e,hookRegistry:this.hookRegistry,providerRegistry:this.providerRegistry,getModelRegistry:()=>this._modelRegistry,logger:this.logger,workspaceDir:this.workspaceDir,getTools:()=>this.tools,getDeclarativeAgentProfiles:()=>this.getEnabledAgentProfiles(),getWorkspaceRef:()=>this.workspaceRef,repoRef:g,maxToolTurns:this.maxToolTurns,promptManager:this.promptManager,memory:this.storage.memory,traceStore:this.storage.traceStore,checkpointStore:this.storage.checkpointStore,clock:this.clock,devtools:this.devtools??void 0,residencyGovernor:this._residencyGovernor,getResidencyConfig:()=>this.getResidencyConfig(),visionDelegateService:pe,resolveEffectiveModel:re,defaultModel:ne,planeRegistry:this.planeRegistry,semanticReviewer:wp({getPermissionMode:()=>this.getPermissionMode(),isSemanticReviewEnabled:()=>this.settings.get(`sandbox`)?.semanticReview===!0,resolveReviewModel:()=>{let e=re();if(e)return ee(`compact`,e,this._modelRegistry)[0]??e},createLlmReviewer:e=>tn({stream:this.codingSessionPool.stream,model:e})})});this.agentRuntime=me.agentRuntime,this.codingSessionPool=me.codingSessionPool,Dx(this);let he=me.swarmAgentRunner,ge=hp({hookRegistry:this.hookRegistry,stream:this.codingSessionPool.stream,logger:this.logger,defaultModel:me.defaultModel,providerRegistry:this.providerRegistry,getDeclarativeTeams:()=>this.declarativeTeams,getDeclarativeAgentProfiles:()=>this.getEnabledAgentProfiles(),getSession:e=>this.getSession(e),createSession:e=>this.createSession(e),removeSession:e=>this.removeSession(e),sessionConfigResolver:this.sessionConfigResolver,swarmAgentRunner:he,workflowConfig:{retry:this.settings.get(`workflow`)?.retry,circuitBreaker:this.settings.get(`workflow`)?.circuitBreaker,orchestration:this.settings.get(`workflow`)?.orchestration}});this.orchestrator=ge.orchestrator,this.runSession=ge.runSession,this.runTeam=ge.runTeam,this.writeTodos=ge.writeTodos,this.toolRegistry=this.initToolRegistry(e);let _e=yp({toolRegistry:this.toolRegistry,hookRegistry:this.hookRegistry,settings:this.settings,workspaceDir:this.workspaceDir,logger:this.logger,getResilienceConfig:()=>this.getResilienceConfig(),compatProducts:this.compatProducts});this.permissionRegistry=_e.permissionRegistry,this.auditLog=_e.auditLog,this.mcpController=_e.mcpController;let ve=_e.preExistingHooks;this.extensions=bp({settings:this.settings,mcpController:this.mcpController,skillRegistry:this.skillRegistry,declarativeAgentProfiles:this.declarativeAgentProfiles,workspaceDir:this.workspaceDir,pluginHomedir:this._pluginHomedir,pluginBundledDirs:this._pluginBundledDirs,onPluginToggle:(e,t)=>{this.pluginModuleManager?.emitMonitorEvent({type:t?`plugin.enabled`:`plugin.disabled`,pluginId:e})}}),this.panelBackendController=gp({mcpController:this.mcpController,callMcpTool:(e,t,n)=>this.callMcpTool(e,t,n),getActivePlugins:()=>this.activePlugins()}).panelBackendController;let ye=xp({pluginInput:this.pluginInput,sigilResolvers:this.sigilResolvers,settings:this.settings,workspaceDir:this.workspaceDir,activePlugins:()=>this.activePlugins(),agentRuntime:this.agentRuntime,hookRegistry:this.hookRegistry,preExistingHooks:ve,codingSessionPoolGet:e=>this.codingSessionPool.getSession(e),logger:this.logger,registerHooks:()=>this.registerHooks()});this.ownedHookNames=ye.ownedHookNames,this.processRegistryUnsubs=ye.processRegistryUnsubs,this.i18nRegistry=new or;let be=_p({hookRegistry:this.hookRegistry,skillRegistry:this.skillRegistry,providerRegistry:this.providerRegistry,wireProtocolRegistry:this.wireProtocolRegistry,modelRegistry:this._modelRegistry,authStore:this._authStore,toolRegistry:this.toolRegistry,feedbackRegistry:this.feedbackRegistry,sigilResolverRegistry:this.sigilResolvers,pluginInput:this.pluginInput,workspaceDir:this.workspaceDir,activePlugins:()=>this.activePlugins(),callMcpTool:(e,t,n)=>this.callMcpTool(e,t,n),startPluginJob:({pluginId:e,title:t,prompt:n,sessionId:r})=>this.agentJobs.start({title:`[${e}] ${t}`,prompt:n,sessionId:r,origin:`plugin`}),getPluginJobSessionId:()=>this.getActiveSession()?.id,getSessionMessages:e=>this.getSession(e)?.session.messages().filter(e=>e.role===`user`||e.role===`assistant`||e.role===`tool_result`),completeText:(e,t)=>this.completeText(e,t),capabilityQuota:this.pluginCapabilityQuota,askUser:(e,t)=>this.askPluginUser(e,t),getWorkspaceKey:()=>this.workspaceRef?.key,logger:this.logger,onPluginLoadError:(e,t,n)=>{this.pluginHealthTracker.recordError(e,t),ex(this.pluginModuleManager?.emitMonitorEvent.bind(this.pluginModuleManager))({pluginId:e,reason:n,message:t})},getSchedulePort:()=>this.scheduleServiceInstance,settings:this.settings,mcpController:this.mcpController,skillRegistryForReloader:this.skillRegistry,modelCatalogManager:this.modelCatalogManager,getActivePluginsForReloader:()=>this.activePlugins(),i18nRegistry:this.i18nRegistry,getCompatTrustGated:()=>this.compatProducts?.trustVerdict.gated??!0,getSettingValue:e=>{try{return this.settings.get(e)}catch{return}},planeRegistry:this.planeRegistry});this.pluginModuleManager=be.pluginModuleManager,this.capabilityGapRecorder=nx(this.capabilityGapStore,this.pluginModuleManager.emitMonitorEvent.bind(this.pluginModuleManager)),this.pluginProviderManager=be.pluginProviderManager,this.capabilityReloader=be.capabilityReloader,this.toolRegistry.onMutation=e=>{this.permissionSync.sync(this.settings.config);for(let t of e.added??[])this.pluginModuleManager.emitMonitorEvent({type:`tool.registered`,toolName:t,source:e.source});for(let t of e.removed??[])this.pluginModuleManager.emitMonitorEvent({type:`tool.unregistered`,toolName:t,source:e.source})},this.settings.on(`change`,e=>{let t=e,n=this.lastSettingsConfig;if(this.lastSettingsConfig=t,!n)return;let r=new Set([...Object.keys(n),...Object.keys(t)]),i=[];for(let e of r)n[e]!==t[e]&&i.push(e);i.length>0&&this.pluginModuleManager.emitMonitorEvent({type:`settings.changed`,keys:i})});let xe=vp({sessionConfigResolver:this.sessionConfigResolver,getSession:e=>this.codingSessionPool.getSession(e),listSessionIds:()=>this.codingSessionPool.listSessions().map(e=>e.id),logger:this.logger,workspaceDir:this.workspaceDir,settings:this.settings,pluginModuleManager:this.pluginModuleManager,mcpController:this.mcpController,getActivePlugins:()=>this.activePlugins(),compatProducts:this.compatProducts});this.toolsSyncCoordinator=xe.toolsSyncCoordinator,this.pluginContributionsFacade=xe.pluginContributionsFacade,this.session=new nc(this),this.model=new Ns(this),this.notifications=new Rs(this),this.permissions=new Gs(this)}deferredConfigSteps(){return[{label:`resilience-config`,apply:()=>{this.freezeResilienceConfig()}},{label:`residency-config`,apply:()=>{this.freezeResidencyConfig()}},{label:`memory-governor-thresholds`,apply:()=>{let e=this.settings.get(`residency`);e&&this._memoryGovernor.updateThresholds({warnThresholdPct:e.warn_threshold_pct,hardThresholdPct:e.hard_threshold_pct})}},{label:`auth-store-lock-timeout`,apply:()=>{this._authStore.setRefreshLockTimeoutMs(this.getResilienceConfig().oauth.refreshLockTimeoutMs)}}]}async ensureSettingsLoaded(){await Sp(this.settings,()=>this.settingsLoaded,e=>{this.settingsLoaded=e}),Cp(this.deferredConfigSteps())}freezeResilienceConfig(){if(this._resilienceConfig!==void 0)return;let e=ji(process.env.OTTO_RESILIENCE_CONFIG),t=this._resilienceOverride?Pi(this._resilienceOverride):void 0;this._resilienceConfig=l(e,this.settings.get(`resilience`),t)}_residencyConfig;freezeResidencyConfig(){if(this._residencyConfig!==void 0)return;let e=this.settings.get(`residency`);this._residencyConfig={totalBytes:e?.total_bytes,minPerSessionBytes:e?.min_per_session_bytes,maxPerSessionBytes:e?.max_per_session_bytes,maxContentBytes:e?.max_content_bytes,maxHistoryMessages:e?.max_history_messages,resumeWindowMessages:e?.resume_window_messages,compactionTimeoutMs:e?.compaction_timeout_ms}}getResidencyConfig(){return this._residencyConfig}getResilienceConfig(){if(this._resilienceConfig===void 0)throw Error(`getResilienceConfig() called before settings are loaded — call after ensureSettingsLoaded()/start()`);return this._resilienceConfig}async allowToolAlways(e,t){return this.permissions.allowToolAlways(e,t)}getPermissionMode(){return this.permissions.getPermissionMode()}async setPermissionMode(e){return this.permissions.setPermissionMode(e)}getSessionAlwaysAllow(e){return this.permissions.getSessionAlwaysAllow(e)}bashAlwaysAllowPrefix(e){return this.permissions.bashAlwaysAllowPrefix(e)}isWellFormedAllowEntry(e){return this.permissions.isWellFormedAllowEntry(e)}async disallowToolAlways(e){return this.permissions.disallowToolAlways(e)}clearSessionAlwaysAllow(e){this.permissions.clearSessionAlwaysAllow(e)}activePlugins(){return this.pluginTopology.resolve({workspaceDir:this.workspaceDir,disabledPlugins:this.settings.get(`disabled_plugins`)??[],homedir:this._pluginHomedir,bundledDirs:this._pluginBundledDirs})}async diagnoseTopoSortIssues(){await this.pluginTopology.diagnose(this.logger,this.settings,ex(this.pluginModuleManager?.emitMonitorEvent.bind(this.pluginModuleManager)))}listFileCommands(){return this.pluginContributionsFacade.listFileCommands()}async callMcpTool(e,t,n){return this.pluginContributionsFacade.callMcpTool(e,t,n)}getPluginPanelRegistrations(){return this.pluginContributionsFacade.getPluginPanelRegistrations()}getPluginStatusItems(){return this.pluginContributionsFacade.getPluginStatusItems()}getGlobalMenuItems(){return this.pluginContributionsFacade.getGlobalMenuItems()}getPluginRenderers(){return this.pluginContributionsFacade.getPluginRenderers()}getPluginStatusWidgets(){return this.pluginContributionsFacade.getPluginStatusWidgets()}getPluginFileViewers(){return this.pluginContributionsFacade.getPluginFileViewers()}isFeedbackAvailable(){return this.feedbackRegistry.get()!==void 0}getPulseSurveyConfig(){return this.settings.get(`pulse_survey`)??{}}recordPulseSurvey(e){this.feedbackRegistry.get()?.recordPulseSurvey?.(e)}buildFeedbackIssueUrl(e){return this.feedbackRegistry.get()?.buildIssueUrl?.(e)}listFeedbackIssues(e){return this.feedbackRegistry.get()?.listIssues?.(e)??Promise.resolve({items:[]})}resolveFeedbackPlatform(){return this.feedbackRegistry.get()?.resolveFeedbackPlatform?.()??Promise.resolve(`github`)}markFeedbackResolved(e){return this.feedbackRegistry.get()?.markIssueResolved?.(e)??Promise.resolve(!1)}unmarkFeedbackResolved(e,t){return this.feedbackRegistry.get()?.unmarkIssueResolved?.(e,t)??Promise.resolve(!1)}listFeedbackResolvedMarks(){return this.feedbackRegistry.get()?.listResolvedMarks?.()??Promise.resolve([])}buildFeedbackCodingIssueUrl(e){return this.feedbackRegistry.get()?.buildCodingIssueUrl?.(e)??null}updateSettings(e){return this.settings.update(e)}resolveA2uiRendererPayload(e){return Ro(Fo(this.activePlugins()),e)}getPluginRegistrations(){return this.pluginContributionsFacade.getPluginRegistrations()}async firePluginActivationEvent(e){await this.pluginModuleManager.activateOn(e,new Set(this.declarativeAgentProfiles.map(e=>e.name)))}async start(){return ix(this)}async completeWorkspaceDependentStartup(){return ax(this)}needsWorkspaceInit(){return ox(this)}async confirmWorkspaceInit(){return ux(this)}hasParentWorkspace(){return sx(this)}async adoptParentWorkspace(){return cx(this)}async createLocalWorkspace(){return lx(this)}async setWorkspaceMemorySyncEnabled(e){return dx(this,e)}async sweepOrphanTraceFiles(){return fx(this)}async stop(){return px(this)}async createSession(e={}){return this.session.createSession(e)}registerNotificationChannel(e){this.notifications.registerNotificationChannel(e)}registerInAppNotificationChannel(e){this.notifications.registerInAppNotificationChannel(e)}setUserAskRenderer(e){this.userAskRenderer=e}async askPluginUser(e,t){let n={...Ax(t),id:`plugin_ask_${++this.userAskSeq}`,askedBy:`plugin:${e}`},r=this.userAskRenderer;if(!this._interactive||!r)return kx();let i=this.inquiryCenter.enqueue({id:n.id,origin:{kind:`plugin`,pluginId:e},question:n});if(!i.accepted)return kx();if(!await this.inquiryCenter.waitForTurn(n.id))return await i.answer;try{let e=await r(n);return this.inquiryCenter.settle(n.id,e),e}catch(e){throw this.inquiryCenter.settle(n.id,kx()),e}}notifyUserInteraction(){this.notifications.notifyUserInteraction()}setTerminalFocus(e){this.notifications.setTerminalFocus(e)}setFollowUpPendingProbe(e){this.followUpPendingProbe=e}notifyPluginServices(e){let t=_u(),n=Mx(this.activePlugins(),this.planeRegistry.resolveForEmit({workspaceKey:this.workspaceRef?.key})),r=0;for(let i of this.activePlugins())if(n.has(i.id))for(let n of t.runningServiceIds(i.id))t.notify(i.id,n,e)&&(this.pluginCapabilityQuota.onNotifyDelivered(i.id,e.sessionId),r+=1);return r}notifyPluginServiceSchedule(e,t){return this.activePlugins().some(t=>t.id===e.pluginId)?_u().notify(e.pluginId,e.serviceId,{type:`schedule.tick`,scheduleId:t.scheduleId,occurrenceId:t.occurrenceId,occurredAt:t.occurredAt}):!1}getSession(e){return this.session.getSession(e)}async shareSession(e,t){return this.session.shareSession(e,t)}getActiveSession(){return this.session.getActiveSession()}listSessions(e){return this.session.listSessions(e)}async listAllSessions(e){return this.session.listAllSessions(e)}async removeSession(e){return this.session.removeSession(e)}async exportSessionArchive(e,t){return this.session.exportSessionArchive(e,t)}exportTrajectory(e,t){return wx(e,{sessionRepoRef:this.sessionRepoRef??{},evolutionSignals:this.evolutionSignals},t)}archiveSession(e){return this.session.archiveSession(e)}async forkSession(e,t){return this.session.forkSession(e,t)}getEnabledAgentProfiles(){let e=new Set(this.settings.get(`disabled_agents`)??[]);return e.size===0?this.declarativeAgentProfiles:this.declarativeAgentProfiles.filter(t=>!e.has(t.name))}initToolRegistry(e){return Zb(this,e)}async buildModelCatalog(e){return this.model.buildModelCatalog(e)}setSessionAvailableModels(e,t){this.model.setSessionAvailableModels(e,t)}registerHooks(){Qb(this)}get activeSandbox(){return this.permissions.activeSandbox}approveSandboxBypass(e){this.permissions.approveSandboxBypass(e)}getRecentPermissionDecisions(e,t){return this.permissions.getRecentPermissionDecisions(e,t)}recordAutoPermissionDecision(e){this.permissions.recordAutoPermissionDecision(e)}ensureNotDisposed(){if(this.disposed)throw Error(`App has been stopped and cannot be reused.`)}};function kx(){return{answer:``,acceptedRecommendation:!1,resolvedBy:`human`}}function Ax(e){return{header:jx(e.header,160),question:jx(e.question,2e3),background:jx(e.background,4e3),recommendation:jx(e.recommendation,1e3),...e.options?{options:e.options.slice(0,8).map(e=>({label:jx(e.label,120),rationale:jx(e.rationale,1e3),...e.recommended?{recommended:!0}:{}}))}:{},...e.allowFreeform===void 0?{}:{allowFreeform:e.allowFreeform},...e.multiSelect===void 0?{}:{multiSelect:e.multiSelect},...e.evidence?{evidence:e.evidence.slice(0,8).map(e=>jx(e,1e3))}:{}}}function jx(e,t){return String(e??``).replace(/[--Ÿ‎‏‪-‮⁦-⁩]/g,` `).slice(0,t)}function Mx(e,t){let n=new Set(t.map(e=>e.pluginId).filter(e=>e!==void 0));return new Set(e.map(e=>e.id).filter(e=>n.has(e)))}function Nx(e){return new Ox(e)}function Px(e){return{get id(){return e.id},get title(){return e.title},get agentName(){return e.agentName},get model(){return{id:e.model.id,name:e.model.name,provider:e.model.provider}},get isBusy(){return e.isBusy},messageCount:()=>e.session.messages().length,lastAssistantText:()=>gs(e.session.messages()),prompt:(t,n)=>e.prompt(t,n),subscribe:((t,n)=>e.subscribe(t,n)),resolveApproval:(t,n)=>e.resolveApproval(t,n),resolveAskUser:(t,n)=>e.resolveAskUser(t,n),clearContext:()=>e.clearContext(),compactNow:()=>e.compactNow(),renameSession:t=>e.renameSession(t),abort:()=>e.abort(),dispose:()=>e.dispose()}}function Fx(e){return{createSession:async t=>Px(await e.createSession(t)),jobs:mn,models:{getAll:()=>e.modelRegistry.getAll().map(e=>({id:e.id,name:e.name,provider:e.provider})),switchModel:async(t,n)=>{let r=e.getSession(t);if(!r)return`会话未找到`;if(r.isBusy)return`当前有正在执行的对话,请等待完成后重试。`;let i=e.modelRegistry.find(n);return i?(r.applyModel(i),null):`未知模型 \`${n}\`。`},refresh:async()=>(await e.refreshModels()).map(e=>({provider:e.provider,status:e.status,added:e.added,kept:e.kept,total:e.total,reason:e.reason}))},permission:{getMode:()=>e.getPermissionMode(),setMode:t=>e.setPermissionMode(t)},auth:{getAuthSource:t=>e.authStore.getAuthSource(t)},i18n:{t:(t,n)=>e.i18nRegistry.t(t,n)},reloadCapabilities:()=>e.reloadCapabilities(),workspaceDir:e.workspaceDir}}const Ix=new Set(`assert.async_hooks.buffer.child_process.cluster.console.constants.crypto.dgram.diagnostics_channel.dns.domain.events.fs.http.http2.https.inspector.module.net.os.path.perf_hooks.process.punycode.querystring.readline.repl.sqlite.stream.string_decoder.timers.tls.trace_events.tty.url.util.v8.vm.wasi.worker_threads.zlib`.split(`.`));function Lx(e){return e.absolutePaths.length>0||e.bareSpecifiers.length>0}function Rx(e){let t=[],n=[];for(let r of e.matchAll(/require\("([^"]+)"\)/g)){let e=r[1];if(e.startsWith(`/`)){t.includes(e)||t.push(e);continue}e.startsWith(`.`)||e.startsWith(`node:`)||Ix.has(e)||n.includes(e)||n.push(e)}return{absolutePaths:t,bareSpecifiers:n}}function zx(e,t){let n=Rx(t);if(!Lx(n))return;let r=[`${e}: 产物不可分发(RFC-365 R1/R2)`];throw n.absolutePaths.length>0&&r.push(` 编译机绝对路径 require(R1)——发布机路径在用户机器不存在:`,...n.absolutePaths.map(e=>` ${e}`)),n.bareSpecifiers.length>0&&r.push(` 裸模块名 require(R2)——假设运行机有 node_modules,在 ~/.otto/plugins/<id>/ 必然 MODULE_NOT_FOUND:`,...n.bareSpecifiers.map(e=>` ${e}`)),Error(r.join(`
591
- `))}function Bx(e,t){return new Promise((n,r)=>{let i=setTimeout(()=>r(Error(`timeout`)),t);i.unref?.(),e.then(e=>{clearTimeout(i),n(e)},e=>{clearTimeout(i),r(e)})})}function Vx(e,t=O){let n=t(e);return n.gated||!(e.manifest.capabilities?.includes(`tools`)??!1)?!1:!n.pendingCapabilities.includes(`tools`)}async function Hx(e,t,n){let r=[];for(let i of e){if(!Vx(i,t))continue;let e=i.manifest.contributes?.perfMetrics;if(!e?.length)continue;let a=Uu(i.scope);for(let t of e){let e=(async()=>{try{let{result:e,error:n}=await Bx(a.executeTool(i.id,t.toolRef,{}),5e3);return n?{id:t.id,label:t.label,error:n}:{id:t.id,label:t.label,value:e}}catch(e){let r=e instanceof Error?e.message:String(e);return r===`timeout`&&n?.(i.id),{id:t.id,label:t.label,error:r}}})();r.push(e)}}return(await Promise.allSettled(r)).map((e,t)=>e.status===`fulfilled`?e.value:{id:`unknown-${t}`,label:`unknown`,error:String(e.reason)})}const Ux=20;function Wx(e,t=20){let n=Qc(e);if(!n||!v(n))return[];let r;try{r=b(n,`utf8`)}catch{return[]}let i=r.split(`
592
- `).filter(e=>e.trim().length>0).slice(-t),a=[];for(let e of i)try{a.push(JSON.parse(e))}catch{}return a}function Gx(e,t,n){let r=e?.manifest.contributes?.contextKeys;return{...t,...vr(r,n)}}function Kx(e,t){let n=e.manifest.scripts?.[t];if(!n)return Promise.reject(Error(`plugin ${e.id} 无脚本「${t}」`));let r=ht(n);return r.safe?new Promise((r,i)=>{let a=$i(n,{shell:!0,cwd:e.dir,stdio:`ignore`,env:mt()});a.on(`error`,i),a.on(`exit`,e=>e===0?r():i(Error(`脚本「${t}」退出码 ${e}`)))}):Promise.reject(Error(`脚本「${t}」被安全检查拦截:${r.reason}`))}function qx(e){let t=e.startsWith(`chrome://`);process.platform===`darwin`?$i(`open`,t?[`-a`,`Google Chrome`,e]:[e],{detached:!0,stdio:`ignore`}).unref():process.platform===`win32`?$i(`cmd`,[`/c`,`start`,``,e],{detached:!0,stdio:`ignore`}).unref():$i(t?`google-chrome`:`xdg-open`,[e],{detached:!0,stdio:`ignore`}).unref()}const Jx=T(`@x-otto/coding:plugin-cli-passthrough`),Yx=6e4;function Xx(e){let t=e.manifest.contributes?.cli?.bin,n=t?C(e.dir,t):Zx(e.dir);if(n)return Qx(n,e.dir)}function Zx(e){let t=C(e,`package.json`);if(v(t))try{let n=JSON.parse(b(t,`utf8`));if(typeof n.bin==`string`)return C(e,n.bin);if(n.bin&&typeof n.bin==`object`){let t=Object.values(n.bin)[0];return typeof t==`string`?C(e,t):void 0}return}catch{return}}function Qx(e,t){if(!v(e))return;let n,r;try{n=Qe(e),r=Qe(t)}catch{return}let i=r.endsWith(`/`)?r:`${r}/`;if(!n.startsWith(i)&&n!==r){Jx.warn({candidate:e,pluginDir:t},`Plugin CLI bin resolves outside plugin directory (symlink escape rejected)`);return}try{if(!tt(n).isFile())return}catch{return}return n}function $x(e,t){let n=new Map;for(let r of e){let e=r.manifest.contributes?.cli?.name;if(!e)continue;if(t.has(e)){Jx.warn({pluginId:r.id,name:e},`Plugin CLI contribution name collides with a built-in command; ignored`);continue}let i=n.get(e);i?i.push(r):n.set(e,[r])}return n}function eS(e,t){let n=$x(e,t),r=new Map;for(let[e,t]of n){if(t.length===1){r.set(e,t[0]);continue}Jx.warn({name:e,conflictingPluginIds:t.map(e=>e.id)},`Plugin CLI contribution name claimed by multiple plugins; command disabled (fail-closed, RFC-124 §10.2.2 — rename one of the conflicting plugins to resolve)`)}return r}function tS(e,t,n){let r=$x(e,t).get(n);return r&&r.length>=2?r.map(e=>e.id):void 0}function nS(e,t,n,r=Yx){return new Promise((i,a)=>{let o=$i(e,t,{stdio:`inherit`,cwd:n,env:mt()}),s=setTimeout(()=>{o.kill(`SIGTERM`),a(Error(`插件 CLI 执行超时(${r}ms),已终止子进程`))},r);s.unref(),o.on(`error`,e=>{clearTimeout(s),a(e)}),o.on(`exit`,(e,t)=>{clearTimeout(s),i(e??(t?1:0))})})}function rS(e,t){let n=new Map,r=(e,r,i)=>{if(t.has(e)){Jx.warn({pluginId:r.id,name:e,kind:i},`Plugin CLI contribution name collides with a built-in command; ignored`);return}let a=n.get(e);a?a.push({plugin:r,kind:i}):n.set(e,[{plugin:r,kind:i}])};for(let t of e){let e=t.manifest.contributes?.cli?.name;e&&r(e,t,`passthrough`);for(let e of t.manifest.contributes?.cliCommands??[])r(e.name,t,`in-process`)}return n}function iS(e,t){let n=rS(e,t),r=new Map;for(let[e,t]of n){if(t.length===1){r.set(e,t[0]);continue}Jx.warn({name:e,conflicts:t.map(e=>({pluginId:e.plugin.id,kind:e.kind}))},`Plugin CLI command name claimed by multiple contributions (cross-plugin or cross-axis); command disabled (fail-closed, RFC-410 D4 / RFC-124 §10.2.2)`)}return r}function aS(e,t){let n=iS(e,t),r=[];for(let[e,t]of n){let n=t.kind===`in-process`?t.plugin.manifest.contributes?.cliCommands?.find(t=>t.name===e)?.summary:void 0;r.push({name:e,pluginId:t.plugin.id,kind:t.kind,...n?{summary:n}:{}})}return r.sort((e,t)=>e.name.localeCompare(t.name))}function oS(e,t,n){let r=rS(e,t).get(n);return r&&r.length>=2?r:void 0}async function sS(e,t=Yx){let n,r=new Promise(e=>{n=setTimeout(()=>{Jx.warn({timeoutMs:t},`in-process plugin CLI command timed out; returning exit code 124 (handler may still be running detached — cannot be force-killed in-process)`),e(124)},t),n.unref()});try{return await Promise.race([Promise.resolve(e()),r])}catch(e){return Jx.warn({err:String(e)},`in-process plugin CLI command threw; returning exit code 1`),1}finally{n&&clearTimeout(n)}}function cS(e,t={}){return gr({cwd:t.workspaceDir??process.cwd(),homedir:t.homedir??at(),bundledDirs:t.bundledDirs}).find(t=>t.id===e)}function lS(e,t,n={}){let r=cS(e,n);if(!r)return{ok:!1,reason:`plugin-not-found`,granted:[],pending:[],message:`Plugin "${e}" not found. Install it first, or check workspaceDir/homedir options.`};let i=(r.manifest?.capabilities??[]).filter(e=>Xn.includes(e)),a=t??[],o=a.filter(e=>!Xn.includes(e));if(o.length>0)return{ok:!1,reason:`unknown-capability`,granted:[],pending:i,message:`Unknown capability: ${o.join(`, `)}. Valid high-risk capabilities: ${Xn.join(`, `)}.`};let s=a.filter(e=>!i.includes(e));if(s.length>0)return{ok:!1,reason:`capability-not-declared`,granted:[],pending:i,message:`Plugin "${e}" does not declare capability: ${s.join(`, `)}. Declared: ${i.length?i.join(`, `):`(none)`}.`};Ur(r.dir),a.length>0&&Cr(r.dir,a);let c=O(r);return{ok:!0,granted:[...a],pending:c.pendingCapabilities}}function uS(e,t={}){let n=cS(e,t);if(!n)return{found:!1,trusted:!1,gated:!1,declared:[],granted:[],pending:[]};let r=O(n),i=(n.manifest?.capabilities??[]).filter(e=>Xn.includes(e));return{found:!0,trusted:r.trusted,gated:r.gated,declared:[...i],granted:[...r.grantedCapabilities],pending:[...r.pendingCapabilities]}}function dS(e,t={}){let n=cS(e,t);return n?(Gr(n.dir),!0):!1}const fS=T(`@x-otto/coding:plugin-theme-preset-loader`),pS=new Set([`dark`,`light`,`system`,`builtin`]);function mS(e){let t=[];for(let n of e){let e=n.manifest.contributes?.themePresets;if(!e?.length)continue;if(O(n).gated){fS.warn({pluginId:n.id},`plugin gated (untrusted), themePresets skipped`);continue}let r=e;r.length>nr&&(fS.warn({pluginId:n.id,declared:r.length,limit:nr},`plugin declares more theme presets than the per-plugin limit, truncated`),r=r.slice(0,nr));for(let e of r){if(pS.has(e.localId)){fS.warn({pluginId:n.id,localId:e.localId},`themePresets localId collides with a reserved name, skipped`);continue}t.push({pluginId:n.id,localId:e.localId,label:e.label,appearance:e.appearance,colors:e.colors,markdown:e.markdown,meta:e.meta})}}return t}export{ns as AgentJobService,Bt as AgentSession,Ox as App,qt as CodingSessionPool,wb as DEFAULT_WORKSPACE_KEY,vo as ExtensionManager,Yn as HIGH_RISK_CAPABILITIES,Cb as INDUCTOR_PLUGIN_ID,Ux as PLUGIN_LOG_TAIL_LINES,ir as PLUGIN_MANIFEST_FILENAME,ar as POINT,Wd as PluginConfigStore,xa as RegistryClient,Db as SANDBOX_ESCALATION_MARKER,la as SCHEDULE_LEASE_MIGRATIONS,Kt as SandboxUnavailableError,ua as ScheduleRegistry,da as SchedulerService,bo as SigilResolverRegistry,g as apiCredentialId,zx as assertPortableArtifact,lS as authorizePlugin,Gx as buildExtensionContext,Ha as buildMemoryStore,eS as buildPluginCliRegistry,iS as buildUnifiedCliCommandRegistry,Sa as builtinOfficialSource,Zt as captureFiles,vx as captureTrajectory,Ca as checkArchiveBomb,wa as checkGitUpgrades,yf as checkPluginConsistency,Ta as checkUpgrades,Kr as claudeTrustStorePath,Ea as cleanTempDir,aS as collectPluginCliCommandsForHelp,Hx as collectPluginPerfMetrics,mS as collectPluginThemePresets,$l as compilePluginModule,af as compilePluginPanels,nu as computeSourceHash,Nx as createApp,Da as createArchive,cr as createBuiltinHashtags,up as createBuiltinResolvers,qr as createClaudeHookBridgeHooks,ur as createFileProvider,Fx as createFrontendPort,Rp as createLessonInjectionHooks,fa as createLocalFireOwnership,fr as createPluginInputRegistry,pa as createRemoteFireOwnership,ma as createRemoteScheduleStore,ga as createScheduleStore,rn as createSessionStableInjectionHooks,zp as createSkillCatalogInjectionHooks,Oa as createTempDir,Dp as createToolGuidanceHook,Yr as defaultHookRunner,ln as defaultMaxToolTurnExtensions,Cc as defaultPostInstallExecutor,fn as deriveSessionTitle,Xr as detectClaudeExecutableSurface,mr as detectPluginExecutableSurface,Di as detectProjectConfigGating,ka as detectUninstallTarget,Zr as discoverFileCommands,hr as discoverPlugins,_r as dispatch,$r as evaluateClaudeTrust,yr as evaluatePluginTrust,Oi as evaluateWorkspaceTrustPrompt,ti as expandCommandBody,ko as expandSigilChips,bx as exportTrajectory,Sx as exportTrajectoryFromSession,Aa as extractArchive,tS as findPluginCliNameConflict,Rx as findPortabilityViolations,oS as findUnifiedCliCommandConflict,a as findWorkspaceRoot,Fl as getEsbuildModule,_s as getIncompleteSubagentReason,gs as getLastAssistantText,pn as globalAgentJobRegistry,hn as globalAgentObservability,_n as globalProcessRuntime,Sr as grantPluginCapabilities,wr as grantPluginCapabilitiesWithVersion,Tr as grantedPluginCapabilities,Er as grantedPluginCapabilitiesForVersion,Lx as hasPortabilityViolations,uS as inspectPluginAuthorization,ja as install,Rl as installEsbuildExitHook,Bl as installEsbuildSignalBridges,mf as installPluginFromDir,pf as installPluginFromPackage,Zl as installPluginHostExternals,Ma as installSkill,ni as interpretPreToolUse,Cf as isInternalDelegatedSession,Dr as isPluginTrusted,ri as isProjectTrusted,kr as isSensitiveField,Ai as isStrictProjectConfigEnabled,Na as listInstalledItems,ii as loadClaudeHooksConfig,cu as loadPluginModule,Il as markEsbuildStarted,ai as matchesHookMatcher,Sn as messagesFromSnapshot,qx as openTarget,oi as parseClaudeHooks,fi as parseDotMcpJson,jr as parsePluginManifest,Pa as parseRegistry,Nr as pluginTrustStorePath,qd as purgePluginState,Pr as readHighRiskCapabilities,Wx as readPluginLogTail,Rb as readSkillLoopStatus,$o as readTaskOutputTail,Cn as reconstructMessages,_f as recordPluginInstalled,vf as recordPluginUninstalled,Fr as redactSensitiveFields,gf as removeInstalledPluginEntry,Ir as resolveActions,si as resolveClaudeMcpServers,Xl as resolveHostExternalPaths,ff as resolvePackageDir,Xx as resolvePluginCliBin,lo as resolvePluginMcpServers,Mi as resolveProjectConfigTrusted,Tn as resolveSessionTitle,Dn as restoreFiles,dS as revokePluginAuthorization,iu as rewriteArtifactSourceHash,sS as runInProcessCliCommand,Kx as runPluginScript,Fa as scanInstalledVersions,xx as selectTrajectoryEntries,Br as sigilOf,nS as spawnPluginCli,Ll as stopEsbuildService,Hr as trustPlugin,li as trustProject,Ia as uninstall,Wr as untrustPlugin,ui as untrustProject,hf as upsertInstalledPluginEntry,La as validateExtractedPaths,Vl as withBuildTimeout};
590
+ user explicitly applies it.`}function $b(e){return`Draft skill: ${e.taskSignature.length>60?`${e.taskSignature.slice(0,60)}…`:e.taskSignature}`}function ex(e){try{let t=Xb({pluginId:e.pluginId,workspaceKey:e.workspaceKey,sessionIds:e.brief.sessionIds});return{jobId:e.startJob({title:$b(e.brief),prompt:Qb(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 tx(e){e.hookRegistry.register(Mp(e.toolRegistry,e.getDefaultToolPreset)),e.hookRegistry.register(Oe(e.failureSignals)),e.hookRegistry.register(ke(e.failureSignals)),e.hookRegistry.registerAll(e.contextSourcesBuildHooks(e.workspaceDir,e.memory)),e.memory&&e.hookRegistry.registerAll(rn(e.memory)),e.hookRegistry.registerAll(on({getTodoList:t=>e.getSession(t)?.session.getTodoList()}));let t=/-milestone\.md$/,n=/^Status:\s*Done\b/m;e.hookRegistry.registerAll(tn({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(Up(e.learningStore,e.promptManager,e.localLearningStore,{evolutionSignals:e.evolutionSignals,workspaceDir:e.workspaceDir},e.memory)),e.skillRegistry&&(e.hookRegistry.registerAll(Wp(e.skillRegistry)),e.hookRegistry.registerAll(Qp({registry:e.skillRegistry,evolutionSignals:e.evolutionSignals,getConfig:()=>{let t=e.settings.get(`skill_internalization`);return{enabled:t?.enabled===!0,minExecutions:t?.min_executions??Gp.minExecutions,minSuccessRate:t?.min_success_rate??Gp.minSuccessRate,maxInternalized:t?.max_internalized??Gp.maxInternalized}}})),e.hookRegistry.register(Lb({registry:e.skillRegistry,resolveCwd:t=>t?w(e.workspaceDir,t):e.workspaceDir,logger:e.logger}))),e.hookRegistry.registerAll(e.claudeHooks),e.hookRegistry.registerAll(im()),e.hookRegistry.on(`session.deleted`,`rfc047-notification-detach`,t=>e.notificationDispatcher.detach(t.sessionId));let r=Hb();e.hookRegistry.registerAll(r.hooks),e.hookRegistry.register(am(e=>{E.killAllForSession(e)})),e.hookRegistry.registerAll(om({registry:e.permissionRegistry,getPersistedAllow:t=>e.codingSessionPool.getSessionPermissionAllow(t)})),e.hookRegistry.register(Ib({getContext:()=>{let t=Pe(e.workspaceDir,at());if(!e.sandbox.enabled)return{mode:`bypass`,projectRoot:e.workspaceDir,writableRoots:[],deniedRoots:t,networkAllowed:!0};let n=e.settings.get(`permission_mode`)??`auto`;return{mode:n,projectRoot:e.workspaceDir,writableRoots:Te(n,e.workspaceDir,ot(),e.sandbox.writablePaths),deniedRoots:t,networkAllowed:e.sandbox.isNetworkAllowed,autoAllowBashIfSandboxed:e.sandbox.autoAllowBashIfSandboxed}}})),e.hookRegistry.registerAll(cm(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(lm({isEnabled:i},e.promptManager)),e.hookRegistry.registerAll(tm({queue:e.pluginFailureQueue})),e.hookRegistry.registerAll(Pb({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})=>{ex({startJob:t=>e.startSkillDraftJob({...t,origin:`user`}),brief:n,sessionId:t,pluginId:jb,workspaceKey:e.getWorkspaceKey()??Mb,logger:{warn:t=>e.logger.warn(t)}})},logger:e.logger})),e.hookRegistry.register(Bb({getOnFileEdited:e.getEditFileCallback,dedupCache:e.editFilesDedup})),{agentJobNotify:r.notify}}function nx(e,t,n,r){return Ap({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,validateScheduleModelId:t=>e.modelRegistry.find(t)?void 0:`Model "${t}" not found (check /model list)`,searchEcosystem:e.searchEcosystem,capabilityGapRecorder:e.capabilityGapRecorder},t,n,r)}function rx(e,t){return Be(t,jp(nx(e,t,e.skillRegistry?Vn(e.skillRegistry,t):void 0,!1))).getAvailable(e.defaultToolPreset)}function ix(e){return e.toolRegistry.getAvailable(e.defaultToolPreset).filter(e=>e.name.startsWith(`mcp__`))}function ax(e,t){let n=t.skillProvider??(e.skillRegistry?Vn(e.skillRegistry,e.workspaceDir):void 0);t.sandbox&&e.sandbox.pin(t.sandbox);let r={registerChild(e,t){return{pid:E.registerChild(e,t).pid??0}}};return Be(e.workspaceDir,{...jp(nx(e,e.workspaceDir,n,t.lsp===!0)),processTracker:r})}function ox(e){e.agentJobNotify=tx({hookRegistry:e.hookRegistry,toolRegistry:e.toolRegistry,getDefaultToolPreset:()=>e.defaultToolPreset,failureSignals:e.failureSignals,contextSourcesBuildHooks:(t,n)=>e.agentRuntime.contextSources.sealAndBuildHooks(t,n),workspaceDir:e.workspaceDir,memory:e.storage.memory,learningStore:e.learningStore,localLearningStore:e.localLearningStore,evolutionSignals:e.evolutionSignals,promptManager:e.promptManager,skillRegistry:e.skillRegistry,notificationDispatcher:e.notificationDispatcher,permissionRegistry:e.permissionRegistry,codingSessionPool:e.codingSessionPool,sandbox:e.sandbox,settings:e.settings,getEditFileCallback:()=>e.editFileCallback,editFilesDedup:e._editFilesDedup,memoryAutoExtractor:e.memoryAutoExtractor,getSession:t=>e.getSession(t),notifyPluginServices:t=>e.notifyPluginServices(t),getWorkspaceKey:()=>e.workspaceRef?.key,startSkillDraftJob:t=>e.agentJobs.start(t),claudeHooks:e.compatProducts?.hooks??[],pluginFailureQueue:e.pluginFailureQueue,logger:e.logger}).agentJobNotify}function sx(e){return{async readFile(e){try{return await Zi(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return null;throw e}},async writeFile(e,t){await Yi(S(e),{recursive:!0}),await Nn(e,t)},async writeFileExclusive(e,t){await Yi(S(e),{recursive:!0});try{let n=await Xi(e,`wx`);try{await n.writeFile(t,`utf8`)}finally{await n.close()}return!0}catch(e){if(e.code===`EEXIST`)return!1;throw e}},genId:e?.genId??Gi,now:e?.now??(()=>new Date().toISOString())}}function cx(e){return t=>{e?.({type:`plugin.load-failed`,...t})}}function lx(e){return new Tt({persist:Ft(`${r}/signals`),logWarn:(t,n)=>e.warn({err:n},t)})}function ux(e,t){return{record:n=>{e.record(n),t?.({type:`capability_gap.reported`,...n})}}}async function dx(e,t){let n=await e.restoreFromLog();return n>0&&t?.(n),n}async function fx(e){if(e.ensureNotDisposed(),await e.ensureSettingsLoaded(),await dx(e.evolutionSignals,t=>e.logger.info({count:t},`signal log restored %d records`)),!e.workspaceRef&&!e.pendingWorkspaceInit&&!e.parentWorkspaceExisted)try{let t=Wi(sx()),n=e._workspaceId?{id:e._workspaceId}:void 0,r=await t.resolveLocal(e.workspaceDir,{...n,autoCreate:!(e._interactive&&!n)});`kind`in r&&r.kind===`uninitialized`?e.pendingWorkspaceInit={root:r.root}:`kind`in r&&r.kind===`parentWorkspaceExisted`?e.parentWorkspaceExisted={parentRoot:r.parentRoot,currentRoot:r.currentRoot,marker:r.marker}:e.workspaceRef=r}catch(t){e.logger.warn({err:t,workspaceDir:e.workspaceDir},`Workspace resolution failed; continuing without workspace identity. Sessions previously saved under a workspace key will not be restored.`)}e.storage.autoMemory&&await e.storage.autoMemory.load(),await St(`skills/agents/teams discovery + plugin module load`,async()=>{if(e.skillRegistry){await e.skillRegistry.discover();for(let t of e.settings.get(`disabled_skills`)??[])e.skillRegistry.disable(t);let t=new Set(e.settings.get(`disabled_plugins`)??[]);if(t.size>0)for(let[n,r]of e.skillRegistry.getAll())r.source?.type===`plugin`&&r.source.id&&t.has(r.source.id)&&e.skillRegistry.disable(n)}e.declarativeAgentProfiles=await zc(e.workspaceDir,{plugins:e.activePlugins(),claudeProjectAgentsAllowed:e.compatProducts?!e.compatProducts.trustVerdict.gated:void 0}),e.declarativeTeams=await Gc(e.workspaceDir);let t=await e.pluginModuleManager.reload(new Set(e.declarativeAgentProfiles.map(e=>e.name)));e.declarativeAgentProfiles.push(...t),e._pendingProviderCapabilities=(await e.pluginProviderManager.reload()).pendingCapabilityPluginIds,await e.diagnoseTopoSortIssues()});let t=()=>St(`mcpController.start()`,()=>e.mcpController.start()).then(t=>(e.syncSessionTools(),e.onMcpStartupSettled?e.onMcpStartupSettled(t):e.pendingMcpStartupResult=t,t)).catch(t=>(e.logger.warn({err:t instanceof Error?t.message:String(t)},`mcpController.start() failed unexpectedly (non-blocking path)`),{connected:0,failed:0}));e._interactive?t():await t(),e.pendingWorkspaceInit?e.logger.info({workspaceDir:e.workspaceDir},`Workspace identity pending trust confirmation; session restore deferred`):e.parentWorkspaceExisted?e.logger.info({workspaceDir:e.workspaceDir,parentRoot:e.parentWorkspaceExisted.parentRoot},`Parent workspace detected; waiting for user choice (adopt parent or create new)`):e._interactive?await St(`completeWorkspaceDependentStartup (session restoreAll)`,()=>px(e)):St(`sweepOrphanTraceFiles (headless)`,()=>bx(e)),e._memoryGovernor.setCallbacks({onWarning:()=>{let t=e.getActiveSession();t&&t.compactNow().catch(t=>{e.logger.warn({err:t instanceof Error?t.message:String(t)},`[memory-governor] headless compactNow (soft degrade) failed`)})},onCritical:t=>{let n=process.env.OTTO_HEADLESS_OOM_POLICY??`log-only`;e.logger.error({policy:n,level:t.level,usedPct:t.usedPct,heapUsed:t.heapUsed},`[memory-governor] critical memory threshold reached (headless/service)`),n===`graceful-exit`&&xx(e).finally(()=>process.exit(1))},onSample:t=>{e._residencyGovernor.setLevel(t.level);let n=performance.getEntriesByType(`measure`).length;n>5e4&&(performance.clearMeasures(),performance.clearMarks(),e.logger.warn({measureCount:n},`[memory-governor] user-timing buffer exceeded guard threshold — cleared (likely a dev-mode library leaking performance.measure; see a7eaa826)`));let r=e.getActiveSession()?.id;r&&e.storage.traceStore.append(r,{ts:t.ts,sessionId:r,kind:`lifecycle`,node:`process.memory.sample`,payload:{pid:process.pid,level:t.level,heapUsed:t.heapUsed,heapSizeLimit:t.heapSizeLimit,usedPct:Number(t.usedPct.toFixed(2)),rss:t.rss,external:t.external}}).catch(t=>{e.logger.warn({err:t instanceof Error?t.message:String(t)},`[memory-governor] trace sample append failed`)})}}),e._memoryGovernor.start(),e._fleetMonitor.setCallbacks({onSample:t=>{let n=e.getActiveSession()?.id;n&&e.storage.traceStore.append(n,{ts:t.ts,sessionId:n,kind:`lifecycle`,node:`process.fleet.sample`,payload:{pid:process.pid,processCount:t.processCount,totalRssMb:t.totalRssMb,suspectedOrphanCount:t.suspectedOrphanCount,maxGeneration:t.maxGeneration}}).catch(t=>{e.logger.warn({err:t instanceof Error?t.message:String(t)},`[fleet-monitor] trace sample append failed`)})}}),e._fleetMonitor.start(),vt(`app.start() internal phases complete`),e.logger.info(`App started`)}async function px(e){if(e.workspaceRef&&e.planeRegistry.migrateWorkspaceGrid(`default`,e.workspaceRef.key),e.codingSessionPool.autoPersist){let t=await e.codingSessionPool.restoreAll();if(t>0){e.logger.info({count:t},`Sessions restored from storage`);for(let t of e.listSessions()){let n=e.getSession(t.id);n&&e.notificationDispatcher.attach(n)}}}bx(e)}function mx(e){return!!e.pendingWorkspaceInit}function hx(e){return!!e.parentWorkspaceExisted}async function gx(e){let t=e.parentWorkspaceExisted;if(!t)return e.workspaceRef;e.parentWorkspaceExisted=void 0;try{return e.workspaceRef=await Wi(sx()).resolveLocal(t.parentRoot),await px(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 _x(e){let t=e.parentWorkspaceExisted;if(!t)return e.workspaceRef;e.parentWorkspaceExisted=void 0;try{return e.workspaceRef=await Wi(sx()).createLocal(t.currentRoot),await px(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 vx(e){let t=e.pendingWorkspaceInit;if(!t)return e.workspaceRef;e.pendingWorkspaceInit=void 0;try{return e.workspaceRef=await Wi(sx()).createLocal(t.root),await px(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 yx(e,t){let n=e.workspaceRef?.root;if(!n)return!1;let r=sx(),i=await Ki(n,r);if(!i)return!1;if(!t&&i.memorySyncEnabled){try{await e.storage.autoMemory?.load()}catch{}try{await e.learningStore.refresh()}catch{}}let a=t?{...i,memorySyncEnabled:!0}:{id:i.id,name:i.name,createdAt:i.createdAt};return await Ji(n,a,r),e.workspaceRef={key:qi(a.id),id:a.id,root:n,...a.memorySyncEnabled?{memorySyncEnabled:!0}:{}},!0}async function bx(e){let t=e.sessionStorageDir,n=e.sessionRepoRef?.current;if(!t||!n)return;let r=process.env.OTTO_TRACE_SWEEP;if(r!==`off`)try{let{sweepOrphanTraces:i}=await import(`./trace-orphan-sweeper-BdEIlLfB.js`),a=new Set(await n.listAllSessionIds());for(let t of e.codingSessionPool.listSessions())a.add(t.id);await i({dirs:[C(t,`trace`),C(t,`checkpoint`)],liveSessionIds:a,logger:e.logger,mode:r===`dry-run`?`dry-run`:`delete`})}catch(t){e.logger.warn({err:t instanceof Error?t.message:String(t)},`Orphan trace sweep failed`)}}async function xx(e){if(e.disposed)return;e.disposed=!0;let t=[],n=async(e,n)=>{try{await n()}catch(n){t.push(Error(`stop:${e}: ${n.message}`))}};e.codingSessionPool.autoPersist&&await n(`saveSessions`,()=>e.codingSessionPool.saveAll()),await n(`processRegistryUnsubs`,()=>{for(let t of e.processRegistryUnsubs)t();e.processRegistryUnsubs.length=0}),await n(`bgProcesses`,()=>E.killAllForOwner(`app`,e.processOwnerId)),await n(`mcpController`,()=>e.mcpController.stop()),await n(`processRuntime`,()=>E.killAll()),await n(`scheduleService`,()=>e.scheduleServiceInstance?.stop()),await n(`memoryGovernor`,()=>e._memoryGovernor.dispose()),await n(`fleetMonitor`,()=>e._fleetMonitor.dispose()),await n(`agentJobs`,()=>e.agentJobServiceInstance?.dispose()),await n(`settings`,()=>e.settings.dispose()),await n(`toolRegistry`,()=>e.toolRegistry.dispose()),await n(`orchestrator`,()=>e.orchestrator.dispose()),await n(`notification`,()=>e.notificationDispatcher.dispose()),await n(`agentRuntime`,()=>e.agentRuntime.dispose()),await n(`hooks`,()=>{for(let t of e.ownedHookNames)e.hookRegistry.unregister(t);e.ownedHookNames.length=0}),await n(`pluginModules`,()=>e.pluginModuleManager.cleanup()),await n(`pluginProviders`,()=>e.pluginProviderManager.cleanup()),await n(`pluginWorkers`,()=>Uu()),await n(`pluginServices`,()=>vu()),await n(`sandbox`,()=>e.sandbox.dispose()),e.devtools&&await n(`devtools`,()=>e.devtools.stop()),await n(`logSub`,()=>{e.globalLogSubscription&&=(e.globalLogSubscription(),null)}),await n(`traceStore`,()=>e.storage.traceStore.close?.()),await n(`checkpointStore`,()=>e.storage.checkpointStore.close?.()),await n(`signalLog`,()=>e.evolutionSignals.close()),await n(`authStore`,()=>e._authStore.dispose()),await n(`planeRegistry`,()=>e.planeRegistry.dispose()),t.length>0&&e.logger.warn({count:t.length,errors:t.map(e=>e.message)},`stop: %d subsystems reported errors`),e.logger.info(`App stopped`)}function Sx(e){return e.filter(e=>e.type===`text`).map(e=>e.text).join(`
591
+ `)}function Cx(e){return typeof e==`string`?e:Sx(e)}function wx(e){return Sx(e)}function Tx(e){return Sx(e)}function Ex(e){let{sessionId:t,entries:n,signals:r=[]}=e,i=[],a=0,o=-1,s=e=>{i.push({sessionId:t,seq:a++,...e})};for(let e of n){if(e.type===`message`){let t=e.message;if(t.role===`system`||t.role===`system_notification`)continue;if(t.role===`user`){o+=1,s({kind:`turn.start`,at:e.timestamp,turnIndex:o}),s({kind:`user.message`,at:e.timestamp,turnIndex:o,text:Cx(t.content)});continue}if(t.role===`assistant`){s({kind:`assistant.message`,at:e.timestamp,turnIndex:o,text:wx(t.content),model:t.model,usage:{input:t.usage.inputTokens,output:t.usage.outputTokens},stopReason:t.stopReason});for(let n of ba(t))s(Dx(n,e.timestamp,o));continue}if(t.role===`tool_result`){s({kind:`tool.result`,at:e.timestamp,turnIndex:o,toolCallId:t.toolCallId,toolName:t.toolName,isError:t.isError,summary:Tx(t.content)});continue}continue}if(e.type===`compaction`){if(e.replacementStripped)continue;s({kind:`compaction`,at:e.timestamp,boundaryId:e.id,summary:e.summary,compactedCount:e.compactedCount});continue}}for(let e of r)e.sessionId===t&&s({kind:`signal`,at:e.at,signalKind:e.kind,key:e.key,value:e.value,...e.detail===void 0?{}:{detail:e.detail}});return i}function Dx(e,t,n){return{kind:`tool.call`,at:t,turnIndex:n,toolCallId:e.id,toolName:e.name,arguments:e.arguments}}function Ox(e){let t=[...e.records].sort((e,t)=>e.seq-t.seq),n=0,r=0;for(let i of t){let t=i;if(e.redact){try{t=e.redact(i)}catch{r+=1;continue}if(t===void 0){r+=1;continue}}e.output.write(`${JSON.stringify(t)}\n`),n+=1}return{written:n,suppressed:r}}function kx(e,t,n){return e.filter(e=>(t==null||e.seq>t)&&e.seq<n)}async function Ax(e){let t=await e.repo.getEntryCount(e.sessionId),n=kx(await e.repo.loadEntries(e.sessionId,e.sinceSeq),e.sinceSeq,t);for(let t of n){if(t.type!==`compaction`)continue;let n=t.data?.summary;if(typeof n!=`string`||n.length===0)throw Error(`轨迹导出失败:会话 ${e.sessionId.slice(0,8)} 的 compaction 条目 ${t.entryId.slice(0,8)} 缺 summary(blob 完整性 fail-fast)。`)}let r=n.map(e=>Si(e));return{...Ox({records:Ex({sessionId:e.sessionId,entries:r,signals:e.signals??[]}),redact:e.redact,output:e.output}),upperSeq:t,entryCount:n.length}}function jx(){let e=[];return{lines:e,write(t){return e.push(t),!0}}}async function Mx(e,t,n={}){let r=t.sessionRepoRef.current;if(!r)throw Error(`轨迹导出仅支持关系化 SQLite 后端(sessions.db)。当前后端不支持。`);let i=t.evolutionSignals.list();if(n.output)return Ax({sessionId:e,repo:r,redact:n.redact,output:n.output,signals:i});let a=jx();return{...await Ax({sessionId:e,repo:r,redact:n.redact,output:a,signals:i}),lines:a.lines}}const Nx=/(\/[\w.\-]+)+/g,Px=/\s+at\s+[\w.<>\[\]:]+ \(.*?\)/g,Fx=/\s+\(.*?:\d+:\d+\)/g,Ix=/(?:sk-|key|token|secret|password)[-=:\s]+[A-Za-z0-9_\-]{8,}/gi;function Lx(e){return e.replace(Px,` [stack]`).replace(Fx,``).replace(Nx,`[path]`).replace(Ix,`$1=[redacted]`).replace(/\s{2,}/g,` `).trim()}function Rx(e){try{let t=b(e,`utf8`);return JSON.parse(t)}catch{return[]}}function zx(e,t){y(S(e),{recursive:!0});let n=C(ot(),`plugin-failures-${process.pid}-${Date.now()}.json`);x(n,JSON.stringify(t),`utf8`),$e(n,e)}function Bx(e=`${r}/plugin-failures`){let t=C(e,`failures.json`);return{async push(e){let n=Rx(t),r=Date.parse(e.occurredAt);n.some(t=>t.pluginId===e.pluginId&&t.reason===e.reason&&r-Date.parse(t.occurredAt)<6e4)||zx(t,[...n,e].slice(-16))},list:()=>Promise.resolve(Rx(t)),async consumeAll(){try{et(t,{force:!0})}catch{}}}}async function Vx(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 Hx=0;function Ux(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 Wx=class{processOwnerId=`app-${++Hx}`;get processOwner(){return this.processOwnerId}settings;toolRegistry;hookRegistry;planeRegistry=new Ht;providerRegistry;wireProtocolRegistry;agentRuntime;codingSessionPool;permissionRegistry;auditLog;logger;sessionRepoRef;sessionStorageDir;get workspaceDir(){return this.workspaceRef?.root??this._workspaceDir}_workspaceDir;_workspaceId;_interactive;_shadow;_pluginHomedir;_pluginBundledDirs;workspaceRef;pendingWorkspaceInit;parentWorkspaceExisted;maxSessions;maxToolTurns;maxToolTurnExtensions;promptOutputTokenBudget;promptWallClockBudgetMs;sessionCostBudgetUSD;stallDetection;devtools=null;editFileCallback=void 0;_editFilesDedup=new Set;storage;userMemory=new Ct({store:(()=>{let e=new Dt(at());return c()?Pt(e):e})()});completeText;clock;fileStateManager;learningStore;localLearningStore;memoryAutoExtractor;promptManager;orchestrator;runSession;writeTodos;sessionConfigResolver;session;model;notifications;permissions;runTeam;skillRegistry;i18nRegistry;_pendingProviderCapabilities=[];get pendingProviderCapabilities(){return this._pendingProviderCapabilities}declarativeAgentProfiles=[];compatProducts;extensions;pluginInput=mr();sigilResolvers=new bo;expandSigilChips(e,t){return ko(e,this.sigilResolvers,{workspaceDir:this.workspaceDir},{...t,lookupResolverId:e=>{for(let t of this.pluginInput.getAll())if(t.value===e&&t.resolverId)return t.resolverId}})}feedbackRegistry=new yo;getShortcuts(){return this.settings.get(`shortcuts`)??[]}async saveShortcut(e,t,n){let r=e.trim();if(!r||!/^[A-Za-z0-9_-]+$/.test(r))throw Error(`invalid shortcut name: ${JSON.stringify(e)}`);if(!t.trim())throw Error(`shortcut text cannot be empty`);let i=this.getShortcuts();if(i.some(e=>e.name===r&&e.name!==n))throw Error(`shortcut name already exists: ${r}`);let a=[...n?i.filter(e=>e.name!==n):i,{name:r,text:t}];await this.settings.persist({shortcuts:a},`project`)}async deleteShortcut(e){let t=this.getShortcuts(),n=t.filter(t=>t.name!==e);n.length!==t.length&&await this.settings.persist({shortcuts:n},`project`)}declarativeTeams=[];mcpController;panelBackendController;get mcpManager(){return this.mcpController.manager}disposed=!1;ownedHookNames=[];failureSignals=new be;diagnoser=new ye(this.failureSignals);pluginHealthTracker=wl();pluginCapabilityQuota=new Dl;inquiryCenter=new kl;userAskRenderer;userAskSeq=0;processRegistryUnsubs=[];settingsLoaded=!1;lastSettingsConfig=null;_resilienceOverride;pluginFailureQueue;_resilienceConfig;defaultToolPreset=`full`;permissionSync;sandbox;_memoryGovernor;_residencyGovernor;_fleetMonitor;get tools(){return this.toolRegistry.getAvailable(this.defaultToolPreset)}agentJobNotify;agentJobServiceInstance;scheduleServiceInstance;searchEcosystem;evolutionSignals;notificationDispatcher;presenceTracker;followUpPendingProbe;toolsSyncCoordinator;onMcpStartupSettled;pendingMcpStartupResult;setMcpStartupCallback(e){this.onMcpStartupSettled=e,this.pendingMcpStartupResult&&=(e(this.pendingMcpStartupResult),void 0)}pluginContributionsFacade;buildToolsForWorkspace(e){return rx(this,e)}connectorTools(){return ix(this)}get agentJobs(){return this.agentJobServiceInstance||=hs({workspaceDir:this.workspaceDir,agentJobNotify:this.agentJobNotify,buildToolsForWorkspace:e=>this.buildToolsForWorkspace(e),connectorTools:()=>this.connectorTools(),settings:this.settings,modelRegistry:this.modelRegistry,stream:this.codingSessionPool.stream,logger:this.logger,hookRegistry:this.hookRegistry}),this.agentJobServiceInstance}setScheduleService(e){this.scheduleServiceInstance=e,this.pluginModuleManager?.reconcileServiceSchedules()}setEcosystemSearch(e){this.searchEcosystem!==e&&(this.searchEcosystem=e,this.reloadCapabilities().catch(e=>{this.logger.warn({err:e instanceof Error?e.message:String(e)},`Failed to refresh capability_gap after ecosystem search injection`)}))}get memoryGovernor(){return this._memoryGovernor}get fleetMonitor(){return this._fleetMonitor}get modelRegistry(){return this._modelRegistry}get authStore(){return this._authStore}modelCatalogManager;_modelRegistry;_authStore;getAllModels(){return this.model.getAllModels()}resolveModel(e){return this.model.resolveModel(e)}listProviders(){return this.model.listProviders()}registerHook(e){Es(this,e)}unregisterHook(e){return Ds(this,e)}async hydrateModelCache(){return this.model.hydrateModelCache()}getSessionAvailableModels(e){return this.model.getSessionAvailableModels(e)}async refreshModels(){return this.model.refreshModels()}async reloadCapabilities(){let{agentProfiles:e,teamDeclarations:t,...n}=await Vx({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 Ef;pluginModuleManager;capabilityGapStore=new Le;capabilityGapRecorder;pluginProviderManager;capabilityReloader;computedPluginCommands(){return this.pluginContributionsFacade.computedPluginCommands()}pluginCliCommands(){return this.pluginContributionsFacade.pluginCliCommands()}pluginSlashCommands(){return this.pluginContributionsFacade.pluginSlashCommands()}get sessionManager(){return this.codingSessionPool}getResidencyDiagnostics(){return this.codingSessionPool.getResidencyDiagnostics()}globalLogSubscription=null;constructor(e){let{inspect:t,logger:n,projectConfigPath:r,maxSessions:i,maxToolTurns:a,maxToolTurnExtensions:o,promptOutputTokenBudget:s,promptWallClockBudgetMs:l,sessionCostBudgetUSD:u,stallDetection:d,workspaceDir:f,workspaceId:p,pluginHomedir:m,pluginBundledDirs:h}=e;this.maxSessions=i??_i,this.maxToolTurns=a??Gt.maxToolTurns,this.maxToolTurnExtensions=o,this.promptOutputTokenBudget=s,this.promptWallClockBudgetMs=l,this.sessionCostBudgetUSD=u,this.stallDetection=d,this._workspaceDir=f??process.cwd(),this._workspaceId=p,this._interactive=e.interactive??!1,this._shadow=e.shadow??c(),this._pluginHomedir=m??at(),this._pluginBundledDirs=h??[],this._resilienceOverride=e.resilience,this.pluginFailureQueue=e.pluginFailureQueue,this.logger=T(n.name,{level:n.level,destination:n.destination}),this.evolutionSignals=lx(this.logger);let g={};this.sessionRepoRef=g,this.sessionStorageDir=e.storage?.session&&`dir`in e.storage.session?e.storage.session.dir:void 0;let _=gp({logger:this.logger,hookRegistry:e.hookRegistry,getToolRegistry:()=>this.toolRegistry,getPermissionRegistry:()=>this.permissionRegistry,onHookTimeout:({hookName:e,timeoutMs:t})=>{let n=nl(e);n&&this.pluginHealthTracker.recordHookTimeout(n,e)}});this.sandbox=_.sandbox,this._memoryGovernor=_.memoryGovernor,this._residencyGovernor=_.residencyGovernor,this._fleetMonitor=_.fleetMonitor,this.permissionSync=_.permissionSync,this.hookRegistry=_.hookRegistry;let te=Df(e,()=>this.settings);this._authStore=te.authStore,this._modelRegistry=te.modelRegistry,this.providerRegistry=te.providerRegistry,this.wireProtocolRegistry=te.wireProtocolRegistry,this.modelCatalogManager=te.modelCatalogManager;let ne=te.defaultModel,re=te.resolveEffectiveModel,ie=e.modelId,ae=$a({options:e,workspaceDir:this.workspaceDir,providerRegistry:this.providerRegistry,defaultModel:ne,resolveEffectiveModel:re,repoRef:g,getWorkspaceRef:()=>this.workspaceRef,onMemoryConflict:e.onMemoryConflict,getActiveSessionBytes:()=>{let e=this.codingSessionPool?.active?.session;return e instanceof hi?e.estimatedContentBytes:void 0},getRealInputTokens:()=>this.codingSessionPool?.active?.getLastTotalInputTokens(),getToolRegistry:()=>this.toolRegistry,getEffectiveMaxBytes:()=>{let e=this.codingSessionPool;if(e)return e.getResidencyDiagnostics().maxBytesPerSession},getCoverageThresholds:Ya(()=>this.settings.get(`residency`)),...Ja(e=>this.codingSessionPool?.getSession?.(e)?.session,()=>this.codingSessionPool?.active?.session)});this.storage={storageHost:ae.storageHost,autoMemory:ae.autoMemory,memory:ae.memory,traceStore:ae.traceStore,traceLive:ae.traceLive,checkpointStore:ae.checkpointStore,remoteMemoryConfigured:!!(e.storage?.remote?.getAuth&&e.storage?.session&&`url`in e.storage.session),remoteSessionConfigured:!!(e.storage?.session&&`url`in e.storage.session)},this.clock=ae.clock;let se=_p({inspect:t,loggerName:n.name,workspaceDir:this.workspaceDir,projectConfigPath:r,interactive:this._interactive,permissionSync:this.permissionSync,sandbox:this.sandbox,onSettingsApplied:e=>{this.settingsLoaded=!0,e.tool_preset&&(this.defaultToolPreset=e.tool_preset)},getI18nRegistry:()=>this.i18nRegistry});this.devtools=se.devtools,this.globalLogSubscription=se.logSubscription,this.settings=se.settings;let ce=bs({getConfig:()=>this.settings.get(`notification`),getCwd:()=>this.workspaceDir,isFollowUpPending:()=>this.followUpPendingProbe?.()??!1,emitHookNotification:e=>void this.hookRegistry.emit(`notification`,e)});this.notificationDispatcher=ce.dispatcher,this.presenceTracker=ce.presenceTracker,this.compatProducts=io(this.workspaceDir,this.activePlugins());let le=this.settings,ue=ro({skillProvider:e.skillProvider,workspaceDir:this.workspaceDir,activePlugins:()=>this.activePlugins(),resolveEffectiveModel:re,providerRegistry:this.providerRegistry,prompt:e.prompt,compatProducts:this.compatProducts,memoryStore:ae.memoryStore,evolutionSignals:this.evolutionSignals,memoryAutoExtractConfig:{enabled:!0,get everyNTurns(){return le.get(`memory_auto_extract`)?.every_n_turns},get maxLessons(){return le.get(`memory_auto_extract`)?.max_lessons},get similarityThreshold(){return le.get(`memory_auto_extract`)?.similarity_threshold},get minRelevantHits(){return le.get(`memory_auto_extract`)?.min_relevant_hits}}});this.skillRegistry=ue.skillRegistry,this.fileStateManager=ue.fileStateManager,this.learningStore=ue.learningStore,this.localLearningStore=ue.localLearningStore,this.memoryAutoExtractor=ue.memoryAutoExtractor,this.completeText=ue.completeText,this.promptManager=ue.promptManager;let de=oe(this._authStore,`delegation`),fe=vp({getModelRegistry:()=>this.modelRegistry,providerRegistry:this.providerRegistry,authStore:this._authStore,getSettings:()=>this.settings,promptManager:this.promptManager,getTools:()=>this.tools,getDeclarativeAgentProfiles:()=>this.getEnabledAgentProfiles(),defaultModel:ne,explicitModelId:ie,isModelUsable:de,maxToolTurns:this.maxToolTurns,maxToolTurnExtensions:this.maxToolTurnExtensions,promptOutputTokenBudget:this.promptOutputTokenBudget,promptWallClockBudgetMs:this.promptWallClockBudgetMs,sessionCostBudgetUSD:this.sessionCostBudgetUSD,stallDetection:this.stallDetection,workspaceDir:this.workspaceDir,getWorkspaceRef:()=>this.workspaceRef,workspaceId:this._workspaceId,logger:this.logger,getResilienceConfig:()=>this.getResilienceConfig()}),pe=fe.visionDelegateService;this.sessionConfigResolver=fe.sessionConfigResolver;let me=yp({options:e,hookRegistry:this.hookRegistry,providerRegistry:this.providerRegistry,getModelRegistry:()=>this._modelRegistry,logger:this.logger,workspaceDir:this.workspaceDir,getTools:()=>this.tools,getDeclarativeAgentProfiles:()=>this.getEnabledAgentProfiles(),getWorkspaceRef:()=>this.workspaceRef,repoRef:g,maxToolTurns:this.maxToolTurns,promptManager:this.promptManager,memory:this.storage.memory,traceStore:this.storage.traceStore,checkpointStore:this.storage.checkpointStore,clock:this.clock,devtools:this.devtools??void 0,residencyGovernor:this._residencyGovernor,getResidencyConfig:()=>this.getResidencyConfig(),visionDelegateService:pe,resolveEffectiveModel:re,defaultModel:ne,planeRegistry:this.planeRegistry,semanticReviewer:kp({getPermissionMode:()=>this.getPermissionMode(),isSemanticReviewEnabled:()=>this.settings.get(`sandbox`)?.semanticReview===!0,resolveReviewModel:()=>{let e=re();if(e)return ee(`compact`,e,this._modelRegistry)[0]??e},createLlmReviewer:e=>nn({stream:this.codingSessionPool.stream,model:e})})});this.agentRuntime=me.agentRuntime,this.codingSessionPool=me.codingSessionPool,Ux(this);let he=me.swarmAgentRunner,ge=bp({hookRegistry:this.hookRegistry,stream:this.codingSessionPool.stream,logger:this.logger,defaultModel:me.defaultModel,providerRegistry:this.providerRegistry,getDeclarativeTeams:()=>this.declarativeTeams,getDeclarativeAgentProfiles:()=>this.getEnabledAgentProfiles(),getSession:e=>this.getSession(e),createSession:e=>this.createSession(e),removeSession:e=>this.removeSession(e),sessionConfigResolver:this.sessionConfigResolver,swarmAgentRunner:he,workflowConfig:{retry:this.settings.get(`workflow`)?.retry,circuitBreaker:this.settings.get(`workflow`)?.circuitBreaker,orchestration:this.settings.get(`workflow`)?.orchestration}});this.orchestrator=ge.orchestrator,this.runSession=ge.runSession,this.runTeam=ge.runTeam,this.writeTodos=ge.writeTodos,this.toolRegistry=this.initToolRegistry(e);let _e=wp({toolRegistry:this.toolRegistry,hookRegistry:this.hookRegistry,settings:this.settings,workspaceDir:this.workspaceDir,logger:this.logger,getResilienceConfig:()=>this.getResilienceConfig(),compatProducts:this.compatProducts});this.permissionRegistry=_e.permissionRegistry,this.auditLog=_e.auditLog,this.mcpController=_e.mcpController;let ve=_e.preExistingHooks;this.extensions=Tp({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=xp({mcpController:this.mcpController,callMcpTool:(e,t,n)=>this.callMcpTool(e,t,n),getActivePlugins:()=>this.activePlugins()}).panelBackendController;let ye=Ep({pluginInput:this.pluginInput,sigilResolvers:this.sigilResolvers,settings:this.settings,workspaceDir:this.workspaceDir,activePlugins:()=>this.activePlugins(),agentRuntime:this.agentRuntime,hookRegistry:this.hookRegistry,preExistingHooks:ve,codingSessionPoolGet:e=>this.codingSessionPool.getSession(e),logger:this.logger,registerHooks:()=>this.registerHooks()});this.ownedHookNames=ye.ownedHookNames,this.processRegistryUnsubs=ye.processRegistryUnsubs,this.i18nRegistry=new sr;let be=Sp({hookRegistry:this.hookRegistry,skillRegistry:this.skillRegistry,providerRegistry:this.providerRegistry,wireProtocolRegistry:this.wireProtocolRegistry,modelRegistry:this._modelRegistry,authStore:this._authStore,toolRegistry:this.toolRegistry,feedbackRegistry:this.feedbackRegistry,sigilResolverRegistry:this.sigilResolvers,pluginInput:this.pluginInput,workspaceDir:this.workspaceDir,activePlugins:()=>this.activePlugins(),callMcpTool:(e,t,n)=>this.callMcpTool(e,t,n),startPluginJob:({pluginId:e,title:t,prompt:n,sessionId:r})=>this.agentJobs.start({title:`[${e}] ${t}`,prompt:n,sessionId:r,origin:`plugin`}),getPluginJobSessionId:()=>this.getActiveSession()?.id,getSessionMessages:e=>this.getSession(e)?.session.messages().filter(e=>e.role===`user`||e.role===`assistant`||e.role===`tool_result`),completeText:(e,t)=>this.completeText(e,t),capabilityQuota:this.pluginCapabilityQuota,askUser:(e,t)=>this.askPluginUser(e,t),getWorkspaceKey:()=>this.workspaceRef?.key,logger:this.logger,onPluginLoadError:(e,t,n)=>{this.pluginHealthTracker.recordError(e,t),cx(this.pluginModuleManager?.emitMonitorEvent.bind(this.pluginModuleManager))({pluginId:e,reason:n,message:t}),this.pluginFailureQueue?.push({kind:`plugin-failure`,source:`plugin-load`,pluginId:e,reason:n,message:Lx(t),occurredAt:new Date(this.clock?.now()??Date.now()).toISOString()})},getSchedulePort:()=>this.scheduleServiceInstance,settings:this.settings,mcpController:this.mcpController,skillRegistryForReloader:this.skillRegistry,modelCatalogManager:this.modelCatalogManager,getActivePluginsForReloader:()=>this.activePlugins(),i18nRegistry:this.i18nRegistry,getCompatTrustGated:()=>this.compatProducts?.trustVerdict.gated??!0,getSettingValue:e=>{try{return this.settings.get(e)}catch{return}},planeRegistry:this.planeRegistry});this.pluginModuleManager=be.pluginModuleManager,this.capabilityGapRecorder=ux(this.capabilityGapStore,this.pluginModuleManager.emitMonitorEvent.bind(this.pluginModuleManager)),this.pluginProviderManager=be.pluginProviderManager,this.capabilityReloader=be.capabilityReloader,this.toolRegistry.onMutation=e=>{this.permissionSync.sync(this.settings.config);for(let t of e.added??[])this.pluginModuleManager.emitMonitorEvent({type:`tool.registered`,toolName:t,source:e.source});for(let t of e.removed??[])this.pluginModuleManager.emitMonitorEvent({type:`tool.unregistered`,toolName:t,source:e.source})},this.settings.on(`change`,e=>{let t=e,n=this.lastSettingsConfig;if(this.lastSettingsConfig=t,!n)return;let r=new Set([...Object.keys(n),...Object.keys(t)]),i=[];for(let e of r)n[e]!==t[e]&&i.push(e);i.length>0&&this.pluginModuleManager.emitMonitorEvent({type:`settings.changed`,keys:i})});let xe=Cp({sessionConfigResolver:this.sessionConfigResolver,getSession:e=>this.codingSessionPool.getSession(e),listSessionIds:()=>this.codingSessionPool.listSessions().map(e=>e.id),logger:this.logger,workspaceDir:this.workspaceDir,settings:this.settings,pluginModuleManager:this.pluginModuleManager,mcpController:this.mcpController,getActivePlugins:()=>this.activePlugins(),compatProducts:this.compatProducts});this.toolsSyncCoordinator=xe.toolsSyncCoordinator,this.pluginContributionsFacade=xe.pluginContributionsFacade,this.session=new nc(this),this.model=new Ns(this),this.notifications=new Rs(this),this.permissions=new Gs(this)}deferredConfigSteps(){return[{label:`resilience-config`,apply:()=>{this.freezeResilienceConfig()}},{label:`residency-config`,apply:()=>{this.freezeResidencyConfig()}},{label:`memory-governor-thresholds`,apply:()=>{let e=this.settings.get(`residency`);e&&this._memoryGovernor.updateThresholds({warnThresholdPct:e.warn_threshold_pct,hardThresholdPct:e.hard_threshold_pct})}},{label:`auth-store-lock-timeout`,apply:()=>{this._authStore.setRefreshLockTimeoutMs(this.getResilienceConfig().oauth.refreshLockTimeoutMs)}}]}async ensureSettingsLoaded(){await Dp(this.settings,()=>this.settingsLoaded,e=>{this.settingsLoaded=e}),Op(this.deferredConfigSteps())}freezeResilienceConfig(){if(this._resilienceConfig!==void 0)return;let e=Mi(process.env.OTTO_RESILIENCE_CONFIG),t=this._resilienceOverride?Fi(this._resilienceOverride):void 0;this._resilienceConfig=l(e,this.settings.get(`resilience`),t)}_residencyConfig;freezeResidencyConfig(){if(this._residencyConfig!==void 0)return;let e=this.settings.get(`residency`);this._residencyConfig={totalBytes:e?.total_bytes,minPerSessionBytes:e?.min_per_session_bytes,maxPerSessionBytes:e?.max_per_session_bytes,maxContentBytes:e?.max_content_bytes,maxHistoryMessages:e?.max_history_messages,resumeWindowMessages:e?.resume_window_messages,compactionTimeoutMs:e?.compaction_timeout_ms}}getResidencyConfig(){return this._residencyConfig}getResilienceConfig(){if(this._resilienceConfig===void 0)throw Error(`getResilienceConfig() called before settings are loaded — call after ensureSettingsLoaded()/start()`);return this._resilienceConfig}async allowToolAlways(e,t){return this.permissions.allowToolAlways(e,t)}getPermissionMode(){return this.permissions.getPermissionMode()}async setPermissionMode(e){return this.permissions.setPermissionMode(e)}getSessionAlwaysAllow(e){return this.permissions.getSessionAlwaysAllow(e)}bashAlwaysAllowPrefix(e){return this.permissions.bashAlwaysAllowPrefix(e)}isWellFormedAllowEntry(e){return this.permissions.isWellFormedAllowEntry(e)}async disallowToolAlways(e){return this.permissions.disallowToolAlways(e)}clearSessionAlwaysAllow(e){this.permissions.clearSessionAlwaysAllow(e)}activePlugins(){return this.pluginTopology.resolve({workspaceDir:this.workspaceDir,disabledPlugins:this.settings.get(`disabled_plugins`)??[],homedir:this._pluginHomedir,bundledDirs:this._pluginBundledDirs})}async diagnoseTopoSortIssues(){await this.pluginTopology.diagnose(this.logger,this.settings,cx(this.pluginModuleManager?.emitMonitorEvent.bind(this.pluginModuleManager)))}listFileCommands(){return this.pluginContributionsFacade.listFileCommands()}async callMcpTool(e,t,n){return this.pluginContributionsFacade.callMcpTool(e,t,n)}getPluginPanelRegistrations(){return this.pluginContributionsFacade.getPluginPanelRegistrations()}getPluginStatusItems(){return this.pluginContributionsFacade.getPluginStatusItems()}getGlobalMenuItems(){return this.pluginContributionsFacade.getGlobalMenuItems()}getPluginRenderers(){return this.pluginContributionsFacade.getPluginRenderers()}getPluginStatusWidgets(){return this.pluginContributionsFacade.getPluginStatusWidgets()}getPluginFileViewers(){return this.pluginContributionsFacade.getPluginFileViewers()}isFeedbackAvailable(){return this.feedbackRegistry.get()!==void 0}getPulseSurveyConfig(){return this.settings.get(`pulse_survey`)??{}}recordPulseSurvey(e){this.feedbackRegistry.get()?.recordPulseSurvey?.(e)}buildFeedbackIssueUrl(e){return this.feedbackRegistry.get()?.buildIssueUrl?.(e)}listFeedbackIssues(e){return this.feedbackRegistry.get()?.listIssues?.(e)??Promise.resolve({items:[]})}resolveFeedbackPlatform(){return this.feedbackRegistry.get()?.resolveFeedbackPlatform?.()??Promise.resolve(`github`)}markFeedbackResolved(e){return this.feedbackRegistry.get()?.markIssueResolved?.(e)??Promise.resolve(!1)}unmarkFeedbackResolved(e,t){return this.feedbackRegistry.get()?.unmarkIssueResolved?.(e,t)??Promise.resolve(!1)}listFeedbackResolvedMarks(){return this.feedbackRegistry.get()?.listResolvedMarks?.()??Promise.resolve([])}buildFeedbackCodingIssueUrl(e){return this.feedbackRegistry.get()?.buildCodingIssueUrl?.(e)??null}updateSettings(e){return this.settings.update(e)}resolveA2uiRendererPayload(e){return Ro(Fo(this.activePlugins()),e)}getPluginRegistrations(){return this.pluginContributionsFacade.getPluginRegistrations()}async firePluginActivationEvent(e){await this.pluginModuleManager.activateOn(e,new Set(this.declarativeAgentProfiles.map(e=>e.name)))}async start(){return fx(this)}async completeWorkspaceDependentStartup(){return px(this)}needsWorkspaceInit(){return mx(this)}async confirmWorkspaceInit(){return vx(this)}hasParentWorkspace(){return hx(this)}async adoptParentWorkspace(){return gx(this)}async createLocalWorkspace(){return _x(this)}async setWorkspaceMemorySyncEnabled(e){return yx(this,e)}async sweepOrphanTraceFiles(){return bx(this)}async stop(){return xx(this)}async createSession(e={}){return this.session.createSession(e)}registerNotificationChannel(e){this.notifications.registerNotificationChannel(e)}registerInAppNotificationChannel(e){this.notifications.registerInAppNotificationChannel(e)}setUserAskRenderer(e){this.userAskRenderer=e}async askPluginUser(e,t){let n={...Kx(t),id:`plugin_ask_${++this.userAskSeq}`,askedBy:`plugin:${e}`},r=this.userAskRenderer;if(!this._interactive||!r)return Gx();let i=this.inquiryCenter.enqueue({id:n.id,origin:{kind:`plugin`,pluginId:e},question:n});if(!i.accepted)return Gx();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,Gx()),e}}notifyUserInteraction(){this.notifications.notifyUserInteraction()}setTerminalFocus(e){this.notifications.setTerminalFocus(e)}setFollowUpPendingProbe(e){this.followUpPendingProbe=e}notifyPluginServices(e){let t=_u(),n=Jx(this.activePlugins(),this.planeRegistry.resolveForEmit({workspaceKey:this.workspaceRef?.key})),r=0;for(let i of this.activePlugins())if(n.has(i.id))for(let n of t.runningServiceIds(i.id))t.notify(i.id,n,e)&&(this.pluginCapabilityQuota.onNotifyDelivered(i.id,e.sessionId),r+=1);return r}notifyPluginServiceSchedule(e,t){return this.activePlugins().some(t=>t.id===e.pluginId)?_u().notify(e.pluginId,e.serviceId,{type:`schedule.tick`,scheduleId:t.scheduleId,occurrenceId:t.occurrenceId,occurredAt:t.occurredAt}):!1}getSession(e){return this.session.getSession(e)}async shareSession(e,t){return this.session.shareSession(e,t)}getActiveSession(){return this.session.getActiveSession()}listSessions(e){return this.session.listSessions(e)}async listAllSessions(e){return this.session.listAllSessions(e)}async removeSession(e){return this.session.removeSession(e)}async exportSessionArchive(e,t){return this.session.exportSessionArchive(e,t)}exportTrajectory(e,t){return Mx(e,{sessionRepoRef:this.sessionRepoRef??{},evolutionSignals:this.evolutionSignals},t)}archiveSession(e){return this.session.archiveSession(e)}async forkSession(e,t){return this.session.forkSession(e,t)}getEnabledAgentProfiles(){let e=new Set(this.settings.get(`disabled_agents`)??[]);return e.size===0?this.declarativeAgentProfiles:this.declarativeAgentProfiles.filter(t=>!e.has(t.name))}initToolRegistry(e){return ax(this,e)}async buildModelCatalog(e){return this.model.buildModelCatalog(e)}setSessionAvailableModels(e,t){this.model.setSessionAvailableModels(e,t)}registerHooks(){ox(this)}get activeSandbox(){return this.permissions.activeSandbox}approveSandboxBypass(e){this.permissions.approveSandboxBypass(e)}getRecentPermissionDecisions(e,t){return this.permissions.getRecentPermissionDecisions(e,t)}recordAutoPermissionDecision(e){this.permissions.recordAutoPermissionDecision(e)}ensureNotDisposed(){if(this.disposed)throw Error(`App has been stopped and cannot be reused.`)}};function Gx(){return{answer:``,acceptedRecommendation:!1,resolvedBy:`human`}}function Kx(e){return{header:qx(e.header,160),question:qx(e.question,2e3),background:qx(e.background,4e3),recommendation:qx(e.recommendation,1e3),...e.options?{options:e.options.slice(0,8).map(e=>({label:qx(e.label,120),rationale:qx(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=>qx(e,1e3))}:{}}}function qx(e,t){return String(e??``).replace(/[--Ÿ‎‏‪-‮⁦-⁩]/g,` `).slice(0,t)}function Jx(e,t){let n=new Set(t.map(e=>e.pluginId).filter(e=>e!==void 0));return new Set(e.map(e=>e.id).filter(e=>n.has(e)))}function Yx(e){return new Wx(e)}function Xx(e){return{get id(){return e.id},get title(){return e.title},get agentName(){return e.agentName},get model(){return{id:e.model.id,name:e.model.name,provider:e.model.provider}},get isBusy(){return e.isBusy},messageCount:()=>e.session.messages().length,lastAssistantText:()=>gs(e.session.messages()),prompt:(t,n)=>e.prompt(t,n),subscribe:((t,n)=>e.subscribe(t,n)),resolveApproval:(t,n)=>e.resolveApproval(t,n),resolveAskUser:(t,n)=>e.resolveAskUser(t,n),clearContext:()=>e.clearContext(),compactNow:()=>e.compactNow(),renameSession:t=>e.renameSession(t),abort:()=>e.abort(),dispose:()=>e.dispose()}}function Zx(e){return{createSession:async t=>Xx(await e.createSession(t)),jobs:hn,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);if(!i)return`未知模型 \`${n}\`。`;try{await r.applyModelWithContextFit?.(i)}catch{}return null},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 Qx=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 $x(e){return e.absolutePaths.length>0||e.bareSpecifiers.length>0}function eS(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:`)||Qx.has(e)||n.includes(e)||n.push(e)}return{absolutePaths:t,bareSpecifiers:n}}function tS(e,t){let n=eS(t);if(!$x(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(`
592
+ `))}function nS(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 rS(e,t=O){let n=t(e);return n.gated||!(e.manifest.capabilities?.includes(`tools`)??!1)?!1:!n.pendingCapabilities.includes(`tools`)}async function iS(e,t,n){let r=[];for(let i of e){if(!rS(i,t))continue;let e=i.manifest.contributes?.perfMetrics;if(!e?.length)continue;let a=Wu(i.scope);for(let t of e){let e=(async()=>{try{let{result:e,error:n}=await nS(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 aS=20;function oS(e,t=20){let n=Qc(e);if(!n||!v(n))return[];let r;try{r=b(n,`utf8`)}catch{return[]}let i=r.split(`
593
+ `).filter(e=>e.trim().length>0).slice(-t),a=[];for(let e of i)try{a.push(JSON.parse(e))}catch{}return a}function sS(e,t,n){let r=e?.manifest.contributes?.contextKeys;return{...t,...yr(r,n)}}function cS(e,t){let n=e.manifest.scripts?.[t];if(!n)return Promise.reject(Error(`plugin ${e.id} 无脚本「${t}」`));let r=ht(n);return r.safe?new Promise((r,i)=>{let a=$i(n,{shell:!0,cwd:e.dir,stdio:`ignore`,env:mt()});a.on(`error`,i),a.on(`exit`,e=>e===0?r():i(Error(`脚本「${t}」退出码 ${e}`)))}):Promise.reject(Error(`脚本「${t}」被安全检查拦截:${r.reason}`))}function lS(e){let t=e.startsWith(`chrome://`);process.platform===`darwin`?$i(`open`,t?[`-a`,`Google Chrome`,e]:[e],{detached:!0,stdio:`ignore`}).unref():process.platform===`win32`?$i(`cmd`,[`/c`,`start`,``,e],{detached:!0,stdio:`ignore`}).unref():$i(t?`google-chrome`:`xdg-open`,[e],{detached:!0,stdio:`ignore`}).unref()}const uS=T(`@x-otto/coding:plugin-cli-passthrough`),dS=6e4;function fS(e){let t=e.manifest.contributes?.cli?.bin,n=t?C(e.dir,t):pS(e.dir);if(n)return mS(n,e.dir)}function pS(e){let t=C(e,`package.json`);if(v(t))try{let n=JSON.parse(b(t,`utf8`));if(typeof n.bin==`string`)return C(e,n.bin);if(n.bin&&typeof n.bin==`object`){let t=Object.values(n.bin)[0];return typeof t==`string`?C(e,t):void 0}return}catch{return}}function mS(e,t){if(!v(e))return;let n,r;try{n=Qe(e),r=Qe(t)}catch{return}let i=r.endsWith(`/`)?r:`${r}/`;if(!n.startsWith(i)&&n!==r){uS.warn({candidate:e,pluginDir:t},`Plugin CLI bin resolves outside plugin directory (symlink escape rejected)`);return}try{if(!tt(n).isFile())return}catch{return}return n}function hS(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)){uS.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 gS(e,t){let n=hS(e,t),r=new Map;for(let[e,t]of n){if(t.length===1){r.set(e,t[0]);continue}uS.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 _S(e,t,n){let r=hS(e,t).get(n);return r&&r.length>=2?r.map(e=>e.id):void 0}function vS(e,t,n,r=dS){return new Promise((i,a)=>{let o=$i(e,t,{stdio:`inherit`,cwd:n,env:mt()}),s=setTimeout(()=>{o.kill(`SIGTERM`),a(Error(`插件 CLI 执行超时(${r}ms),已终止子进程`))},r);s.unref(),o.on(`error`,e=>{clearTimeout(s),a(e)}),o.on(`exit`,(e,t)=>{clearTimeout(s),i(e??(t?1:0))})})}function yS(e,t){let n=new Map,r=(e,r,i)=>{if(t.has(e)){uS.warn({pluginId:r.id,name:e,kind:i},`Plugin CLI contribution name collides with a built-in command; ignored`);return}let a=n.get(e);a?a.push({plugin:r,kind:i}):n.set(e,[{plugin:r,kind:i}])};for(let t of e){let e=t.manifest.contributes?.cli?.name;e&&r(e,t,`passthrough`);for(let e of t.manifest.contributes?.cliCommands??[])r(e.name,t,`in-process`)}return n}function bS(e,t){let n=yS(e,t),r=new Map;for(let[e,t]of n){if(t.length===1){r.set(e,t[0]);continue}uS.warn({name:e,conflicts:t.map(e=>({pluginId:e.plugin.id,kind:e.kind}))},`Plugin CLI command name claimed by multiple contributions (cross-plugin or cross-axis); command disabled (fail-closed, RFC-410 D4 / RFC-124 §10.2.2)`)}return r}function xS(e,t){let n=bS(e,t),r=[];for(let[e,t]of n){let n=t.kind===`in-process`?t.plugin.manifest.contributes?.cliCommands?.find(t=>t.name===e)?.summary:void 0;r.push({name:e,pluginId:t.plugin.id,kind:t.kind,...n?{summary:n}:{}})}return r.sort((e,t)=>e.name.localeCompare(t.name))}function SS(e,t,n){let r=yS(e,t).get(n);return r&&r.length>=2?r:void 0}async function CS(e,t=dS){let n,r=new Promise(e=>{n=setTimeout(()=>{uS.warn({timeoutMs:t},`in-process plugin CLI command timed out; returning exit code 124 (handler may still be running detached — cannot be force-killed in-process)`),e(124)},t),n.unref()});try{return await Promise.race([Promise.resolve(e()),r])}catch(e){return uS.warn({err:String(e)},`in-process plugin CLI command threw; returning exit code 1`),1}finally{n&&clearTimeout(n)}}function wS(e,t={}){return _r({cwd:t.workspaceDir??process.cwd(),homedir:t.homedir??at(),bundledDirs:t.bundledDirs}).find(t=>t.id===e)}function TS(e,t,n={}){let r=wS(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=>Zn.includes(e)),a=t??[],o=a.filter(e=>!Zn.includes(e));if(o.length>0)return{ok:!1,reason:`unknown-capability`,granted:[],pending:i,message:`Unknown capability: ${o.join(`, `)}. Valid high-risk capabilities: ${Zn.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)`}.`};Wr(r.dir),a.length>0&&wr(r.dir,a);let c=O(r);return{ok:!0,granted:[...a],pending:c.pendingCapabilities}}function ES(e,t={}){let n=wS(e,t);if(!n)return{found:!1,trusted:!1,gated:!1,declared:[],granted:[],pending:[]};let r=O(n),i=(n.manifest?.capabilities??[]).filter(e=>Zn.includes(e));return{found:!0,trusted:r.trusted,gated:r.gated,declared:[...i],granted:[...r.grantedCapabilities],pending:[...r.pendingCapabilities]}}function DS(e,t={}){let n=wS(e,t);return n?(Kr(n.dir),!0):!1}const OS=T(`@x-otto/coding:plugin-theme-preset-loader`),kS=new Set([`dark`,`light`,`system`,`builtin`]);function AS(e){let t=[];for(let n of e){let e=n.manifest.contributes?.themePresets;if(!e?.length)continue;if(O(n).gated){OS.warn({pluginId:n.id},`plugin gated (untrusted), themePresets skipped`);continue}let r=e;r.length>rr&&(OS.warn({pluginId:n.id,declared:r.length,limit:rr},`plugin declares more theme presets than the per-plugin limit, truncated`),r=r.slice(0,rr));for(let e of r){if(kS.has(e.localId)){OS.warn({pluginId:n.id,localId:e.localId},`themePresets localId collides with a reserved name, skipped`);continue}t.push({pluginId:n.id,localId:e.localId,label:e.label,appearance:e.appearance,colors:e.colors,markdown:e.markdown,meta:e.meta})}}return t}export{ns as AgentJobService,Bt as AgentSession,Wx as App,Jt as CodingSessionPool,Mb as DEFAULT_WORKSPACE_KEY,vo as ExtensionManager,Xn as HIGH_RISK_CAPABILITIES,jb as INDUCTOR_PLUGIN_ID,aS as PLUGIN_LOG_TAIL_LINES,ar as PLUGIN_MANIFEST_FILENAME,or as POINT,Yd as PluginConfigStore,xa as RegistryClient,Fb as SANDBOX_ESCALATION_MARKER,oa as SCHEDULE_LEASE_MIGRATIONS,qt as SandboxUnavailableError,sa as ScheduleRegistry,ca as SchedulerService,bo as SigilResolverRegistry,g as apiCredentialId,tS as assertPortableArtifact,TS as authorizePlugin,sS as buildExtensionContext,Ha as buildMemoryStore,gS as buildPluginCliRegistry,bS as buildUnifiedCliCommandRegistry,Sa as builtinOfficialSource,Qt as captureFiles,Ex as captureTrajectory,Ca as checkArchiveBomb,wa as checkGitUpgrades,wf as checkPluginConsistency,Ta as checkUpgrades,qr as claudeTrustStorePath,Ea as cleanTempDir,xS as collectPluginCliCommandsForHelp,iS as collectPluginPerfMetrics,AS as collectPluginThemePresets,$l as compilePluginModule,uf as compilePluginPanels,nu as computeSourceHash,Yx as createApp,Da as createArchive,lr as createBuiltinHashtags,hp as createBuiltinResolvers,Jr as createClaudeHookBridgeHooks,dr as createFileProvider,Zx as createFrontendPort,Up as createLessonInjectionHooks,la as createLocalFireOwnership,Bx as createPluginFailureQueue,pr as createPluginInputRegistry,ua as createRemoteFireOwnership,da as createRemoteScheduleStore,pa as createScheduleStore,an as createSessionStableInjectionHooks,Wp as createSkillCatalogInjectionHooks,Oa as createTempDir,Mp as createToolGuidanceHook,Xr as defaultHookRunner,un as defaultMaxToolTurnExtensions,Cc as defaultPostInstallExecutor,pn as deriveSessionTitle,Zr as detectClaudeExecutableSurface,hr as detectPluginExecutableSurface,Oi as detectProjectConfigGating,ka as detectUninstallTarget,Qr as discoverFileCommands,gr as discoverPlugins,vr as dispatch,ei as evaluateClaudeTrust,br as evaluatePluginTrust,ki as evaluateWorkspaceTrustPrompt,ni as expandCommandBody,ko as expandSigilChips,Ox as exportTrajectory,Ax as exportTrajectoryFromSession,Aa as extractArchive,_S as findPluginCliNameConflict,eS as findPortabilityViolations,SS as findUnifiedCliCommandConflict,a as findWorkspaceRoot,Fl as getEsbuildModule,_s as getIncompleteSubagentReason,gs as getLastAssistantText,mn as globalAgentJobRegistry,gn as globalAgentObservability,vn as globalProcessRuntime,Cr as grantPluginCapabilities,Tr as grantPluginCapabilitiesWithVersion,Er as grantedPluginCapabilities,Dr as grantedPluginCapabilitiesForVersion,$x as hasPortabilityViolations,ES as inspectPluginAuthorization,ja as install,Rl as installEsbuildExitHook,Bl as installEsbuildSignalBridges,yf as installPluginFromDir,vf as installPluginFromPackage,Zl as installPluginHostExternals,Ma as installSkill,ri as interpretPreToolUse,Of as isInternalDelegatedSession,Or as isPluginTrusted,ii as isProjectTrusted,Ar as isSensitiveField,ji as isStrictProjectConfigEnabled,Na as listInstalledItems,ai as loadClaudeHooksConfig,cu as loadPluginModule,Il as markEsbuildStarted,oi as matchesHookMatcher,Cn as messagesFromSnapshot,lS as openTarget,si as parseClaudeHooks,pi as parseDotMcpJson,Mr as parsePluginManifest,Pa as parseRegistry,Pr as pluginTrustStorePath,Qd as purgePluginState,Fr as readHighRiskCapabilities,oS as readPluginLogTail,Kb as readSkillLoopStatus,$o as readTaskOutputTail,wn as reconstructMessages,Sf as recordPluginInstalled,Cf as recordPluginUninstalled,Ir as redactSensitiveFields,xf as removeInstalledPluginEntry,Lr as resolveActions,ci as resolveClaudeMcpServers,Xl as resolveHostExternalPaths,_f as resolvePackageDir,fS as resolvePluginCliBin,lo as resolvePluginMcpServers,Ni as resolveProjectConfigTrusted,En as resolveSessionTitle,On as restoreFiles,DS as revokePluginAuthorization,iu as rewriteArtifactSourceHash,CS as runInProcessCliCommand,cS as runPluginScript,Lx as sanitizeFailureMessage,Fa as scanInstalledVersions,kx as selectTrajectoryEntries,Vr as sigilOf,vS as spawnPluginCli,Ll as stopEsbuildService,Ur as trustPlugin,ui as trustProject,Ia as uninstall,Gr as untrustPlugin,di as untrustProject,bf as upsertInstalledPluginEntry,La as validateExtractedPaths,Vl as withBuildTimeout};
593
594
  //# sourceMappingURL=index.js.map