@x-otto/coding 0.1.0-alpha.13 → 0.1.0-alpha.15
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/README.md +0 -2
- package/dist/index.d.ts +4 -250
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +75 -178
- package/dist/index.js.map +1 -1
- package/package.json +29 -29
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,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(`
|
|
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 v,createCredentialBackendRegistry as te,createDefaultAuthStore as ne,createDefaultModelRegistry as re,createModelSlot as y,createModelUsabilityGate as ie,createProviderRegistry as ae,createWireProtocolRegistry as oe,fetchModels as se,isBuiltinProviderId as b,mergeFetchedModels as ce,rankModelsBySlotAffinity as le,registerCacheReportingApi as ue,registerProviderDescriptor as de,resolveModelsRequest as fe,stream as pe,unregisterCacheReportingApi as me,unregisterProviderDescriptor as he}from"@x-otto/ai";import{Diagnoser as ge,FailureSignalStore as _e,PermissionAuditLog as ve,assessSandboxSafety as ye,bashAlwaysAllowPrefix as be,compilePolicyFromSetting as xe,computeSandboxRoots as Se,createDisabledToolsPolicy as Ce,createEgressAllowlistPolicy as we,createFailureSignalHook as Te,createPermissionDenyHook as Ee,createPermissionGuardHook as De,createPermissionModePolicy as Oe,createPermissionRegistry as ke,createPermissionToolSetsFromRegistry as Ae,defaultDeniedRoots as je,extractWriteTargets as Me,isWellFormedAllowEntry as Ne}from"@x-otto/guard";import{ORCHESTRATION_TOOL_NAMES as Pe,createPlatformSandbox as Fe,createToolRegistry as Ie,credentialDenyReadPaths as Le,isPlatformSandboxAvailable as Re}from"@x-otto/tools";import{appendFileSync as ze,closeSync as Be,constants as Ve,existsSync as x,fsyncSync as He,lstatSync as Ue,mkdirSync as S,mkdtempSync as We,openSync as Ge,readFileSync as C,readdirSync as Ke,readlinkSync as qe,realpathSync as w,renameSync as Je,rmSync as Ye,statSync as Xe,symlinkSync as Ze,unlinkSync as Qe,writeFileSync as T,writeSync as $e}from"node:fs";import{homedir as E,tmpdir as et}from"node:os";import{dirname as D,extname as tt,isAbsolute as nt,join as O,relative as rt,resolve as k,sep as it}from"node:path";import{CodedError as at,ProviderError as ot,attachLogListener as st,buildAllowedEnv as ct,checkShellCommand as lt,createLogger as A,installGlobalProxyDispatcher as ut,mapClaudeAgentToolNames as dt,markStartupPhase as ft,parseFrontmatterList as pt,setDefaultProxy as mt,splitFrontmatter as ht,traceStartupPhase as gt}from"@x-otto/shared";import{AutoMemory as _t,DEFAULT_MEMORY_SOURCES as vt,FileStateManager as yt,FileSystemMemoryStore as bt,HttpMemoryStore as xt,InMemoryArchiveStorage as St,OperationalLearningStore as Ct,computeLessonContentHash as wt,createMemoryAutoExtractor as Tt,createMemoryManager as Et,createOverlayMemoryStore as Dt,discoverAgentsSources as Ot,formatMessageForSummary as kt}from"@x-otto/memory";import{Agent as At,wireSnapshotStore as jt}from"@x-otto/agent";import{AgentSession as Mt,FleetMonitor as Nt,HostRegistry as Pt,JobStateStore as Ft,MemoryGovernor as It,RUNTIME_DEFAULTS as Lt,ResidencyGovernor as Rt,SandboxUnavailableError as zt,SessionPool as Bt,applyDiff as Vt,attachAgentObserver as Ht,buildEngineStores as Ut,captureFiles as Wt,checkApply as Gt,createAgentRuntime as Kt,createDocSyncReminderHooks as qt,createEnvironmentVolatileHooks as Jt,createLlmEscalationReviewer as Yt,createMemoryDeltaHooks as Xt,createSessionStableInjectionHooks as Zt,createTodoReminderHooks as Qt,createToolHookExecutor as $t,createWorktree as en,decideApply as tn,defaultMaxToolTurnExtensions as nn,defaultMaxToolTurnExtensions as rn,definePromptSection as an,deriveSessionTitle as on,globalAgentJobRegistry as sn,globalAgentJobRegistry as cn,globalAgentObservability as ln,globalAgentObservability as un,globalProcessRuntime as dn,globalProcessRuntime as j,globalToolResultStore as fn,hasRepoDrifted as pn,installAgentJobReaper as mn,installExitReaper as hn,messagesFromSnapshot as gn,reconstructMessages as _n,removeWorktree as vn,resolveSessionTitle as yn,resolveTodoContinuationConfig as bn,restoreFiles as xn,revertDiff as Sn,touchesCapabilitySurface as Cn,touchesForbiddenZone as wn,worktreeDiff as Tn}from"@x-otto/runtime";import{atomicWriteFile as En,createFileStorageHost as Dn,createInMemoryPanelStatePersistence as On,createInMemoryPasteStatePersistence as kn,createLiveTappedAppendLog as An,createPersistence as jn}from"@x-otto/persistence";import{SESSION_MAX_PER_SESSION_BYTES as Mn,SESSION_RESUME_WINDOW_MESSAGES as Nn}from"@x-otto/session-contract";import{createRegistrySkillProvider as Pn,createSkillRegistry as Fn}from"@x-otto/skill";import{BUILTIN_PROMPTS_DIR as In,PromptManager as Ln,SUBAGENT_GUARDRAILS as Rn,assembleGenericSubAgentPrompt as zn,buildLessonInjection as Bn,createPromptProvider as Vn,resolveAgentProfile as Hn}from"@x-otto/prompt";import{HIGH_RISK_CAPABILITIES as Un,HIGH_RISK_CAPABILITIES as Wn,ID_RE as Gn,MAX_I18N_ENTRIES_PER_PLUGIN as Kn,MAX_I18N_FILE_BYTES as qn,MAX_I18N_LOCALE_FILES_PER_PLUGIN as Jn,MAX_I18N_TRANSLATION_BYTES as Yn,MAX_THEME_PRESETS_PER_PLUGIN as Xn,PLUGIN_API_VERSION as Zn,PLUGIN_MANIFEST_FILENAME as Qn,PLUGIN_MANIFEST_FILENAME as M,POINT as $n,PluginI18nRegistry as er,SHELL_POINTS as tr,createBuiltinHashtags as nr,createBuiltinHashtags as rr,createFileProvider as ir,createFileProvider as ar,createPluginInputRegistry as or,createPluginInputRegistry as sr,detectPluginExecutableSurface as cr,discoverPlugins as lr,discoverPlugins as ur,dispatch as dr,evaluateContextKeys as fr,evaluatePluginTrust as pr,evaluatePluginTrust as N,evaluateWhen as mr,filterEngineCompatible as hr,grantPluginCapabilities as gr,grantPluginCapabilities as _r,grantPluginCapabilitiesWithVersion as vr,grantedPluginCapabilities as yr,grantedPluginCapabilitiesForVersion as br,isPluginTrusted as xr,isPluginTrusted as Sr,isSensitiveField as Cr,mergeConfigWithDefaults as wr,parsePluginManifest as Tr,parsePluginManifest as Er,pluginTrustStorePath as Dr,readHighRiskCapabilities as Or,redactSensitiveFields as kr,resolveActions as Ar,resolveActions as jr,resolveActivationEvents as Mr,resolveManifestPlane as Nr,sigilOf as Pr,topoSortPlugins as Fr,trustPlugin as Ir,trustPlugin as Lr,untrustPlugin as Rr,untrustPlugin as zr}from"@x-otto/plugin";import{claudeTrustStorePath as Br,createClaudeHookBridgeHooks as Vr,createClaudeHookBridgeHooks as Hr,defaultHookRunner as Ur,detectClaudeExecutableSurface as Wr,discoverFileCommands as Gr,discoverFileCommands as Kr,evaluateClaudeTrust as qr,evaluateClaudeTrust as Jr,expandCommandBody as Yr,interpretPreToolUse as Xr,isProjectTrusted as Zr,loadClaudeHooksConfig as Qr,matchesHookMatcher as $r,parseClaudeHooks as ei,resolveClaudeMcpServers as ti,resolveClaudeMcpServers as ni,trustProject as ri,untrustProject as ii}from"@x-otto/claude-compat";import{McpManager as ai,parseDotMcpJson as oi,parseDotMcpJson as si}from"@x-otto/mcp";import{InMemorySession as ci,RelationalSessionPersistence as li,SESSION_MAX as ui,SqliteSessionRepository as di,createNoopSessionWriteLeaseManager as fi,createSessionWriteLeaseManager as pi,reassembleSnapshot as mi}from"@x-otto/session";import{Orchestrator as hi,createHandoffTool as gi,createSwarm as _i}from"@x-otto/orchestrator";import{BUILTIN_AGENT_PROFILES as vi,SettingsManager as yi,detectProjectConfigGating as bi,evaluateWorkspaceTrustPrompt as xi,isProjectTrusted as Si,isStrictProjectConfigEnabled as Ci,parseResilienceEnvOverride as wi,resolveProjectConfigTrusted as Ti,resolveProjectConfigTrusted as Ei,validateResilienceOverride as Di}from"@x-otto/setting";import{createHash as Oi,randomUUID as ki}from"node:crypto";import{CallbackChannel as Ai,CommandChannel as ji,NotificationDispatcher as Mi,PresenceTracker as Ni,TerminalChannel as Pi,TimestampPresenceGate as Fi}from"@x-otto/notification";import{DEFAULT_WORKSPACE_KEY as P,createWorkspaceResolver as Ii,genWorkspaceId as Li,readMarker as Ri,workspaceKey as zi,writeMarker as Bi}from"@x-otto/workspace";import{mkdir as Vi,open as Hi,readFile as Ui,writeFile as Wi}from"node:fs/promises";import{spawn as F,spawnSync as Gi}from"node:child_process";import{createHookRegistry as Ki,defineHook as I,isWaterfallTiming as qi}from"@x-otto/hooks";import{Worker as Ji}from"node:worker_threads";import{fileURLToPath as L,pathToFileURL as Yi}from"node:url";import{SCHEDULE_LEASE_MIGRATIONS as Xi,ScheduleRegistry as Zi,SchedulerService as Qi,createLocalFireOwnership as $i,createRemoteFireOwnership as ea,createRemoteScheduleStore as ta,createScheduleCapability as na,createScheduleStore as ra}from"@x-otto/schedule";import{DeviceFlowOAuthTemplate as ia,PKCEOAuthTemplate as aa}from"@x-otto/provider";import{createTodoStore as oa}from"@x-otto/orchestration-contracts";import{SYSTEM_PROMPT_SECTIONS as R,applySectionBudget as sa}from"@x-otto/interchange";import{RegistryClient as ca,builtinOfficialSource as la,checkArchiveBomb as ua,checkGitUpgrades as da,checkUpgrades as fa,cleanTempDir as pa,createArchive as ma,createTempDir as ha,detectUninstallTarget as ga,extractArchive as _a,install as va,installSkill as ya,listInstalledItems as ba,parseRegistry as xa,scanInstalledVersions as Sa,uninstall as Ca,validateExtractedPaths as wa}from"@x-otto/install";O(E(),`.otto`);const Ta=u(process.env.OTTO_REMOTE_STORAGE_TIMEOUT_MS,3e4),Ea=A(`@x-otto/coding:rfc344-compaction-cost`),Da=A(`@x-otto/coding:rfc387-prefix-degradation`);function Oa(e,t){if(!e?.remote?.getAuth)throw Error(`storage.${t}.url is configured, so storage.remote.getAuth is required.`);return e.remote}function ka(e,t,n,r,i){let a=Aa(e,t,n,r,i);return a&&c()?Dt(a):a}function Aa(e,t,n,r,i){let a=e?.memory;if(a&&`dir`in a)return new bt(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 xt({baseUrl:o,getAuth:a.getAuth,fetch:a.fetch??globalThis.fetch,timeoutMs:a.timeoutMs??Ta,userId:n?.userId,workspaceKey:()=>r?.()?.key,isWorkspaceSyncEnabled:()=>r?.()?.memorySyncEnabled===!0,localDir:t,onConflict:i})}if(t)return new bt(t)}function ja(e,t){let n=()=>({ok:!1,fallbackText:Na(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=>Ma(e,r));if(a<0)return n();let o=-1;for(let e=t.length-1;e>=a;e--)if(Ma(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 Ma(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 Na(e){return e.map(kt).join(`
|
|
2
2
|
|
|
3
|
-
`)}function
|
|
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(`
|
|
3
|
+
`)}function Pa(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&&Da.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?ja(p,f.messages):void 0;p&&p.length>0&&f?.messages&&m?.ok!==!0&&Da.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 pe(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 Fa(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 fn.spill(r.id,e,n)}}}function Ia(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 La(e){return e.includes(`./.otto/AGENTS.md`)?0:e.includes(`~/.otto/AGENTS.md`)?1:2}function Ra(e,t){try{let n=O(t,D(e.indexPath),`memory`),r=new Map;for(let e of Ke(n,{withFileTypes:!0}))!e.isFile()||!e.name.endsWith(`.md`)||r.set(`memory/${e.name}`,Xe(O(n,e.name)).mtimeMs);return r}catch{return}}function za(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=Pa({model:t,getModel:n,providerRegistry:i,getWireSnapshot:e=>jt.get(e),onUsage:(e,t)=>Ea.info({sessionId:t?.sessionId,inputTokens:e.inputTokens,outputTokens:e.outputTokens,cacheReadTokens:e.cacheReadTokens,cacheWriteTokens:e.cacheWriteTokens},`[RFC-344] compaction summarize request cost`)}),_=[...vt].filter(e=>e.writable).sort((e,t)=>La(e.path)-La(t.path)),v=Ot(o??process.cwd()),te=s()?[{path:`~/.claude/CLAUDE.md`,writable:!1},...Ot(o??process.cwd(),{fileName:`CLAUDE.md`})]:[],ne=[..._,...te,...v],re=r&&a?[...ne,a.asSource()]:void 0;return Et({entryMtimes:r&&a?Ra(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:Mn,getMaxContentBytes:u,getRealInputTokens:d,getCoverageThresholds:f,getEstimatedBytes:l,memoryStore:r,sources:re,archiveStorage:new St,messageFromEntry:e=>{let t=e.data;if(!t||typeof t!=`object`)return null;let n=t.message;return n&&typeof n.role==`string`?n:null},loadSessionEntries:async e=>{let t=c?.();if(!t)throw Error(`Session entries not wired`);return t(e)},compactionLock:m,compactionSpill:h})}function Ba(e){let{options:t,workspaceDir:n,providerRegistry:r,defaultModel:i,resolveEffectiveModel:a,repoRef:o,getWorkspaceRef:s}=e,l=t.storage?.host?{host:Dn({baseDir:t.storage.host.dir,namespaces:t.storage.host.namespaces}),token:t.storage.host.token}:null,u=ka(t.storage,n,t.userIdentity,s,e.onMemoryConflict),d=u?new _t({store:u}):null,f=t.memory??za({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=Ut({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??Ta}:void 0,ephemeral:c()},{traceStore:t.traceStore,checkpointStore:t.checkpointStore}),{store:h,live:g}=An(m.traceStore);return{storageHost:l,autoMemory:d,memory:f,traceStore:h,traceLive:g,checkpointStore:m.checkpointStore,clock:t.clock,memoryStore:u}}const Va={delegation:`task_delegate`,"task-observability":`task_inspect`,"file-state-refresh":`capture_file_state`},Ha=new Set(Object.keys(Va));function Ua(e){let t=new Set;for(let[n,r]of Object.entries(Va))e.has(r)&&t.add(n);return t}function Wa(e){let{skillProvider:t,workspaceDir:n,activePlugins:r,resolveEffectiveModel:i,providerRegistry:a,prompt:o,memoryStore:l,memoryAutoExtractConfig:u}=e,d=s()&&(e.compatProducts?.trustVerdict.gated??!0),f=t?null:Fn({workspaceDir:n,library:{...d?{projectDirs:[`.otto/skills`]}:{},pluginDirs:r().filter(e=>e.manifest.contributes?.skills!==!1).filter(e=>!N(e).gated).map(e=>({id:e.id,dir:O(e.dir,`skills`)}))}}),p=new yt,m=c(),h=new Ct({path:`${n}/.otto/lessons.json`,...l?{store:l,storePath:`./.otto/lessons.json`}:{},ephemeral:m});return{skillRegistry:f,fileStateManager:p,learningStore:h,localLearningStore:new Ct({path:`${n}/.otto/local/lessons.json`,ephemeral:m}),memoryAutoExtractor:Tt({llm:Pa({getModel:i,providerRegistry:a}),store:h,config:u??{enabled:!0},readRelevantHits:async()=>(await h.list()).reduce((e,t)=>Math.max(e,t.relevantHitCount??0),0)}),completeText:Pa({getModel:i,providerRegistry:a}),promptManager:new Ln({provider:Vn(o??{type:`local`,baseDir:In}),knownCapabilities:Ha})}}function Ga(e,t){return{hooks:Hr({workspaceDir:e}),mcpServers:ni(e),fileCommands:Kr(e,t),trustVerdict:Jr(e)}}var Ka=class{currentPermissionMode=void 0;constructor(e){this.deps=e}sync(e){let t=Ae(this.deps.getToolRegistry().getAll());this.syncModePolicy(e.permission_mode,t),this.syncDisabledToolsPolicy(e.disabled_tools),this.syncEgressPolicy(e.web_fetch_allowed_hosts),this.syncUserPolicies(e.permissions),this.registry.setAlwaysAllow(e.permission_always_allow??[]),this.deps.logger.debug(`Permission policies synced: %d policies active`,this.registry.getAll().length)}get registry(){return this.deps.getPermissionRegistry()}syncModePolicy(e,t){let n=e??`auto`;this.currentPermissionMode&&this.registry.unregister(`mode::${this.currentPermissionMode}`),this.registry.register(Oe(n,t)),this.currentPermissionMode=n}syncDisabledToolsPolicy(e){e&&e.length>0?this.registry.register(Ce(e)):this.registry.unregister(`setting::disabled-tools`)}syncEgressPolicy(e){e&&e.length>0?this.registry.register(we(e)):this.registry.unregister(`setting::egress-allowlist`)}syncUserPolicies(e){for(let e of this.registry.getAll())e.name.startsWith(`user::`)&&this.registry.unregister(e.name);if(e)for(let t of e)this.registry.registerWithSource(xe({...t,name:`user::${t.name}`}),`user`)}},qa=class{strategy=null;pinned=!1;settingSnapshot=`null`;networkAllowed=!0;configuredWritablePaths=[];autoAllowBash=!1;constructor(e){this.logger=e}get current(){return this.strategy}get activeName(){return this.strategy?.name??null}get enabled(){return this.strategy!==null}get isNetworkAllowed(){return this.networkAllowed}get writablePaths(){return this.configuredWritablePaths}get autoAllowBashIfSandboxed(){return this.autoAllowBash}bypassCommands=new Set;approveBypass(e){e&&this.bypassCommands.add(e)}isBypassed(e){return e!==void 0&&this.bypassCommands.has(e)}pin(e){this.pinned=!0,this.networkAllowed=e.network!==`deny`,this.configuredWritablePaths=Array.isArray(e.writablePaths)?e.writablePaths.filter(e=>typeof e==`string`):[],this.autoAllowBash=e.autoAllowBashIfSandboxed===!0,e.enabled&&!Re()?(this.logger.warn(`Sandbox pinned but no platform sandbox available (install bwrap on Linux); running WITHOUT sandbox`),this.strategy=null):this.strategy=e.enabled?Fe({network:e.network,writablePaths:e.writablePaths,denyReadPaths:e.protectCredentials?Le():void 0}):null}applySetting(e){if(this.pinned)return;let t=JSON.stringify(e??null);if(t===this.settingSnapshot)return;this.settingSnapshot=t,this.networkAllowed=e?.network!==`deny`,this.configuredWritablePaths=Array.isArray(e?.writablePaths)?e.writablePaths.filter(e=>typeof e==`string`):[],this.autoAllowBash=e?.autoAllowBashIfSandboxed===!0;let n=this.strategy;e?.enabled===!0&&!Re()?(this.logger.warn(`Sandbox enabled but no platform sandbox available (install bwrap on Linux); running WITHOUT sandbox`),this.strategy=null):this.strategy=e?.enabled===!0?Fe({network:e.network===`deny`?`deny`:`allow`,writablePaths:this.configuredWritablePaths,denyReadPaths:e.protectCredentials?Le():void 0}):null,n?.dispose().catch(()=>void 0),this.logger.info(`Sandbox strategy %s (settings)`,this.strategy?`enabled: ${this.strategy.name}`:`disabled`)}resolveConfig(e){if(e.sandbox)return e.sandbox;if((e.permission_mode??`auto`)!==`bypass`)return{enabled:!0,network:process.env.OTTO_SANDBOX_NETWORK===`deny`?`deny`:`allow`,writablePaths:[]}}async dispose(){this.strategy&&=(await this.strategy.dispose().catch(()=>void 0),null)}};function Ja(e){return typeof e==`string`&&(e.startsWith(`./`)||e.startsWith(`../`)||e.startsWith(`.\\`))}function Ya(e,t){let n={...e};return Ja(n.command)&&!nt(n.command)&&(n.command=k(t,n.command)),Array.isArray(n.args)&&(n.args=n.args.map(e=>Ja(e)?k(t,e):e)),n}function Xa(e){let t=e.plugins??ur({cwd:e.workspaceDir,homedir:e.homedir,disabled:e.disabled}),n={};for(let e of t){if(e.manifest.contributes?.mcp===!1)continue;let t=N(e);if(t.gated||!(e.manifest.capabilities?.includes(`mcp.server`)??!1)||t.pendingCapabilities.includes(`mcp.server`))continue;let r=si(e.dir);for(let[t,i]of Object.entries(r))n[t]={...Ya(i,e.dir),_pluginId:e.id}}return n}const Za=(e,t,n)=>{let r=j.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 Qa(e){return e.code===`MCP_UNAUTHORIZED`?`MCP server "${e.name}" requires authentication. Run 'otto mcp login ${e.name}' to authenticate.`:null}var $a=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?Xa({workspaceDir:this.workspaceDir,homedir:E(),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 ai({skipOnError:!0,processSpawnFactory:Za,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=Qa(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)}},eo=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)}},to=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})}},no=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]})}},ro=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=N(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}}))}},io=class{providers;deps;constructor(e){this.deps=e,this.providers=[new eo(e.mcp),...e.skills?[new to(e.settings,e.skills)]:[],new no(e.settings,e.getAgentProfiles),...e.getPlugins?[new ro(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)}},ao=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}},oo=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 so=A(`@x-otto/coding:sigil-expand`),co=/\[@([a-z][\w.-]*):((?:\\\]|[^\]])+)\]/g,lo=/\[@([a-z][\w.-]*)\]/g,uo=/@([\w./-]+):(\d+)(?:-(\d+))?/g,fo=/@def:([A-Za-z_]\w*)/g;function po(e,t){let n=new Set,r=[];for(let i of[co,lo]){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,`]`)})}}uo.lastIndex=0;for(let i of e.matchAll(uo)){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)}))}fo.lastIndex=0;for(let i of e.matchAll(fo)){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 mo(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 ho(e,t){return e.length<=t?e:`${e.slice(0,t)}\n[...truncated ${e.length-t} chars...]`}async function go(e,t,n,r){let i=po(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 so.debug({chip:e.raw},`uiHostOnly resolver skipped in non-uiHost context`),null;let c=i.timeoutMs??1e4,l=await mo(Promise.resolve().then(()=>i.resolve(e.param,s)),c);return l===``?null:[e.raw,ho(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`){so.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 _o=e(import.meta.url);function vo(e,t){let n=t.entries(e);if(!n?.length)return[];let r=N(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=O(e.dir,t.entryPath(r));if(!x(n)){t.logger.warn({pluginId:e.id,...t.idLogFields(r),modulePath:n},`${t.noun} entry not found, skipped`);continue}try{delete _o.cache[n];let a=_o(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 yo(e,t,n){if(!n)return e.flatMap(e=>vo(e,t));let r=new Map,i=[];for(let a of e)for(let e of vo(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 bo=A(`@x-otto/coding:plugin-a2ui-renderer-loader`),xo={capability:`a2ui.renderer`,axis:`a2uiRenderers`,noun:`a2ui renderer`,pendingNote:`RFC-210 D5`,logger:bo,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 So(e){return yo(e,xo)}function Co(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 wo=2e3;async function To(e,t){for(let n of e)if(Co(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 ${wo}ms`)),wo))]);if(Array.isArray(e)&&e.length>0)return e}catch(e){bo.warn({a2uiRendererId:n.id,err:String(e)},`toPayload failed, trying next candidate (fail-soft)`)}return null}const Eo={file_read:[`read`],file_write:[`write`],file_edit:[`edit`],shell:[`bash`],search:[`find`,`grep`]};function Do(e){if(e===void 0)return;if(e.length===0)return[];let t=new Set;for(let n of e){let e=Eo[n];if(e&&e.length>0){for(let n of e)t.add(n);continue}t.add(n)}return[...t]}function Oo(){return process.env.OTTO_SUBAGENT_MODEL_POLICY===`off`}var ko=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=le(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 y({slots:this.deps.settings.get(`model_slots`)?.slots??{},default:t},n).candidates(e).filter(e=>e.id!==t.id)}categoryCandidates(e,t,n){let r=[],i=e=>{if(e){let t=n.tryResolve(e);t&&r.push(t)}},a=this.deps.settings.get(`categories`)?.[e];i(a?.default_model);for(let e of a?.preferred_models??[])i(e);if(r.length>0)return r;if(Oo())return[];let o=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 Ao(e,t){let n=new Set(t);return e.filter(e=>n.has(e.name))}function jo(e,t,n,r,i){let a;return a=t||(n?Ao(e(),n):e()),r?.length&&(a=a.filter(e=>!r.includes(e.name))),i||(a=a.filter(e=>!Pe.has(e.name))),a}function Mo(e,t,n,r){let i=n?[...t.disallowedToolNames??[],...r]:t.disallowedToolNames;return jo(e,void 0,t.toolNames,i,t.allowSubagents)}const No=[`edit`,`write`,`lsp_rename`,`bash`];function Po(e,t,n,r){let i=Hn([...t,...vi],n),a=Ua(new Set(r.map(e=>e.name)));return()=>e.assemblePreset({preset:`subagent`,agentName:n,profile:i,promptMode:i?.promptMode},a)}var Fo=class{modelResolver;constructor(e){this.deps=e,this.modelResolver=new ko(e)}readAgentSources(e,t){let n=e?this.deps.settings.get(`agents`)?.[e]:void 0,r=t===`subagent`&&e?Hn([...this.deps.getDeclarativeAgentProfiles(),...vi],e):void 0;return{slot:n?.default_workflow_slot,profileTier:r?.preferredModelTier,toolNames:n?.tools??Do(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 Mo(this.deps.getTools,i,n,No)}resolveTools(e,t,n,r){return jo(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??[],...No]:n.disallowedToolNames,u=this.resolveTools(e.tools,n.toolNames,l,n.allowSubagents);s.supportsTools===!1&&(u=[]);let d=Ua(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??rn(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=bn(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??Io(this.deps.getResilienceConfig?.().networkDisconnect),lifecycleAsyncTimeoutMs:Lo(process.env.OTTO_LIFECYCLE_ASYNC_TIMEOUT_MS),describeImages:this.deps.describeImages}}};function Io(e){if(e)return{maxRetries:e.maxRetries,initialDelayMs:e.intervalMs,backoffFactor:1,maxDelayMs:e.intervalMs}}function Lo(e){if(!e)return;let t=Number(e);return Number.isFinite(t)&&t>0?t:void 0}const Ro=Ve.O_NOFOLLOW??0;function zo(e,t){let n=Ge(e,Ve.O_WRONLY|Ve.O_APPEND|Ve.O_CREAT|Ro,384);try{$e(n,t.endsWith(`
|
|
5
5
|
`)?t:t+`
|
|
6
|
-
`)}finally{
|
|
6
|
+
`)}finally{Be(n)}}function Bo(e,t=20){let n;try{return n=Ge(e,Ve.O_RDONLY|Ro),C(n,`utf-8`).replace(/\n+$/,``).split(`
|
|
7
7
|
`).slice(-t).join(`
|
|
8
|
-
`)}catch{return``}finally{n!==void 0&&
|
|
9
|
-
`)}function
|
|
8
|
+
`)}catch{return``}finally{n!==void 0&&Be(n)}}function Vo(e){return e.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
|
|
9
|
+
`)}function Ho(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 At({stream:e.stream,logger:e.logger,agentName:e.runId,maxToolTurns:e.maxToolTurns,toolHookExecutor:$t({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=>{un.setAwaitingApproval(e.runId,`${t}: ${i}`),r=t=>{un.clearAwaitingApproval(e.runId),n(t)};try{zo(e.outputPath,`⏳ 需要你确认「${t}」:${i}\n 进 Delegates 面板按 o,回复 yes 允许 / no 拒绝。`)}catch{}a(i)}):Promise.resolve(!1)}});i.on(`turn.end`,({message:t})=>{let n=Vo(t);if(n)try{zo(e.outputPath,n)}catch{}});let a=()=>{if(r){let e=r;r=void 0,e(!1)}i.abort()},o=Ht(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:Vo(e),messages:n.messages,tokenUsage:{input:e.usage.inputTokens,output:e.usage.outputTokens,cacheRead:e.usage.cacheReadTokens},durationMs:Date.now()-t})).finally(()=>{o(),un.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 Uo=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=en(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 vn(s,this.deps.onWorktreeCleanupError),e}let u=n.register({id:o,sessionId:e.sessionId,title:e.title,origin:e.origin,worktree:s,outputPath:c,abort:l.abort});return this.ownedJobIds.add(o),this.handles.set(o,l),l.promise.then(t=>this.onRunComplete(o,e.title,e.sessionId,s,c,t)).catch(t=>this.onRunFailed(o,e.title,e.sessionId,t)).finally(()=>this.handles.delete(o)),u}supply(e,t){let n=this.handles.get(e);if(!n?.steer)return!1;let r=this.deps.registry.get(e);return!r||r.status!==`running`&&r.status!==`needs_input`?!1:(n.steer(t),r.status===`needs_input`&&this.deps.registry.update(e,{status:`running`}),!0)}dispose(){for(let e of this.ownedJobIds)this.deps.registry.cancel(e);this.ownedJobIds.clear(),this.handles.clear(),this.appliedDiffs.clear()}onRunComplete(e,t,n,r,i,a){let o=this.deps.registry.get(e);if(!o||o.status===`canceled`)return;let s=``;try{s=Tn(r)}catch(r){this.onRunFailed(e,t,n,r);return}if(this.deps.registry.update(e,{status:`ready`,diff:s}),s.trim()){this.deps.notify(n,{jobId:e,title:t,status:`ready`,summary:`produced a diff (${Ko(s)})`,outputPath:i,worktree:{path:r.path,branch:r.branch}});return}let c=Wo(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 Tn(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=wn(r),a=Cn(r),{added:o,removed:s}=Go(r),c=!Gt(this.deps.repoRoot,r),l=tn({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=Vt(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=pn(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=Sn(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 Wo(e){let t=e?.text;return typeof t==`string`?t:``}function Go(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
|
|
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+`
|
|
11
|
+
`))r.startsWith(`+`)&&!r.startsWith(`+++`)?t++:r.startsWith(`-`)&&!r.startsWith(`---`)&&n++}return{added:t,removed:n,binaryFiles:r}}function Ko(e){let{added:t,removed:n,binaryFiles:r}=Go(e);return`+${t}/-${n}${r>0?`, ${r} binary file${r===1?``:`s`}`:``}`}const qo=/^[a-zA-Z0-9_-]+$/;function Jo(e){return{save(t,n){if(!qo.test(t))throw Error(`Invalid jobId for applied diff store: ${t}`);S(e,{recursive:!0}),T(O(e,`${t}.patch`),n,`utf-8`)},load(t){let n=O(e,`${t}.patch`);if(x(n))return C(n,`utf-8`)},delete(t){let n=O(e,`${t}.patch`);x(n)&&Qe(n)},loadAll(){return x(e)?Ke(e).filter(e=>tt(e)===`.patch`).map(t=>({jobId:t.slice(0,-6),diff:C(O(e,t),`utf-8`)})):[]}}}const Yo=[`delegate_job`];function Xo(e){return e.filter(e=>!Yo.includes(e.name))}function Zo(){return`job_${ki().replace(/-/g,``).slice(0,8)}`}function Qo(e){let t=e.outputDir??O(et(),`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 Uo({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?Jo(e.appliedDiffDir):void 0,spawnRun:({runId:t,prompt:n,outputPath:r,workspaceDir:i,onAwaitingInput:a,model:o})=>{let s=o?ts(o,e):void 0;return Ho({runId:t,prompt:n,outputPath:r,model:s?.model??e.getModel(),thinkingLevel:s?.thinkingLevel,systemPrompt:e.systemPrompt,tools:[...Xo(e.buildTools(i)),...e.mcpTools?.()??[]],maxToolTurns:e.maxToolTurns,stream:e.stream,logger:e.logger,hookRegistry:e.hookRegistry,onAwaitingInput:a})},buildOutputPath:e=>(S(t,{recursive:!0}),O(t,`agent-job-${e}.log`)),newJobId:e.newJobId??Zo})}const $o=[`low`,`medium`,`high`,`xhigh`,`max`];function es(e){return $o.includes(e)}function ts(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(!es(e.thinkingLevel))throw Error(`Invalid thinking level "${e.thinkingLevel}" (expected low|medium|high|xhigh|max)`);r=e.thinkingLevel}return{model:n,thinkingLevel:r}}function ns(e){return Qo({repoRoot:e.workspaceDir,registry:cn,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:O(r,`jobs`,`applied`)})}function rs(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 is(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 as(e){let t=Error(e);return t.name=`AbortError`,t}function os(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=Ht(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 as(`Task cancelled before the session started`);let e=n.agentName?`<agent-guardrails>\n${Rn}\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(as(`Task cancelled`))})})]);let a=s.session.messages(),o=rs(a),c=is(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{un.setMessages(l,s.session.messages()),u(),un.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 ss(e){let t=new Ni({focusTracking:process.env.OTTO_TUI_FOCUS===`1`}),n=new Mi({getConfig:e.getConfig,getCwd:e.getCwd,onInteraction:()=>t.recordInteraction(),isFollowUpPending:e.isFollowUpPending,gate:new Fi({getCondition:()=>e.getConfig()?.condition,getIdleThresholdMs:()=>e.getConfig()?.idle_threshold_ms,state:t})});return n.registerChannel(new Pi({getConfig:e.getConfig})),n.registerChannel(new Ai(`hook`,()=>!0,t=>e.emitHookNotification({sessionId:t.sessionId,message:t.message,title:t.title,notification_type:t.type}))),n.registerChannel(new ji({getConfig:e.getConfig,isTrusted:()=>Si(e.getCwd())})),{dispatcher:n,presenceTracker:t}}function cs(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 ls=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=ce(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=fe(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=cs(await se(c),c.modelIdExclude),n=ce(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 us(e){return e.modelRegistry.getAll()}function ds(e,t){return e.modelRegistry.resolve(t)}function fs(e){return e.providerRegistry.list()}function ps(e,t){e.hookRegistry.register(t)}function ms(e,t){return e.hookRegistry.unregister(t)}async function hs(e){return e.modelCatalogManager.hydrate()}function gs(e,t){return e.codingSessionPool.getSessionAvailableModels(t)}function _s(e,t,n){e.codingSessionPool.setSessionAvailableModels(t,n)}async function vs(e){return e.modelCatalogManager.refresh()}async function ys(e,t){let n=new Set(t?e.codingSessionPool.getSessionAvailableModels(t):[]),r=ie(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 bs=class{constructor(e){this.host=e}get modelRegistry(){return this.host.modelRegistry}get authStore(){return this.host.authStore}getAllModels(){return us(this.host)}resolveModel(e){return ds(this.host,e)}listProviders(){return fs(this.host)}hydrateModelCache(){return hs(this.host)}getSessionAvailableModels(e){return gs(this.host,e)}setSessionAvailableModels(e,t){_s(this.host,e,t)}refreshModels(){return vs(this.host)}buildModelCatalog(e){return ys(this.host,e)}};function xs(e,t){e.notificationDispatcher.registerChannel(t)}function Ss(e,t){e.notificationDispatcher.registerChannel(new Ai(`inapp`,()=>!0,e=>t(e.title??`otto`,e.message,e.type)))}function Cs(e){e.presenceTracker.recordInteraction()}function ws(e,t){e.presenceTracker.setFocus(t)}var Ts=class{constructor(e){this.host=e}registerNotificationChannel(e){xs(this.host,e)}registerInAppNotificationChannel(e){Ss(this.host,e)}notifyUserInteraction(){Cs(this.host)}setTerminalFocus(e){ws(this.host,e)}setFollowUpPendingProbe(e){this.host.setFollowUpPendingProbe?.(e)}};async function Es(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 Ds(e){return e.settings.get(`permission_mode`)??`auto`}async function Os(e,t){let n=Ds(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 ks(e,t){return e.permissionRegistry.getSessionAlwaysAllow(t)}async function As(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 js(e,t){t&&(e.permissionRegistry.clearSessionAlwaysAllow(t),e.codingSessionPool.setSessionPermissionAllow(t,[]),e.logger.info({sessionId:t},`Session always-allow list cleared`))}var Ms=class{constructor(e){this.host=e}allowToolAlways(e,t){return Es(this.host,e,t)}disallowToolAlways(e){return As(this.host,e)}setPermissionMode(e){return Os(this.host,e)}getPermissionMode(){return Ds(this.host)}getSessionAlwaysAllow(e){return ks(this.host,e)}clearSessionAlwaysAllow(e){js(this.host,e)}bashAlwaysAllowPrefix(e){return be(e)}isWellFormedAllowEntry(e){return Ne(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 Ns(e,t={}){e.ensureNotDisposed(),await e.ensureSettingsLoaded();let n=await e.sessionConfigResolver.resolve(t),r=await e.agentRuntime.createSession(n);return e.notificationDispatcher.attach(r),e.toolsSyncCoordinator?.record(r.id,{agentName:t.agentName,promptPreset:t.promptPreset??(t.agentName?`subagent`:`main`),readOnly:t.readOnly,hasExplicitTools:t.tools!==void 0}),e.logger.info({sessionId:r.id},`Session created`),r}function Ps(e,t){return e.codingSessionPool.getSession(t)}async function Fs(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 Is(e){return e.codingSessionPool.active}function Ls(e,t){return e.codingSessionPool.listSessions(t)}async function Rs(e,t){let n=Ls(e,t).filter(t=>{let n=e.codingSessionPool.getSession(t.id);return n?!(n.transient===!0||n.depth>0||n.listable===!1):!0}),r;try{r=t?.workspaceId===void 0?e.workspaceRef?.key:zi(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 zs(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 Bs(e,t){let n=await e.codingSessionPool.archiveSession(t);return n&&e.logger.info({sessionId:t},`Session archived`),n}async function Vs(e,t,n){let r=await e.codingSessionPool.forkSession(t,n);return r&&e.notificationDispatcher.attach(r),r}async function Hs(e,t,n){let r=n.current;if(!r)throw Error(`导出归档仅支持关系化 SQLite 后端(sessions.db)。当前后端不支持。`);let i=await mi(e,r);if(!i)throw Error(`会话 ${e.slice(0,8)} 不存在或无法加载`);let a=JSON.stringify(i,null,2),o=Oi(`sha256`).update(a,`utf-8`).digest(`hex`);await Vi(D(t),{recursive:!0}),await Wi(t,a,`utf-8`);let s=await Ui(t,`utf-8`),c=Oi(`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 Us=class{constructor(e){this.host=e}get sessionManager(){return this.host.codingSessionPool}createSession(e={}){return Ns(this.host,e)}getSession(e){return Ps(this.host,e)}getActiveSession(){return Is(this.host)}listSessions(e){return Ls(this.host,e)}listAllSessions(e){return Rs(this.host,e)}removeSession(e){return zs(this.host,e)}forkSession(e,t){return Vs(this.host,e,t)}shareSession(e,t){return Fs(this.host,e,t)}archiveSession(e){return Bs(this.host,e)}exportSessionArchive(e,t){return Hs(e,t,this.host.sessionRepoRef??{})}getResidencyConfig(){return this.host.getResidencyConfig?.()}sweepOrphanTraceFiles(){return this.host.sweepOrphanTraceFiles?.()??Promise.resolve()}},Ws=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 Gs=A(`@x-otto/coding:plugin-panel-manager`);function Ks(e){let t=e.plugins??ur({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=N(e);if(!r.gated){if(!e.manifest.capabilities?.includes(`tui.renderer`)){Gs.warn({pluginId:e.id},`plugin declares contributes.panels but not capabilities:["tui.renderer"], skipped (fail-closed)`);continue}if(r.pendingCapabilities.includes(`tui.renderer`)){Gs.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=O(e.dir,r.entry);if(!x(t)){Gs.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 qs(e){let t=[];for(let n of e){if(N(n).gated)continue;let e=n.manifest.contributes?.statusItems;if(!e?.length)continue;let r=fr(n.manifest.contributes?.contextKeys);for(let i of e){if((i.point??tr.statuslineItem)!==tr.statuslineItem||!mr(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 Js(e){let t=[];for(let n of e){if(N(n).gated)continue;let e=n.manifest.contributes;if(!e?.menus?.length)continue;let r=fr(e.contextKeys);t.push(...jr(tr.menuItem,e.menus,e.actions,r))}return t}const Ys={capability:`tui.renderer`,axis:`renderers`,noun:`renderer`,pendingNote:`RFC-140 D3`,logger:A(`@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 Xs(e){return yo(e,Ys)}const Zs=A(`@x-otto/coding:plugin-a2ui-component-loader`),Qs=new Set([`Text`,`Card`,`List`,`Progress`,`Chip`,`Button`]),$s={capability:`a2ui.component`,axis:`a2uiComponents`,noun:`a2ui component`,pendingNote:`RFC-140 D3 pattern`,logger:Zs,entries:e=>e.manifest.contributes?.a2uiComponents,entryPath:e=>e.entry,exportName:e=>e.export,idLogFields:e=>({type:e.type}),logTypeofOnNotFunction:!1,preCheck:(e,t)=>Qs.has(t.type)?(Zs.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 ec(e){return yo(e,$s,{key:e=>e.type,onConflict:(e,t)=>{Zs.warn({pluginId:e.pluginId,type:e.type,existingOwner:t},`a2ui component type already registered by another plugin, rejected (first-registered wins)`)}})}const tc={capability:`tui.renderer`,axis:`statusWidgets`,noun:`status widget`,pendingNote:`RFC-140 D3 pattern`,logger:A(`@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 nc(e){return yo(e,tc)}const rc={capability:`tui.renderer`,axis:`fileViewers`,noun:`file viewer`,pendingNote:`RFC-140 D3 pattern`,logger:A(`@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 ic(e){return yo(e,rc)}var ac=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 Ks({workspaceDir:this.deps.getWorkspaceDir(),homedir:E(),disabledPlugins:this.deps.settings.get(`disabled_plugins`),plugins:this.deps.getActivePlugins()})}getPluginStatusItems(){return qs(this.deps.getActivePlugins())}getGlobalMenuItems(){return Js(this.deps.getActivePlugins())}getPluginRenderers(){return Xs(this.deps.getActivePlugins())}getPluginA2uiComponents(){return ec(this.deps.getActivePlugins())}getPluginStatusWidgets(){return nc(this.deps.getActivePlugins())}getPluginFileViewers(){return ic(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 z=A(`@x-otto/coding:plugin-hooks`),oc=4096;function sc(e,t){let n=ct();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 cc(e){let t=lt(e);return t.safe?null:{success:!1,hook:`pre-check`,command:e,error:`Dangerous command blocked: ${t.reason}`}}function lc(e,t){let n=!1,r,i;if(e?.length){let t=typeof e==`string`?e:e.toString(`utf-8`);r=t.slice(0,oc),n=t.length>oc}if(t?.length){let e=typeof t==`string`?t:t.toString(`utf-8`);i=e.slice(0,oc),n||=e.length>oc}return{stdout:r,stderr:i,truncated:n}}async function uc(e,t){return cc(t)||(z.info({pluginId:e.pluginId,command:t},`Executing postinstall hook`),new Promise(n=>{let r=F(t,{cwd:e.pluginDir,env:sc(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}=lc(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||z.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 dc(e,t,n,r,i){let a=cc(t);if(a){z.warn({pluginId:e.pluginId,command:t},`Setup hook blocked by safety check`),n?.(a);return}if(z.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:sc(e),signal:i}),o=setTimeout(()=>{z.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?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);
|
|
16
|
-
[context truncated: budget exceeded]`;function
|
|
14
|
+
`}),a.onExit(r=>{clearTimeout(o);let{stdout:i,stderr:a,truncated:l}=lc(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?z.info({pluginId:e.pluginId},`Setup hook succeeded`):z.error({pluginId:e.pluginId,exitCode:r.code,signal:r.signal,stderr:a?.slice(0,512)},`Setup hook failed`),n?.(u)}),a.onError(r=>{z.error({pluginId:e.pluginId,err:r},`Setup hook spawn error`),n?.({success:!1,hook:`setup`,command:t,error:r.message})});return}let o=F(t,{cwd:e.pluginDir,env:sc(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}=lc(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?z.info({pluginId:e.pluginId},`Setup hook succeeded`):z.error({pluginId:e.pluginId,exitCode:r,signal:i,stderr:o?.slice(0,512)},`Setup hook failed`),n?.(u)}),o.on(`error`,r=>{z.error({pluginId:e.pluginId,err:r},`Setup hook spawn error`),n?.({success:!1,hook:`setup`,command:t,error:r.message})})}const fc=A(`@x-otto/coding:plugin-lifecycle`),pc=`plugin_lifecycle`,mc=new Set;async function hc(e,t,n){let r=t.get(pc)?.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(N(r).gated){fc.info({pluginId:r.id},`Setup hook deferred: plugin not yet trusted`);continue}mc.has(r.id)||(mc.add(r.id),dc({pluginDir:r.dir,pluginId:r.id,workspaceDir:n},s,e=>{mc.delete(r.id),i.set(r.id,a),gc(t,i)},j))}}o&&await gc(t,i)}async function gc(e,t){let n=[...t].map(([e,t])=>({id:e,version:t}));await e.persist({[pc]:{setupDone:n}})}function _c(e,t){let n;try{n=w(t)}catch{return!1}let r;try{r=w(e)}catch{r=e}return r===n||r.startsWith(n+it)}const B=A(`@x-otto/coding:plugin-i18n-loader`),vc=/^([a-zA-Z0-9_-]+)\.json$/;function yc(e){return Buffer.byteLength(e,`utf8`)<=Yn?e:`${Buffer.from(e,`utf8`).subarray(0,Yn).toString(`utf8`)}…`}function bc(e,t,n){let r=new Map,i=k(t,n);if(!_c(i,t))return B.warn({pluginId:e,i18nDir:n},`i18nDir resolves outside plugin dir, skipped`),r;let a;try{a=Ke(i)}catch{return r}let o=a.filter(e=>vc.test(e)).sort();o.length>Jn&&(B.warn({pluginId:e,i18nDir:n,declared:o.length,limit:Jn},`plugin i18nDir declares more locale files than the per-plugin limit, truncated`),o=o.slice(0,Jn));for(let n of o){let a=vc.exec(n)?.[1];if(!a)continue;let o=k(i,n);if(!_c(o,t)){B.warn({pluginId:e,filename:n},`i18nDir locale file resolves outside plugin dir, skipped`);continue}let s;try{s=C(o,`utf8`)}catch(t){B.warn({pluginId:e,filename:n,err:String(t)},`i18nDir locale file read failed, skipped`);continue}if(Buffer.byteLength(s,`utf8`)>qn){B.warn({pluginId:e,filename:n,limit:qn},`i18nDir locale file exceeds byte limit, skipped`);continue}let c;try{c=JSON.parse(s)}catch(t){B.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)){B.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 xc(e){let t=[];for(let n of e){if(N(n).gated)continue;let e=n.manifest.contributes?.i18nDir,r=n.manifest.contributes?.i18n;if(!e&&!r?.length)continue;let i=e?bc(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&&B.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>Kn&&(B.warn({pluginId:n.id,declared:a.length,limit:Kn},`plugin declares more i18n entries than the per-plugin limit, truncated`),a=a.slice(0,Kn));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]=yc(t);t.push({pluginId:n.id,id:e,translations:a})}}return t}const Sc=A(`@x-otto/coding:declarative-agents`);function Cc(e){return{...e,defaultTools:e.defaultTools?.length?dt(e.defaultTools):e.defaultTools,disallowedTools:e.disallowedTools?.length?dt(e.disallowedTools):e.disallowedTools}}function wc(e,t){let n=ht(e);if(!n)return Sc.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 Sc.warn({sourcePath:t},`Agent definition requires name/description/body, skipped`),null;let s=pt(r.get(`tools`)),c=Number.parseInt(r.get(`maxtoolturns`)??``,10),l=Number.parseInt(r.get(`maxtoolturnextensions`)??``,10),u=r.get(`prompt-mode`),d=pt(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:pt(r.get(`tasktypes`))??[o],capabilities:pt(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 Tc(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??ur({cwd:e,homedir:n()})).filter(e=>e.manifest.contributes?.agents!==!1).filter(e=>!N(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 Ec(e))d.set(n.name,t?Cc(n):n);let f=[...d.values()];return f.length>0&&Sc.info(`Loaded %d declarative agent(s): %s`,f.length,f.map(e=>e.name).join(`, `)),f}async function Ec(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){Sc.warn({sourcePath:i,err:e},`Failed to read agent definition, skipped`)}}return a}const Dc=A(`@x-otto/coding:declarative-teams`),Oc=new Set([`handoff`,`sequential`,`parallel`,`hierarchical`,`router`]);function kc(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 Ac(e,t){let n=ht(e);if(!n)return Dc.warn({sourcePath:t},`Team definition missing frontmatter, skipped`),null;let{fields:r}=n,i=r.get(`name`),a=r.get(`pattern`),o=pt(r.get(`agents`));if(!i||!a||!Oc.has(a)||!o||o.length===0)return Dc.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:pt(r.get(`pipeline`)),supervisorId:r.get(`supervisor`),entryAgentId:r.get(`entry`),routerStrategy:r.get(`router`),rules:kc(r.get(`rules`)),maxHandoffDepth:Number.isInteger(s)?s:void 0}}async function jc(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 Mc(e))o.set(t.name,t);let s=[...o.values()];return s.length>0&&Dc.info(`Loaded %d declarative team(s): %s`,s.length,s.map(e=>e.name).join(`, `)),s}async function Mc(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=Ac(await t(i,`utf-8`),i);e&&a.push(e)}catch(e){Dc.warn({sourcePath:i,err:e},`Failed to read team definition, skipped`)}}return a}var Nc=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(),hc(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=>!N(e).gated).map(e=>({id:e.id,dir:O(e.dir,`skills`)}))),await this.skills.discover());let e=xc(this.activePlugins());this.i18n.register(e);let t=(await this.modelCatalog.refresh().catch(()=>[])).reduce((e,t)=>e+(t.added??0),0),n=await Tc(this.workspaceDir,{plugins:this.activePlugins(),claudeProjectAgentsAllowed:this.getCompatTrustGated?!this.getCompatTrustGated():void 0}),r=await jc(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 Pc=A(`@x-otto/coding:panel-backend-controller`);var Fc=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=N(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&&Pc.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 Ic=A(`@x-otto/coding:plugin-log-writer`);function Lc(){return k(r,`plugin-logs`)}function Rc(e){return Gn.test(e)?O(Lc(),`${e}.jsonl`):(Ic.warn({pluginId:e},`plugin id failed kebab-case validation, skipping log path resolution`),null)}function zc(e){let t;try{t=Xe(e).size}catch{return}if(!(t<=5242880))try{let t=C(e,`utf8`),n=Math.floor(t.length/2),r=t.indexOf(`
|
|
15
|
+
`,n);T(e,r>=0?t.slice(r+1):t.slice(n))}catch(t){Ic.warn({path:e,err:String(t)},`plugin log truncation failed (fail-soft)`)}}function Bc(e,t,n){if(!c())try{let r=Rc(e);if(!r)return;let i=Lc();x(i)||S(i,{recursive:!0}),zc(r),ze(r,`${JSON.stringify({ts:Date.now(),level:t,pluginId:e,msg:n})}\n`)}catch(t){Ic.warn({pluginId:e,err:String(t)},`plugin log append failed (fail-soft)`)}}const V=A(`@x-otto/coding:plugin-tool-wiring`);function H(e,t){return`plugin:${e}:${t}`}function Vc(e){let t=e.split(`:`);return t.length<3||t[0]!==`plugin`?null:t[1]||null}function Hc(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 U={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 Uc(e,t){let n=[];if(t.preToolUse){let r=t.preToolUse;n.push(I({name:H(e,`preToolUse`),timing:U.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(I({name:H(e,`postToolUse`),timing:U.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(I({name:H(e,`userPromptSubmit`),timing:U.userPromptSubmit,handle:async e=>{await r({prompt:Hc(e.message)})}}))}if(t.sessionStart){let r=t.sessionStart;n.push(I({name:H(e,`sessionStart`),timing:U.sessionStart,handle:async()=>{await r()}}))}if(t.stop){let r=t.stop;n.push(I({name:H(e,`stop`),timing:U.stop,handle:async()=>{await r()}}))}if(t.sessionRestored){let r=t.sessionRestored;n.push(I({name:H(e,`sessionRestored`),timing:U.sessionRestored,handle:async e=>{await r({sessionId:e.sessionId})}}))}if(t.sessionDeleted){let r=t.sessionDeleted;n.push(I({name:H(e,`sessionDeleted`),timing:U.sessionDeleted,handle:async e=>{await r({sessionId:e.sessionId})}}))}if(t.sessionIdle){let r=t.sessionIdle;n.push(I({name:H(e,`sessionIdle`),timing:U.sessionIdle,handle:async e=>{await r({sessionId:e.sessionId})}}))}if(t.sessionError){let r=t.sessionError;n.push(I({name:H(e,`sessionError`),timing:U.sessionError,handle:async e=>{await r({sessionId:e.sessionId,error:e.error})}}))}if(t.streamStart){let r=t.streamStart;n.push(I({name:H(e,`streamStart`),timing:U.streamStart,handle:async e=>{await r({sessionId:e.sessionId,model:e.model})}}))}if(t.compactionPending){let r=t.compactionPending;n.push(I({name:H(e,`compactionPending`),timing:U.compactionPending,handle:async e=>{await r({sessionId:e.sessionId,messageCount:e.messageCount})}}))}if(t.compactionOccurred){let r=t.compactionOccurred;n.push(I({name:H(e,`compactionOccurred`),timing:U.compactionOccurred,handle:async e=>{await r({sessionId:e.sessionId,retainedCount:e.retainedCount})}}))}if(t.taskCreated){let r=t.taskCreated;n.push(I({name:H(e,`taskCreated`),timing:U.taskCreated,handle:async e=>{await r({taskId:e.task.id})}}))}if(t.taskStarted){let r=t.taskStarted;n.push(I({name:H(e,`taskStarted`),timing:U.taskStarted,handle:async e=>{await r({taskId:e.task.id,agent:e.agent})}}))}if(t.onNotification){let r=t.onNotification;n.push(I({name:H(e,`onNotification`),timing:U.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(I({name:H(e,`taskCompleted`),timing:U.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(I({name:H(e,`taskFailed`),timing:U.taskFailed,handle:async e=>{await r({taskId:e.task.id,error:e.error.message})}}))}if(t.taskCancelled){let r=t.taskCancelled;n.push(I({name:H(e,`taskCancelled`),timing:U.taskCancelled,handle:async e=>{await r({taskId:e.taskId})}}))}if(t.waterfall)for(let r of Object.keys(t.waterfall)){if(!qi(r)){V.warn({pluginId:e,timing:r},`plugin waterfall timing not in whitelist, rejected (fail-closed)`),Bc(e,`warn`,`waterfall timing "${r}" not in whitelist, rejected (fail-closed)`);continue}let i=t.waterfall[r];i&&n.push(I({name:H(e,`waterfall:${r}`),timing:r,handle:async(t,n)=>r===`system.prompt.transform`?Wc(e,i,t,n):Gc(e,r,i,t,n)}))}return n}async function Wc(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=qc(r,n);if(e.truncated){l=!0,t.push(`${e.content}${Jc}`);break}t.push(e.content),n-=Buffer.byteLength(e.content,`utf8`)}r.systemTail=t}if(s||c||l||Yc(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(`, `);Kc(e,`system.prompt.transform`,n.sessionId,a)}return o}async function Gc(e,t,n,r,i){let a=Xc(i),o=await n(r,i),s=Zc(t,a,i);return s&&Kc(e,t,(typeof r==`object`&&r&&`sessionId`in r?String(r.sessionId??``):void 0)||void 0,s),o}function Kc(e,t,n,r){let i=r.length>400?`${r.slice(0,400)}…`:r;V.info({pluginId:e,timing:t,...n?{sessionId:n}:{}},`plugin waterfall rewrite: ${i}`)}function qc(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 Jc=`
|
|
16
|
+
[context truncated: budget exceeded]`;function Yc(e,t){return t===void 0?e.length>0:e.length!==t.length||e.some((e,n)=>e!==t[n])}function Xc(e){if(typeof e!=`object`||!e)return{};let t={};for(let n of Object.keys(e))t[n]=e[n];return t}function Zc(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 Qc(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 $c(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 el(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 tl(e,t){return t instanceof at?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 ot(t instanceof Error?t.message:String(t),{code:`PROVIDER_PLUGIN_ERROR`,cause:t instanceof Error?t:void 0,pluginSource:e})}function nl(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:tl(e,o.error)}:yield o}catch(t){throw tl(e,t)}}}}}function rl(e,t){try{return t()}catch(t){let n=String(t);return V.warn({pluginId:e,err:n},`plugin oauthProviderFactory threw, skipped`),Bc(e,`warn`,`oauthProviderFactory threw, skipped: ${n}`),null}}function il(e){return e&&typeof e==`object`&&Array.isArray(e.content)?e:{content:[{type:`text`,text:typeof e==`string`?e:JSON.stringify(e??null)}]}}function al(e,t,n){let r=t;if(!r||typeof r!=`object`)return V.warn({pluginId:e},`plugin tool entry is not an object, skipped`),null;if(typeof r.name!=`string`||!r.name)return V.warn({pluginId:e},`plugin tool missing valid name, skipped`),null;if(typeof r.execute!=`function`)return V.warn({pluginId:e,tool:r.name},`plugin tool missing execute function, skipped`),null;if(!r.parameters||typeof r.parameters.safeParse!=`function`)return V.warn({pluginId:e,tool:r.name},`plugin tool missing valid parameters.safeParse, skipped`),null;typeof r.parameters.toJSONSchema!=`function`&&V.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=il(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 ol(e,t){let n=[],r=async(t,n)=>{try{await t.onEvent(n)}catch(n){V.warn({pluginId:e,monitorId:t.id,err:String(n)},`plugin monitor onEvent threw, isolated`)}};for(let i of t)n.push(I({name:H(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(I({name:H(e,`monitor:${i.id}:compaction.after`),timing:`compaction.after`,handle:async e=>{await r(i,{type:`compaction.occurred`,sessionId:e.sessionId})}})),n.push(I({name:H(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 ll(e){return new cl(e)}const ul=3600*1e3;function dl(){return{authorizedSessionIds:new Set,readCountThisEpoch:0,llmCountThisEpoch:0,llmCallTimes:[],notifyTimes:[]}}var fl=class{states=new Map;constructor(e=()=>Date.now()){this.now=e}stateOf(e){let t=this.states.get(e);return t||(t=dl(),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()-ul;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()-ul;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 pl(e){return e.kind===`session`?0:1}var ml=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)=>pl(e.request.origin)-pl(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(hl(n.request.question)))}}shutdown(){let e=this.queue.splice(0,this.queue.length);this.inFlightId=null;for(let t of e)t.resolve(hl(t.request.question))}};function hl(e){return{answer:``,acceptedRecommendation:!1,resolvedBy:`human`}}const W={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 gl(){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: '${
|
|
69
|
+
__send({ type: '${W.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: '${
|
|
108
|
+
__send({ type: '${W.crashed}', error: (err && err.message) || String(err) })
|
|
109
109
|
})
|
|
110
110
|
process.on('unhandledRejection', (err) => {
|
|
111
|
-
__send({ type: '${
|
|
111
|
+
__send({ type: '${W.crashed}', error: (err && err.message) || String(err) })
|
|
112
112
|
})
|
|
113
113
|
|
|
114
114
|
parentPort.on('message', async (msg) => {
|
|
115
|
-
if (msg.type === '${
|
|
115
|
+
if (msg.type === '${W.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 === '${
|
|
124
|
+
if (msg.type === '${W.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: '${
|
|
139
|
+
__send({ type: '${W.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: '${
|
|
171
|
+
__send({ type: '${W.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: '${
|
|
187
|
-
warn: (m) => __send({ type: '${
|
|
188
|
-
error: (m) => __send({ type: '${
|
|
186
|
+
info: (m) => __send({ type: '${W.hostCall}', callId: 'log', method: 'log.info', params: { msg: String(m) } }),
|
|
187
|
+
warn: (m) => __send({ type: '${W.hostCall}', callId: 'log', method: 'log.warn', params: { msg: String(m) } }),
|
|
188
|
+
error: (m) => __send({ type: '${W.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: '${
|
|
196
|
+
__send({ type: '${W.started}' })
|
|
197
197
|
} catch (err) {
|
|
198
|
-
__send({ type: '${
|
|
198
|
+
__send({ type: '${W.started}', error: (err && err.message) || String(err) })
|
|
199
199
|
}
|
|
200
200
|
return
|
|
201
201
|
}
|
|
202
202
|
|
|
203
|
-
if (msg.type === '${
|
|
203
|
+
if (msg.type === '${W.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: '${
|
|
210
|
+
__send({ type: '${W.crashed}', error: (err && err.message) || String(err) })
|
|
211
211
|
}
|
|
212
212
|
return
|
|
213
213
|
}
|
|
214
214
|
|
|
215
|
-
if (msg.type === '${
|
|
215
|
+
if (msg.type === '${W.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: '${
|
|
219
|
+
catch (e) { __send({ type: '${W.crashed}', error: (e && e.message) || String(e) }) }
|
|
220
220
|
}
|
|
221
221
|
return
|
|
222
222
|
}
|
|
223
223
|
|
|
224
|
-
if (msg.type === '${
|
|
224
|
+
if (msg.type === '${W.stop}') {
|
|
225
225
|
try {
|
|
226
226
|
if (serviceInstance && typeof serviceInstance.stop === 'function') await serviceInstance.stop()
|
|
227
|
-
__send({ type: '${
|
|
227
|
+
__send({ type: '${W.stopped}' })
|
|
228
228
|
} catch (err) {
|
|
229
|
-
__send({ type: '${
|
|
229
|
+
__send({ type: '${W.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 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
|
|
234
|
+
`}const _l=e(import.meta.url);let vl=!1,yl=()=>_l(`esbuild`);function bl(){return yl()}function xl(){vl=!0}function Sl(){if(vl)try{yl().stop?.()}catch{}}function Cl(e=process){e.once(`exit`,()=>Sl())}const wl=[`SIGINT`,`SIGTERM`,`SIGHUP`];function Tl(e=process){for(let t of wl){let n=()=>{e.listenerCount(t)>1||(Sl(),e.removeListener(t,n),e.kill?.(e.pid??process.pid,t))};e.on(t,n)}}function El(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 G=A(`@x-otto/coding:plugin-module-loader`),K=e(import.meta.url),Dl=[`plugin.ts`,`plugin.tsx`];function Ol(e){for(let t of Dl){let n=O(e,t);if(x(n))return n}return null}const kl={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 Al(){let e={};try{let t=import.meta.resolve(`@x-otto/shared`),n=D(L(t)),r=K.resolve(`pino`,{paths:[n]});e.pino=r,e[`thread-stream`]=K.resolve(`thread-stream`,{paths:[D(r)]}),e[`jsonc-parser`]=K.resolve(`jsonc-parser`,{paths:[n]}),e[`@x-otto/shared`]=t.startsWith(`file://`)?L(t):t;let i=import.meta.resolve(`@x-otto/provider`);e[`@x-otto/provider`]=i.startsWith(`file://`)?L(i):i;let a=import.meta.resolve(`@x-otto/interchange`);e[`@x-otto/interchange`]=a.startsWith(`file://`)?L(a):a;let o=import.meta.resolve(`@x-otto/env`);e[`@x-otto/env`]=o.startsWith(`file://`)?L(o):o}catch(e){G.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 jl=[`pino`,`thread-stream`,`jsonc-parser`,`undici`],Ml=`otto-host-external`,Nl=`__ottoPluginHostExternals`;function Pl(){let e=RegExp(`^(${jl.join(`|`)})$`);return{name:`otto-plugin-host-slot`,setup(t){t.onResolve({filter:e},e=>({path:e.path,namespace:Ml})),t.onLoad({filter:/.*/,namespace:Ml},e=>({contents:`const __slot = globalThis[${JSON.stringify(Nl)}]\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 Fl(){let e={};try{let t=D(L(import.meta.resolve(`@x-otto/shared`))),n=K.resolve(`pino`,{paths:[t]});e.pino=n,e[`thread-stream`]=K.resolve(`thread-stream`,{paths:[D(n)]}),e[`jsonc-parser`]=K.resolve(`jsonc-parser`,{paths:[t]}),e.undici=K.resolve(`undici`,{paths:[t]})}catch(e){G.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 Il(){let e=globalThis,t=e[Nl]??={};for(let[e,n]of Object.entries(Fl()))if(t[e]===void 0)try{t[e]=K(n)}catch(t){G.warn({module:e,path:n,err:String(t)},`failed to load host external into injection slot`)}}function Ll(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 Rl(e,t){let n=Ol(e);if(!n)return null;let r=O(e,`plugin-dist`);S(r,{recursive:!0});let i=O(r,`plugin.cjs`),a=t?.portable?{}:Al(),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}=bl();return xl(),await El(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:[kl,...t?.portable?[Pl()]:[Ll(a)]]}),t?.timeoutMs??12e4,()=>Sl()),Wl(r,e),i}const zl=[`.ts`,`.tsx`,`.js`,`.jsx`,`.mjs`,`.cjs`,`.json`];function Bl(e){let t=[],n=r=>{let i;try{i=Ke(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=O(r,i);if(a.isDirectory())n(o);else if(a.isFile()){let n=i.lastIndexOf(`.`),r=n>=0?i.slice(n):``;zl.includes(r)&&t.push(rt(e,o))}}};return n(e),t.sort()}function Vl(e){let t=Bl(e),n=Oi(`sha256`);for(let r of t){let t=r.split(it).join(`/`);n.update(t),n.update(`\0`);try{n.update(C(O(e,r)))}catch(e){n.update(`<unreadable:${e instanceof Error?e.message:String(e)}>`)}n.update(`\0`)}return n.digest(`hex`)}function Hl(e){return{apiVersion:Zn,compilerVersion:i,sourceHash:Vl(e)}}function Ul(e,t=e){let n=O(e,`plugin-dist`,`meta.json`);if(x(n))try{let e=JSON.parse(C(n,`utf8`));e.sourceHash=Vl(t),T(n,JSON.stringify(e))}catch(t){G.warn({pluginDir:e,err:String(t)},`failed to rewrite artifact sourceHash`)}}function Wl(e,t){try{let n=O(e,`meta.json`),r=O(e,`.meta.json.tmp-${process.pid}`);T(r,JSON.stringify(Hl(t))),Je(r,n)}catch(e){G.warn(`Failed to write plugin artifact meta: %s`,e instanceof Error?e.message:String(e))}}function Gl(e){try{let t=C(O(e,`plugin-dist`,`meta.json`),`utf8`),n=JSON.parse(t),r=Hl(e);return n.apiVersion===r.apiVersion&&n.compilerVersion===r.compilerVersion&&n.sourceHash===r.sourceHash}catch{return!1}}function Kl(e){let t=O(e,`plugin-dist`,`plugin.cjs`);return x(t)?Gl(e)?t:(G.info(`Plugin artifact at %s is stale (meta mismatch/missing) — recompiling`,t),null):null}async function ql(e,t,n){if(!Ol(e.dir))return null;if((e.scope===`project`||e.scope===`repository`)&&!Sr(e.dir))return G.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=N(e);if(r.pendingCapabilities.length>0)return G.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=Kl(e.dir);if(a)i=!0,G.info({pluginId:e.id,outfile:a},`using prebuilt plugin module (RFC-150 D5, skip compile)`);else try{a=await Rl(e.dir)}catch(t){let r=String(t);return G.warn({pluginId:e.id,err:r},`plugin.ts compile failed`),n?.(e.id,`compile failed: ${r}`,`module-error`),null}if(!a)return null;Il();let o;try{delete K.cache[a];let e=K(a);o=e?.default??e}catch(t){if(i){G.warn({pluginId:e.id,outfile:a,err:String(t)},`prebuilt plugin module failed to load — recompiling for this machine`);try{let t=await Rl(e.dir);if(!t)throw Error(`recompile produced no artifact`);a=t,delete K.cache[a];let n=K(a);o=n?.default??n}catch(t){let r=String(t);return G.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 G.warn({pluginId:e.id,err:r},`plugin.ts load failed`),n?.(e.id,`load failed: ${r}`,`module-error`),null}}if(typeof o!=`function`)return G.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 G.warn({pluginId:e.id,err:r},`plugin factory threw`),n?.(e.id,`factory threw: ${r}`,`module-error`),null}}const q=A(`@x-otto/coding:plugin-service-pool`),Jl=5e3;function Yl(e){return[`--experimental-permission`,`--allow-fs-read=*`,...e?[`--allow-fs-write=${e}`]:[]]}`${et()}`;let Xl=null,Zl=null;function Ql(){return Zl||(Xl||=We(O(et(),`otto-plugin-service-`)),Zl=O(Xl,`service-entry.cjs`),T(Zl,gl()),Zl)}function $l(e,t){return`${e}:${t}`}var eu=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($l(e,t))?.status}restartsOf(e,t){return this.services.get($l(e,t))?.restarts??0}notify(e,t,n){let r=this.services.get($l(e,t));if(!r||r.status!==`running`)return!1;try{return r.worker.postMessage({type:W.notify,notification:n}),!0}catch{return!1}}pushEvent(e,t){for(let n of this.runningServiceIds(e)){let r=this.services.get($l(e,n));if(r)try{r.worker.postMessage({type:W.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=$l(e.pluginId,e.serviceId);return await this.stop(e.pluginId,e.serviceId),this.spawnAndStart(t,e,0)}spawnAndStart(e,t,n){return new Promise(r=>{let i;try{i=new Ji(Ql(),{execArgv:[...Yl(t.storageDir)]})}catch(t){q.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=>{q.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:W.start,compiledPath:t.compiledPath,hostExternals:Fl(),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===W.started){n.error?(t.status=`failed`,q.warn({key:e,err:n.error},`plugin service failed to start`),r({error:n.error}),this.scheduleRestart(e,t)):(t.status=`running`,q.info({key:e},`plugin service started`),r({}));return}if(n.type===W.crashed){q.warn({key:e,err:n.error},`plugin service crashed at runtime`),t.status=`failed`,this.scheduleRestart(e,t);return}if(n.type===W.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??``;q[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:W.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}q.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){q.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);q.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=$l(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===W.stopped&&(r.worker.off(`message`,t),e(!0))};r.worker.on(`message`,t);try{r.worker.postMessage({type:W.stop})}catch{e(!1)}}),a=new Promise(e=>{setTimeout(()=>e(!1),Jl).unref?.()});await Promise.race([i,a])||q.warn({key:n,timeoutMs:Jl},`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(Xl){try{Ye(Xl,{recursive:!0,force:!0})}catch{}Xl=null,Zl=null}}};let tu=null;function nu(){return tu||=new eu,tu}async function ru(){await tu?.dispose(),tu=null}const iu=[/\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 au(e){let t=e;for(let e of iu)t=t.replace(e,`***`);return t}function ou(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:au(ou(e.content))};if(e.role===`assistant`){let t=e.content.filter(e=>e.type===`tool_call`)[0]?.name,n={role:`assistant`,text:au(ou(e.content))};return t&&(n.toolName=t),n}return e.role===`tool_result`?e.internal?null:{role:`tool_result`,text:au(ou(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 J={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 lu(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: '${
|
|
251
|
+
__send({ type: '${J.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 === '${
|
|
267
|
+
if (msg.type === '${J.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: '${
|
|
284
|
+
__send({ type: '${J.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: '${
|
|
356
|
+
type: '${J.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: '${
|
|
372
|
+
__send({ type: '${J.error}', pluginId, error: err?.message ?? String(err) })
|
|
373
373
|
}
|
|
374
374
|
return
|
|
375
375
|
}
|
|
376
|
-
if (msg.type === '${
|
|
376
|
+
if (msg.type === '${J.toolExecute}') {
|
|
377
377
|
const exec = toolExecutors.get(msg.name)
|
|
378
|
-
if (!exec) { __send({ type: '${
|
|
378
|
+
if (!exec) { __send({ type: '${J.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: '${
|
|
382
|
+
__send({ type: '${J.toolResult}', id: msg.id, result: r })
|
|
383
383
|
} catch (e) {
|
|
384
384
|
if (cancelledToolIds.delete(msg.id)) return
|
|
385
|
-
__send({ type: '${
|
|
385
|
+
__send({ type: '${J.toolResult}', id: msg.id, error: e?.message ?? String(e) })
|
|
386
386
|
}
|
|
387
387
|
return
|
|
388
388
|
}
|
|
389
|
-
if (msg.type === '${
|
|
389
|
+
if (msg.type === '${J.toolCancel}') {
|
|
390
390
|
cancelledToolIds.add(msg.id)
|
|
391
391
|
return
|
|
392
392
|
}
|
|
393
|
-
if (msg.type === '${
|
|
393
|
+
if (msg.type === '${J.sigilResolve}') {
|
|
394
394
|
const fn = sigilResolverExecutors.get(msg.name)
|
|
395
|
-
if (!fn) { __send({ type: '${
|
|
395
|
+
if (!fn) { __send({ type: '${J.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: '${
|
|
398
|
+
__send({ type: '${J.sigilResult}', id: msg.id, result: r })
|
|
399
399
|
} catch (e) {
|
|
400
|
-
__send({ type: '${
|
|
400
|
+
__send({ type: '${J.sigilResult}', id: msg.id, error: e?.message ?? String(e) })
|
|
401
401
|
}
|
|
402
402
|
return
|
|
403
403
|
}
|
|
404
|
-
if (msg.type === '${
|
|
404
|
+
if (msg.type === '${J.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 === '${
|
|
412
|
+
if (msg.type === '${J.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 === '${
|
|
424
|
+
if (msg.type === '${J.onActivate}') {
|
|
425
425
|
if (!pluginInstance || typeof pluginInstance.onActivate !== 'function') {
|
|
426
|
-
__send({ type: '${
|
|
426
|
+
__send({ type: '${J.activated}', id: msg.id })
|
|
427
427
|
return
|
|
428
428
|
}
|
|
429
|
-
try { await pluginInstance.onActivate(); __send({ type: '${
|
|
430
|
-
catch (e) { __send({ type: '${
|
|
429
|
+
try { await pluginInstance.onActivate(); __send({ type: '${J.activated}', id: msg.id }) }
|
|
430
|
+
catch (e) { __send({ type: '${J.activated}', id: msg.id, error: e?.message ?? String(e) }) }
|
|
431
431
|
return
|
|
432
432
|
}
|
|
433
|
-
if (msg.type === '${
|
|
433
|
+
if (msg.type === '${J.onDeactivate}') {
|
|
434
434
|
if (!pluginInstance || typeof pluginInstance.onDeactivate !== 'function') {
|
|
435
|
-
__send({ type: '${
|
|
435
|
+
__send({ type: '${J.deactivated}', id: msg.id })
|
|
436
436
|
return
|
|
437
437
|
}
|
|
438
|
-
try { await pluginInstance.onDeactivate(); __send({ type: '${
|
|
439
|
-
catch (e) { __send({ type: '${
|
|
438
|
+
try { await pluginInstance.onDeactivate(); __send({ type: '${J.deactivated}', id: msg.id }) }
|
|
439
|
+
catch (e) { __send({ type: '${J.deactivated}', id: msg.id, error: e?.message ?? String(e) }) }
|
|
440
440
|
return
|
|
441
441
|
}
|
|
442
|
-
if (msg.type === '${
|
|
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
|
|
442
|
+
if (msg.type === '${J.stop}') { toolExecutors.clear(); pluginInstance = null; process.exit(0) }
|
|
443
|
+
})`}`}var uu=class{pending=new Map;idCounter=0;boundPluginId=``;hostCallDispatcher=null;setHostCallDispatcher(e){this.hostCallDispatcher=e}pushEvent(e){try{this.adapter.send({type:J.eventPush,eventType:e.type,payload:e.payload,sourcePluginId:e.sourcePluginId})}catch{}}constructor(e){this.adapter=e,this.adapter.onMessage(e=>{if(e.type===J.loaded){let t=this.settlePending(`__load__`);t&&t.resolve(e.module);return}if(e.type===J.error){let t=this.settlePending(`__load__`);t&&t.reject(Error(e.error??this.adapter.loadFailedMessage?.()??`plugin isolated transport load failed`));return}if(e.type===J.toolResult){let t=this.settlePending(e.id);t&&t.resolve({result:e.result,error:e.error});return}if(e.type===J.sigilResult){let t=this.settlePending(e.id);t&&t.resolve({result:e.result,error:e.error});return}if(e.type===J.activated||e.type===J.deactivated){let t=this.settlePending(e.id);t&&t.resolve({error:e.error});return}if(e.type===J.hostCall){let t=this.boundPluginId,n=this.hostCallDispatcher,r=t=>{try{this.adapter.send({type:J.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:J.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:J.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:J.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:J.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:J.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:J.onDeactivate,id:e})})}clearPending(){this.pending.clear()}};const du=A(`@x-otto/coding:plugin-worker-pool`);let fu=null,pu=null;function mu(){return pu||(fu||=We(O(et(),`otto-plugin-worker-`)),pu=O(fu,`worker-entry.cjs`),T(pu,lu(`worker`)),pu)}var hu=class extends uu{worker;constructor(){let e=new Ji(mu());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)=>{du.warn({tool:e,timeoutMs:t},`plugin tool execution timed out`)},onErrorLog:e=>{du.warn({err:String(e)},`plugin worker error`)},onExitLog:e=>{du.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:J.stop}),await this.worker.terminate()}catch{}this.clearPending(),this.worker.unref()}},gu=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 hu;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(),fu){try{Ye(fu,{recursive:!0,force:!0})}catch{}fu=null,pu=null}await Promise.all(e.map(e=>e.stop().catch(()=>{})))}get size(){return this.workers.size}};const _u=A(`@x-otto/coding:plugin-process-pool`);let vu=null,yu=null;function bu(){return yu||(vu||=We(O(et(),`otto-plugin-process-`)),yu=O(vu,`process-entry.cjs`),T(yu,lu(`process`)),yu)}var xu=class extends uu{child;sandboxToDispose;constructor(e){let t=bu(),n=process.execPath,r=[t],i=n,a=r,o;if(Re()){let t=Fe({network:`deny`}),s=t.wrap({command:n,args:r,options:{timeout:0,cwd:e},projectRoot:e});i=s.command,a=s.args,o=t}else _u.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=F(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)=>{_u.warn({tool:e,timeoutMs:t},`plugin tool execution timed out (isolated process)`)},onErrorLog:e=>{_u.warn({err:String(e)},`plugin process error`)},onExitLog:e=>{_u.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=>{_u.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:J.stop})}catch{}try{this.child.kill()}catch{}this.clearPending()}},Su=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 xu(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(),vu){try{Ye(vu,{recursive:!0,force:!0})}catch{}vu=null,yu=null}await Promise.all(e.map(e=>e.stop().catch(()=>{})))}get size(){return this.processes.size}};const Y=A(`@x-otto/coding:plugin-module-loader-isolated`);let Cu=null;function wu(){return Cu||=new gu,Cu}let Tu=null;function Eu(){return Tu||=new Su,Tu}async function Du(){await Promise.all([Cu?.dispose()??Promise.resolve(),Tu?.dispose()??Promise.resolve()])}function Ou(e){return e===`project`||e===`repository`?Eu():wu()}function ku(e){return!!e.manifest.capabilities?.includes(`tools`)}function Au(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 ju(e,t,n,r){if((e.scope===`project`||e.scope===`repository`)&&!Sr(e.dir))return Y.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=N(e);if(i.pendingCapabilities.length>0)return Y.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??Ou(e.scope),o=Kl(e.dir);try{o?Y.info({pluginId:e.id,compiledPath:o},`using prebuilt plugin module (isolated path, RFC-150 D5)`):o=await Rl(e.dir)}catch(t){let n=String(t);return Y.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:Fl()});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 Y.warn({pluginId:e.id},t),r?.(e.id,t,`module-error`),null}return Y.info({pluginId:e.id},`plugin worker pool exhausted, falling back to in-process load`),ql(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 Y.warn({pluginId:e.id,axes:i},t),r?.(e.id,t,`module-error`),null}return{pluginId:e.id,module:Au(e.id,n,a),compiledPath:o}}catch(t){let n=String(t);return Y.warn({pluginId:e.id,err:n},`plugin.ts worker load failed`),r?.(e.id,`worker load failed: ${n}`,`module-error`),null}}const X=A(`@x-otto/coding:plugin-event-dispatcher`);var Mu=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){X.warn({pluginId:e,type:r.type},`event type namespace does not match pluginId, skipping registration (fail-closed)`);continue}n.set(r.type,Pu)}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)){X.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){X.warn({sourcePluginId:e,type:t,error:i.error.message},`emit rejected: payload schema validation failed (fail-closed, R3)`);return}let a=Nu({...n});if(!this.checkEmitRate(e)){X.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){X.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}`),X.warn({subscriberPluginId:n.subscriberPluginId,type:t,err:r},`event handler threw, isolating (R2a, swallowed + warn)`)}}X.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 X.warn({subscriberPluginId:e,current:i,max:50},`subscribe rejected: max subscriptions exceeded (R1)`),()=>{};let a=t.endsWith(`.*`)||t===`*`;if(t===`*`)return X.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 Nu(e){if(typeof e!=`object`||!e)return e;if(Object.freeze(e),Array.isArray(e))for(let t of e)Nu(t);else for(let t of Object.keys(e)){let n=e[t];typeof n==`object`&&n&&!Object.isFrozen(n)&&Nu(n)}return e}const Pu={safeParse:e=>typeof e==`object`&&e&&!Array.isArray(e)?{success:!0,data:e}:{success:!1,error:{message:`payload must be a plain object`}}};function Fu(e,t){return e.includes(`onStartup`)?!0:e.some(e=>t.has(e))}var Iu=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=Uc(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)}},Lu=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=ol(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()]}},Ru=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 zu=A(`@x-otto/coding:plugin-sigil-loader`);function Bu(e){return e.startsWith(`!`)||e.startsWith(`#`)}function Vu(e){let t=[];for(let n of e){let e=n.manifest.contributes?.sigilEntries;if(e?.length){if(N(n).gated){zu.warn({pluginId:n.id},`plugin gated (untrusted), sigilEntries skipped`);continue}for(let r of e){if(Bu(r.value)){zu.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 Hu(e){for(let t of e)t.manifest.contributes?.inputEntries&&zu.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 Uu(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}):zu.warn({pluginId:e,name:r},`sigilResolvers entry is neither function nor {resolve}, skipped`)}return n}function Wu(e,t){return t.map(t=>async(n,r)=>(await t(n,r)).filter(e=>!Bu(e.value)).map(t=>({...t,source:e})))}function Gu(e,t){for(let n of e)n.resolverId&&!t(n.resolverId)&&zu.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 Ku=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=Uu(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 Wu(e.plugin.id,n))t.push(this.pluginInput.registerProvider(`@`,r));this.sigilProviderUnsubsByPlugin.set(e.plugin.id,t)}if(this.sigilResolverRegistry){let t=this.sigilResolverRegistry;Gu(Vu([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)}},qu=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(...Qc(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()}},Ju=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(...$c(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}},Yu=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 el(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 Xu(e,t,n){return Error(`Invalid baseUrl override for provider "${e}" from ${t}: ${n}`)}function Zu(e,t,n){if(typeof t!=`string`||t.length===0)throw Xu(e,n,`expected a non-empty string`);if(/\s/.test(t))throw Xu(e,n,`whitespace is not allowed`);let r;try{r=new URL(t)}catch{throw Xu(e,n,`expected an absolute URL`)}if(r.protocol!==`http:`&&r.protocol!==`https:`)throw Xu(e,n,`unsupported protocol ${r.protocol}`);if(r.username||r.password)throw Xu(e,n,`embedded credentials are not allowed`);if(r.search||r.hash)throw Xu(e,n,`query strings and fragments are not allowed`);return r.pathname=r.pathname.replace(/\/+$/,``)||`/`,r.toString().replace(/\/(?=[?#]|$)/,``)}function Qu(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:Zu(e,t,`OTTO_PROVIDER_OVERRIDES`)}}return n}function $u(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 Zu(e.providerId,n.value,n.source);throw Error(`No baseUrl is configured for provider "${e.providerId}"`)}const Z=A(`@x-otto/coding:plugin-provider-loader`);function ed(e){let t=A(`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 Q(e,t){return`${e}:${t}`}function td(e){return new Set([...(e.contributes?.providers??[]).filter(e=>e.preserveProviderId===!0&&e.oauthRef).map(e=>e.oauthRef),...e.codeProviderIds??[]])}function nd(e,t){let n=td(t);return new Set((t.contributes?.oauth??[]).map(t=>n.has(t.id)?t.id:Q(e,t.id)))}function rd(e,t){return new Set((t.contributes?.providers??[]).filter(e=>e.catalogOnly!==!0&&e.baseUrl&&e.wireApi).map(t=>t.preserveProviderId===!0?t.id:Q(e,t.id)))}function id(e,t,n){return new Set([...n.codeProviderIds??[],...(n.contributes?.providers??[]).filter(e=>e.preserveProviderId===!0).map(e=>e.id)]).has(t)?t:Q(e,t)}function ad(e){return`code:${e}`}function od(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 sd(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 cd(e,t,n,r,i,a,o,s){return()=>{let c=r.get(o);if(!c)throw new ot(`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()=>$u({providerId:i,manifestBaseUrl:a,credentialBaseUrl:await t.getBaseUrl(n),configOverrides:s?.(),processOverrides:Qu(process.env.OTTO_PROVIDER_OVERRIDES)}),headers:e.headers,tokenDerivedHeaders:e.tokenDerivedHeaders,allowAuthHeaderOverride:e.allowAuthHeaderOverride,logger:ed(o)})}}function ld(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:Q(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}),Z.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`?aa({...t,id:s,name:c,tokenExchangeEncoding:t.tokenExchangeEncoding??`form`,assumesLoopbackAlways:t.assumesLoopbackAlways??!1,subscriptionScoped:t.subscriptionScoped??!1}):ia({...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{Z.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 ud(e,t,n,r,i,a){let o=t.contributes?.providers;if(!o?.length)return;if(!t.capabilities?.includes(`provider`)){Z.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}),Z.warn({pluginId:e,providerId:t.id},`duplicate provider id in manifest, second entry rejected (review F5)`);continue}if(b(t.id)){i.rejected.push({id:t.id,reason:`reserved builtin provider id`,pluginId:e}),Z.warn({pluginId:e,providerId:t.id},`plugin provider id collides with builtin, rejected (R3)`);continue}let o=t.preserveProviderId===!0,c=o?t.id:Q(e,t.id),l=o?t.id:Q(e,t.id);if(t.catalogOnly===!0){let a=l;if(t.oauthRef){let n=o?t.oauthRef:Q(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}),Z.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(!de({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=>od(e,a,c,t.baseUrl??``,void 0,t.supportsTools,t.responseBodyPolicy)),i=n.modelRegistry.registerWithSource(r,e);for(let t of i)Z.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:Q(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}),Z.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&&Z.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?sd(t.modelsEndpoint,l,c,t.baseUrl,t.headers):void 0,m=()=>{t.oauthRef&&r&&!s.has(u)&&r.unregister(u)};if(!de({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&&Z.warn({pluginId:e,providerId:t.id},`provider declares allowAuthHeaderOverride: custom headers may replace auth headers (RFC-270 D3)`);let h=cd(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}),he(l),t.envKey&&!t.oauthRef&&n.authStore.unregisterEnvKey(l),m();continue}if(t.models?.length){let r=t.models.map(e=>od(e,u,c,d,t.imageConstraints,t.supportsTools,t.responseBodyPolicy)),i=n.modelRegistry.registerWithSource(r,e);for(let t of i)Z.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 dd(e,t,n,r,i){let a={registered:[],rejected:[]},o=n.authStore.oauth;return ld(e,t,o,td(t),new Map((t.contributes?.providers??[]).filter(e=>e.oauthRef&&e.name).map(e=>[e.oauthRef,e.name])),a,r),ud(e,t,n,o,a,i),a}async function fd(e,t,n,r,i){let a=n.authStore.oauth,o=td(t),s=t.contributes?.oauth;if(s?.length&&a)for(let t of s){let n=o.has(t.id)?t.id:Q(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:Q(e,t.id);he(r),t.envKey&&!t.oauthRef&&n.authStore.unregisterEnvKey(r)}await n.providerRegistry.unregisterBySource(e,i),n.modelRegistry.unregisterBySource(e)}}var pd=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=rl(e.plugin.id,i);if(!t)continue;let a=n.has(r)?r:Q(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)}},md=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=id(e.plugin.id,i,e.plugin.manifest);if(!this.providerRegistry.registerPluginProvider(t,nl(e.plugin.id,a),ad(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(de({id:t,buildModelsRequest:sd(o,t,t)},ad(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=>od(e,t,t,s.baseUrl,s.imageConstraints,s.supportsTools,s.responseBodyPolicy)),r=this.modelRegistry.registerWithSource(n,ad(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(ad(e)),this.providerSourcePluginIds.delete(e)),this.modelRegistry&&this.modelSourcePluginIds.has(e)&&(this.modelRegistry.unregisterBySource(ad(e)),this.modelSourcePluginIds.delete(e));let t=this.descriptorIdsByPlugin.get(e);if(t){for(let e of t)he(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)}},hd=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){ue(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)me(e);this.cacheReportingApisByPlugin.delete(e)}}unregisterAll(){let e=new Set([...this.wireProtocolSourcePluginIds,...this.cacheReportingApisByPlugin.keys()]);for(let t of e)this.unregister(t)}},gd=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=>al(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 _d=`[plugin]`;function vd(e,t,n){let r=n.name?.trim()||n.key;return`${_d} ${e}:${t}:${n.key} — ${r}`}function yd(e,t,n){let r=e.subscriber;return!r||r.kind!==`plugin-service`||r.pluginId!==t||r.serviceId!==n?!1:e.name.startsWith(_d)}function bd(e,t,n){let r=`${_d} ${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 xd(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(!yd(e,r,i))continue;let t=bd(e,r,i);t!==void 0&&s.set(t,e)}for(let[e,c]of o){let o=vd(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 Sd(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(_d)&&t.remove(e.id)&&(r+=1)}return r}var Cd=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=xd({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&&xd({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=Sd({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=xd({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)`)}}},wd=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()}},Td=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()}},Ed=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 Dd=A(`@x-otto/plugin:config-store`),Od=/^[a-z0-9]+(?:-[a-z0-9]+)*$/;function kd(){return O(process.env.OTTO_HOME||r,`plugin-state`)}function Ad(e,t){if(!Od.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=k(O(kd(),e,t));S(n,{recursive:!0});let r=w(n),i=w(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}.${ki()}.tmp`,r;try{r=Ge(n,`w`),T(r,t),He(r),Be(r),r=void 0,Je(n,e)}finally{if(r!==void 0)try{Be(r)}catch{}}}var Md=class{dir;isMemory;configPath;memoryStore={};pluginId;workspaceKey;constructor(e,t){this.pluginId=e,this.workspaceKey=t;let{dir:n,isMemory:r}=Ad(e,t);this.dir=n,this.isMemory=r,this.configPath=O(n,`config.json`)}get(){if(this.isMemory)return{...this.memoryStore};if(!x(this.configPath))return{};try{let e=C(this.configPath,`utf-8`),t=JSON.parse(e);return t&&typeof t==`object`&&!Array.isArray(t)?t:{}}catch(e){return Dd.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}x(this.dir)||S(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{x(this.configPath)&&T(this.configPath,`{}`)}catch{}}};const Nd=/^[a-z0-9]+(?:-[a-z0-9]+)*$/,Pd=O(r,`plugin-state`);function Fd(e){let t=Id(e);try{return Ye(t,{recursive:!0,force:!0}),{removed:!x(t),dir:t}}catch{return{removed:!1,dir:t}}}function Id(e){if(!Nd.test(e))throw Error(`invalid pluginId for scoped storage: ${e} (must be kebab-case)`);return O(Pd,e)}var Ld=class{persistence;baseDir;pluginId;workspaceKey;constructor(e,t){if(this.pluginId=e,this.workspaceKey=t,!Nd.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=jn({type:`memory`});return}let n=k(O(Id(e),t));S(n,{recursive:!0});let r=w(n),i=w(Pd);if(r!==i&&!r.startsWith(i+`/`))throw Error(`scoped storage path escapes plugin-state root: ${r}`);this.baseDir=n,this.persistence=jn({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 Rd(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.getScheduleService;if(r.includes(`schedule`)&&!t.pendingCapabilities.includes(`schedule`)&&o){let e=na(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=Vd(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 Bd=new WeakMap;function Vd(e){if(e.capabilityQuota)return e.capabilityQuota;let t=Bd.get(e);return t||(t=new fl,Bd.set(e,t)),t}const Hd=new Map([[`oauthProviderFactories`,`provider`],[`providerFactories`,`provider`],[`wireProtocols`,`wire-protocol`]]);function Ud(e){let t=e.manifest.contributes;return!t||typeof t!=`object`?[]:Object.keys(t)}var Wd=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 Iu(e.hookRegistry),this.monitorsAxis=new Lu(e.hookRegistry,e.logger),this.feedbackAxis=new Ru(e.feedbackRegistry,e.logger),this.sigilAxis=new Ku(e.sigilResolverRegistry,e.pluginInput,e.logger),this.computedCommandsAxis=new qu,this.computedAgentsAxis=new Ju,this.computedSkillsAxis=new Yu(e.skillRegistry),this.oauthProviderAxis=new pd(e.authStore,e.logger),this.codeProviderAxis=new md(e.providerRegistry,e.modelRegistry,e.logger),this.wireProtocolAxis=new hd(e.wireProtocolRegistry,e.logger),this.toolsAxis=new gd(e.toolRegistry,e.logger),this.servicesAxis=new Cd({pool:e.servicePool??nu(),logger:e.logger,workspaceDir:e.workspaceDir,getWorkspaceKey:()=>e.getWorkspaceKey?.()??P,bridgeFor:t=>{let n=e.activePlugins().find(e=>e.id===t);if(!n)return{};let r=zd(n,N(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,N(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 Ld(e,t).baseDir,hasStorageCapability:t=>!!e.activePlugins().find(e=>e.id===t)?.manifest.capabilities?.includes(`storage`),...e.getSchedulePort?{getSchedulePort:e.getSchedulePort}:{}}),this.cliCommandsAxis=new wd(e.logger),this.slashCommandsAxis=new Td(e.logger),this.eventsAxis=new Ed(e.eventDispatcher,e.logger),(e.servicePool??nu()).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=Nr(e.manifest),a=this.deps.getWorkspaceKey?.()??P,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?N(t):void 0;for(let n of this.axisHandlers){let a=Hd.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),Vd(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=N(e),n=`${t.gated?`gated`:`ok`}:${[...t.pendingCapabilities].sort().join(`,`)}`,r=`nofile`;for(let t of[`plugin.ts`,`plugin.tsx`])try{let n=Xe(O(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 Md(e,this.deps.getWorkspaceKey?.()??P).set(t),await this.notifyConfigChange(e,t)}getPluginConfig(e,t){return wr(t,new Md(e,this.deps.getWorkspaceKey?.()??P).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(!Fu(Mr(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),Bc(e.id,`info`,t)},warn:t=>{this.deps.logger.warn({pluginId:e.id},t),Bc(e.id,`warn`,t)},error:t=>{this.deps.logger.error({pluginId:e.id},t),Bc(e.id,`error`,t)}},getWireProtocol:e=>this.deps.wireProtocolRegistry?.get(e),resolveProviderCredential:(()=>{let t=Rd(e);return e=>t(e)?this.deps.providerRegistry?.resolveAccessKey(e)??Promise.resolve(null):Promise.resolve(null)})(),resolveProviderAuth:(()=>{let t=Rd(e);return e=>t(e)?this.deps.providerRegistry?.resolveAuth(e)??Promise.resolve(null):Promise.resolve(null)})(),host:zd(e,N(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)??Ud(e)})),...e.manifest.contributes?.config?{config:wr(e.manifest.contributes.config,new Md(e.id,this.deps.getWorkspaceKey?.()??P).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&&ku(e)?await ju(e,t,void 0,this.deps.onPluginLoadError):await ql(e,t,this.deps.onPluginLoadError);if(!n)continue;let i=N(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?.()??P;a=new Ld(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,Ud(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=Vd(this.deps);for(let t of this.deps.activePlugins())e.reset(t.id);this.firedEvents.clear()}};const Gd=A(`@x-otto/coding:panel-compiler`);function Kd(e){let t=O(e,`panels`);if(!x(t))return{compiled:[],errors:[],skipped:!0};let n;try{n=Ke(t).filter(e=>e.endsWith(`.tsx`))}catch{return{compiled:[],errors:[],skipped:!0}}if(n.length===0)return{compiled:[],errors:[],skipped:!0};let r=O(e,`panels-dist`);S(r,{recursive:!0});let i=We(O(et(),`otto-panel-shims-`)),a=O(i,`react-shim.js`),o=O(i,`ink-shim.js`),s=O(i,`tui-shim.js`);T(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,
|
|
@@ -448,13 +448,13 @@ export const useState = R.useState, useEffect = R.useEffect, useCallback = R.use
|
|
|
448
448
|
useLayoutEffect = R.useLayoutEffect, createElement = R.createElement, Fragment = R.Fragment,
|
|
449
449
|
memo = R.memo, forwardRef = R.forwardRef, createContext = R.createContext, Children = R.Children,
|
|
450
450
|
cloneElement = R.cloneElement, isValidElement = R.isValidElement
|
|
451
|
-
`),
|
|
451
|
+
`),T(o,`const I = globalThis.__ottoPanelInk
|
|
452
452
|
if (!I) throw new Error('otto panel: globalThis.__ottoPanelInk 未注入(TUI 须在加载面板前 import panel-globals)')
|
|
453
453
|
export const Box = I.Box, Text = I.Text, Newline = I.Newline, Spacer = I.Spacer, Static = I.Static,
|
|
454
454
|
Transform = I.Transform, useApp = I.useApp, useInput = I.useInput, useStdin = I.useStdin,
|
|
455
455
|
useStdout = I.useStdout, useStderr = I.useStderr, useFocus = I.useFocus,
|
|
456
456
|
useFocusManager = I.useFocusManager, measureElement = I.measureElement, render = I.render
|
|
457
|
-
`),
|
|
457
|
+
`),T(s,`const T = globalThis.__ottoPanelTui
|
|
458
458
|
if (!T) throw new Error('otto panel: globalThis.__ottoPanelTui 未注入(TUI 须在加载面板前 import panel-globals)')
|
|
459
459
|
export const Tabs = T.Tabs
|
|
460
460
|
export const DataList = T.DataList
|
|
@@ -465,130 +465,27 @@ 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}=
|
|
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,hostCapabilities:t.hostCapabilities,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,hostCapabilities:t.hostCapabilities})}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
|
|
468
|
+
`);let c=[],l=[],{buildSync:u}=bl();xl();for(let i of n){let n=i.replace(/\.tsx$/,`.mjs`);try{u({entryPoints:[O(t,i)],outfile:O(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(O(`panels-dist`,n))}catch(t){l.push({entry:i,message:t.message}),Gd.warn({pluginDir:e,entry:i,err:String(t)},`panel compile failed`)}}return Gd.info({pluginDir:e,compiled:c.length,errors:l.length},`compiled plugin panels`),{compiled:c,errors:l,skipped:!1}}const qd=A(`@x-otto/coding:plugin-install`);function Jd(e){let t=[];return(async()=>{try{let t=await Rl(e);t&&qd.info({pluginDir:e,outfile:t},`plugin code module compiled at install time`)}catch(n){let r=n instanceof Error?n.message:String(n);qd.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}=Kd(e);if(!r&&n.length>0)for(let r of n)qd.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);qd.warn({pluginDir:e,err:r},`plugin panel compilation crashed unexpectedly at install time`),t.push(`面板编译异常:${r}`)}})().then(()=>t)}function Yd(e){try{return Ue(e).isSymbolicLink()}catch{return!1}}function Xd(e){let t=C(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 Zd(e,t){let n=k(e,t.endsWith(`/*`)?t.slice(0,-2):t);if(!n.startsWith(e.endsWith(`/`)?e:e+`/`)&&n!==e)return[];if(!t.endsWith(`/*`))return x(n)?[n]:[];if(!x(n))return[];try{return Ke(n,{withFileTypes:!0}).filter(e=>e.isDirectory()).map(e=>O(n,e.name))}catch{return[]}}function Qd(e,t){let n=o(t);if(!n)return;let r=Xd(O(n,`pnpm-workspace.yaml`));for(let t of r)for(let r of Zd(n,t)){let t=O(r,`package.json`);if(!x(t))continue;try{if(JSON.parse(C(t,`utf8`)).name===e)return r}catch{}let n=O(r,M);if(x(n))try{if(Er(C(n,`utf8`),n)?.id===e)return r}catch{}}}function $d(t,n=process.cwd()){let r=[Yi(O(n,`__resolve__.js`)).href,import.meta.url];for(let n of r)try{return D(e(n).resolve(`${t}/package.json`))}catch{}return Qd(t,D(L(import.meta.url)))??Qd(t,n)}async function ef(e){let t=$d(e.pkg,e.cwd);if(!t)throw Error(`无法解析包 ${e.pkg}(未安装或不可从当前位置解析)。`);let n=O(t,M);if(!x(n))throw Error(`${e.pkg} 不是 otto 插件:缺 ${M}(RFC-044 自描述)。`);let i=Er(C(n,`utf8`),n);if(!i)throw Error(`${e.pkg} 的 ${M} 非法(需合法 kebab-case id)。`);let a=e.ottoDir??r,o=O(a,`plugins`,i.id);S(O(a,`plugins`),{recursive:!0});let s=k(t);if(Yd(o)){try{if(k(qe(o))===s){let e=await Jd(t);return{id:i.id,packageDir:t,dir:o,created:!1,compileWarnings:e,version:i.version}}}catch{}Qe(o)}else if(x(o))if((x(O(o,M))?Er(C(O(o,M),`utf8`),o):null)?.id===i.id)Ye(o,{recursive:!0,force:!0});else throw Error(`目标已存在且非本插件,拒绝覆盖:${o}`);Ze(s,o);let c=await Jd(t);return{id:i.id,packageDir:t,dir:o,created:!0,compileWarnings:c,version:i.version}}async function tf(e){let t=O(e,M);if(!x(t))throw Error(`${e} 不是 otto 插件:缺 ${M}`);let n=Er(C(t,`utf8`),t);if(!n)throw Error(`${e} 的 ${M} 非法。`);let i=O(r,`plugins`,n.id);S(O(r,`plugins`),{recursive:!0});let a=k(e);if(Yd(i)){try{if(k(qe(i))===a){let t=await Jd(e);return{id:n.id,packageDir:e,dir:i,created:!1,compileWarnings:t,version:n.version}}}catch{}Qe(i)}else if(x(i))if((x(O(i,M))?Er(C(O(i,M),`utf8`),i):null)?.id===n.id)Ye(i,{recursive:!0,force:!0});else throw Error(`目标已存在且非本插件,拒绝覆盖:${i}`);Ze(a,i);let o=await Jd(e);return{id:n.id,packageDir:e,dir:i,created:!0,compileWarnings:o,version:n.version}}function nf(e,t){return[...e.filter(e=>e.id!==t.id),t]}function rf(e,t){return e.filter(e=>e.id!==t)}async function af(e,t,n=()=>Date.now()){let r=nf(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 of(e,t){let n={},r=!1,i=e.get(`installed_plugins`)??[];i.some(e=>e.id===t)&&(n.installed_plugins=rf(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 sf(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 cf(e,t,n,r){try{let i=await ef({pkg:r});t&&await af(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 lf=class{lastTopoSort;lastEngineIncompatible=new Map;warnedTopoIssues=new Set;warnedEngineIncompatible=new Set;resolve(e){let{compatible:t,incompatible:n}=hr(ur({cwd:e.workspaceDir,homedir:e.homedir??E(),disabled:e.disabledPlugins,bundledDirs:e.bundledDirs}));this.lastEngineIncompatible=n;let r=Fr(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:Zn},`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: ${Zn})`}));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 cf(e,t,i,n)}this.warnedTopoIssues=i}};function uf(e,t){let{model:r,authStore:i,modelRegistry:a,providerRegistry:o}=e,s=i??ne(),c=a??re(),l=o??ae({authStore:s,modelRegistry:c}),u=oe(),d=new ls(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:te(D(n))}}function df(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 ff(t)}function ff(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 pf(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=Ua(new Set(a.map(e=>e.name)));return{model:i,systemPrompt:``,tools:a,thinkingLevel:`medium`,maxToolTurns:t.maxToolTurns,promptRefresh:e?Po(t.promptManager,t.getDeclarativeAgentProfiles(),e,a):()=>t.promptManager.assemblePreset({preset:`main`},o),workspaceDir:t.workspaceDir}},i=e.storage?.session;if(i&&`dir`in i){let n=c(),a=new di({dbPath:n?`:memory:`:O(i.dir,`sessions.db`)});t.repoRef&&(t.repoRef.current=a);let o=n?fi():pi({lockDir:O(i.dir,`locks`)}),s=new li({repo:a,workspaceKey:t.getWorkspaceKey??(()=>P),maxLoadEntries:Nn,canStartHistory:e=>e.role!==`tool_result`,writeLease:o,stripInactiveReplacements:!0}),l=async e=>(await a.listSessions(e).catch(()=>[])).filter(e=>!df(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 Kt({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,hostCapabilities:t.hostCapabilities,storage:{kind:`custom`,persistence:s,autoPersist:!0,...n?{panelStatePersistence:On(),pasteStatePersistence:kn()}:{panelStateDir:O(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=Oa(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 Kt({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,hostCapabilities:t.hostCapabilities})}function mf(e){return e.map(e=>({name:e.name,description:typeof e.description==`function`?e.description({projectRoot:``}):e.description,parameters:e.parameters}))}function hf(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=Hn(n.getDeclarativeAgentProfiles?.()??[],t),i=r?Do(r.defaultTools):void 0,a=jo(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 gf(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(gi(o.context.from,o.context.allowedTargets,r))}return i}function _f(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=hf(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=gf(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 At({stream:e.stream,logger:e.logger,agentName:t.agentId,maxToolTurns:t.maxToolTurns,toolHookExecutor:$t({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=Ht(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(),un.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 vf(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??_f(t)}}function yf(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=yf(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=vf(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 _i(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=Hn(o,c);if(!l){s.push({kind:`agent`,id:c,name:c,description:c,systemPrompt:zn(c),tools:mf(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:mf(t.resolveTools(void 0,Do(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 bf(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=yf(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 _i(vf(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 xf=`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
|
|
478
|
-
`),c=Math.max(1,n);if(c>s.length)return null;let l=Math.min(s.length,r>0?r:n);return
|
|
479
|
-
`))}function
|
|
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,hostCapabilities:e.hostCapabilities},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,hostCapabilities:e.hostCapabilities,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,webSearch:e.webSearch,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.hostCapabilities?.memory,c=e.processOwner,l=c?{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:c},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:s?{recordMemory:e=>s.record(e),readMemory:e=>s.read(e),archive:o?{read:e=>o.readArchive(e),list:e=>o.listArchives(e)}:void 0}: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,webSearch:e.webSearch,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:l,shellEnv:e.hostCapabilities?.shellEnv,captureFileState:e.hostCapabilities?.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
|
|
477
|
+
If the image is not a UI/design screenshot, give a normal concise description instead. Do not speculate beyond what's visible.`;var Sf=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?`${xf}\n\nContext: ${t.contextHint}`:xf},{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 v(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 Oi(`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 Cf(e){let t=e?.slots?.vision;if(t)return Array.isArray(t)?t:[t]}function wf(e,t){globalThis[e]||Object.defineProperty(globalThis,e,{value:Object.freeze(t()),writable:!1,configurable:!1})}var Tf=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,wf(`__ottoPanelRuntime`,()=>({callMcpTool:(e,t,n)=>this.callMcpTool(e,t,n),usePluginData:Ef(this)}))}};function Ef(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 Df=new Tf;function Of(e){Df.install(e)}const kf=`backend/`;function Af(e){return e.startsWith(kf)?e:`${kf}${e}`}var jf=class{fns=null;get(){return this.fns}install(e){this.fns=e,wf(`__ottoPanelBackendRuntime`,()=>({usePanelBackend:Nf(this)}))}};function Mf(){return globalThis.__ottoCurrentPanelPluginId}function Nf(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=Mf(),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,Af(e),t,i)},[n]),cancel:t.useCallback(e=>{!n||!r||r.cancel(n,e)},[n]),state:i,status:o}}}const Pf=new jf;function Ff(e){Pf.install(e)}function If(){let e=process.env.LC_ALL||process.env.LC_MESSAGES||process.env.LANG||``;return/zh/i.test(e)?`zh`:`en`}function Lf(e){return!e||e===`auto`?If():e}var Rf=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=N(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=nd(e.id,e.manifest),r=nd(e.id,t),i=new Set([...n].filter(e=>r.has(e)));i.size>0&&o.set(e.id,i);let a=rd(e.id,e.manifest),c=rd(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 fd(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=dd(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 fd(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:st(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 Bf=class{registry;auditLog;constructor(e,t){let n=Ae(e.getAll());this.auditLog=new ve,this.registry=ke({toolSets:n}),t.register(De(this.registry,this.auditLog))}};const Vf=A(`@x-otto/coding:plugin-context-sources`),Hf=64*1024;function Uf(e,t,n){let r=k(t,n);if(!_c(r,t)){Vf.warn({pluginId:e,file:n},`contextSources.content.file resolves outside plugin dir, skipped`);return}try{let e=C(r,`utf8`);return Buffer.byteLength(e,`utf8`)>Hf?`${e.slice(0,Hf)}\n<!-- truncated -->`:e}catch(t){Vf.warn({pluginId:e,file:n,err:String(t)},`contextSources.content.file read failed, skipped`);return}}function Wf(e){let t=[];for(let n of e){if(N(n).gated)continue;let e=n.manifest.contributes?.contextSources;if(e?.length){if(!n.manifest.capabilities?.includes(`context`)){Vf.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:Uf(n.id,n.dir,r.content.file);if(e!=null)return`<!-- plugin:${n.id} -->\n${e}`}})}}return t}function Gf(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 Kf(e){hn();let t=e.jobStateDir?new Ft(e.jobStateDir):void 0;t&&cn.setStateStore(t),mn(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[j.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})}),j.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 qf=2e4,Jf=(e,t)=>{let n=Gi(`git`,[...e],{cwd:t,timeout:1e4,encoding:`utf-8`,maxBuffer:4194304});return n.error||n.status!==0?null:n.stdout??``};function Yf(e){return e.length<=qf?e:`${e.slice(0,qf)}\n[...truncated ${e.length-qf} chars...]`}function Xf(e,t,n,r){let i=k(e),a=nt(t)?t:k(i,t);if(a!==i&&!a.startsWith(`${i}/`)||!x(a)||!Xe(a).isFile())return null;let o;try{o=C(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 Yf(s.slice(c-1,l).join(`
|
|
479
|
+
`))}function Zf(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 Xf(e,a[1],o,o+r)}function Qf(e){let t=e?.gitRunner??Jf;return[{id:`file-range`,resolve:(e,t)=>{let n=/^([\w./-]+):(\d+)(?:-(\d+))?$/.exec(e);if(!n)return``;let r=Xf(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=Zf(n.workspaceDir,e,t);return r===null?``:`\n\n@def:${e}:\n\`\`\`\n${r}\n\`\`\`\n`}}]}function $f(e){return{sandbox:new qa(e.logger),memoryGovernor:new It({logger:e.logger}),residencyGovernor:new Rt,fleetMonitor:new Nt({logger:e.logger}),permissionSync:new Ka({logger:e.logger,getToolRegistry:e.getToolRegistry,getPermissionRegistry:e.getPermissionRegistry}),hookRegistry:e.hookRegistry??Ki({preset:`default`,onHookTimeout:e.onHookTimeout})}}function ep(e){let t=zf(e.inspect,e.loggerName),n=t.devtools,r=t.logSubscription,i=new yi({workspaceDir:e.workspaceDir,projectConfigPath:e.projectConfigPath,projectConfigTrusted:()=>Ei(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;mt(r),ut(r),e.getI18nRegistry().setLocale(Lf(t.language))}),{devtools:n,logSubscription:r,settings:i}}function tp(e){let t=new Sf({getModelRegistry:e.getModelRegistry,providerRegistry:e.providerRegistry,getVisionSlotCandidates:()=>Cf(e.getSettings().get(`model_slots`)),isModelUsable:e.isModelUsable,logger:e.logger});return{visionDelegateService:t,sessionConfigResolver:new Fo({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 np(e){let t=pf(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,hostCapabilities:e.hostCapabilities},e.resolveEffectiveModel),n=t.sessions;return{agentRuntime:t,codingSessionPool:n,swarmAgentRunner:_f({hookRegistry:e.hookRegistry,stream:n.stream,logger:e.logger,defaultModel:e.defaultModel,getTools:e.getTools,getDeclarativeAgentProfiles:e.getDeclarativeAgentProfiles}),defaultModel:e.defaultModel}}function rp(e){let{runSession:t,abortTask:n}=os({logger:e.logger,getSession:e.getSession,createSession:e.createSession,removeSession:e.removeSession}),r=new hi({hookRegistry:e.hookRegistry,runSession:t,abortTask:n,runAgentTurn:e.swarmAgentRunner,workflowConfig:e.workflowConfig});return{orchestrator:r,runSession:t,runTeam:bf({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:oa()}}function ip(e){Of(e.callMcpTool);let t=new Fc({mcpController:e.mcpController,getActivePlugins:e.getActivePlugins});return Ff({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 ap(e){let t=new Mu((t,n)=>{let r=e.activePlugins().find(e=>e.id===t);return r?(r.manifest.capabilities??[]).includes(n):!1}),n=new Wd({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 Rf({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(xc(e.activePlugins())),{pluginModuleManager:n,pluginProviderManager:r,capabilityReloader:new Nc(e.settings,e.mcpController,e.skillRegistryForReloader,n,r,e.toolRegistry,e.modelCatalogManager,e.workspaceDir,e.getActivePluginsForReloader,e.i18nRegistry,e.getCompatTrustGated)}}function op(e){return{toolsSyncCoordinator:new Ws({sessionConfigResolver:e.sessionConfigResolver,getSession:e.getSession,listSessionIds:e.listSessionIds,logger:e.logger}),pluginContributionsFacade:new ac({getWorkspaceDir:()=>e.workspaceDir,settings:e.settings,getActivePlugins:e.getActivePlugins,pluginModuleManager:e.pluginModuleManager,mcpController:e.mcpController,compatProducts:e.compatProducts})}}function sp(e){let t=new Set(e.hookRegistry.getRegistered().map(e=>e.name)),n=new Bf(e.toolRegistry,e.hookRegistry),r=new $a(e.settings,e.toolRegistry,e.logger,e.workspaceDir,e.getResilienceConfig,e.compatProducts);return{permissionRegistry:n.registry,auditLog:n.auditLog,mcpController:r,preExistingHooks:t}}function cp(e){return new io({settings:e.settings,mcp:e.mcpController,skills:e.skillRegistry,getAgentProfiles:()=>e.declarativeAgentProfiles,getPlugins:()=>ur({cwd:e.workspaceDir,homedir:e.pluginHomedir,bundledDirs:e.pluginBundledDirs}),processRuntime:j,onPluginToggle:e.onPluginToggle})}function lp(e){e.pluginInput.register(rr()),e.pluginInput.registerProvider(`@`,ar({cwd:e.workspaceDir})),e.sigilResolvers.register(Qf(),`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=Vu(e.activePlugins());t.length>0&&e.pluginInput.register(t),Hu(e.activePlugins());for(let t of Wf(e.activePlugins()))Gf(e.agentRuntime.contextSources,[t],e.logger);return e.registerHooks(),{ownedHookNames:e.hookRegistry.getRegistered().map(e=>e.name).filter(t=>!e.preExistingHooks.has(t)),processRegistryUnsubs:Kf({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 up(e,t,n){t()||(await e.load(),n(!0))}function dp(e){for(let t of e)try{t.apply()}catch(e){throw Error(`deferred config step "${t.label}" failed: ${e.message}`,{cause:e})}}function fp(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 pp(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,hostCapabilities:e.hostCapabilities,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,webSearch:e.webSearch,startJob:e.startJob,schedule:na(e.getScheduleService,{validateModelId:e.validateScheduleModelId})}}function mp(e){let{orchestrator:t,writeTodos:n,skillProvider:r,autoMemory:i,reloadMemory:a,archiveRecall:o}=e,s=e.hostCapabilities?.memory,c=e.processOwner,l=c?{register:e=>{let t=j.registerChild({command:e.command,cwd:e.cwd,logPath:e.logPath,port:e.port,url:e.url,owner:{type:`app`,id:c},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=j.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=j.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=>j.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=>j.kill(e),updateDetectedService:(e,t)=>j.updateDetectedService(e,t)}:{register:e=>{let t=j.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=j.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=j.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=>j.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=>j.kill(e),updateDetectedService:(e,t)=>j.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:s?{recordMemory:e=>s.record(e),readMemory:e=>s.read(e),archive:o?{read:e=>o.readArchive(e),list:e=>o.listArchives(e)}:void 0}: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,webSearch:e.webSearch,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:l,shellEnv:e.hostCapabilities?.shellEnv,captureFileState:e.hostCapabilities?.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}}function hp(e,t){return I({name:R.toolGuidance.name,timing:`system.prompt.transform`,priority:R.toolGuidance.priority,handle:async(n,r)=>{let i=e.buildToolGuidance(t());if(i){let e=sa(R.toolGuidance.name,i);r.systemPrompt=`${r.systemPrompt}\n\n${e}`}}})}function gp(e){let t=O(e,`docs/rfc/RFC-284-core-pack/content.txt`);if(!x(t))return;let n=C(t,`utf8`).trim();return n.length>0?n:void 0}function _p(e){let t=O(e,`docs/rfc/RFC-284-governance-plan.json`);if(!x(t))return new Map;let n=JSON.parse(C(t,`utf8`));return new Map((n.decisions??[]).map(e=>[e.key,e]))}function vp(e){return new Set(e.toLowerCase().split(/[^\p{L}\p{N}._/-]+/u).filter(e=>e.length>=3))}function yp(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 bp(e,t){let n=vp(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=vp(`${e.trigger} ${e.insight}`);for(let e of n)a.has(e)&&(r+=1);return r}function xp(e){return e.size>0?{mode:`governance`,decisions:e}:{mode:`safe-default`}}function Sp(e){return!!e.contentHash&&wt({tags:e.tags??[],trigger:e.trigger,insight:e.insight})===e.contentHash}function Cp(e){return!(!Sp(e)||e.supersededBy||(e.relevantHitCount??0)<1)}function wp(e,t,n){if(!n)return;let r=xp(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(!Cp(e))return;let t=bp(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:yp(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 Tp(e){return[...e].sort((e,t)=>(t.relevantHitCount??0)-(e.relevantHitCount??0)||(t.createdAt??0)-(e.createdAt??0))}function Ep(e,t,n,r={},i){let a=r.workspaceDir??process.cwd(),o=an({name:R.agentKnowledge.name,compute:async()=>{let r=gp(a),o=r?sa(R.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?Bn(Tp(s),e):``].filter(e=>e.length>0).join(`
|
|
482
482
|
|
|
483
|
-
`)||void 0}else{let n=
|
|
484
|
-
`)}}),s=
|
|
485
|
-
[
|
|
486
|
-
`),n=t.findIndex(e=>/^#+\s/.test(e));return(n>0?t.slice(0,n):t.slice(0,3)).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
|
-
|
|
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
|
-
|
|
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(`
|
|
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(`
|
|
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(`
|
|
497
|
-
if (${n}.issues.length) {
|
|
498
|
-
if (${o} in input) {
|
|
499
|
-
payload.issues = payload.issues.concat(${n}.issues.map(iss => ({
|
|
500
|
-
...iss,
|
|
501
|
-
path: iss.path ? [${o}, ...iss.path] : [${o}]
|
|
502
|
-
})));
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
|
|
506
|
-
if (${n}.value === undefined) {
|
|
507
|
-
if (${o} in input) {
|
|
508
|
-
newResult[${o}] = undefined;
|
|
509
|
-
}
|
|
510
|
-
} else {
|
|
511
|
-
newResult[${o}] = ${n}.value;
|
|
512
|
-
}
|
|
513
|
-
|
|
514
|
-
`):t.write(`
|
|
515
|
-
if (${n}.issues.length) {
|
|
516
|
-
payload.issues = payload.issues.concat(${n}.issues.map(iss => ({
|
|
517
|
-
...iss,
|
|
518
|
-
path: iss.path ? [${o}, ...iss.path] : [${o}]
|
|
519
|
-
})));
|
|
520
|
-
}
|
|
521
|
-
|
|
522
|
-
if (${n}.value === undefined) {
|
|
523
|
-
if (${o} in input) {
|
|
524
|
-
newResult[${o}] = undefined;
|
|
525
|
-
}
|
|
526
|
-
} else {
|
|
527
|
-
newResult[${o}] = ${n}.value;
|
|
528
|
-
}
|
|
529
|
-
|
|
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>
|
|
531
|
-
|
|
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`}`)}}})}const Lb=new Set([`grill_me`]);function Rb(){return A({name:`host-approval-gate`,timing:`tool.execute.before`,priority:20,enabled:!0,handle:(e,t)=>{t.cancelled||t.decision===`deny`||Lb.has(e.toolName)||t.decision!==`ask`&&(t.decision=`ask`,t.decisionReason=t.decisionReason??`host approval required`)}})}function zb(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 Bb(e){return e?(e.endsWith(`
|
|
483
|
+
`)||void 0}else{let n=Tp([...await e.list(),...s]);n.length>0&&(c=Bn(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=I({name:`lesson-relevant-hints`,timing:`system.prompt.transform`,priority:R.agentKnowledge.priority+1,handle:async(t,n)=>{if(!t.userText)return;let i=r.governanceDecisions??_p(a),o=wp(await e.list(),i,t.userText);o&&(await e.recordRelevantHits(o.hitIds),n.systemTail=[...n.systemTail??[],sa(R.lessonRelevantHints.name,o.text)])}});return[...o,s]}function Dp(e){return an({name:R.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.`}})}function Op(e,t,n){let r=e.get(t.sessionId);if(!r||r.length===0)return;e.delete(t.sessionId);let i=r.join(`
|
|
485
|
+
`),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 kp(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 Ap(){let e=new Map;return[I({name:`background-process-exit-collector`,timing:`process.exited`,handle:t=>{let n=e.get(t.sessionId)??[];n.push(kp(t)),e.set(t.sessionId,n)}}),I({name:`background-process-exit-injector`,timing:`messages.transform`,priority:25,handle:(t,n)=>{Op(e,t,n)}}),I({name:`background-process-notification-cleanup`,timing:`session.deleted`,handle:t=>{e.delete(t.sessionId)}})]}function jp(e){return I({name:`background-process-session-kill`,timing:`session.deleted`,handle:t=>{let n=t.metadata.reason;n===`idle`||n===`evicted`||e(t.sessionId)}})}function Mp(e){return[I({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)}}),I({name:`session-permission-cleanup`,timing:`session.deleted`,handle:t=>{e.registry.clearSessionAlwaysAllow(t.sessionId)}})]}function Np(e){return e.role===`user`||e.role===`assistant`||e.role===`tool_result`}function Pp(e,t,n={}){let r=n.minMessages??6;return[I({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(Np))}}),I({name:`memory-auto-extract-cleanup`,timing:`session.deleted`,handle:e=>{t.reset(e.sessionId)}})]}const Fp=`[sandbox-escalation]`;function Ip(e){return I({name:`sandbox-guard`,timing:`tool.execute.before`,priority:6,enabled:!0,handle:(t,n)=>{if(n.cancelled)return;let r=e.getContext();if(!r||t.readonly)return;let i=t.args,a=t.paths?[...t.paths]:[],o=i?.command;if(typeof o==`string`&&a.push(...Me(o)),a.length===0)return;let s=typeof i?.targetDir==`string`?i.targetDir:`.`,c=k(r.projectRoot,s),l=ye({writePaths:a.map(e=>k(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=`${Fp} ${l.reason??`requires approval`}`)}}})}const Lp=new Set([`grill_me`]);function Rp(){return I({name:`host-approval-gate`,timing:`tool.execute.before`,priority:20,enabled:!0,handle:(e,t)=>{t.cancelled||t.decision===`deny`||Lp.has(e.toolName)||t.decision!==`ask`&&(t.decision=`ask`,t.decisionReason=t.decisionReason??`host approval required`)}})}function zp(e){return e?(e.endsWith(`
|
|
533
486
|
`)?e.slice(0,-1):e).split(`
|
|
534
|
-
`).length:0}function
|
|
535
|
-
`)}\n</delegate-notification>`}function Wb(){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(Ub(r)),e.set(n,i)}}}const Gb=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 Kb(e,t){return C($d(e),t,`episodes.json`)}function qb(e,t){let n;try{let r=Kb(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=Gb.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 Jb(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=qb(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:Yb({pending:o.length,success:r.success,minClusterSize:e.minClusterSize??3})}}function Yb(e){return e.pending>0?null:e.success===0?`no-episodes`:e.success<e.minClusterSize?`not-enough-successes`:`no-cluster-yet`}const Xb=Jy({tool:Q().min(1).max(64),intent:Q().max(160)}),Zb=Jy({taskSignature:Q().min(1).max(200),steps:Ky(Xb).max(20),outcome:eb([`success`,`partial`,`failure`]),sessionId:Q().max(64),at:Ry().int().nonnegative()});function Qb(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=Zb.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 $b(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(`
|
|
536
|
-
`)
|
|
537
|
-
|
|
538
|
-
`)}function ex(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.
|
|
539
|
-
|
|
540
|
-
## The pattern
|
|
541
|
-
|
|
542
|
-
- Task type: ${e.taskSignature}
|
|
543
|
-
- Observed ${e.size} times
|
|
544
|
-
- Tags: ${e.tags.length>0?e.tags.join(`, `):`(none)`}
|
|
545
|
-
- In sessions: ${n}
|
|
546
|
-
|
|
547
|
-
## The recorded execution paths
|
|
548
|
-
|
|
549
|
-
These are the actual tool sequences otto observed for this task type. They are your evidence —
|
|
550
|
-
you do not need to (and cannot) go looking for the original sessions.
|
|
551
|
-
|
|
552
|
-
${$b(t)}
|
|
553
|
-
|
|
554
|
-
## What to do
|
|
555
|
-
|
|
556
|
-
1. **Work from the recorded paths above.** They are the only evidence available. If they are
|
|
557
|
-
too few, too varied, or too thin to support a reusable procedure, stop (see below) — do NOT
|
|
558
|
-
invent steps from the task type alone.
|
|
559
|
-
2. **Find what is genuinely reusable.** Across those runs, identify the stable path: the order
|
|
560
|
-
of steps, the checks that mattered, the traps that were hit. Drop one-off details (specific
|
|
561
|
-
file names, ids, values) — a skill describes a class of tasks, not one instance.
|
|
562
|
-
3. **You may inspect the repository** to ground the procedure in real paths and commands
|
|
563
|
-
(read/grep are available) — but the *sequence* must come from the recorded runs, not from
|
|
564
|
-
your own idea of how the task should be done.
|
|
565
|
-
4. **Write exactly one file**: \`.otto/skills/<kebab-case-name>/SKILL.md\`
|
|
566
|
-
|
|
567
|
-
\`\`\`
|
|
568
|
-
---
|
|
569
|
-
name: <kebab-case-name>
|
|
570
|
-
description: Use when <the trigger condition — when should otto reach for this skill>
|
|
571
|
-
---
|
|
572
|
-
|
|
573
|
-
<the reusable procedure, in plain prose and ordered steps>
|
|
574
|
-
\`\`\`
|
|
575
|
-
|
|
576
|
-
Both \`name\` and \`description\` are required — the skill loader rejects the file without them.
|
|
577
|
-
\`description\` must describe **when to use this skill**, not what it does: it is what otto
|
|
578
|
-
matches against future requests. Keep name + description under 1024 characters combined.
|
|
579
|
-
|
|
580
|
-
5. **Change nothing else.** No edits to source, config, or docs. The reviewer should see exactly
|
|
581
|
-
one new file in the diff.
|
|
582
|
-
|
|
583
|
-
## When to stop instead
|
|
584
|
-
|
|
585
|
-
If the recorded paths turn out to be too varied, too thin, or not actually the same kind of task,
|
|
586
|
-
**do not write the file**. Report what you found and stop. A fabricated skill pollutes the
|
|
587
|
-
library permanently; skipping costs nothing — otto will offer again if the pattern recurs.
|
|
588
|
-
|
|
589
|
-
The draft you produce is a proposal: it will be reviewed as a diff and only takes effect if the
|
|
590
|
-
user explicitly applies it.`}function tx(e){return`Draft skill: ${e.taskSignature.length>60?`${e.taskSignature.slice(0,60)}…`:e.taskSignature}`}function nx(e){try{let t=Qb({pluginId:e.pluginId,workspaceKey:e.workspaceKey,sessionIds:e.brief.sessionIds});return{jobId:e.startJob({title:tx(e.brief),prompt:ex(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 rx(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(zb({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=Wb();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.hostApprovalGate&&e.hookRegistry.register(Rb()),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})=>{nx({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(Hb({getOnFileEdited:e.getEditFileCallback,dedupCache:e.editFilesDedup})),{agentJobNotify:r.notify}}function ix(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,webSearch:e.webSearchOptions,hostCapabilities:e.hostCapabilities,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 ax(e,t){return Be(t,jp(ix(e,t,e.skillRegistry?Vn(e.skillRegistry,t):void 0,!1))).getAvailable(e.defaultToolPreset)}function ox(e){return e.toolRegistry.getAvailable(e.defaultToolPreset).filter(e=>e.name.startsWith(`mcp__`))}function sx(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(ix(e,e.workspaceDir,n,t.lsp===!0)),processTracker:r})}function cx(e){e.agentJobNotify=rx({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,hostApprovalGate:e.hostCapabilities?.permissionAsk!==void 0}).agentJobNotify}function lx(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 ux(e){return t=>{e?.({type:`plugin.load-failed`,...t})}}function dx(e){return new Tt({persist:Ft(`${r}/signals`),logWarn:(t,n)=>e.warn({err:n},t)})}function fx(e,t){return{record:n=>{e.record(n),t?.({type:`capability_gap.reported`,...n})}}}async function px(e,t){let n=await e.restoreFromLog();return n>0&&t?.(n),n}async function mx(e){if(e.ensureNotDisposed(),await e.ensureSettingsLoaded(),await px(e.evolutionSignals,t=>e.logger.info({count:t},`signal log restored %d records`)),!e.workspaceRef&&!e.pendingWorkspaceInit&&!e.parentWorkspaceExisted)try{let t=Wi(lx()),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)`,()=>hx(e)):St(`sweepOrphanTraceFiles (headless)`,()=>Sx(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`&&Cx(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 hx(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)}}}Sx(e)}function gx(e){return!!e.pendingWorkspaceInit}function _x(e){return!!e.parentWorkspaceExisted}async function vx(e){let t=e.parentWorkspaceExisted;if(!t)return e.workspaceRef;e.parentWorkspaceExisted=void 0;try{return e.workspaceRef=await Wi(lx()).resolveLocal(t.parentRoot),await hx(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 yx(e){let t=e.parentWorkspaceExisted;if(!t)return e.workspaceRef;e.parentWorkspaceExisted=void 0;try{return e.workspaceRef=await Wi(lx()).createLocal(t.currentRoot),await hx(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 bx(e){let t=e.pendingWorkspaceInit;if(!t)return e.workspaceRef;e.pendingWorkspaceInit=void 0;try{return e.workspaceRef=await Wi(lx()).createLocal(t.root),await hx(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 xx(e,t){let n=e.workspaceRef?.root;if(!n)return!1;let r=lx(),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 Sx(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 Cx(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 wx(e){return e.filter(e=>e.type===`text`).map(e=>e.text).join(`
|
|
591
|
-
`)}function Tx(e){return typeof e==`string`?e:wx(e)}function Ex(e){return wx(e)}function Dx(e){return wx(e)}function Ox(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:Tx(t.content)});continue}if(t.role===`assistant`){s({kind:`assistant.message`,at:e.timestamp,turnIndex:o,text:Ex(t.content),model:t.model,usage:{input:t.usage.inputTokens,output:t.usage.outputTokens},stopReason:t.stopReason});for(let n of ba(t))s(kx(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:Dx(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 kx(e,t,n){return{kind:`tool.call`,at:t,turnIndex:n,toolCallId:e.id,toolName:e.name,arguments:e.arguments}}function Ax(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 jx(e,t,n){return e.filter(e=>(t==null||e.seq>t)&&e.seq<n)}async function Mx(e){let t=await e.repo.getEntryCount(e.sessionId),n=jx(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{...Ax({records:Ox({sessionId:e.sessionId,entries:r,signals:e.signals??[]}),redact:e.redact,output:e.output}),upperSeq:t,entryCount:n.length}}function Nx(){let e=[];return{lines:e,write(t){return e.push(t),!0}}}async function Px(e,t,n={}){let r=t.sessionRepoRef.current;if(!r)throw Error(`轨迹导出仅支持关系化 SQLite 后端(sessions.db)。当前后端不支持。`);let i=t.evolutionSignals.list();if(n.output)return Mx({sessionId:e,repo:r,redact:n.redact,output:n.output,signals:i});let a=Nx();return{...await Mx({sessionId:e,repo:r,redact:n.redact,output:a,signals:i}),lines:a.lines}}const Fx=/(\/[\w.\-]+)+/g,Ix=/\s+at\s+[\w.<>\[\]:]+ \(.*?\)/g,Lx=/\s+\(.*?:\d+:\d+\)/g,Rx=/(?:sk-|key|token|secret|password)[-=:\s]+[A-Za-z0-9_\-]{8,}/gi;function zx(e){return e.replace(Ix,` [stack]`).replace(Lx,``).replace(Fx,`[path]`).replace(Rx,`$1=[redacted]`).replace(/\s{2,}/g,` `).trim()}function Bx(e){try{let t=b(e,`utf8`);return JSON.parse(t)}catch{return[]}}function Vx(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 Hx(e=`${r}/plugin-failures`){let t=C(e,`failures.json`);return{async push(e){let n=Bx(t),r=Date.parse(e.occurredAt);n.some(t=>t.pluginId===e.pluginId&&t.reason===e.reason&&r-Date.parse(t.occurredAt)<6e4)||Vx(t,[...n,e].slice(-16))},list:()=>Promise.resolve(Bx(t)),async consumeAll(){try{et(t,{force:!0})}catch{}}}}async function Ux(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 Wx=0;function Gx(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 Kx=class{processOwnerId=`app-${++Wx}`;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;webSearchOptions;hostCapabilities;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 ax(this,e)}connectorTools(){return ox(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 Ux({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=dx(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.webSearchOptions=e.webSearch,this.hostCapabilities=e.hostCapabilities,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,hostCapabilities:e.hostCapabilities,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,Gx(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),ux(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:zx(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=fx(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,ux(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 mx(this)}async completeWorkspaceDependentStartup(){return hx(this)}needsWorkspaceInit(){return gx(this)}async confirmWorkspaceInit(){return bx(this)}hasParentWorkspace(){return _x(this)}async adoptParentWorkspace(){return vx(this)}async createLocalWorkspace(){return yx(this)}async setWorkspaceMemorySyncEnabled(e){return xx(this,e)}async sweepOrphanTraceFiles(){return Sx(this)}async stop(){return Cx(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={...Jx(t),id:`plugin_ask_${++this.userAskSeq}`,askedBy:`plugin:${e}`},r=this.userAskRenderer;if(!this._interactive||!r)return qx();let i=this.inquiryCenter.enqueue({id:n.id,origin:{kind:`plugin`,pluginId:e},question:n});if(!i.accepted)return qx();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,qx()),e}}notifyUserInteraction(){this.notifications.notifyUserInteraction()}setTerminalFocus(e){this.notifications.setTerminalFocus(e)}setFollowUpPendingProbe(e){this.followUpPendingProbe=e}notifyPluginServices(e){let t=_u(),n=Xx(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 Px(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 sx(this,e)}async buildModelCatalog(e){return this.model.buildModelCatalog(e)}setSessionAvailableModels(e,t){this.model.setSessionAvailableModels(e,t)}registerHooks(){cx(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 qx(){return{answer:``,acceptedRecommendation:!1,resolvedBy:`human`}}function Jx(e){return{header:Yx(e.header,160),question:Yx(e.question,2e3),background:Yx(e.background,4e3),recommendation:Yx(e.recommendation,1e3),...e.options?{options:e.options.slice(0,8).map(e=>({label:Yx(e.label,120),rationale:Yx(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=>Yx(e,1e3))}:{}}}function Yx(e,t){return String(e??``).replace(/[----]/g,` `).slice(0,t)}function Xx(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 Zx(e){return new Kx(e)}function Qx(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 $x(e){return{createSession:async t=>Qx(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 eS=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 tS(e){return e.absolutePaths.length>0||e.bareSpecifiers.length>0}function nS(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:`)||eS.has(e)||n.includes(e)||n.push(e)}return{absolutePaths:t,bareSpecifiers:n}}function rS(e,t){let n=nS(t);if(!tS(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 iS(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 aS(e,t=O){let n=t(e);return n.gated||!(e.manifest.capabilities?.includes(`tools`)??!1)?!1:!n.pendingCapabilities.includes(`tools`)}async function oS(e,t,n){let r=[];for(let i of e){if(!aS(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 iS(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 sS=20;function cS(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 lS(e,t,n){let r=e?.manifest.contributes?.contextKeys;return{...t,...yr(r,n)}}function uS(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 dS(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 fS=T(`@x-otto/coding:plugin-cli-passthrough`),pS=6e4;function mS(e){let t=e.manifest.contributes?.cli?.bin,n=t?C(e.dir,t):hS(e.dir);if(n)return gS(n,e.dir)}function hS(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 gS(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){fS.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 _S(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)){fS.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 vS(e,t){let n=_S(e,t),r=new Map;for(let[e,t]of n){if(t.length===1){r.set(e,t[0]);continue}fS.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 yS(e,t,n){let r=_S(e,t).get(n);return r&&r.length>=2?r.map(e=>e.id):void 0}function bS(e,t,n,r=pS){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 xS(e,t){let n=new Map,r=(e,r,i)=>{if(t.has(e)){fS.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 SS(e,t){let n=xS(e,t),r=new Map;for(let[e,t]of n){if(t.length===1){r.set(e,t[0]);continue}fS.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 CS(e,t){let n=SS(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 wS(e,t,n){let r=xS(e,t).get(n);return r&&r.length>=2?r:void 0}async function TS(e,t=pS){let n,r=new Promise(e=>{n=setTimeout(()=>{fS.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 fS.warn({err:String(e)},`in-process plugin CLI command threw; returning exit code 1`),1}finally{n&&clearTimeout(n)}}function ES(e,t={}){return _r({cwd:t.workspaceDir??process.cwd(),homedir:t.homedir??at(),bundledDirs:t.bundledDirs}).find(t=>t.id===e)}function DS(e,t,n={}){let r=ES(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 OS(e,t={}){let n=ES(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 kS(e,t={}){let n=ES(e,t);return n?(Kr(n.dir),!0):!1}const AS=T(`@x-otto/coding:plugin-theme-preset-loader`),jS=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){AS.warn({pluginId:n.id},`plugin gated (untrusted), themePresets skipped`);continue}let r=e;r.length>rr&&(AS.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(jS.has(e.localId)){AS.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,Kx as App,Jt as CodingSessionPool,Mb as DEFAULT_WORKSPACE_KEY,vo as ExtensionManager,Xn as HIGH_RISK_CAPABILITIES,jb as INDUCTOR_PLUGIN_ID,sS 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,rS as assertPortableArtifact,DS as authorizePlugin,lS as buildExtensionContext,Ha as buildMemoryStore,vS as buildPluginCliRegistry,SS as buildUnifiedCliCommandRegistry,Sa as builtinOfficialSource,Qt as captureFiles,Ox as captureTrajectory,Ca as checkArchiveBomb,wa as checkGitUpgrades,wf as checkPluginConsistency,Ta as checkUpgrades,qr as claudeTrustStorePath,Ea as cleanTempDir,CS as collectPluginCliCommandsForHelp,oS as collectPluginPerfMetrics,MS as collectPluginThemePresets,$l as compilePluginModule,uf as compilePluginPanels,nu as computeSourceHash,Zx as createApp,Da as createArchive,lr as createBuiltinHashtags,hp as createBuiltinResolvers,Jr as createClaudeHookBridgeHooks,dr as createFileProvider,$x as createFrontendPort,Up as createLessonInjectionHooks,la as createLocalFireOwnership,Hx 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,Ax as exportTrajectory,Mx as exportTrajectoryFromSession,Aa as extractArchive,yS as findPluginCliNameConflict,nS as findPortabilityViolations,wS 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,tS as hasPortabilityViolations,OS 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,dS as openTarget,si as parseClaudeHooks,pi as parseDotMcpJson,Mr as parsePluginManifest,Pa as parseRegistry,Pr as pluginTrustStorePath,Qd as purgePluginState,Fr as readHighRiskCapabilities,cS as readPluginLogTail,Jb 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,mS as resolvePluginCliBin,lo as resolvePluginMcpServers,Ni as resolveProjectConfigTrusted,En as resolveSessionTitle,On as restoreFiles,kS as revokePluginAuthorization,iu as rewriteArtifactSourceHash,TS as runInProcessCliCommand,uS as runPluginScript,zx as sanitizeFailureMessage,Fa as scanInstalledVersions,jx as selectTrajectoryEntries,Vr as sigilOf,bS 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};
|
|
487
|
+
`).length:0}function Bp(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=zp(i),n=zp(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:zp(o),removedLines:0,timestamp:Date.now(),toolCallId:t}}function Vp(e={}){let{onFileEdited:t,getOnFileEdited:n,dedupCache:r}=e;return I({name:`edit-files-panel`,timing:`tool.execute.after`,priority:90,handle(e){let i=n?.()??t;if(!i||e.readonly)return;let a=Bp(e);if(!a)return;let o=a.toolCallId;if(r){if(r.has(o))return;r.add(o)}i(a)}})}function Hp(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(`
|
|
488
|
+
`)}\n</delegate-notification>`}function Up(){let e=new Map,t=new Set;return{hooks:[I({name:`agent-job-notification-injector`,timing:`messages.transform`,priority:25,handle:(t,n)=>{Op(e,t,n)}}),I({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(Hp(r)),e.set(n,i)}}}function Wp(e){e.hookRegistry.register(hp(e.toolRegistry,e.getDefaultToolPreset)),e.hookRegistry.register(Te(e.failureSignals)),e.hookRegistry.register(Ee(e.failureSignals)),e.hookRegistry.registerAll(e.contextSourcesBuildHooks(e.workspaceDir,e.memory)),e.hookRegistry.registerAll(Jt(e.workspaceDir)),e.memory&&e.hookRegistry.registerAll(Xt(e.memory)),e.hookRegistry.registerAll(Qt({getTodoList:t=>e.getSession(t)?.session.getTodoList()}));let t=/-milestone\.md$/,n=/^Status:\s*Done\b/m;e.hookRegistry.registerAll(qt({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(Ep(e.learningStore,e.promptManager,e.localLearningStore,{workspaceDir:e.workspaceDir},e.memory)),e.skillRegistry&&e.hookRegistry.registerAll(Dp(e.skillRegistry)),e.hookRegistry.registerAll(e.claudeHooks),e.hookRegistry.registerAll(Ap()),e.hookRegistry.on(`session.deleted`,`rfc047-notification-detach`,t=>e.notificationDispatcher.detach(t.sessionId));let r=Up();return e.hookRegistry.registerAll(r.hooks),e.hookRegistry.register(jp(e=>{j.killAllForSession(e)})),e.hookRegistry.registerAll(Mp({registry:e.permissionRegistry,getPersistedAllow:t=>e.codingSessionPool.getSessionPermissionAllow(t)})),e.hostApprovalGate&&e.hookRegistry.register(Rp()),e.hookRegistry.register(Ip({getContext:()=>{let t=je(e.workspaceDir,E());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:Se(n,e.workspaceDir,et(),e.sandbox.writablePaths),deniedRoots:t,networkAllowed:e.sandbox.isNetworkAllowed,autoAllowBashIfSandboxed:e.sandbox.autoAllowBashIfSandboxed}}})),e.hookRegistry.registerAll(Pp(t=>e.getSession(t),e.memoryAutoExtractor,{isEnabled:()=>e.settings.get(`memory_auto_extract`)?.enabled===!0||process.env.OTTO_MEMORY_AUTO_EXTRACT===`1`})),e.hookRegistry.register(Vp({getOnFileEdited:e.getEditFileCallback,dedupCache:e.editFilesDedup})),{agentJobNotify:r.notify}}function Gp(e,t,n,r){return pp({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,webSearch:e.webSearchOptions,hostCapabilities:e.hostCapabilities,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)`},t,n,r)}function Kp(e,t){return Ie(t,mp(Gp(e,t,e.skillRegistry?Pn(e.skillRegistry,t):void 0,!1))).getAvailable(e.defaultToolPreset)}function qp(e){return e.toolRegistry.getAvailable(e.defaultToolPreset).filter(e=>e.name.startsWith(`mcp__`))}function Jp(e,t){let n=t.skillProvider??(e.skillRegistry?Pn(e.skillRegistry,e.workspaceDir):void 0);t.sandbox&&e.sandbox.pin(t.sandbox);let r={registerChild(e,t){return{pid:j.registerChild(e,t).pid??0}}};return Ie(e.workspaceDir,{...mp(Gp(e,e.workspaceDir,n,t.lsp===!0)),processTracker:r})}function Yp(e){e.agentJobNotify=Wp({hookRegistry:e.hookRegistry,toolRegistry:e.toolRegistry,getDefaultToolPreset:()=>e.defaultToolPreset,failureSignals:e.failureSignals,contextSourcesBuildHooks:(t,n)=>e.agentRuntime.contextSources.sealAndBuildHooks(t,n),workspaceDir:e.workspaceDir,memory:e.storage.memory,learningStore:e.learningStore,localLearningStore:e.localLearningStore,promptManager:e.promptManager,skillRegistry:e.skillRegistry,notificationDispatcher:e.notificationDispatcher,permissionRegistry:e.permissionRegistry,codingSessionPool:e.codingSessionPool,sandbox:e.sandbox,settings:e.settings,getEditFileCallback:()=>e.editFileCallback,editFilesDedup:e._editFilesDedup,memoryAutoExtractor:e.memoryAutoExtractor,getSession:t=>e.getSession(t),claudeHooks:e.compatProducts?.hooks??[],logger:e.logger,hostApprovalGate:e.hostCapabilities?.permissionAsk!==void 0}).agentJobNotify}function Xp(e){return{async readFile(e){try{return await Ui(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return null;throw e}},async writeFile(e,t){await Vi(D(e),{recursive:!0}),await En(e,t)},async writeFileExclusive(e,t){await Vi(D(e),{recursive:!0});try{let n=await Hi(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??Li,now:e?.now??(()=>new Date().toISOString())}}async function Zp(e){if(e.ensureNotDisposed(),await e.ensureSettingsLoaded(),!e.workspaceRef&&!e.pendingWorkspaceInit&&!e.parentWorkspaceExisted)try{let t=Ii(Xp()),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 gt(`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 Tc(e.workspaceDir,{plugins:e.activePlugins(),claudeProjectAgentsAllowed:e.compatProducts?!e.compatProducts.trustVerdict.gated:void 0}),e.declarativeTeams=await jc(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=()=>gt(`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 gt(`completeWorkspaceDependentStartup (session restoreAll)`,()=>Qp(e)):gt(`sweepOrphanTraceFiles (headless)`,()=>am(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`&&om(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(),ft(`app.start() internal phases complete`),e.logger.info(`App started`)}async function Qp(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)}}}am(e)}function $p(e){return!!e.pendingWorkspaceInit}function em(e){return!!e.parentWorkspaceExisted}async function tm(e){let t=e.parentWorkspaceExisted;if(!t)return e.workspaceRef;e.parentWorkspaceExisted=void 0;try{return e.workspaceRef=await Ii(Xp()).resolveLocal(t.parentRoot),await Qp(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 nm(e){let t=e.parentWorkspaceExisted;if(!t)return e.workspaceRef;e.parentWorkspaceExisted=void 0;try{return e.workspaceRef=await Ii(Xp()).createLocal(t.currentRoot),await Qp(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 rm(e){let t=e.pendingWorkspaceInit;if(!t)return e.workspaceRef;e.pendingWorkspaceInit=void 0;try{return e.workspaceRef=await Ii(Xp()).createLocal(t.root),await Qp(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 im(e,t){let n=e.workspaceRef?.root;if(!n)return!1;let r=Xp(),i=await Ri(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 Bi(n,a,r),e.workspaceRef={key:zi(a.id),id:a.id,root:n,...a.memorySyncEnabled?{memorySyncEnabled:!0}:{}},!0}async function am(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:[O(t,`trace`),O(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 om(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`,()=>j.killAllForOwner(`app`,e.processOwnerId)),await n(`mcpController`,()=>e.mcpController.stop()),await n(`processRuntime`,()=>j.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`,()=>Du()),await n(`pluginServices`,()=>ru()),await n(`sandbox`,()=>e.sandbox.dispose()),e.devtools&&await n(`devtools`,()=>e.devtools.stop()),await n(`logSub`,()=>{e.globalLogSubscription&&=(e.globalLogSubscription(),null)}),await n(`traceStore`,()=>e.storage.traceStore.close?.()),await n(`checkpointStore`,()=>e.storage.checkpointStore.close?.()),await n(`authStore`,()=>e._authStore.dispose()),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 sm(e){return t=>{e?.({type:`plugin.load-failed`,...t})}}async function cm(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 lm=0;function um(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 dm=class{processOwnerId=`app-${++lm}`;get processOwner(){return this.processOwnerId}settings;toolRegistry;hookRegistry;planeRegistry=new Pt;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 _t({store:(()=>{let e=new bt(E());return c()?Dt(e):e})()});completeText;clock;fileStateManager;learningStore;webSearchOptions;hostCapabilities;localLearningStore;memoryAutoExtractor;promptManager;orchestrator;runSession;writeTodos;sessionConfigResolver;session;model;notifications;permissions;runTeam;skillRegistry;i18nRegistry;_pendingProviderCapabilities=[];get pendingProviderCapabilities(){return this._pendingProviderCapabilities}declarativeAgentProfiles=[];compatProducts;extensions;pluginInput=sr();sigilResolvers=new oo;expandSigilChips(e,t){return go(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 ao;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 _e;diagnoser=new ge(this.failureSignals);pluginHealthTracker=ll();pluginCapabilityQuota=new fl;inquiryCenter=new ml;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;notificationDispatcher;presenceTracker;followUpPendingProbe;toolsSyncCoordinator;onMcpStartupSettled;pendingMcpStartupResult;setMcpStartupCallback(e){this.onMcpStartupSettled=e,this.pendingMcpStartupResult&&=(e(this.pendingMcpStartupResult),void 0)}pluginContributionsFacade;buildToolsForWorkspace(e){return Kp(this,e)}connectorTools(){return qp(this)}get agentJobs(){return this.agentJobServiceInstance||=ns({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()}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){ps(this,e)}unregisterHook(e){return ms(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 cm({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 lf;pluginModuleManager;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??ui,this.maxToolTurns=a??Lt.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??E(),this._pluginBundledDirs=h??[],this._resilienceOverride=e.resilience,this.logger=A(n.name,{level:n.level,destination:n.destination});let g={};this.sessionRepoRef=g,this.sessionStorageDir=e.storage?.session&&`dir`in e.storage.session?e.storage.session.dir:void 0;let _=$f({logger:this.logger,hookRegistry:e.hookRegistry,getToolRegistry:()=>this.toolRegistry,getPermissionRegistry:()=>this.permissionRegistry,onHookTimeout:({hookName:e,timeoutMs:t})=>{let n=Vc(e);n&&this.pluginHealthTracker.recordHookTimeout(n,e)}});this.sandbox=_.sandbox,this._memoryGovernor=_.memoryGovernor,this._residencyGovernor=_.residencyGovernor,this._fleetMonitor=_.fleetMonitor,this.permissionSync=_.permissionSync,this.hookRegistry=_.hookRegistry;let v=uf(e,()=>this.settings);this._authStore=v.authStore,this._modelRegistry=v.modelRegistry,this.providerRegistry=v.providerRegistry,this.wireProtocolRegistry=v.wireProtocolRegistry,this.modelCatalogManager=v.modelCatalogManager;let te=v.defaultModel,ne=v.resolveEffectiveModel,re=e.modelId,y=Ba({options:e,workspaceDir:this.workspaceDir,providerRegistry:this.providerRegistry,defaultModel:te,resolveEffectiveModel:ne,repoRef:g,getWorkspaceRef:()=>this.workspaceRef,onMemoryConflict:e.onMemoryConflict,getActiveSessionBytes:()=>{let e=this.codingSessionPool?.active?.session;return e instanceof ci?e.estimatedContentBytes:void 0},getRealInputTokens:()=>this.codingSessionPool?.active?.getLastTotalInputTokens(),getToolRegistry:()=>this.toolRegistry,getEffectiveMaxBytes:()=>{let e=this.codingSessionPool;if(e)return e.getResidencyDiagnostics().maxBytesPerSession},getCoverageThresholds:Ia(()=>this.settings.get(`residency`)),...Fa(e=>this.codingSessionPool?.getSession?.(e)?.session,()=>this.codingSessionPool?.active?.session)});this.storage={storageHost:y.storageHost,autoMemory:y.autoMemory,memory:y.memory,traceStore:y.traceStore,traceLive:y.traceLive,checkpointStore:y.checkpointStore,remoteMemoryConfigured:!!(e.storage?.remote?.getAuth&&e.storage?.session&&`url`in e.storage.session),remoteSessionConfigured:!!(e.storage?.session&&`url`in e.storage.session)},this.clock=y.clock;let ae=ep({inspect:t,loggerName:n.name,workspaceDir:this.workspaceDir,projectConfigPath:r,interactive:this._interactive,permissionSync:this.permissionSync,sandbox:this.sandbox,onSettingsApplied:e=>{this.settingsLoaded=!0,e.tool_preset&&(this.defaultToolPreset=e.tool_preset)},getI18nRegistry:()=>this.i18nRegistry});this.devtools=ae.devtools,this.globalLogSubscription=ae.logSubscription,this.settings=ae.settings;let oe=ss({getConfig:()=>this.settings.get(`notification`),getCwd:()=>this.workspaceDir,isFollowUpPending:()=>this.followUpPendingProbe?.()??!1,emitHookNotification:e=>void this.hookRegistry.emit(`notification`,e)});this.notificationDispatcher=oe.dispatcher,this.presenceTracker=oe.presenceTracker,this.compatProducts=Ga(this.workspaceDir,this.activePlugins());let se=this.settings,b=Wa({skillProvider:e.skillProvider,workspaceDir:this.workspaceDir,activePlugins:()=>this.activePlugins(),resolveEffectiveModel:ne,providerRegistry:this.providerRegistry,prompt:e.prompt,compatProducts:this.compatProducts,memoryStore:y.memoryStore,memoryAutoExtractConfig:{enabled:!0,get everyNTurns(){return se.get(`memory_auto_extract`)?.every_n_turns},get maxLessons(){return se.get(`memory_auto_extract`)?.max_lessons},get similarityThreshold(){return se.get(`memory_auto_extract`)?.similarity_threshold},get minRelevantHits(){return se.get(`memory_auto_extract`)?.min_relevant_hits}}});this.skillRegistry=b.skillRegistry,this.fileStateManager=b.fileStateManager,this.learningStore=b.learningStore,this.webSearchOptions=e.webSearch,this.hostCapabilities=e.hostCapabilities,this.localLearningStore=b.localLearningStore,this.memoryAutoExtractor=b.memoryAutoExtractor,this.completeText=b.completeText,this.promptManager=b.promptManager;let ce=ie(this._authStore,`delegation`),le=tp({getModelRegistry:()=>this.modelRegistry,providerRegistry:this.providerRegistry,authStore:this._authStore,getSettings:()=>this.settings,promptManager:this.promptManager,getTools:()=>this.tools,getDeclarativeAgentProfiles:()=>this.getEnabledAgentProfiles(),defaultModel:te,explicitModelId:re,isModelUsable:ce,maxToolTurns:this.maxToolTurns,maxToolTurnExtensions:this.maxToolTurnExtensions,promptOutputTokenBudget:this.promptOutputTokenBudget,promptWallClockBudgetMs:this.promptWallClockBudgetMs,sessionCostBudgetUSD:this.sessionCostBudgetUSD,stallDetection:this.stallDetection,workspaceDir:this.workspaceDir,getWorkspaceRef:()=>this.workspaceRef,workspaceId:this._workspaceId,logger:this.logger,getResilienceConfig:()=>this.getResilienceConfig()}),ue=le.visionDelegateService;this.sessionConfigResolver=le.sessionConfigResolver;let de=np({options:e,hookRegistry:this.hookRegistry,providerRegistry:this.providerRegistry,getModelRegistry:()=>this._modelRegistry,logger:this.logger,workspaceDir:this.workspaceDir,getTools:()=>this.tools,getDeclarativeAgentProfiles:()=>this.getEnabledAgentProfiles(),getWorkspaceRef:()=>this.workspaceRef,repoRef:g,maxToolTurns:this.maxToolTurns,promptManager:this.promptManager,memory:this.storage.memory,traceStore:this.storage.traceStore,checkpointStore:this.storage.checkpointStore,clock:this.clock,devtools:this.devtools??void 0,residencyGovernor:this._residencyGovernor,getResidencyConfig:()=>this.getResidencyConfig(),visionDelegateService:ue,resolveEffectiveModel:ne,defaultModel:te,planeRegistry:this.planeRegistry,hostCapabilities:e.hostCapabilities,semanticReviewer:fp({getPermissionMode:()=>this.getPermissionMode(),isSemanticReviewEnabled:()=>this.settings.get(`sandbox`)?.semanticReview===!0,resolveReviewModel:()=>{let e=ne();if(e)return ee(`compact`,e,this._modelRegistry)[0]??e},createLlmReviewer:e=>Yt({stream:this.codingSessionPool.stream,model:e})})});this.agentRuntime=de.agentRuntime,this.codingSessionPool=de.codingSessionPool,um(this);let fe=de.swarmAgentRunner,pe=rp({hookRegistry:this.hookRegistry,stream:this.codingSessionPool.stream,logger:this.logger,defaultModel:de.defaultModel,providerRegistry:this.providerRegistry,getDeclarativeTeams:()=>this.declarativeTeams,getDeclarativeAgentProfiles:()=>this.getEnabledAgentProfiles(),getSession:e=>this.getSession(e),createSession:e=>this.createSession(e),removeSession:e=>this.removeSession(e),sessionConfigResolver:this.sessionConfigResolver,swarmAgentRunner:fe,workflowConfig:{retry:this.settings.get(`workflow`)?.retry,circuitBreaker:this.settings.get(`workflow`)?.circuitBreaker,orchestration:this.settings.get(`workflow`)?.orchestration}});this.orchestrator=pe.orchestrator,this.runSession=pe.runSession,this.runTeam=pe.runTeam,this.writeTodos=pe.writeTodos,this.toolRegistry=this.initToolRegistry(e);let me=sp({toolRegistry:this.toolRegistry,hookRegistry:this.hookRegistry,settings:this.settings,workspaceDir:this.workspaceDir,logger:this.logger,getResilienceConfig:()=>this.getResilienceConfig(),compatProducts:this.compatProducts});this.permissionRegistry=me.permissionRegistry,this.auditLog=me.auditLog,this.mcpController=me.mcpController;let he=me.preExistingHooks;this.extensions=cp({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=ip({mcpController:this.mcpController,callMcpTool:(e,t,n)=>this.callMcpTool(e,t,n),getActivePlugins:()=>this.activePlugins()}).panelBackendController;let ge=lp({pluginInput:this.pluginInput,sigilResolvers:this.sigilResolvers,settings:this.settings,workspaceDir:this.workspaceDir,activePlugins:()=>this.activePlugins(),agentRuntime:this.agentRuntime,hookRegistry:this.hookRegistry,preExistingHooks:he,codingSessionPoolGet:e=>this.codingSessionPool.getSession(e),logger:this.logger,registerHooks:()=>this.registerHooks()});this.ownedHookNames=ge.ownedHookNames,this.processRegistryUnsubs=ge.processRegistryUnsubs,this.i18nRegistry=new er;let _e=ap({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),sm(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=_e.pluginModuleManager,this.pluginProviderManager=_e.pluginProviderManager,this.capabilityReloader=_e.capabilityReloader,this.toolRegistry.onMutation=e=>{this.permissionSync.sync(this.settings.config);for(let t of e.added??[])this.pluginModuleManager.emitMonitorEvent({type:`tool.registered`,toolName:t,source:e.source});for(let t of e.removed??[])this.pluginModuleManager.emitMonitorEvent({type:`tool.unregistered`,toolName:t,source:e.source})},this.settings.on(`change`,e=>{let t=e,n=this.lastSettingsConfig;if(this.lastSettingsConfig=t,!n)return;let r=new Set([...Object.keys(n),...Object.keys(t)]),i=[];for(let e of r)n[e]!==t[e]&&i.push(e);i.length>0&&this.pluginModuleManager.emitMonitorEvent({type:`settings.changed`,keys:i})});let ve=op({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=ve.toolsSyncCoordinator,this.pluginContributionsFacade=ve.pluginContributionsFacade,this.session=new Us(this),this.model=new bs(this),this.notifications=new Ts(this),this.permissions=new Ms(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 up(this.settings,()=>this.settingsLoaded,e=>{this.settingsLoaded=e}),dp(this.deferredConfigSteps())}freezeResilienceConfig(){if(this._resilienceConfig!==void 0)return;let e=wi(process.env.OTTO_RESILIENCE_CONFIG),t=this._resilienceOverride?Di(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,sm(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 To(So(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 Zp(this)}async completeWorkspaceDependentStartup(){return Qp(this)}needsWorkspaceInit(){return $p(this)}async confirmWorkspaceInit(){return rm(this)}hasParentWorkspace(){return em(this)}async adoptParentWorkspace(){return tm(this)}async createLocalWorkspace(){return nm(this)}async setWorkspaceMemorySyncEnabled(e){return im(this,e)}async sweepOrphanTraceFiles(){return am(this)}async stop(){return om(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={...pm(t),id:`plugin_ask_${++this.userAskSeq}`,askedBy:`plugin:${e}`},r=this.userAskRenderer;if(!this._interactive||!r)return fm();let i=this.inquiryCenter.enqueue({id:n.id,origin:{kind:`plugin`,pluginId:e},question:n});if(!i.accepted)return fm();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,fm()),e}}notifyUserInteraction(){this.notifications.notifyUserInteraction()}setTerminalFocus(e){this.notifications.setTerminalFocus(e)}setFollowUpPendingProbe(e){this.followUpPendingProbe=e}notifyPluginServices(e){let t=nu(),n=hm(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)?nu().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)}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 Jp(this,e)}async buildModelCatalog(e){return this.model.buildModelCatalog(e)}setSessionAvailableModels(e,t){this.model.setSessionAvailableModels(e,t)}registerHooks(){Yp(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 fm(){return{answer:``,acceptedRecommendation:!1,resolvedBy:`human`}}function pm(e){return{header:mm(e.header,160),question:mm(e.question,2e3),background:mm(e.background,4e3),recommendation:mm(e.recommendation,1e3),...e.options?{options:e.options.slice(0,8).map(e=>({label:mm(e.label,120),rationale:mm(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=>mm(e,1e3))}:{}}}function mm(e,t){return String(e??``).replace(/[----]/g,` `).slice(0,t)}function hm(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 gm(e){return new dm(e)}function _m(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:()=>rs(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 vm(e){return{createSession:async t=>_m(await e.createSession(t)),jobs:cn,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 ym=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 bm(e){return e.absolutePaths.length>0||e.bareSpecifiers.length>0}function xm(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:`)||ym.has(e)||n.includes(e)||n.push(e)}return{absolutePaths:t,bareSpecifiers:n}}function Sm(e,t){let n=xm(t);if(!bm(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(`
|
|
489
|
+
`))}function Cm(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 wm(e,t=N){let n=t(e);return n.gated||!(e.manifest.capabilities?.includes(`tools`)??!1)?!1:!n.pendingCapabilities.includes(`tools`)}async function Tm(e,t,n){let r=[];for(let i of e){if(!wm(i,t))continue;let e=i.manifest.contributes?.perfMetrics;if(!e?.length)continue;let a=Ou(i.scope);for(let t of e){let e=(async()=>{try{let{result:e,error:n}=await Cm(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 Em=20;function Dm(e,t=20){let n=Rc(e);if(!n||!x(n))return[];let r;try{r=C(n,`utf8`)}catch{return[]}let i=r.split(`
|
|
490
|
+
`).filter(e=>e.trim().length>0).slice(-t),a=[];for(let e of i)try{a.push(JSON.parse(e))}catch{}return a}function Om(e,t,n){let r=e?.manifest.contributes?.contextKeys;return{...t,...fr(r,n)}}function km(e,t){let n=e.manifest.scripts?.[t];if(!n)return Promise.reject(Error(`plugin ${e.id} 无脚本「${t}」`));let r=lt(n);return r.safe?new Promise((r,i)=>{let a=F(n,{shell:!0,cwd:e.dir,stdio:`ignore`,env:ct()});a.on(`error`,i),a.on(`exit`,e=>e===0?r():i(Error(`脚本「${t}」退出码 ${e}`)))}):Promise.reject(Error(`脚本「${t}」被安全检查拦截:${r.reason}`))}function Am(e){let t=e.startsWith(`chrome://`);process.platform===`darwin`?F(`open`,t?[`-a`,`Google Chrome`,e]:[e],{detached:!0,stdio:`ignore`}).unref():process.platform===`win32`?F(`cmd`,[`/c`,`start`,``,e],{detached:!0,stdio:`ignore`}).unref():F(t?`google-chrome`:`xdg-open`,[e],{detached:!0,stdio:`ignore`}).unref()}const $=A(`@x-otto/coding:plugin-cli-passthrough`),jm=6e4;function Mm(e){let t=e.manifest.contributes?.cli?.bin,n=t?O(e.dir,t):Nm(e.dir);if(n)return Pm(n,e.dir)}function Nm(e){let t=O(e,`package.json`);if(x(t))try{let n=JSON.parse(C(t,`utf8`));if(typeof n.bin==`string`)return O(e,n.bin);if(n.bin&&typeof n.bin==`object`){let t=Object.values(n.bin)[0];return typeof t==`string`?O(e,t):void 0}return}catch{return}}function Pm(e,t){if(!x(e))return;let n,r;try{n=w(e),r=w(t)}catch{return}let i=r.endsWith(`/`)?r:`${r}/`;if(!n.startsWith(i)&&n!==r){$.warn({candidate:e,pluginDir:t},`Plugin CLI bin resolves outside plugin directory (symlink escape rejected)`);return}try{if(!Xe(n).isFile())return}catch{return}return n}function Fm(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)){$.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 Im(e,t){let n=Fm(e,t),r=new Map;for(let[e,t]of n){if(t.length===1){r.set(e,t[0]);continue}$.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 Lm(e,t,n){let r=Fm(e,t).get(n);return r&&r.length>=2?r.map(e=>e.id):void 0}function Rm(e,t,n,r=jm){return new Promise((i,a)=>{let o=F(e,t,{stdio:`inherit`,cwd:n,env:ct()}),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 zm(e,t){let n=new Map,r=(e,r,i)=>{if(t.has(e)){$.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 Bm(e,t){let n=zm(e,t),r=new Map;for(let[e,t]of n){if(t.length===1){r.set(e,t[0]);continue}$.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 Vm(e,t){let n=Bm(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 Hm(e,t,n){let r=zm(e,t).get(n);return r&&r.length>=2?r:void 0}async function Um(e,t=jm){let n,r=new Promise(e=>{n=setTimeout(()=>{$.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 $.warn({err:String(e)},`in-process plugin CLI command threw; returning exit code 1`),1}finally{n&&clearTimeout(n)}}function Wm(e,t={}){return ur({cwd:t.workspaceDir??process.cwd(),homedir:t.homedir??E(),bundledDirs:t.bundledDirs}).find(t=>t.id===e)}function Gm(e,t,n={}){let r=Wm(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=>Wn.includes(e)),a=t??[],o=a.filter(e=>!Wn.includes(e));if(o.length>0)return{ok:!1,reason:`unknown-capability`,granted:[],pending:i,message:`Unknown capability: ${o.join(`, `)}. Valid high-risk capabilities: ${Wn.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)`}.`};Lr(r.dir),a.length>0&&_r(r.dir,a);let c=N(r);return{ok:!0,granted:[...a],pending:c.pendingCapabilities}}function Km(e,t={}){let n=Wm(e,t);if(!n)return{found:!1,trusted:!1,gated:!1,declared:[],granted:[],pending:[]};let r=N(n),i=(n.manifest?.capabilities??[]).filter(e=>Wn.includes(e));return{found:!0,trusted:r.trusted,gated:r.gated,declared:[...i],granted:[...r.grantedCapabilities],pending:[...r.pendingCapabilities]}}function qm(e,t={}){let n=Wm(e,t);return n?(zr(n.dir),!0):!1}const Jm=A(`@x-otto/coding:plugin-theme-preset-loader`),Ym=new Set([`dark`,`light`,`system`,`builtin`]);function Xm(e){let t=[];for(let n of e){let e=n.manifest.contributes?.themePresets;if(!e?.length)continue;if(N(n).gated){Jm.warn({pluginId:n.id},`plugin gated (untrusted), themePresets skipped`);continue}let r=e;r.length>Xn&&(Jm.warn({pluginId:n.id,declared:r.length,limit:Xn},`plugin declares more theme presets than the per-plugin limit, truncated`),r=r.slice(0,Xn));for(let e of r){if(Ym.has(e.localId)){Jm.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{Uo as AgentJobService,Mt as AgentSession,dm as App,Bt as CodingSessionPool,io as ExtensionManager,Un as HIGH_RISK_CAPABILITIES,Em as PLUGIN_LOG_TAIL_LINES,Qn as PLUGIN_MANIFEST_FILENAME,$n as POINT,Md as PluginConfigStore,ca as RegistryClient,Fp as SANDBOX_ESCALATION_MARKER,Xi as SCHEDULE_LEASE_MIGRATIONS,zt as SandboxUnavailableError,Zi as ScheduleRegistry,Qi as SchedulerService,oo as SigilResolverRegistry,g as apiCredentialId,Sm as assertPortableArtifact,Gm as authorizePlugin,Om as buildExtensionContext,ka as buildMemoryStore,Im as buildPluginCliRegistry,Bm as buildUnifiedCliCommandRegistry,la as builtinOfficialSource,Wt as captureFiles,ua as checkArchiveBomb,da as checkGitUpgrades,sf as checkPluginConsistency,fa as checkUpgrades,Br as claudeTrustStorePath,pa as cleanTempDir,Vm as collectPluginCliCommandsForHelp,Tm as collectPluginPerfMetrics,Xm as collectPluginThemePresets,Rl as compilePluginModule,Kd as compilePluginPanels,Vl as computeSourceHash,gm as createApp,ma as createArchive,nr as createBuiltinHashtags,Qf as createBuiltinResolvers,Vr as createClaudeHookBridgeHooks,ir as createFileProvider,vm as createFrontendPort,Ep as createLessonInjectionHooks,$i as createLocalFireOwnership,or as createPluginInputRegistry,ea as createRemoteFireOwnership,ta as createRemoteScheduleStore,ra as createScheduleStore,Zt as createSessionStableInjectionHooks,Dp as createSkillCatalogInjectionHooks,ha as createTempDir,hp as createToolGuidanceHook,Ur as defaultHookRunner,nn as defaultMaxToolTurnExtensions,uc as defaultPostInstallExecutor,on as deriveSessionTitle,Wr as detectClaudeExecutableSurface,cr as detectPluginExecutableSurface,bi as detectProjectConfigGating,ga as detectUninstallTarget,Gr as discoverFileCommands,lr as discoverPlugins,dr as dispatch,qr as evaluateClaudeTrust,pr as evaluatePluginTrust,xi as evaluateWorkspaceTrustPrompt,Yr as expandCommandBody,go as expandSigilChips,_a as extractArchive,Lm as findPluginCliNameConflict,xm as findPortabilityViolations,Hm as findUnifiedCliCommandConflict,a as findWorkspaceRoot,bl as getEsbuildModule,is as getIncompleteSubagentReason,rs as getLastAssistantText,sn as globalAgentJobRegistry,ln as globalAgentObservability,dn as globalProcessRuntime,gr as grantPluginCapabilities,vr as grantPluginCapabilitiesWithVersion,yr as grantedPluginCapabilities,br as grantedPluginCapabilitiesForVersion,bm as hasPortabilityViolations,Km as inspectPluginAuthorization,va as install,Cl as installEsbuildExitHook,Tl as installEsbuildSignalBridges,tf as installPluginFromDir,ef as installPluginFromPackage,Il as installPluginHostExternals,ya as installSkill,Xr as interpretPreToolUse,df as isInternalDelegatedSession,xr as isPluginTrusted,Zr as isProjectTrusted,Cr as isSensitiveField,Ci as isStrictProjectConfigEnabled,ba as listInstalledItems,Qr as loadClaudeHooksConfig,ql as loadPluginModule,xl as markEsbuildStarted,$r as matchesHookMatcher,gn as messagesFromSnapshot,Am as openTarget,ei as parseClaudeHooks,oi as parseDotMcpJson,Tr as parsePluginManifest,xa as parseRegistry,Dr as pluginTrustStorePath,Fd as purgePluginState,Or as readHighRiskCapabilities,Dm as readPluginLogTail,Bo as readTaskOutputTail,_n as reconstructMessages,af as recordPluginInstalled,of as recordPluginUninstalled,kr as redactSensitiveFields,rf as removeInstalledPluginEntry,Ar as resolveActions,ti as resolveClaudeMcpServers,Fl as resolveHostExternalPaths,$d as resolvePackageDir,Mm as resolvePluginCliBin,Xa as resolvePluginMcpServers,Ti as resolveProjectConfigTrusted,yn as resolveSessionTitle,xn as restoreFiles,qm as revokePluginAuthorization,Ul as rewriteArtifactSourceHash,Um as runInProcessCliCommand,km as runPluginScript,Sa as scanInstalledVersions,Pr as sigilOf,Rm as spawnPluginCli,Sl as stopEsbuildService,Ir as trustPlugin,ri as trustProject,Ca as uninstall,Rr as untrustPlugin,ii as untrustProject,nf as upsertInstalledPluginEntry,wa as validateExtractedPaths,El as withBuildTimeout};
|
|
594
491
|
//# sourceMappingURL=index.js.map
|