@ai-agent-forge/agent-forge 0.85.13 → 0.85.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/CHANGELOG.md +1 -4
- package/dist/bundle/.build-manifest.json +3 -3
- package/dist/bundle/chunks/{chunk-G3Y7J54C.js → chunk-2I2FZ6F3.js} +1 -1
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/core/extensions/capability-plugin.d.ts.map +1 -1
- package/dist/core/extensions/capability-plugin.js +11 -0
- package/dist/core/extensions/capability-plugin.js.map +1 -1
- package/package.json +1 -1
|
@@ -500,7 +500,7 @@ ${errors}
|
|
|
500
500
|
File: ${path15}`)}let config=parsed,providers=new Map;for(let[providerId,provider]of Object.entries(config.providers))providers.set(providerId,deepFreeze(structuredClone(provider)));return new _ModelConfig(providers)}getProvider(providerId){return this.providers.get(providerId)}getProviderIds(){return[...this.providers.keys()]}getError(){return this.error}};import{join as join5}from"node:path";var sharedModelsFileReadState,InMemoryCodingAgentModelsStore=class{entries=new Map;async read(providerId,options){options?.signal?.throwIfAborted();let entry=this.entries.get(providerId);return entry?structuredClone(entry):void 0}async write(providerId,entry,options){options?.signal?.throwIfAborted(),this.entries.set(providerId,structuredClone(entry))}async delete(providerId,options){options?.signal?.throwIfAborted(),this.entries.delete(providerId)}},FileModelsStore=class{storage;path;readState;constructor(path15=join5(getAgentDir(),"models-store.json")){this.path=normalizePath(path15),this.storage=new FileAuthStorageBackend(this.path),this.readState=sharedModelsFileReadState?.path===this.path?sharedModelsFileReadState.readState:{data:{}},sharedModelsFileReadState||(sharedModelsFileReadState={path:this.path,readState:this.readState})}parse(content){return content?JSON.parse(stripBom(content)):{}}updateReadState(readState,data,revision){readState.data=data,readState.revision=revision}reloadFromStorage(readState,options){return this.storage.withLockAsync(async content=>{let data=this.parse(content);return this.updateReadState(readState,data,getFileRevision(this.path)),{result:data}},options)}async readLatest(readState,options){options?.signal?.throwIfAborted();let revision=getFileRevision(this.path);if(revision!==void 0&&revision===readState.revision)return readState.data;if(!readState.reload){let controller=new AbortController,reload2={controller,promise:this.reloadFromStorage(readState,{signal:controller.signal}),readers:0};readState.reload=reload2,reload2.promise.then(()=>{readState.reload===reload2&&(readState.reload=void 0)},()=>{readState.reload===reload2&&(readState.reload=void 0)})}let reload=readState.reload;reload.readers++;try{return await raceWithAbortSignal(reload.promise,options?.signal)}finally{reload.readers--,reload.readers===0&&readState.reload===reload&&(readState.reload=void 0,reload.controller.abort())}}async read(providerId,options){let entry=(await this.readLatest(this.readState,options))[providerId];return options?.signal?.throwIfAborted(),entry?structuredClone(entry):void 0}async write(providerId,entry,options){let latest;await this.storage.withLockAsync(async content=>{let current=this.parse(content);return current[providerId]=structuredClone(entry),latest=current,{result:void 0,next:JSON.stringify(current,null,2)}},options),latest&&this.updateReadState(this.readState,latest)}async delete(providerId,options){let latest;await this.storage.withLockAsync(async content=>{let current=this.parse(content);return delete current[providerId],latest=current,{result:void 0,next:JSON.stringify(current,null,2)}},options),latest&&this.updateReadState(this.readState,latest)}};var imagesApiProviderRegistry=new Map;function wrapGenerateImages(api,generateImages){return(model,context,options)=>{if(model.api!==api)throw new Error(`Mismatched api: ${model.api} expected ${api}`);return generateImages(model,context,options)}}function registerImagesApiProvider(provider,sourceId){imagesApiProviderRegistry.set(provider.api,{provider:{api:provider.api,generateImages:wrapGenerateImages(provider.api,provider.generateImages)},sourceId})}var openRouterImagesProviderModulePromise;function createLazyLoadErrorImages(model,error2){return{api:model.api,provider:model.provider,model:model.id,output:[],stopReason:"error",errorMessage:error2 instanceof Error?error2.message:String(error2),timestamp:Date.now()}}function loadOpenRouterImagesProviderModule(){return openRouterImagesProviderModulePromise||=import("./openrouter-images-G3GT5BVT.js").then(module=>module),openRouterImagesProviderModulePromise}var generateImagesOpenRouter=async(model,context,options)=>{try{return await(await loadOpenRouterImagesProviderModule()).generateImages(model,context,options)}catch(error2){return createLazyLoadErrorImages(model,error2)}};function registerBuiltInImagesApiProviders(){registerImagesApiProvider({api:"openrouter-images",generateImages:generateImagesOpenRouter})}registerBuiltInImagesApiProviders();var apiProviderRegistry=new Map,activeFauxApis=new Map;function releaseFauxApiOwnership(sourceId){for(let[api,owner]of activeFauxApis)owner===sourceId&&activeFauxApis.delete(api)}function wrapStream(api,stream){return(model,context,options)=>{if(model.api!==api)throw new Error(`Mismatched api: ${model.api} expected ${api}`);return stream(model,context,options)}}function wrapStreamSimple(api,streamSimple2){return(model,context,options)=>{if(model.api!==api)throw new Error(`Mismatched api: ${model.api} expected ${api}`);return streamSimple2(model,context,options)}}function registerApiProvider(provider,sourceId){let previous=apiProviderRegistry.get(provider.api);previous?.sourceId&&releaseFauxApiOwnership(previous.sourceId),apiProviderRegistry.set(provider.api,{provider:{api:provider.api,stream:wrapStream(provider.api,provider.stream),streamSimple:wrapStreamSimple(provider.api,provider.streamSimple)},sourceId})}function getApiProvider(api){return apiProviderRegistry.get(api)?.provider}var BUILTIN_APIS=[["anthropic-messages",anthropicMessagesApi()],["openai-completions",openAICompletionsApi()],["openai-responses",openAIResponsesApi()],["openai-codex-responses",openAICodexResponsesApi()],["azure-openai-responses",azureOpenAIResponsesApi()],["google-generative-ai",googleGenerativeAIApi()],["google-vertex",googleVertexApi()],["mistral-conversations",mistralConversationsApi()],["bedrock-converse-stream",bedrockConverseStreamApi()],["pi-messages",piMessagesApi()]],builtinApiProviderInstances=new Map;function registerBuiltInApiProviders(){for(let[api,streams]of BUILTIN_APIS)getApiProvider(api)||registerApiProvider({api,stream:streams.stream,streamSimple:streams.streamSimple}),builtinApiProviderInstances.set(api,getApiProvider(api))}registerBuiltInApiProviders();var compatModels=builtinModels(),AMBIENT_AUTH_MARKER="<authenticated>";function hasExplicitApiKey(apiKey){return typeof apiKey=="string"&&apiKey.trim().length>0}function withEnvApiKey(model,options){if(hasExplicitApiKey(options?.apiKey))return options;let apiKey=getEnvApiKey(model.provider,options?.env);return!apiKey||apiKey===AMBIENT_AUTH_MARKER?options:{...options,apiKey}}function hasResolvedCloudflareAuth(options){return hasExplicitApiKey(options?.apiKey)||typeof options?.headers?.["cf-aig-authorization"]=="string"}function getBuiltinProviderForModel(model){if(getApiProvider(model.api)!==builtinApiProviderInstances.get(model.api))return;let provider=compatModels.getProvider(model.provider);return provider?.getModels().some(candidate=>candidate.api===model.api)?provider:void 0}function resolveApiProvider(api){let provider=getApiProvider(api);if(!provider)throw new Error(`No API provider registered for api: ${api}`);return provider}function streamSimple(model,context,options){let builtinProvider=getBuiltinProviderForModel(model);return builtinProvider?model.provider.startsWith("cloudflare-")&&!hasResolvedCloudflareAuth(options)?compatModels.streamSimple(model,context,options):builtinProvider.streamSimple(model,context,withEnvApiKey(model,options)):resolveApiProvider(model.api).streamSimple(model,context,withEnvApiKey(model,options))}async function completeSimple(model,context,options){return streamSimple(model,context,options).result()}function mergeCompat(base,override){if(!override)return base;let merged={...base,...override},baseNested=base,overrideNested=override,mergedNested=merged;for(let key of["openRouterRouting","vercelGatewayRouting","chatTemplateKwargs","chatTemplateArgs"]){let baseValue=baseNested?.[key],overrideValue=overrideNested[key];(typeof baseValue=="object"&&baseValue!==null||typeof overrideValue=="object"&&overrideValue!==null)&&(mergedNested[key]={...baseValue,...overrideValue})}return merged}function applyModelOverride(model,override){return{...model,name:override.name??model.name,reasoning:override.reasoning??model.reasoning,thinkingLevelMap:override.thinkingLevelMap?{...model.thinkingLevelMap,...override.thinkingLevelMap}:model.thinkingLevelMap,input:override.input??model.input,cost:override.cost?{input:override.cost.input??model.cost.input,output:override.cost.output??model.cost.output,cacheRead:override.cost.cacheRead??model.cost.cacheRead,cacheWrite:override.cost.cacheWrite??model.cost.cacheWrite,tiers:override.cost.tiers??model.cost.tiers}:model.cost,contextWindow:override.contextWindow??model.contextWindow,maxTokens:override.maxTokens??model.maxTokens,samplingParams:override.samplingParams?{...model.samplingParams,...override.samplingParams}:model.samplingParams,compat:mergeCompat(model.compat,override.compat)}}function modelFromJson(providerId,definition,providerConfig,defaults2){let api=definition.api??providerConfig.api??defaults2?.api;if(!api)throw new Error(`Provider ${providerId}, model ${definition.id}: no "api" specified. Set at provider or model level.`);let baseUrl=definition.baseUrl??providerConfig.baseUrl??defaults2?.baseUrl;if(!baseUrl)throw new Error(`Provider ${providerId}: "baseUrl" is required when defining custom models.`);if(definition.contextWindow!==void 0&&definition.contextWindow<=0)throw new Error(`Provider ${providerId}, model ${definition.id}: invalid contextWindow`);if(definition.maxTokens!==void 0&&definition.maxTokens<=0)throw new Error(`Provider ${providerId}, model ${definition.id}: invalid maxTokens`);return{id:definition.id,name:definition.name??definition.id,api,provider:providerId,baseUrl,reasoning:definition.reasoning??!1,thinkingLevelMap:definition.thinkingLevelMap,input:definition.input??["text"],cost:definition.cost??{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:definition.contextWindow??128e3,maxTokens:definition.maxTokens??16384,samplingParams:definition.samplingParams,headers:void 0,compat:mergeCompat(providerConfig.compat,definition.compat)}}function findModelDefaults(models,modelId,api){return models.find(model=>model.id===modelId)??(api?models.find(model=>model.api===api):void 0)??models.find(model=>model.api==="openai-completions")??models[0]}function applyModelsJson(providerId,baseModels,config){if(!config)return[...baseModels];if(config.oauth&&!config.baseUrl)throw new Error(`Provider ${providerId}: "baseUrl" is required when "oauth" is set.`);let hasOverrides=config.modelOverrides&&Object.keys(config.modelOverrides).length>0;if(!config.models?.length&&!config.baseUrl&&!config.headers&&!config.compat&&!hasOverrides&&!config.apiKey&&!config.oauth&&config.authHeader===void 0)throw new Error(`Provider ${providerId}: must specify "baseUrl", "headers", "compat", "modelOverrides", or "models".`);let models=baseModels.map(model=>({...model,baseUrl:config.oauth==="radius"?model.baseUrl:config.baseUrl??model.baseUrl,compat:mergeCompat(model.compat,config.compat)}));for(let definition of config.models??[]){let existingIndex=models.findIndex(model2=>model2.id===definition.id),defaults2=findModelDefaults(models,definition.id,definition.api??config.api),model=modelFromJson(providerId,definition,config,defaults2);existingIndex>=0?models[existingIndex]=model:models.push(model)}return models}function applyExtension(providerId,models,config){return config?config.models?config.models.map(definition=>{let defaults2=findModelDefaults(models,definition.id,definition.api??config.api),api=definition.api??config.api??defaults2?.api;if(!api)throw new Error(`Provider ${providerId}, model ${definition.id}: no "api" specified. Set at provider or model level.`);let baseUrl=definition.baseUrl??config.baseUrl??defaults2?.baseUrl;if(!baseUrl)throw new Error(`Provider ${providerId}: "baseUrl" is required when defining custom models.`);return{...definition,api,provider:providerId,baseUrl,headers:void 0}}):config.baseUrl?models.map(model=>({...model,baseUrl:config.baseUrl})):[...models]:[...models]}function adaptOAuth(config){return{name:config.name,isSubscription:config.isSubscription,login:async callbacks=>({...await config.login({onAuth:info=>callbacks.notify({type:"auth_url",...info}),onDeviceCode:info=>callbacks.notify({type:"device_code",...info}),onPrompt:prompt=>callbacks.prompt({type:"text",...prompt}),onProgress:message=>callbacks.notify({type:"progress",message}),onManualCodeInput:()=>callbacks.prompt({type:"manual_code",message:"Paste the authorization code"}),onSelect:prompt=>callbacks.prompt({type:"select",...prompt}),signal:callbacks.signal}),type:"oauth"}),refresh:async(credential,signal)=>({...await config.refreshToken(credential,signal),type:"oauth"}),toAuth:async credential=>({apiKey:config.getApiKey(credential)})}}function withConfiguredAuth(auth,headers,authHeader){let mergedHeaders=auth.headers||headers?{...auth.headers,...headers}:void 0;if(authHeader){if(!auth.apiKey)throw new Error("authHeader requires a resolved API key");mergedHeaders={...mergedHeaders,Authorization:`Bearer ${auth.apiKey}`}}return{...auth,headers:mergedHeaders}}function configuredApiKey(config,extension){return extension?.apiKey??config?.apiKey}function configuredHeaders(config,extension){if(!(!config?.headers&&!extension?.headers))return{...config?.headers,...extension?.headers}}async function configContextEnv(values,ctx,explicit){let env2={...explicit};for(let name of new Set(values.flatMap(getConfigValueEnvVarNames))){if(env2[name]!==void 0)continue;let value=await ctx.env(name);value!==void 0&&(env2[name]=value)}return Object.keys(env2).length>0?env2:void 0}function composeApiKeyAuth(providerId,base,config,extension){let inherited=base?.auth.apiKey,rawKey=configuredApiKey(config,extension),oauth=extension?.oauth??base?.auth.oauth;if(!inherited&&rawKey===void 0&&oauth)return;let rawHeaders=configuredHeaders(config,extension),authHeader=extension?.authHeader??config?.authHeader??!1;return{name:inherited?.name??"API key",login:inherited?.login??(async interaction=>({type:"api_key",key:await interaction.prompt({type:"secret",message:"Enter API key"})})),check:async input=>{if(input.credential){if(inherited?.check)return inherited.check(input);if(input.credential.key)return{type:"api_key",source:"stored credential"};let resolved2=await inherited?.resolve(input);return resolved2?{type:"api_key",source:resolved2.source}:void 0}if(rawKey!==void 0){if(isCommandConfigValue(rawKey))return{type:"api_key",source:"configured API key"};let envNames=getConfigValueEnvVarNames(rawKey);for(let name of envNames)if(await input.ctx.env(name)===void 0)return;return{type:"api_key",source:"configured API key"}}if(inherited?.check)return inherited.check(input);let resolved=await inherited?.resolve(input);return resolved?{type:"api_key",source:resolved.source}:void 0},resolve:async input=>{let result;if(input.credential)result=inherited?await inherited.resolve(input):input.credential.key?{auth:{apiKey:input.credential.key},env:input.credential.env,source:"stored credential"}:void 0;else if(rawKey!==void 0){let env2=await configContextEnv([rawKey],input.ctx),key=resolveConfigValueOrThrow(rawKey,`API key for provider "${providerId}"`,env2);result=inherited?await inherited.resolve({...input,credential:{type:"api_key",key}}):{auth:{apiKey:key},source:"configured API key"}}else result=await inherited?.resolve(input);if(!result)return;let explicitEnv={...input.credential?.env??{},...result.env??{}},headerEnv=await configContextEnv(Object.values(rawHeaders??{}),input.ctx,explicitEnv),headers=resolveHeadersOrThrow(rawHeaders,`provider "${providerId}"`,headerEnv);return{...result,auth:withConfiguredAuth(result.auth,headers,authHeader)}}}}function composeOAuthAuth(providerId,base,config,extension){let oauth=extension?.oauth?adaptOAuth(extension.oauth):base?.auth.oauth;if(!oauth)return;let rawHeaders=configuredHeaders(config,extension),authHeader=extension?.authHeader??config?.authHeader??!1;return{...oauth,toAuth:async credential=>{let auth=await oauth.toAuth(credential),env2=credential.env,headers=resolveHeadersOrThrow(rawHeaders,`provider "${providerId}"`,typeof env2=="object"&&env2!==null?env2:void 0);return withConfiguredAuth(auth,headers,authHeader)}}}function rawModelHeaders(model,config,extension){let definition=config?.models?.find(entry=>entry.id===model.id),extensionModel=extension?.models?.find(entry=>entry.id===model.id),headers={...config?.modelOverrides?.[model.id]?.headers,...definition?.headers,...extensionModel?.headers};return Object.keys(headers).length>0?headers:void 0}function validateExtensionProvider(providerId,base,modelsConfig,extension){if(extension.streamSimple&&!extension.api)throw new Error(`Provider ${providerId}: "api" is required when registering streamSimple.`);applyExtension(providerId,applyModelsJson(providerId,base?.getModels()??[],modelsConfig),extension)}function composeModelProvider(providerId,base,modelConfig,extension){let config=modelConfig.getProvider(providerId),extensionOAuthCredential,refreshedExtensionModels,currentExtension=()=>extension&&refreshedExtensionModels?{...extension,models:refreshedExtensionModels}:extension,getModels=()=>{let models=applyExtension(providerId,applyModelsJson(providerId,base?.getModels()??[],config),currentExtension());return extensionOAuthCredential&&extension?.oauth?.modifyModels&&(models=extension.oauth.modifyModels(models,extensionOAuthCredential)),models.map(model=>{let override=config?.modelOverrides?.[model.id];return override?applyModelOverride(model,override):model})};getModels();let apiKey=composeApiKeyAuth(providerId,base,config,extension),oauth=composeOAuthAuth(providerId,base,config,extension);if(!apiKey&&!oauth)throw new Error(`Provider ${providerId}: no authentication method configured.`);let supportsBaseApi=model=>base?.getModels().some(entry=>entry.api===model.api)??!1,streamWith=(model,context,options,simple)=>lazyStream(model,async()=>{if(extension?.streamSimple&&model.api===extension.api)return extension.streamSimple(model,context,options);if(base&&supportsBaseApi(model))return simple?base.streamSimple(model,context,options):base.stream(model,context,options);let api=getApiProvider(model.api);if(!api)throw new Error(`No API provider registered for api: ${model.api}`);return simple?api.streamSimple(model,context,options):api.stream(model,context,options)}),provider={id:providerId,name:extension?.name??config?.name??base?.name??extension?.oauth?.name??providerId,baseUrl:extension?.baseUrl??config?.baseUrl??base?.baseUrl,headers:base?.headers,auth:{...apiKey?{apiKey}:{},...oauth?{oauth}:{}},getModels,refreshModels:base?.refreshModels||extension?.refreshModels||extension?.oauth?.modifyModels?async context=>{await base?.refreshModels?.(context);let refreshed;if(extension?.refreshModels&&(refreshed=await extension.refreshModels(context)),context.signal.aborted)return;let oauthCredential=context.credential?.type==="oauth"?context.credential:void 0;await context.publish({update:()=>{refreshed&&(applyExtension(providerId,applyModelsJson(providerId,base?.getModels()??[],config),{...extension,models:refreshed}),refreshedExtensionModels=refreshed),extensionOAuthCredential=oauthCredential}})}:void 0,filterModels:base?.filterModels?(models,credential)=>base.filterModels(models,credential):void 0,stream:(model,context,options)=>streamWith(model,context,options,!1),streamSimple:(model,context,options)=>streamWith(model,context,options,!0)},fetchDeferred=base?.fetchDeferred;fetchDeferred&&(provider.fetchDeferred=(model,handle,options)=>fetchDeferred(model,handle,options));let cancelDeferred=base?.cancelDeferred;return cancelDeferred&&(provider.cancelDeferred=(model,handle,options)=>cancelDeferred(model,handle,options)),provider}function resolveConfiguredModelHeaders(model,config,extension,env2){return resolveHeadersOrThrow(rawModelHeaders(model,config,extension),`model "${model.provider}/${model.id}"`,env2)}function resolveCompatibilityRequestConfig(model,config,extension){let configured=resolveHeadersOrThrow({...configuredHeaders(config,extension),...rawModelHeaders(model,config,extension)},`model "${model.provider}/${model.id}"`);return{headers:model.headers||configured?{...model.headers,...configured}:void 0,authHeader:extension?.authHeader??config?.authHeader??!1}}function configuredRequestAuthStatus(config,extension){let value=configuredApiKey(config,extension);if(value===void 0)return;if(isCommandConfigValue(value))return{configured:!0,source:"models_json_command"};let names2=getConfigValueEnvVarNames(value);return names2.length>0?isConfigValueConfigured(value)?{configured:!0,source:"environment",label:names2.join(", ")}:{configured:!1}:{configured:!0,source:extension?.apiKey!==void 0?"fallback":"models_json_key"}}function getAgentForgeUserAgent(version){let runtime=process.versions.bun?`bun/${process.versions.bun}`:`node/${process.version}`;return`agent-forge/${version} (${process.platform}; ${runtime}; ${process.arch})`}var RETRYABLE_STATUS_CODES=new Set([408,425,429,500,502,503,504]);async function fetchWithRetry(input,init=void 0,options={}){let maxRetries=options.maxRetries===void 0||!Number.isFinite(options.maxRetries)?2:Math.max(0,Math.floor(options.maxRetries)),retryOnStatus=options.retryOnStatus??!0,parentSignal=init?.signal??void 0,timeoutSignal=options.timeoutMs!==void 0&&options.timeoutMs>0?AbortSignal.timeout(options.timeoutMs):void 0,attemptTimeoutMs=options.attemptTimeoutMs!==void 0&&options.attemptTimeoutMs>0?options.attemptTimeoutMs:void 0;for(let attempt2=0;;attempt2++){parentSignal?.throwIfAborted(),timeoutSignal?.throwIfAborted();let attemptTimeoutSignal=attemptTimeoutMs?AbortSignal.timeout(attemptTimeoutMs):void 0,signals=[parentSignal,timeoutSignal,attemptTimeoutSignal].filter(signal2=>signal2!==void 0),signal=signals.length>1?AbortSignal.any(signals):signals[0];try{let response2=await fetch(input,signal?{...init,signal}:init);if(!(retryOnStatus&&RETRYABLE_STATUS_CODES.has(response2.status)&&attempt2<maxRetries))return response2;try{await response2.body?.cancel()}catch{}}catch(error2){let attemptTimedOut=attemptTimeoutSignal?.aborted===!0&&!parentSignal?.aborted&&!timeoutSignal?.aborted;if(parentSignal?.aborted||timeoutSignal?.aborted||error2 instanceof Error&&error2.name==="AbortError"&&!attemptTimedOut&&timeoutSignal===void 0||attempt2>=maxRetries)throw error2}}}var REMOTE_CATALOG_ATTEMPT_TIMEOUT_MS=4e3,REMOTE_CATALOG_REFRESH_INTERVAL_MS=14400*1e3;function mergeModels(baseline,dynamic){let merged=[...baseline];for(let model of dynamic){let index3=merged.findIndex(entry=>entry.id===model.id);index3>=0?merged[index3]=model:merged.push(model)}return merged}function parseCatalog(providerId,value){let entries=Array.isArray(value)?value:typeof value=="object"&&value!==null&&"models"in value&&Array.isArray(value.models)?value.models:typeof value=="object"&&value!==null?Object.values(value):void 0;if(!entries)throw new Error(`Invalid model catalog for provider "${providerId}"`);return entries.filter(entry=>typeof entry=="object"&&entry!==null&&"id"in entry).map(model=>({...model,provider:providerId}))}function remoteModels(entry,localGeneratedAt){return entry?localGeneratedAt!==void 0&&(entry.lastModified===void 0||entry.lastModified<=localGeneratedAt)?[]:entry.models:[]}function withRemoteCatalog(provider,catalogBaseUrl,localGeneratedAt){let dynamicModels=[];return{...provider,getModels:()=>mergeModels(provider.getModels(),dynamicModels),refreshModels:async context=>{let stored=context.stored,restored=remoteModels(stored,localGeneratedAt).filter(model=>model.provider===provider.id);if(!await context.publish({update:()=>{dynamicModels=restored}})||!catalogBaseUrl||!context.allowNetwork||context.signal.aborted||!context.force&&stored?.checkedAt!==void 0&&stored.lastModified!==void 0&&Date.now()-stored.checkedAt<REMOTE_CATALOG_REFRESH_INTERVAL_MS)return;let validator=stored?.models.length?stored.etag:void 0,url=new URL(`/api/models/providers/${encodeURIComponent(provider.id)}`,catalogBaseUrl),response2=await fetchWithRetry(url,{headers:{accept:"application/json","User-Agent":getAgentForgeUserAgent(VERSION),...validator?{"if-none-match":validator}:{}},signal:context.signal},{attemptTimeoutMs:REMOTE_CATALOG_ATTEMPT_TIMEOUT_MS});if(context.signal.aborted)return;let checkedAt=Date.now();if(response2.status===304&&stored){await context.publish({persist:{...stored,checkedAt}});return}if(response2.status===404||response2.status===501){await context.publish({persist:{...stored??{models:[]},checkedAt,lastModified:0,etag:void 0}});return}if(!response2.ok)throw await context.publish({persist:{...stored??{models:[]},checkedAt}}),new Error(`Model catalog request failed for ${provider.id}: ${response2.status}`);let refreshed=parseCatalog(provider.id,await response2.json()),lastModified=Date.parse(response2.headers.get("last-modified")??"");if(context.signal.aborted)return;let entry={models:refreshed,checkedAt,lastModified:Number.isNaN(lastModified)?0:lastModified,etag:response2.headers.get("etag")??void 0},published=remoteModels(entry,localGeneratedAt);await context.publish({persist:entry,update:()=>{dynamicModels=published}})}}}var RuntimeCredentials=class{store;overrides=new Map;constructor(store){this.store=store}setRuntimeApiKey(providerId,apiKey){this.overrides.set(providerId,apiKey)}removeRuntimeApiKey(providerId){this.overrides.delete(providerId)}hasRuntimeApiKey(providerId){return this.overrides.has(providerId)}async read(providerId,options){options?.signal?.throwIfAborted();let override=this.overrides.get(providerId);return override?{type:"api_key",key:override}:this.store.read(providerId,options)}async list(options){let entries=new Map((await this.store.list(options)).map(entry=>[entry.providerId,entry]));options?.signal?.throwIfAborted();for(let providerId of this.overrides.keys())entries.set(providerId,{providerId,type:"api_key"});return[...entries.values()]}modify(providerId,fn,options){return this.store.modify(providerId,fn,options)}async delete(providerId,options){options?.signal?.throwIfAborted(),await this.store.delete(providerId,options),this.overrides.delete(providerId)}};var CredentialSynchronizationError=class extends Error{providerId;operation;credential;constructor(providerId,operation,credential,options){super(`Credential ${operation} committed for ${providerId}, but local synchronization failed`,options),this.name="CredentialSynchronizationError",this.providerId=providerId,this.operation=operation,this.credential=credential}};function mergeHeaders(base,override){if(!base&&!override)return;let merged={...base};for(let[name,value]of Object.entries(override??{})){let lowerName=name.toLowerCase();for(let existingName of Object.keys(merged))existingName.toLowerCase()===lowerName&&delete merged[existingName];merged[name]=value}return merged}var ModelRuntime=class _ModelRuntime{models;credentials;defaultBuiltins;builtins=new Map;nativeExtensionProviders=new Map;extensionProviders=new Map;compositionErrors=new Map;modelsPath;modelNetworkEnabled;config;snapshot={all:[],available:[],configuredProviders:new Set,storedProviders:new Set,auth:new Map};availabilityRefreshSeq=0;availabilityErrorSeq=0;providerAvailabilitySeq=new Map;availabilityError;credentialOperations=new Map;constructor(credentials,config,modelsPath,modelsStore,providers,modelNetworkEnabled){this.credentials=credentials,this.config=config,this.modelsPath=modelsPath,this.modelNetworkEnabled=modelNetworkEnabled,this.defaultBuiltins=new Map(providers.map(provider=>[provider.id,provider]));for(let[providerId,provider]of this.defaultBuiltins)this.builtins.set(providerId,provider);this.models=createModels({credentials,modelsStore}),this.rebuildProviders()}static async create(options={}){let credentials=new RuntimeCredentials(options.credentials??AuthStorage.create(options.authPath)),modelsPath=options.modelsPath===null?void 0:options.modelsPath??join6(getAgentDir(),"models.json"),config=await ModelConfig.load(modelsPath),modelsStore=options.modelsStore??(modelsPath?new FileModelsStore(options.modelsStorePath??join6(dirname3(modelsPath),"models-store.json")):new InMemoryCodingAgentModelsStore),builtinModelDataGeneratedAt=getBuiltinModelDataGeneratedAt(),providers=builtinProviders().map(provider=>provider.id==="radius"?provider:withRemoteCatalog(provider,options.catalogBaseUrl,builtinModelDataGeneratedAt)),runtime=new _ModelRuntime(credentials,config,modelsPath,modelsStore,providers,process.env.AGENT_FORGE_OFFLINE===void 0);runtime.configureRadiusProviders(),runtime.rebuildProviders();let refreshFromNetwork=runtime.modelNetworkEnabled&&options.allowModelNetwork===!0,controller=refreshFromNetwork&&options.modelRefreshTimeoutMs!==void 0?new AbortController:void 0,timeout=controller?setTimeout(()=>controller.abort(),options.modelRefreshTimeoutMs):void 0,signal=controller?options.signal?AbortSignal.any([options.signal,controller.signal]):controller.signal:options.signal;try{options.refreshOnCreate!==!1&&await runtime.refresh({allowNetwork:refreshFromNetwork,signal})}finally{timeout&&clearTimeout(timeout)}return runtime}configureRadiusProviders(){this.builtins.clear();for(let[providerId,provider]of this.defaultBuiltins)this.builtins.set(providerId,provider);for(let providerId of this.config.getProviderIds()){let config=this.config.getProvider(providerId);config?.oauth!=="radius"||!config.baseUrl||this.builtins.set(providerId,radiusProvider({id:providerId,name:config.name??providerId,gateway:config.baseUrl.replace(/\/v1\/?$/u,"")}))}}providerIds(){return new Set([...this.builtins.keys(),...this.nativeExtensionProviders.keys(),...this.config.getProviderIds(),...this.extensionProviders.keys()])}recomposeProvider(providerId){let base=this.nativeExtensionProviders.get(providerId)??this.builtins.get(providerId),extension=this.extensionProviders.get(providerId);if(!base&&!this.config.getProvider(providerId)&&!extension){this.models.deleteProvider(providerId),this.compositionErrors.delete(providerId);return}if(base&&!this.config.getProvider(providerId)&&!extension){this.models.setProvider(base),this.compositionErrors.delete(providerId);return}try{this.models.setProvider(composeModelProvider(providerId,base,this.config,extension)),this.compositionErrors.delete(providerId)}catch(error2){this.compositionErrors.set(providerId,error2 instanceof Error?error2.message:String(error2)),base?this.models.setProvider(base):this.models.deleteProvider(providerId)}}rebuildProviders(){this.models.clearProviders(),this.compositionErrors.clear();for(let providerId of this.providerIds())this.recomposeProvider(providerId);this.updateModelSnapshot()}updateModelSnapshot(){let all=[...this.models.getModels()];this.snapshot={...this.snapshot,all,available:all.filter(model=>this.snapshot.configuredProviders.has(model.provider))}}async runAvailabilityRefresh(seq,errorSeq,signal){let providers=this.models.getProviders(),[available,checks,credentials]=await Promise.all([this.models.getAvailable(void 0,{signal}),Promise.all(providers.map(async provider=>[provider.id,await this.models.checkAuth(provider.id,{signal})])),this.credentials.list({signal})]);if(seq!==this.availabilityRefreshSeq)return;let auth=new Map(checks),configuredProviders=new Set(checks.filter(entry=>entry[1]!==void 0).map(([providerId])=>providerId));this.snapshot={all:[...this.models.getModels()],available:[...available],configuredProviders,storedProviders:new Set(credentials.map(entry=>entry.providerId)),auth},errorSeq===this.availabilityErrorSeq&&(this.availabilityError=void 0)}queueAvailabilityRefresh(signal){let seq=++this.availabilityRefreshSeq;for(let[providerId,providerSeq]of this.providerAvailabilitySeq)this.providerAvailabilitySeq.set(providerId,providerSeq+1);let errorSeq=++this.availabilityErrorSeq,effectiveSignal=operationSignal(signal);return this.runAvailabilityRefresh(seq,errorSeq,effectiveSignal).catch(error2=>{throw errorSeq===this.availabilityErrorSeq&&!effectiveSignal.aborted&&(this.availabilityError=error2 instanceof Error?error2.message:String(error2)),error2})}async refreshProviderAvailability(providerId,signal){++this.availabilityRefreshSeq;let providerSeq=(this.providerAvailabilitySeq.get(providerId)??0)+1;this.providerAvailabilitySeq.set(providerId,providerSeq);let errorSeq=++this.availabilityErrorSeq;try{let[available,auth,credential]=await Promise.all([this.models.getAvailable(providerId,{signal}),this.models.checkAuth(providerId,{signal}),this.credentials.read(providerId,{signal})]);if(signal.throwIfAborted(),this.providerAvailabilitySeq.get(providerId)!==providerSeq)return;let configuredProviders=new Set(this.snapshot.configuredProviders),storedProviders=new Set(this.snapshot.storedProviders),authByProvider=new Map(this.snapshot.auth);auth?(configuredProviders.add(providerId),authByProvider.set(providerId,auth)):(configuredProviders.delete(providerId),authByProvider.delete(providerId)),credential?storedProviders.add(providerId):storedProviders.delete(providerId);let all=[...this.models.getModels()],availableById=new Map([...this.snapshot.available.filter(model=>model.provider!==providerId),...available].map(model=>[`${model.provider}\0${model.id}`,model]));this.snapshot={all,available:all.flatMap(model=>availableById.get(`${model.provider}\0${model.id}`)??[]),configuredProviders,storedProviders,auth:authByProvider},errorSeq===this.availabilityErrorSeq&&(this.availabilityError=void 0)}catch(error2){throw this.providerAvailabilitySeq.get(providerId)===providerSeq&&errorSeq===this.availabilityErrorSeq&&!signal.aborted&&(this.availabilityError=error2 instanceof Error?error2.message:String(error2)),error2}}getProviders(){return this.models.getProviders()}getProvider(providerId){return this.models.getProvider(providerId)}getModels(providerId){return this.models.getModels(providerId)}getModel(providerId,modelId){return this.models.getModel(providerId,modelId)}async checkAuth(providerId,options){return this.models.checkAuth(providerId,options)}async getAvailable(providerId,options){if(providerId){let errorSeq=++this.availabilityErrorSeq;try{let available=await this.models.getAvailable(providerId,options);return errorSeq===this.availabilityErrorSeq&&(this.availabilityError=void 0),available}catch(error2){throw errorSeq===this.availabilityErrorSeq&&!options?.signal?.aborted&&(this.availabilityError=error2 instanceof Error?error2.message:String(error2)),error2}}return await this.queueAvailabilityRefresh(options?.signal),this.snapshot.available}getAvailableSnapshot(){return this.snapshot.available}getError(){let errors=[],configError=this.config.getError();configError&&errors.push(configError);for(let[providerId,error2]of this.compositionErrors)errors.push(`Provider "${providerId}": ${error2}`);return this.availabilityError&&errors.push(`Availability refresh: ${this.availabilityError}`),errors.length>0?errors.join(`
|
|
501
501
|
|
|
502
502
|
`):void 0}getRegisteredProviderConfig(providerId){return this.extensionProviders.get(providerId)}getRegisteredProviderIds(){return[...new Set([...this.extensionProviders.keys(),...this.nativeExtensionProviders.keys()])]}getRegisteredNativeProvider(providerId){return this.nativeExtensionProviders.get(providerId)}getCompatibilityRequestConfig(model){return resolveCompatibilityRequestConfig(model,this.config.getProvider(model.provider),this.extensionProviders.get(model.provider))}isUsingOAuth(providerId){return this.snapshot.auth.get(providerId)?.type==="oauth"}isUsingSubscription(providerId){return this.isUsingOAuth(providerId)&&this.models.getProvider(providerId)?.auth.oauth?.isSubscription===!0}hasConfiguredAuth(providerId){return this.snapshot.configuredProviders.has(providerId)}async getAuth(providerOrModel,overrides={}){if(typeof providerOrModel=="string")return this.models.getAuth(providerOrModel,overrides);let resolution=await this.models.getAuth(providerOrModel,overrides);if(!resolution)return;let configuredHeaders2=resolveConfiguredModelHeaders(providerOrModel,this.config.getProvider(providerOrModel.provider),this.extensionProviders.get(providerOrModel.provider),{...resolution.env??{},...overrides.env??{}});return{...resolution,auth:{...resolution.auth,headers:mergeHeaders(resolution.auth.headers,configuredHeaders2)}}}enqueueCredentialOperation(providerId,signal,task){let previous=this.credentialOperations.get(providerId)??Promise.resolve(),markStarted,started=new Promise(resolve25=>{markStarted=resolve25}),operation=(async()=>(await previous.catch(()=>{}),signal.throwIfAborted(),markStarted?.(),task()))(),tail=operation.catch(()=>{});return this.credentialOperations.set(providerId,tail),tail.then(()=>{this.credentialOperations.get(providerId)===tail&&this.credentialOperations.delete(providerId)}),raceWithAbortSignal(started,signal).then(()=>operation)}async synchronizeCredentialState(providerId,operation,credential,signal){try{signal.throwIfAborted(),this.recomposeProvider(providerId);let compositionError=this.compositionErrors.get(providerId);if(compositionError)throw new Error(compositionError);let result=await this.models.refresh({allowNetwork:!1,providers:[providerId],signal});result.aborted&&signal.throwIfAborted();let refreshError=result.errors.get(providerId);if(refreshError)throw refreshError;this.updateModelSnapshot(),await this.refreshProviderAvailability(providerId,signal)}catch(cause){throw new CredentialSynchronizationError(providerId,operation,credential,{cause})}}setRuntimeApiKey(providerId,apiKey,options={}){let signal=operationSignal(options.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{this.credentials.setRuntimeApiKey(providerId,apiKey),await this.synchronizeCredentialState(providerId,"setRuntimeApiKey",{type:"api_key",key:apiKey},signal)})}removeRuntimeApiKey(providerId,options={}){let signal=operationSignal(options.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{this.credentials.removeRuntimeApiKey(providerId),await this.synchronizeCredentialState(providerId,"removeRuntimeApiKey",void 0,signal)})}listCredentials(options){return this.credentials.list(options)}getProviderAuthStatus(providerId){if(this.credentials.hasRuntimeApiKey(providerId))return{configured:!0,source:"runtime"};if(this.snapshot.storedProviders.has(providerId))return{configured:!0,source:"stored"};let configured=configuredRequestAuthStatus(this.config.getProvider(providerId),this.extensionProviders.get(providerId));if(configured)return configured;let check=this.snapshot.auth.get(providerId);return check?{configured:!0,source:"environment",label:check.source}:{configured:!1}}async prepareRequest(model,options){let provider=this.models.getProvider(model.provider);if(!provider)throw new ModelsError("provider",`Unknown provider: ${model.provider}`);let resolution=await this.getAuth(model,{apiKey:options?.apiKey,env:options?.env,signal:options?.signal});if(!resolution)throw new ModelsError("auth",`Provider is not configured: ${model.provider}`);let{transformHeaders,...rawProviderOptions}=options??{},providerOptions=rawProviderOptions,headers=mergeHeaders(resolution.auth.headers,providerOptions.headers);transformHeaders&&(headers=await transformHeaders(headers??{}));let env2=resolution.env||providerOptions.env?{...resolution.env??{},...providerOptions.env??{}}:void 0;return{provider,model:resolution.auth.baseUrl?{...model,baseUrl:resolution.auth.baseUrl}:model,options:{...providerOptions,apiKey:providerOptions.apiKey??resolution.auth.apiKey,headers,env:env2}}}stream(model,context,options){return lazyStream(model,async()=>{let prepared=await this.prepareRequest(model,options);return prepared.provider.stream(prepared.model,context,prepared.options)})}complete(model,context,options){return this.stream(model,context,options).result()}streamSimple(model,context,options){return lazyStream(model,async()=>{let prepared=await this.prepareRequest(model,options);return prepared.provider.streamSimple(prepared.model,context,prepared.options)})}completeSimple(model,context,options){return this.streamSimple(model,context,options).result()}async fetchDeferred(model,handle,options){return lazyStream(model,async()=>{let prepared=await this.prepareRequest(model,options);if(!prepared.provider.fetchDeferred)throw new ModelsError("provider",`Provider ${model.provider} does not support deferred responses`);return prepared.provider.fetchDeferred(prepared.model,handle,prepared.options)}).result()}async cancelDeferred(model,handle,options){let prepared=await this.prepareRequest(model,options);if(!prepared.provider.cancelDeferred)throw new ModelsError("provider",`Provider ${model.provider} does not support deferred responses`);await prepared.provider.cancelDeferred(prepared.model,handle,prepared.options)}login(providerId,type,interaction){let signal=operationSignal(interaction.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{let credential=await this.models.login(providerId,type,{...interaction,signal});return await this.synchronizeCredentialState(providerId,"login",credential,signal),credential})}logout(providerId,options={}){let signal=operationSignal(options.signal);return this.enqueueCredentialOperation(providerId,signal,async()=>{await this.models.logout(providerId,{signal}),await this.synchronizeCredentialState(providerId,"logout",void 0,signal)})}async refresh(options={}){if(this.config=await ModelConfig.load(this.modelsPath),this.configureRadiusProviders(),options.providers){for(let providerId of new Set(options.providers))this.recomposeProvider(providerId);this.updateModelSnapshot()}else this.rebuildProviders();let refreshOptions={...options,allowNetwork:options.allowNetwork??this.modelNetworkEnabled},result=await this.models.refresh(refreshOptions),errors=new Map(result.errors);if(this.updateModelSnapshot(),options.providers)await Promise.all([...new Set(options.providers)].map(async providerId=>{try{await this.refreshProviderAvailability(providerId,operationSignal(options.signal))}catch(error2){options.signal?.aborted||errors.set(providerId,error2 instanceof Error?error2:new Error(String(error2)))}}));else try{await this.queueAvailabilityRefresh(options.signal)}catch{}return{aborted:result.aborted||(options.signal?.aborted??!1),errors}}registerNativeProvider(provider){if(!provider.id.trim())throw new Error("Provider id must not be empty.");this.extensionProviders.delete(provider.id),this.nativeExtensionProviders.set(provider.id,provider),this.recomposeProvider(provider.id),this.updateModelSnapshot(),this.refresh({allowNetwork:!1})}registerProvider(providerId,config){validateExtensionProvider(providerId,this.builtins.get(providerId),this.config.getProvider(providerId),config),this.nativeExtensionProviders.delete(providerId);let effective={...this.extensionProviders.get(providerId)};for(let[key,value]of Object.entries(config))value!==void 0&&(effective[key]=value);if(this.extensionProviders.set(providerId,effective),this.recomposeProvider(providerId),this.updateModelSnapshot(),this.snapshot.storedProviders.has(providerId)||configuredRequestAuthStatus(this.config.getProvider(providerId),effective)?.configured){let configuredProviders=new Set(this.snapshot.configuredProviders).add(providerId),auth=new Map(this.snapshot.auth);auth.get(providerId)||auth.set(providerId,{type:effective.oauth&&!effective.apiKey?"oauth":"api_key",source:"configured provider"}),this.snapshot={...this.snapshot,auth,configuredProviders,available:this.snapshot.all.filter(model=>configuredProviders.has(model.provider))}}this.refresh({allowNetwork:!1})}unregisterProvider(providerId){this.extensionProviders.delete(providerId),this.nativeExtensionProviders.delete(providerId),this.recomposeProvider(providerId),this.updateModelSnapshot(),this.refresh({allowNetwork:!1})}};function readOrientationFromTiff(bytes,tiffStart){if(tiffStart+8>bytes.length)return 1;let le2=(bytes[tiffStart]<<8|bytes[tiffStart+1])===18761,read16=pos=>le2?bytes[pos]|bytes[pos+1]<<8:bytes[pos]<<8|bytes[pos+1],ifdOffset=(pos=>le2?bytes[pos]|bytes[pos+1]<<8|bytes[pos+2]<<16|bytes[pos+3]<<24:(bytes[pos]<<24|bytes[pos+1]<<16|bytes[pos+2]<<8|bytes[pos+3])>>>0)(tiffStart+4),ifdStart=tiffStart+ifdOffset;if(ifdStart+2>bytes.length)return 1;let entryCount=read16(ifdStart);for(let i=0;i<entryCount;i++){let entryPos=ifdStart+2+i*12;if(entryPos+12>bytes.length)return 1;if(read16(entryPos)===274){let value=read16(entryPos+8);return value>=1&&value<=8?value:1}}return 1}function findJpegTiffOffset(bytes){let offset=2;for(;offset<bytes.length-1;){if(bytes[offset]!==255)return-1;let marker=bytes[offset+1];if(marker===255){offset++;continue}if(marker===225){if(offset+4>=bytes.length)return-1;let segmentStart=offset+4;if(segmentStart+6>bytes.length)return-1;if(hasExifHeader(bytes,segmentStart))return segmentStart+6}if(offset+4>bytes.length)return-1;let length=bytes[offset+2]<<8|bytes[offset+3];offset+=2+length}return-1}function findWebpTiffOffset(bytes){let offset=12;for(;offset+8<=bytes.length;){let chunkId=String.fromCharCode(bytes[offset],bytes[offset+1],bytes[offset+2],bytes[offset+3]),chunkSize=bytes[offset+4]|bytes[offset+5]<<8|bytes[offset+6]<<16|bytes[offset+7]<<24,dataStart=offset+8;if(chunkId==="EXIF")return dataStart+chunkSize>bytes.length?-1:chunkSize>=6&&hasExifHeader(bytes,dataStart)?dataStart+6:dataStart;offset=dataStart+chunkSize+chunkSize%2}return-1}function hasExifHeader(bytes,offset){return bytes[offset]===69&&bytes[offset+1]===120&&bytes[offset+2]===105&&bytes[offset+3]===102&&bytes[offset+4]===0&&bytes[offset+5]===0}function getExifOrientation(bytes){let tiffOffset=-1;return bytes.length>=2&&bytes[0]===255&&bytes[1]===216?tiffOffset=findJpegTiffOffset(bytes):bytes.length>=12&&bytes[0]===82&&bytes[1]===73&&bytes[2]===70&&bytes[3]===70&&bytes[8]===87&&bytes[9]===69&&bytes[10]===66&&bytes[11]===80&&(tiffOffset=findWebpTiffOffset(bytes)),tiffOffset===-1?1:readOrientationFromTiff(bytes,tiffOffset)}function rotate90(photon,image,dstIndex){let w2=image.get_width(),h=image.get_height(),src=image.get_raw_pixels(),dst=new Uint8Array(src.length);for(let y2=0;y2<h;y2++)for(let x2=0;x2<w2;x2++){let srcIdx=(y2*w2+x2)*4,dstIdx=dstIndex(x2,y2,w2,h)*4;dst[dstIdx]=src[srcIdx],dst[dstIdx+1]=src[srcIdx+1],dst[dstIdx+2]=src[srcIdx+2],dst[dstIdx+3]=src[srcIdx+3]}return new photon.PhotonImage(dst,h,w2)}function applyExifOrientation(photon,image,originalBytes){let orientation=getExifOrientation(originalBytes);if(orientation===1)return image;switch(orientation){case 2:return photon.fliph(image),image;case 3:return photon.fliph(image),photon.flipv(image),image;case 4:return photon.flipv(image),image;case 5:{let rotated=rotate90(photon,image,(x2,y2,_w,h)=>x2*h+(h-1-y2));return photon.fliph(rotated),rotated}case 6:return rotate90(photon,image,(x2,y2,_w,h)=>x2*h+(h-1-y2));case 7:{let rotated=rotate90(photon,image,(x2,y2,w2,h)=>(w2-1-x2)*h+y2);return photon.fliph(rotated),rotated}case 8:return rotate90(photon,image,(x2,y2,w2,h)=>(w2-1-x2)*h+y2);default:return image}}import{createRequire}from"module";import*as path2 from"path";import{fileURLToPath as fileURLToPath3}from"url";var require2=createRequire(import.meta.url),fs=require2("fs"),WASM_FILENAME="photon_rs_bg.wasm",photonModule=null,loadPromise=null;function pathOrNull(file){return typeof file=="string"?file:file instanceof URL?fileURLToPath3(file):null}function getFallbackWasmPaths(){let execDir=path2.dirname(process.execPath);return[path2.join(execDir,WASM_FILENAME),path2.join(execDir,"photon",WASM_FILENAME),path2.join(process.cwd(),WASM_FILENAME)]}function patchPhotonWasmRead(){let originalReadFileSync=fs.readFileSync.bind(fs),fallbackPaths=getFallbackWasmPaths(),mutableFs=fs,patchedReadFileSync=((...args)=>{let[file,options]=args;if(pathOrNull(file)?.endsWith(WASM_FILENAME))try{return originalReadFileSync(...args)}catch(error2){let err2=error2;if(err2?.code&&err2.code!=="ENOENT")throw error2;for(let fallbackPath of fallbackPaths)if(fs.existsSync(fallbackPath))return options===void 0?originalReadFileSync(fallbackPath):originalReadFileSync(fallbackPath,options);throw error2}return originalReadFileSync(...args)});try{mutableFs.readFileSync=patchedReadFileSync}catch{Object.defineProperty(fs,"readFileSync",{value:patchedReadFileSync,writable:!0,configurable:!0})}return()=>{try{mutableFs.readFileSync=originalReadFileSync}catch{Object.defineProperty(fs,"readFileSync",{value:originalReadFileSync,writable:!0,configurable:!0})}}}async function loadPhoton(){return photonModule||loadPromise||(loadPromise=(async()=>{let restoreReadFileSync=patchPhotonWasmRead();try{return photonModule=await import("@silvia-odwyer/photon-node"),photonModule}catch{return photonModule=null,photonModule}finally{restoreReadFileSync()}})(),loadPromise)}async function convertImageBytesToPng(bytes){let photon=await loadPhoton();if(!photon)return null;try{let rawImage=photon.PhotonImage.new_from_byteslice(bytes),image=applyExifOrientation(photon,rawImage,bytes);image!==rawImage&&rawImage.free();try{return new Uint8Array(image.get_bytes())}finally{image.free()}}catch{return null}}async function convertToPng(base64Data,mimeType){if(mimeType==="image/png")return{data:base64Data,mimeType};let bytes=new Uint8Array(Buffer.from(base64Data,"base64")),pngBytes=await convertImageBytesToPng(bytes);return pngBytes?{data:Buffer.from(pngBytes).toString("base64"),mimeType:"image/png"}:null}import{Worker}from"node:worker_threads";var DEFAULT_MAX_BYTES=4.5*1024*1024,DEFAULT_OPTIONS={maxWidth:2e3,maxHeight:2e3,maxBytes:DEFAULT_MAX_BYTES,jpegQuality:80};function encodeCandidate(buffer,mimeType){let data=Buffer.from(buffer).toString("base64");return{data,encodedSize:Buffer.byteLength(data,"utf-8"),mimeType}}async function resizeImageInProcess(inputBytes,mimeType,options){let opts={...DEFAULT_OPTIONS,...options},inputBase64Size=Math.ceil(inputBytes.byteLength/3)*4,photon=await loadPhoton();if(!photon)return null;let image;try{let tryEncodings=function(width,height,jpegQualities){let resized=photon.resize(image,width,height,photon.SamplingFilter.Lanczos3);try{let candidates=[encodeCandidate(resized.get_bytes(),"image/png")];for(let quality of jpegQualities)candidates.push(encodeCandidate(resized.get_bytes_jpeg(quality),"image/jpeg"));return candidates}finally{resized.free()}},rawImage=photon.PhotonImage.new_from_byteslice(inputBytes);image=applyExifOrientation(photon,rawImage,inputBytes),image!==rawImage&&rawImage.free();let originalWidth=image.get_width(),originalHeight=image.get_height(),format=mimeType.split("/")[1]??"png";if(originalWidth<=opts.maxWidth&&originalHeight<=opts.maxHeight&&inputBase64Size<opts.maxBytes)return{data:Buffer.from(inputBytes).toString("base64"),mimeType:mimeType||`image/${format}`,originalWidth,originalHeight,width:originalWidth,height:originalHeight,wasResized:!1};let targetWidth=originalWidth,targetHeight=originalHeight;targetWidth>opts.maxWidth&&(targetHeight=Math.round(targetHeight*opts.maxWidth/targetWidth),targetWidth=opts.maxWidth),targetHeight>opts.maxHeight&&(targetWidth=Math.round(targetWidth*opts.maxHeight/targetHeight),targetHeight=opts.maxHeight);let qualitySteps=Array.from(new Set([opts.jpegQuality,85,70,55,40])),currentWidth=targetWidth,currentHeight=targetHeight;for(;;){let candidates=tryEncodings(currentWidth,currentHeight,qualitySteps);for(let candidate of candidates)if(candidate.encodedSize<opts.maxBytes)return{data:candidate.data,mimeType:candidate.mimeType,originalWidth,originalHeight,width:currentWidth,height:currentHeight,wasResized:!0};if(currentWidth===1&¤tHeight===1)break;let nextWidth=currentWidth===1?1:Math.max(1,Math.floor(currentWidth*.75)),nextHeight=currentHeight===1?1:Math.max(1,Math.floor(currentHeight*.75));if(nextWidth===currentWidth&&nextHeight===currentHeight)break;currentWidth=nextWidth,currentHeight=nextHeight}return null}catch{return null}finally{image&&image.free()}}function toTransferableBytes(input){return new Uint8Array(input)}function isResizeImageWorkerResponse(value){return value!==null&&typeof value=="object"}function createResizeWorker(workerSpecifier){return new Worker(workerSpecifier)}async function resizeImageInWorker(workerSpecifier,inputBytes,mimeType,options){let worker=createResizeWorker(workerSpecifier);try{let inputBytesForWorker=toTransferableBytes(inputBytes);return await new Promise((resolve25,reject2)=>{let settled=!1,settle=result=>{settled||(settled=!0,resolve25(result))},fail=error2=>{settled||(settled=!0,reject2(error2))};worker.once("message",message=>{if(!isResizeImageWorkerResponse(message)){fail(new Error("Invalid image resize worker response"));return}if(message.error){fail(new Error(message.error));return}settle(message.result??null)}),worker.once("error",fail),worker.once("exit",code=>{settled||fail(new Error(`Image resize worker exited with code ${code}`))}),worker.postMessage({inputBytes:inputBytesForWorker,mimeType,options},[inputBytesForWorker.buffer])})}finally{worker.terminate().catch(()=>{})}}async function resizeImage(inputBytes,mimeType,options){let isTypeScriptRuntime=import.meta.url.endsWith(".ts"),workerUrl=new URL(isTypeScriptRuntime?"./image-resize-worker.ts":"./image-resize-worker.js",import.meta.url);if(typeof process.versions.bun=="string")try{return await resizeImageInWorker("./src/utils/image-resize-worker.ts",inputBytes,mimeType,options)}catch{}try{return await resizeImageInWorker(workerUrl,inputBytes,mimeType,options)}catch{return resizeImageInProcess(inputBytes,mimeType,options)}}function formatDimensionNote(result){if(!result.wasResized)return;let scale=result.originalWidth/result.width;return`[Image: original ${result.originalWidth}x${result.originalHeight}, displayed at ${result.width}x${result.height}. Multiply coordinates by ${scale.toFixed(2)} to map to original image.]`}import{open}from"node:fs/promises";var IMAGE_TYPE_SNIFF_BYTES=4100,PNG_SIGNATURE=[137,80,78,71,13,10,26,10];function detectSupportedImageMimeType(buffer){return startsWith(buffer,[255,216,255])?buffer[3]===247?null:"image/jpeg":startsWith(buffer,PNG_SIGNATURE)?isPng(buffer)&&!isAnimatedPng(buffer)?"image/png":null:startsWithAscii(buffer,0,"GIF")?"image/gif":startsWithAscii(buffer,0,"RIFF")&&startsWithAscii(buffer,8,"WEBP")?"image/webp":startsWithAscii(buffer,0,"BM")&&isBmp(buffer)?"image/bmp":null}async function detectSupportedImageMimeTypeFromFile(filePath){let fileHandle=await open(filePath,"r");try{let buffer=Buffer.alloc(IMAGE_TYPE_SNIFF_BYTES),{bytesRead}=await fileHandle.read(buffer,0,IMAGE_TYPE_SNIFF_BYTES,0);return detectSupportedImageMimeType(buffer.subarray(0,bytesRead))}finally{await fileHandle.close()}}function isPng(buffer){return buffer.length>=16&&readUint32BE(buffer,PNG_SIGNATURE.length)===13&&startsWithAscii(buffer,12,"IHDR")}function isAnimatedPng(buffer){let offset=PNG_SIGNATURE.length;for(;offset+8<=buffer.length;){let chunkLength=readUint32BE(buffer,offset),chunkTypeOffset=offset+4;if(startsWithAscii(buffer,chunkTypeOffset,"acTL"))return!0;if(startsWithAscii(buffer,chunkTypeOffset,"IDAT"))return!1;let nextOffset=offset+8+chunkLength+4;if(nextOffset<=offset||nextOffset>buffer.length)return!1;offset=nextOffset}return!1}function isBmp(buffer){if(buffer.length<26)return!1;let declaredFileSize=readUint32LE(buffer,2),pixelDataOffset=readUint32LE(buffer,10),dibHeaderSize=readUint32LE(buffer,14);if(declaredFileSize!==0&&declaredFileSize<26||pixelDataOffset<14+dibHeaderSize||declaredFileSize!==0&&pixelDataOffset>=declaredFileSize)return!1;let colorPlanes,bitsPerPixel;if(dibHeaderSize===12)colorPlanes=readUint16LE(buffer,22),bitsPerPixel=readUint16LE(buffer,24);else if(dibHeaderSize>=40&&dibHeaderSize<=124){if(buffer.length<30)return!1;colorPlanes=readUint16LE(buffer,26),bitsPerPixel=readUint16LE(buffer,28)}else return!1;return colorPlanes===1&&[1,4,8,16,24,32].includes(bitsPerPixel)}function readUint16LE(buffer,offset){return(buffer[offset]??0)+((buffer[offset+1]??0)<<8)}function readUint32BE(buffer,offset){return(buffer[offset]??0)*16777216+((buffer[offset+1]??0)<<16)+((buffer[offset+2]??0)<<8)+(buffer[offset+3]??0)}function readUint32LE(buffer,offset){return(buffer[offset]??0)+((buffer[offset+1]??0)<<8)+((buffer[offset+2]??0)<<16)+(buffer[offset+3]??0)*16777216}function startsWith(buffer,bytes){return buffer.length<bytes.length?!1:bytes.every((byte,index3)=>buffer[index3]===byte)}function startsWithAscii(buffer,offset,text){if(buffer.length<offset+text.length)return!1;for(let index3=0;index3<text.length;index3++)if(buffer[offset+index3]!==text.charCodeAt(index3))return!1;return!0}function assertNonEmpty(value,label){if(typeof value!="string"||value.trim().length===0)throw new Error(`${label} must be a non-empty string`)}function matchesList(value,allowed){return allowed===void 0||allowed.length>0&&(allowed.includes(value)||allowed.includes("any"))}function hasAllFeatures(hostFeatures,required){if(required===void 0)return;let available=new Set(hostFeatures);return required.find(feature=>!available.has(feature))}function runtimeVersion(host,name){return host.runtime.find(runtime=>runtime.name===name)?.version}function diagnostic(code,message,details){return details===void 0?{code,message}:{code,message,details}}function adapterMatches(adapter,host){return matchesList(host.os,adapter.os)&&matchesList(host.arch,adapter.arch)&&hasAllFeatures(host.hostFeatures,adapter.hostFeatures)===void 0}function hostAdapterMatches(adapter,hostAdapter,host){return hostAdapter.id===adapter.id&&hostAdapter.version===adapter.version&&adapterMatches(adapter,host)&&(hostAdapter.os===void 0||hostAdapter.os===host.os||hostAdapter.os==="any")&&(hostAdapter.arch===void 0||hostAdapter.arch===host.arch||hostAdapter.arch==="any")&&hasAllFeatures(hostAdapter.hostFeatures??[],adapter.hostFeatures)===void 0}function selectAdapter(manifest,host){let adapters=manifest.platform?.adapters;if(adapters===void 0||adapters.length===0)return;let installed=host.adapters??[],selected=adapters.filter(adapter=>adapterMatches(adapter,host)).filter(adapter=>installed.some(hostAdapter=>hostAdapterMatches(adapter,hostAdapter,host))).sort((left,right)=>{let idOrder=left.id.localeCompare(right.id);return idOrder===0?comparePluginVersionsV1(right.version,left.version):idOrder})[0];return selected===void 0?{diagnostic:diagnostic("adapter-unavailable",`No installed adapter satisfies plugin ${manifest.id} on ${host.os}/${host.arch}`)}:{selected:{id:selected.id,version:selected.version}}}function normalizeRefs(refs){let normalized=[...refs??[]].map(ref=>{if(assertNonEmpty(ref.id,"capability id"),!Number.isSafeInteger(ref.version)||ref.version<1)throw new Error(`capability ${ref.id} version must be a positive safe integer`);return{id:ref.id,version:ref.version}});return normalized.sort((left,right)=>left.id===right.id?left.version-right.version:left.id.localeCompare(right.id)),normalized}function hasCapability(ref,available){return available.some(candidate=>candidate.id===ref.id&&candidate.version===ref.version)}function resolvePlatform(manifest,host){let platform3=manifest.platform;if(platform3===void 0)return{diagnostics:[]};if(!matchesList(host.os,platform3.os))return{status:"installed-unavailable",diagnostics:[diagnostic("unsupported-platform",`Plugin ${manifest.id} does not support host OS ${host.os}`)]};if(!matchesList(host.arch,platform3.arch))return{status:"installed-unavailable",diagnostics:[diagnostic("unsupported-architecture",`Plugin ${manifest.id} does not support host architecture ${host.arch}`)]};let missingFeature=hasAllFeatures(host.hostFeatures,platform3.hostFeatures);if(missingFeature!==void 0)return{status:"installed-unavailable",diagnostics:[diagnostic("missing-host-feature",`Host feature is missing: ${missingFeature}`,{feature:missingFeature})]};for(let constraint of platform3.runtime??[]){let actual=runtimeVersion(host,constraint.name);if(actual===void 0)return{status:"version-incompatible",diagnostics:[diagnostic("missing-runtime",`Required runtime is missing: ${constraint.name}`,{runtime:constraint.name})]};if(constraint.minVersion!==void 0&&comparePluginVersionsV1(actual,constraint.minVersion)<0||constraint.maxVersion!==void 0&&comparePluginVersionsV1(actual,constraint.maxVersion)>0)return{status:"version-incompatible",diagnostics:[diagnostic("runtime-version-incompatible",`Runtime ${constraint.name}@${actual} is outside the supported range`,{runtime:constraint.name,actual})]}}let selected=selectAdapter(manifest,host);return selected?.diagnostic!==void 0?{status:"dependency-unavailable",diagnostics:[selected.diagnostic]}:{diagnostics:[],selectedAdapter:selected?.selected}}function resolvePluginCompatibilityV1(input){let{manifest,host}=input;assertNonEmpty(manifest.id,"plugin id"),assertNonEmpty(manifest.pluginVersion,"pluginVersion"),assertNonEmpty(manifest.apiVersion,"apiVersion");let required=input.required??!0;if(input.disabled===!0)return{pluginId:manifest.id,pluginVersion:manifest.pluginVersion,required,status:"disabled",diagnostics:[diagnostic("plugin-disabled",`Plugin ${manifest.id} is disabled`)]};if(manifest.testOnly===!0)return{pluginId:manifest.id,pluginVersion:manifest.pluginVersion,required,status:"installed-unavailable",diagnostics:[diagnostic("test-only-plugin",`Plugin ${manifest.id} is test-only and cannot be selected for production`)]};if(!["windows","macos","linux"].includes(host.os))return{pluginId:manifest.id,pluginVersion:manifest.pluginVersion,required,status:"installed-unavailable",diagnostics:[diagnostic("unsupported-platform",`Host OS is unknown: ${host.os}`)]};if(!["x64","arm64"].includes(host.arch))return{pluginId:manifest.id,pluginVersion:manifest.pluginVersion,required,status:"installed-unavailable",diagnostics:[diagnostic("unsupported-architecture",`Host architecture is unknown: ${host.arch}`)]};if((manifest.minHostVersion!==void 0||manifest.maxHostVersion!==void 0)&&(manifest.minHostVersion!==void 0&&assertNonEmpty(manifest.minHostVersion,"minHostVersion"),manifest.maxHostVersion!==void 0&&assertNonEmpty(manifest.maxHostVersion,"maxHostVersion"),input.hostVersion!==void 0)){let belowFloor=manifest.minHostVersion!==void 0&&comparePluginVersionsV1(input.hostVersion,manifest.minHostVersion)<0,aboveCeiling=manifest.maxHostVersion!==void 0&&comparePluginVersionsV1(input.hostVersion,manifest.maxHostVersion)>0;if(belowFloor||aboveCeiling){let requiredRange=[manifest.minHostVersion!==void 0?`>= ${manifest.minHostVersion}`:void 0,manifest.maxHostVersion!==void 0?`<= ${manifest.maxHostVersion}`:void 0].filter(bound=>bound!==void 0).join(" and "),guidance=belowFloor?`Upgrade the host to at least ${manifest.minHostVersion} to load this plugin.`:`Install a plugin version whose declared host range includes ${input.hostVersion}.`;return{pluginId:manifest.id,pluginVersion:manifest.pluginVersion,required,status:"version-incompatible",diagnostics:[diagnostic("host-version-incompatible",`Plugin ${manifest.id} requires host version ${requiredRange}, but the host is ${input.hostVersion}. ${guidance}`,{required:requiredRange,actual:input.hostVersion})]}}}if(manifest.apiVersion!==host.apiVersion)return{pluginId:manifest.id,pluginVersion:manifest.pluginVersion,required,status:"version-incompatible",diagnostics:[diagnostic("api-version-incompatible",`Plugin requires API ${manifest.apiVersion}, host provides ${host.apiVersion}`)]};let platform3=resolvePlatform(manifest,host);if(platform3.status!==void 0)return{pluginId:manifest.id,pluginVersion:manifest.pluginVersion,required,status:platform3.status,diagnostics:platform3.diagnostics};let available=input.availableCapabilities??[],dependencyDiagnostics=[];for(let requirement of manifest.requires??[])hasCapability(requirement,available)||dependencyDiagnostics.push(diagnostic(requirement.optional===!0?"optional-capability-unavailable":"missing-capability",`Capability ${requirement.id}@${requirement.version} is unavailable`,{capability:requirement.id,version:String(requirement.version)}));if(dependencyDiagnostics.some(item=>item.code==="missing-capability"))return{pluginId:manifest.id,pluginVersion:manifest.pluginVersion,required,status:"dependency-unavailable",diagnostics:dependencyDiagnostics};let capabilityRefs=normalizeRefs(manifest.capabilityRefs),resolved={pluginId:manifest.id,pluginVersion:manifest.pluginVersion,capabilityRefs,...platform3.selectedAdapter===void 0?{}:{selectedAdapter:platform3.selectedAdapter}};return{pluginId:manifest.id,pluginVersion:manifest.pluginVersion,required,status:"installed-ready",diagnostics:dependencyDiagnostics,resolved,...platform3.selectedAdapter===void 0?{}:{selectedAdapter:platform3.selectedAdapter}}}function compareResolvedPlugins(left,right){return left.pluginId===right.pluginId?comparePluginVersionsV1(left.pluginVersion,right.pluginVersion):left.pluginId.localeCompare(right.pluginId)}function compareRefs(left,right){return left.id===right.id?left.version-right.version:left.id.localeCompare(right.id)}function buildResolvedManifestV1(input){assertNonEmpty(input.profileId,"profileId"),assertNonEmpty(input.profileVersion,"profileVersion");let plugins=[...input.plugins].map(plugin=>({pluginId:plugin.pluginId,pluginVersion:plugin.pluginVersion,capabilityRefs:normalizeRefs(plugin.capabilityRefs),...plugin.selectedAdapter===void 0?{}:{selectedAdapter:{...plugin.selectedAdapter}}})).sort(compareResolvedPlugins),capabilityRefs=plugins.flatMap(plugin=>plugin.capabilityRefs).sort(compareRefs).filter((ref,index3,all)=>index3===0||all[index3-1].id!==ref.id||all[index3-1].version!==ref.version),digestInput={profileId:input.profileId,profileVersion:input.profileVersion,plugins,capabilityRefs};return Object.freeze({profileId:input.profileId,profileVersion:input.profileVersion,plugins:Object.freeze(plugins.map(plugin=>Object.freeze({...plugin,capabilityRefs:Object.freeze(plugin.capabilityRefs)}))),capabilityRefs:Object.freeze(capabilityRefs),manifestDigest:stableJsonDigest(digestInput)})}function resolvePluginProfileV1(input){let plugins=input.plugins.map(candidate=>resolvePluginCompatibilityV1({manifest:candidate.manifest,host:input.host,required:candidate.required,disabled:candidate.disabled,availableCapabilities:input.availableCapabilities,hostVersion:input.hostVersion})).sort((left,right)=>left.pluginId===right.pluginId?comparePluginVersionsV1(left.pluginVersion,right.pluginVersion):left.pluginId.localeCompare(right.pluginId)),diagnostics=plugins.flatMap(plugin=>plugin.diagnostics),blocked=plugins.some(plugin=>plugin.required&&plugin.status!=="installed-ready"),resolvedPlugins=plugins.flatMap(plugin=>plugin.resolved===void 0?[]:[plugin.resolved]);return Object.freeze({profileId:input.profileId,profileVersion:input.profileVersion,status:blocked?"blocked":"ready",plugins:Object.freeze(plugins),diagnostics:Object.freeze(diagnostics),resolvedManifest:buildResolvedManifestV1({profileId:input.profileId,profileVersion:input.profileVersion,plugins:resolvedPlugins})})}function manifestPayload(manifest){return{id:manifest.id,pluginVersion:manifest.pluginVersion,apiVersion:manifest.apiVersion,...manifest.capabilityRefs===void 0?{}:{capabilityRefs:manifest.capabilityRefs},...manifest.requires===void 0?{}:{requires:manifest.requires},...manifest.platform===void 0?{}:{platform:manifest.platform},testOnly:manifest.testOnly??!1}}function pluginManifestDigestV1(manifest){return stableJsonDigest(manifestPayload(manifest))}function snapshotManifest(manifest){let capabilityRefs=manifest.capabilityRefs?.map(ref=>Object.freeze({...ref})),requires=manifest.requires?.map(requirement=>Object.freeze({...requirement})),platform3=manifest.platform,runtime=platform3?.runtime?.map(constraint=>Object.freeze({...constraint})),adapters=platform3?.adapters?.map(adapter=>Object.freeze({...adapter,os:Object.freeze([...adapter.os]),...adapter.arch===void 0?{}:{arch:Object.freeze([...adapter.arch])},...adapter.hostFeatures===void 0?{}:{hostFeatures:Object.freeze([...adapter.hostFeatures])}})),platformSnapshot=platform3===void 0?void 0:Object.freeze({...platform3,os:Object.freeze([...platform3.os]),...platform3.arch===void 0?{}:{arch:Object.freeze([...platform3.arch])},...runtime===void 0?{}:{runtime:Object.freeze(runtime)},...platform3.hostFeatures===void 0?{}:{hostFeatures:Object.freeze([...platform3.hostFeatures])},...adapters===void 0?{}:{adapters:Object.freeze(adapters)}});return Object.freeze({...manifest,...capabilityRefs===void 0?{}:{capabilityRefs:Object.freeze(capabilityRefs)},...requires===void 0?{}:{requires:Object.freeze(requires)},...platformSnapshot===void 0?{}:{platform:platformSnapshot}})}function stagePluginUpdateV1(input){if(input.source.trim().length===0)throw new Error("update source must be a non-empty string");return Object.freeze({pluginId:input.manifest.id,pluginVersion:input.manifest.pluginVersion,source:input.source,manifest:snapshotManifest(input.manifest),manifestDigest:pluginManifestDigestV1(input.manifest),state:"staged"})}function verifyPluginUpdateV1(input){let actualDigest=pluginManifestDigestV1(input.record.manifest);if(input.record.state!=="staged")return{status:"rejected",record:input.record,reason:`Update must be staged before verification: ${input.record.state}`};if(input.record.pluginId!==input.record.manifest.id)return{status:"rejected",record:input.record,reason:"Update record plugin ID does not match embedded manifest"};if(input.record.pluginVersion!==input.record.manifest.pluginVersion)return{status:"rejected",record:input.record,reason:"Update record plugin version does not match embedded manifest"};if(input.record.manifestDigest!==actualDigest)return{status:"rejected",record:input.record,reason:"Staged manifest digest drifted"};if(input.expectedDigest!==void 0&&input.expectedDigest!==actualDigest)return{status:"rejected",record:input.record,reason:"Manifest digest does not match expectation"};let resolution=resolvePluginCompatibilityV1({manifest:input.record.manifest,host:input.host,required:!0,availableCapabilities:input.availableCapabilities,hostVersion:VERSION});if(resolution.status!=="installed-ready")return{status:"rejected",record:input.record,reason:`Plugin is not ready on host: ${resolution.status}`};if(input.verifier!==void 0)try{if(input.verifier({pluginId:input.record.pluginId,pluginVersion:input.record.pluginVersion,source:input.record.source,manifestDigest:actualDigest}).status!=="accepted")return{status:"rejected",record:input.record,reason:"Plugin source was rejected by the configured verifier"}}catch{return{status:"rejected",record:input.record,reason:"Plugin source verifier failed"}}return{status:"verified",record:Object.freeze({...input.record,state:"verified"})}}function activatePluginUpdateV1(record){if(record.state!=="verified")throw new Error(`Only a verified update can become active: ${record.pluginId}`);return Object.freeze({...record,state:"active"})}function rollbackPluginUpdateV1(input){if(input.previous.pluginId!==input.failed.pluginId)throw new Error("Cannot rollback updates for different plugins");if(input.previous.state!=="active")throw new Error("Rollback target must be active");return Object.freeze({...input.previous,state:"active"})}var PluginCatalogErrorV1=class extends Error{code;constructor(code,message){super(message),this.name="PluginCatalogErrorV1",this.code=code}},DEFAULT_MAX_ENTRIES=128,MAX_ENTRIES=256;function comparePluginVersionsV1(left,right){let parse5=value=>value.trim().replace(/^[vV]/u,"").split(/[.+-]/u).map(part=>/^\d+$/u.test(part)?Number.parseInt(part,10):part),leftParts=parse5(left),rightParts=parse5(right);for(let index3=0;index3<Math.max(leftParts.length,rightParts.length);index3+=1){let a=leftParts[index3]??0,b2=rightParts[index3]??0;if(a!==b2)return typeof a=="number"&&typeof b2=="number"?a<b2?-1:1:typeof a=="number"?1:typeof b2=="number"||a<b2?-1:1}return 0}function compareCatalogEntries(left,right){let idOrder=left.id.localeCompare(right.id);return idOrder!==0?idOrder:comparePluginVersionsV1(right.pluginVersion,left.pluginVersion)}function buildPluginCatalogV1(input){let maxEntries=input.maxEntries??DEFAULT_MAX_ENTRIES;if(!Number.isSafeInteger(maxEntries)||maxEntries<1||maxEntries>MAX_ENTRIES)throw new PluginCatalogErrorV1("invalid_limit",`maxEntries must be an integer between 1 and ${MAX_ENTRIES}`);let manifests2=[...input.manifests].sort(compareCatalogEntries),seen=new Set;for(let manifest of manifests2){let identity=`${manifest.id}@${manifest.pluginVersion}`;if(seen.has(identity))throw new PluginCatalogErrorV1("duplicate_plugin_version",`Catalog contains duplicate plugin version: ${identity}`);seen.add(identity)}let disabled=new Set(input.disabledPluginIds??[]),entries=manifests2.slice(0,maxEntries).map(manifest=>{let resolution=resolvePluginCompatibilityV1({manifest,host:input.host,required:input.required,disabled:disabled.has(manifest.id),availableCapabilities:input.availableCapabilities,hostVersion:VERSION});return Object.freeze({pluginId:manifest.id,pluginVersion:manifest.pluginVersion,manifestDigest:pluginManifestDigestV1(manifest),resolution})});return Object.freeze({version:1,entries:Object.freeze(entries),truncated:manifests2.length>maxEntries})}function findPluginCatalogEntryV1(snapshot2,pluginId,pluginVersion){return snapshot2.entries.find(entry=>entry.pluginId===pluginId&&(pluginVersion===void 0||entry.pluginVersion===pluginVersion))}function stableStringify(value){return value===null||typeof value=="boolean"||typeof value=="number"||typeof value=="string"?JSON.stringify(value):Array.isArray(value)?`[${value.map(item=>stableStringify(item)).join(",")}]`:`{${Object.keys(value).sort().map(key=>`${JSON.stringify(key)}:${stableStringify(value[key])}`).join(",")}}`}function stableJsonDigest(value){let serialized=stableStringify(value),digest=14695981039346656037n;for(let byte of new TextEncoder().encode(serialized))digest^=BigInt(byte),digest=BigInt.asUintN(64,digest*1099511628211n);return digest.toString(16).padStart(16,"0")}function assertNonEmptyString2(value,label){if(typeof value!="string"||value.trim().length===0)throw new Error(`${label} must be a non-empty string`)}function assertPluginEntries(value,label){if(!Array.isArray(value))throw new Error(`${label} must be an array`);let seen=new Set;return value.map((item,index3)=>{if(item===null||typeof item!="object"||Array.isArray(item))throw new Error(`${label}[${index3}] must be a plain object`);let record=item;assertNonEmptyString2(record.pluginId,`${label}[${index3}].pluginId`),assertNonEmptyString2(record.pluginVersion,`${label}[${index3}].pluginVersion`);let key=`${record.pluginId}@${record.pluginVersion}`;if(seen.has(key))throw new Error(`${label} contains duplicate entry: ${key}`);seen.add(key);let selectedAdapter=record.selectedAdapter;if(selectedAdapter===void 0)return{pluginId:record.pluginId,pluginVersion:record.pluginVersion};if(selectedAdapter===null||typeof selectedAdapter!="object"||Array.isArray(selectedAdapter))throw new Error(`${label}[${index3}].selectedAdapter must be an object`);let adapter=selectedAdapter;return assertNonEmptyString2(adapter.id,`${label}[${index3}].selectedAdapter.id`),assertNonEmptyString2(adapter.version,`${label}[${index3}].selectedAdapter.version`),{pluginId:record.pluginId,pluginVersion:record.pluginVersion,selectedAdapter:{id:adapter.id,version:adapter.version}}}).sort((left,right)=>left.pluginId===right.pluginId?comparePluginVersionsV1(left.pluginVersion,right.pluginVersion):left.pluginId.localeCompare(right.pluginId))}function buildProfileIdentityV1(input){assertNonEmptyString2(input.profileId,"Profile identity.profileId"),assertNonEmptyString2(input.profileVersion,"Profile identity.profileVersion");let pluginEntries=assertPluginEntries(input.resolvedPlugins,"Profile identity.resolvedPlugins"),capabilityVersions=[...input.capabilityVersions].map(ref=>{if(typeof ref.version!="number"||!Number.isSafeInteger(ref.version)||ref.version<1)throw new Error(`Profile identity.capabilityVersions version must be a positive safe integer: ${ref.id}`);return assertNonEmptyString2(ref.id,"Profile identity.capabilityVersions.id"),{id:ref.id,version:ref.version}}).sort((left,right)=>left.id===right.id?left.version-right.version:left.id.localeCompare(right.id)),manifestDigest=stableJsonDigest({profileId:input.profileId,profileVersion:input.profileVersion,plugins:pluginEntries.map(entry=>({pluginId:entry.pluginId,pluginVersion:entry.pluginVersion,...entry.selectedAdapter===void 0?{}:{selectedAdapter:entry.selectedAdapter}})),capabilityVersions:capabilityVersions.map(ref=>({id:ref.id,version:ref.version}))});return Object.freeze({profileId:input.profileId,profileVersion:input.profileVersion,manifestDigest,capabilityVersions:Object.freeze(capabilityVersions.map(ref=>Object.freeze({...ref})))})}function profileIdentitiesCompatible(left,right){return left.manifestDigest===right.manifestDigest}var PLUGIN_DISPOSE_EVENT_ID="plugin.dispose",PLUGIN_DISPOSE_EVENT_VERSION=1,PLUGIN_READY_EVENT_ID="plugin.ready",PLUGIN_READY_EVENT_VERSION=1,SESSION_CONTEXT_REPLACED_EVENT_ID="session.context.replaced",SESSION_CONTEXT_REPLACED_EVENT_VERSION=1,SESSION_RELOAD_EVENT_ID="session.reload",SESSION_RELOAD_EVENT_VERSION=1,AGENT_START_EVENT_ID="agent.start";var AGENT_SETTLED_EVENT_ID="agent.settled";var TURN_START_EVENT_ID="turn.start";var TURN_END_EVENT_ID="turn.end";var MESSAGE_START_EVENT_ID="message.start";var MESSAGE_END_EVENT_ID="message.end";var TOOL_EXECUTION_START_EVENT_ID="tool.execution.start";var MODEL_SELECT_EVENT_ID="model.select";var THINKING_LEVEL_SELECT_EVENT_ID="thinking_level.select";var SESSION_INFO_CHANGED_EVENT_ID="session.info.changed";var SESSION_ENTRY_APPENDED_EVENT_ID="session.entry.appended";var AGENT_END_EVENT_ID="agent.end";var BEFORE_AGENT_START_EVENT_ID="before.agent.start";var UI_PROMPT_START_EVENT_ID="ui.prompt.start";var UI_PROMPT_END_EVENT_ID="ui.prompt.end";var RESOURCES_DISCOVER_EVENT_ID="resources.discover";var CONTEXT_ASSEMBLED_EVENT_ID="context.assembled";var INPUT_RECEIVED_EVENT_ID="input.received";var USER_BASH_EVENT_ID="user.bash";var SESSION_START_EVENT_ID="session.start";var MODEL_RESPONSE_EVENT_ID="model.response",MODEL_RESPONSE_EVENT_VERSION=1,MODEL_STREAM_EVENT_ID="model.stream",MODEL_STREAM_EVENT_VERSION=1,TOOL_RESULT_EVENT_ID="tool.result",TOOL_RESULT_EVENT_VERSION=1,TOOL_CALL_EVENT_ID="tool.call",TOOL_CALL_EVENT_VERSION=1,TOOL_RESULT_RAW_EVENT_ID="tool.result.raw",TOOL_RESULT_RAW_EVENT_VERSION=1,TOOL_EXECUTE_EVENT_ID="tool.execute",TOOL_EXECUTE_EVENT_VERSION=1,TOOL_COMMIT_EVENT_ID="tool.commit",TOOL_COMMIT_EVENT_VERSION=1,TOOL_GATE_BLOCKED_EVENT_ID="tool.gate.blocked";var INPUT_GATE_BLOCKED_EVENT_ID="input.gate.blocked";var OPERATION_END_EVENT_ID="operation.end",OPERATION_END_EVENT_VERSION=1;function assertString(value,label){if(typeof value!="string"||value.trim()==="")throw new Error(`${label} must be a non-empty string`)}function assertJsonSafe(value,label,seen=new Set){if(!(value===null||typeof value=="string"||typeof value=="boolean")){if(typeof value=="number"){if(Number.isFinite(value))return;throw new Error(`${label} must contain only finite JSON numbers`)}if(typeof value!="object")throw new Error(`${label} must be JSON-safe`);if(seen.has(value))throw new Error(`${label} must not contain cycles`);if(seen.add(value),Array.isArray(value))for(let[index3,entry]of value.entries())assertJsonSafe(entry,`${label}[${index3}]`,seen);else if(isPlainRecord2(value))for(let[key,entry]of Object.entries(value))assertJsonSafe(entry,`${label}.${key}`,seen);else throw new Error(`${label} must contain only JSON arrays and plain objects`);seen.delete(value)}}function validatePluginDisposeEventDataV1(value){if(!value||typeof value!="object"||Array.isArray(value)||Object.getPrototypeOf(value)!==Object.prototype)throw new Error("plugin.dispose data must be a plain object");let record=value;if(Object.keys(record).sort().join(",")!=="pluginId,pluginVersion,status,version")throw new Error("plugin.dispose data has unsupported fields");if(record.version!==1)throw new Error("plugin.dispose data.version must be 1");if(assertString(record.pluginId,"plugin.dispose data.pluginId"),assertString(record.pluginVersion,"plugin.dispose data.pluginVersion"),record.status!=="disposed"&&record.status!=="failed")throw new Error("plugin.dispose data.status is invalid");return value}function pluginDisposeEventDefinition(){return{id:PLUGIN_DISPOSE_EVENT_ID,version:1,phase:"committed",schema:"agent-forge/plugin.dispose@1",allowedRegistrationKinds:["observe","after-commit"],validate:validatePluginDisposeEventDataV1}}function validatePluginReadyEventDataV1(value){if(!value||typeof value!="object"||Array.isArray(value)||Object.getPrototypeOf(value)!==Object.prototype)throw new Error("plugin.ready data must be a plain object");let record=value;if(Object.keys(record).sort().join(",")!=="pluginId,pluginVersion,version")throw new Error("plugin.ready data has unsupported fields");if(record.version!==1)throw new Error("plugin.ready data.version must be 1");return assertString(record.pluginId,"plugin.ready data.pluginId"),assertString(record.pluginVersion,"plugin.ready data.pluginVersion"),value}function pluginReadyEventDefinition(){return{id:PLUGIN_READY_EVENT_ID,version:1,phase:"committed",schema:"agent-forge/plugin.ready@1",allowedRegistrationKinds:["observe","after-commit"],validate:validatePluginReadyEventDataV1}}var PLUGIN_REJECTED_EVENT_ID="plugin.rejected",PLUGIN_REJECTED_EVENT_VERSION=1;function validatePluginRejectedEventDataV1(value){if(!value||typeof value!="object"||Array.isArray(value)||Object.getPrototypeOf(value)!==Object.prototype)throw new Error("plugin.rejected data must be a plain object");let record=value;if(Object.keys(record).filter(key=>key!=="pluginId").sort().join(",")!=="code,manifestPath,message,version")throw new Error("plugin.rejected data has unsupported fields");if(record.version!==1)throw new Error("plugin.rejected data.version must be 1");if(record.pluginId!==void 0&&typeof record.pluginId!="string")throw new Error("plugin.rejected data.pluginId must be a string when present");if(assertString(record.manifestPath,"plugin.rejected data.manifestPath"),assertString(record.message,"plugin.rejected data.message"),record.code!=="invalid_manifest"&&record.code!=="duplicate_plugin_id"&&record.code!=="missing_dependency"&&record.code!=="plugin_load_failed")throw new Error("plugin.rejected data.code is invalid");return value}function pluginRejectedEventDefinition(){return{id:PLUGIN_REJECTED_EVENT_ID,version:PLUGIN_REJECTED_EVENT_VERSION,phase:"committed",schema:"agent-forge/plugin.rejected@1",allowedRegistrationKinds:["observe","after-commit"],validate:validatePluginRejectedEventDataV1}}var contextReasons=new Set(["request","reload","session_replace","compaction","overflow_recovery","retry","tree"]);function validateSessionContextReplacedEventDataV1(value){if(!value||typeof value!="object"||Array.isArray(value)||Object.getPrototypeOf(value)!==Object.prototype)throw new Error("session.context.replaced data must be a plain object");let record=value,allowed=new Set(["version","sessionId","reason","messageCount","strategyName"]),unsupported=Object.keys(record).filter(key=>!allowed.has(key));if(unsupported.length>0)throw new Error(`session.context.replaced data has unsupported fields: ${unsupported.join(", ")}`);for(let key of["version","sessionId","reason","messageCount"])if(!(key in record))throw new Error(`session.context.replaced data is missing required field: ${key}`);if(record.version!==1)throw new Error("session.context.replaced data.version must be 1");if(assertString(record.sessionId,"session.context.replaced data.sessionId"),typeof record.reason!="string"||!contextReasons.has(record.reason))throw new Error("session.context.replaced data.reason is invalid");if(typeof record.messageCount!="number"||!Number.isSafeInteger(record.messageCount)||record.messageCount<0)throw new Error("session.context.replaced data.messageCount must be a non-negative safe integer");return record.strategyName!==void 0&&assertString(record.strategyName,"session.context.replaced data.strategyName"),value}function sessionContextReplacedEventDefinition(){return{id:SESSION_CONTEXT_REPLACED_EVENT_ID,version:1,phase:"committed",schema:"agent-forge/session.context.replaced@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateSessionContextReplacedEventDataV1}}function validateSessionReloadEventDataV1(value){if(!isPlainRecord2(value))throw new Error("session.reload data must be a plain object");if(Object.keys(value).sort().join(",")!=="generation,reason,sessionId,version")throw new Error("session.reload data has unsupported fields");if(value.version!==1)throw new Error("session.reload data.version must be 1");if(assertString(value.sessionId,"session.reload data.sessionId"),typeof value.generation!="number"||!Number.isSafeInteger(value.generation)||value.generation<1)throw new Error("session.reload data.generation must be a positive safe integer");if(value.reason!=="reload")throw new Error("session.reload data.reason is invalid");return value}function sessionReloadEventDefinition(){return{id:SESSION_RELOAD_EVENT_ID,version:1,phase:"committed",schema:"agent-forge/session.reload@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateSessionReloadEventDataV1}}function validateAgentLifecycleEventDataV1(value){if(!isPlainRecord2(value))throw new Error("agent lifecycle data must be a plain object");if(Object.keys(value).sort().join(",")!=="sessionId,version")throw new Error("agent lifecycle data has unsupported fields");if(value.version!==1)throw new Error("agent lifecycle data.version must be 1");return assertString(value.sessionId,"agent lifecycle data.sessionId"),value}function agentStartEventDefinition(){return{id:AGENT_START_EVENT_ID,version:1,phase:"committed",schema:"agent-forge/agent.start@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateAgentLifecycleEventDataV1}}function agentSettledEventDefinition(){return{id:AGENT_SETTLED_EVENT_ID,version:1,phase:"committed",schema:"agent-forge/agent.settled@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateAgentLifecycleEventDataV1}}function validateTurnStartEventDataV1(value){if(!isPlainRecord2(value))throw new Error("turn.start data must be a plain object");if(Object.keys(value).sort().join(",")!=="sessionId,turnIndex,version")throw new Error("turn.start data has unsupported fields");if(value.version!==1)throw new Error("turn.start data.version must be 1");if(assertString(value.sessionId,"turn.start data.sessionId"),typeof value.turnIndex!="number"||!Number.isSafeInteger(value.turnIndex)||value.turnIndex<0)throw new Error("turn.start data.turnIndex must be a non-negative safe integer");return value}function validateTurnEndEventDataV1(value){if(!isPlainRecord2(value))throw new Error("turn.end data must be a plain object");let keys=Object.keys(value).sort().join(",");if(keys!=="messageCount,sessionId,turnIndex,version"&&keys!=="messageCount,outcome,sessionId,turnIndex,version")throw new Error("turn.end data has unsupported fields");if(value.version!==1)throw new Error("turn.end data.version must be 1");if(assertString(value.sessionId,"turn.end data.sessionId"),typeof value.turnIndex!="number"||!Number.isSafeInteger(value.turnIndex)||value.turnIndex<0)throw new Error("turn.end data.turnIndex must be a non-negative safe integer");if(typeof value.messageCount!="number"||!Number.isSafeInteger(value.messageCount)||value.messageCount<0)throw new Error("turn.end data.messageCount must be a non-negative safe integer");if(value.outcome!==void 0&&value.outcome!=="aborted"&&value.outcome!=="error")throw new Error("turn.end data.outcome is invalid");return value}function validateMessageBoundaryEventDataV1(value){if(!isPlainRecord2(value))throw new Error("message lifecycle data must be a plain object");if(Object.keys(value).sort().join(",")!=="role,sessionId,version")throw new Error("message lifecycle data has unsupported fields");if(value.version!==1)throw new Error("message lifecycle data.version must be 1");return assertString(value.sessionId,"message lifecycle data.sessionId"),assertString(value.role,"message lifecycle data.role"),value}function turnStartEventDefinition(){return{id:TURN_START_EVENT_ID,version:1,phase:"committed",schema:"agent-forge/turn.start@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateTurnStartEventDataV1}}function turnEndEventDefinition(){return{id:TURN_END_EVENT_ID,version:1,phase:"committed",schema:"agent-forge/turn.end@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateTurnEndEventDataV1}}function messageStartEventDefinition(){return{id:MESSAGE_START_EVENT_ID,version:1,phase:"committed",schema:"agent-forge/message.start@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateMessageBoundaryEventDataV1}}function messageEndEventDefinition(){return{id:MESSAGE_END_EVENT_ID,version:1,phase:"committed",schema:"agent-forge/message.end@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateMessageBoundaryEventDataV1}}function validateToolExecutionStartEventDataV1(value){if(!isPlainRecord2(value))throw new Error("tool.execution.start data must be a plain object");if(Object.keys(value).sort().join(",")!=="sessionId,toolCallId,toolName,version")throw new Error("tool.execution.start data has unsupported fields");if(value.version!==1)throw new Error("tool.execution.start data.version must be 1");return assertString(value.sessionId,"tool.execution.start data.sessionId"),assertString(value.toolCallId,"tool.execution.start data.toolCallId"),assertString(value.toolName,"tool.execution.start data.toolName"),value}function toolExecutionStartEventDefinition(){return{id:TOOL_EXECUTION_START_EVENT_ID,version:1,phase:"committed",schema:"agent-forge/tool.execution.start@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateToolExecutionStartEventDataV1}}function validateModelSelectEventDataV1(value){if(!isPlainRecord2(value))throw new Error("model.select data must be a plain object");if(Object.keys(value).sort().join(",")!=="id,provider,sessionId,source,version")throw new Error("model.select data has unsupported fields");if(value.version!==1)throw new Error("model.select data.version must be 1");if(assertString(value.sessionId,"model.select data.sessionId"),assertString(value.provider,"model.select data.provider"),assertString(value.id,"model.select data.id"),value.source!=="set"&&value.source!=="cycle"&&value.source!=="restore")throw new Error("model.select data.source is invalid");return value}function validateThinkingLevelSelectEventDataV1(value){if(!isPlainRecord2(value))throw new Error("thinking_level.select data must be a plain object");if(Object.keys(value).sort().join(",")!=="level,previousLevel,sessionId,version")throw new Error("thinking_level.select data has unsupported fields");if(value.version!==1)throw new Error("thinking_level.select data.version must be 1");return assertString(value.sessionId,"thinking_level.select data.sessionId"),assertString(value.level,"thinking_level.select data.level"),assertString(value.previousLevel,"thinking_level.select data.previousLevel"),value}function modelSelectEventDefinition(){return{id:MODEL_SELECT_EVENT_ID,version:1,phase:"committed",schema:"agent-forge/model.select@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateModelSelectEventDataV1}}function thinkingLevelSelectEventDefinition(){return{id:THINKING_LEVEL_SELECT_EVENT_ID,version:1,phase:"committed",schema:"agent-forge/thinking_level.select@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateThinkingLevelSelectEventDataV1}}function validateSessionInfoChangedEventDataV1(value){if(!isPlainRecord2(value))throw new Error("session.info.changed data must be a plain object");if(Object.keys(value).sort().join(",")!=="sessionId,version"&&Object.keys(value).sort().join(",")!=="name,sessionId,version")throw new Error("session.info.changed data has unsupported fields");if(value.version!==1)throw new Error("session.info.changed data.version must be 1");return assertString(value.sessionId,"session.info.changed data.sessionId"),value.name!==void 0&&assertString(value.name,"session.info.changed data.name"),value}function validateSessionEntryAppendedEventDataV1(value){if(!isPlainRecord2(value))throw new Error("session.entry.appended data must be a plain object");if(Object.keys(value).sort().join(",")!=="entryId,entryType,sessionId,version")throw new Error("session.entry.appended data has unsupported fields");if(value.version!==1)throw new Error("session.entry.appended data.version must be 1");return assertString(value.sessionId,"session.entry.appended data.sessionId"),assertString(value.entryId,"session.entry.appended data.entryId"),assertString(value.entryType,"session.entry.appended data.entryType"),value}function sessionInfoChangedEventDefinition(){return{id:SESSION_INFO_CHANGED_EVENT_ID,version:1,phase:"committed",schema:"agent-forge/session.info.changed@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateSessionInfoChangedEventDataV1}}function sessionEntryAppendedEventDefinition(){return{id:SESSION_ENTRY_APPENDED_EVENT_ID,version:1,phase:"committed",schema:"agent-forge/session.entry.appended@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateSessionEntryAppendedEventDataV1}}function validateAgentEndEventDataV1(value){if(!isPlainRecord2(value))throw new Error("agent.end data must be a plain object");if(Object.keys(value).sort().join(",")!=="messageCount,sessionId,version")throw new Error("agent.end data has unsupported fields");if(value.version!==1)throw new Error("agent.end data.version must be 1");if(assertString(value.sessionId,"agent.end data.sessionId"),typeof value.messageCount!="number"||!Number.isSafeInteger(value.messageCount)||value.messageCount<0)throw new Error("agent.end data.messageCount must be a non-negative safe integer");return value}function validateBeforeAgentStartEventDataV1(value){if(!isPlainRecord2(value))throw new Error("before.agent.start data must be a plain object");if(Object.keys(value).sort().join(",")!=="hasImages,sessionId,version")throw new Error("before.agent.start data has unsupported fields");if(value.version!==1)throw new Error("before.agent.start data.version must be 1");if(assertString(value.sessionId,"before.agent.start data.sessionId"),typeof value.hasImages!="boolean")throw new Error("before.agent.start data.hasImages must be a boolean");return value}function agentEndEventDefinition(){return{id:AGENT_END_EVENT_ID,version:1,phase:"committed",schema:"agent-forge/agent.end@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateAgentEndEventDataV1}}function beforeAgentStartEventDefinition(){return{id:BEFORE_AGENT_START_EVENT_ID,version:1,phase:"committed",schema:"agent-forge/before.agent.start@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateBeforeAgentStartEventDataV1}}function validateBeforeAgentStartEventDataV2(value){if(!isPlainRecord2(value))throw new Error("before.agent.start data must be a plain object");let allowed=new Set(["version","sessionId","systemPrompt","systemPromptOptions"]),unsupported=Object.keys(value).filter(key=>!allowed.has(key));if(unsupported.length>0)throw new Error(`before.agent.start data has unsupported fields: ${unsupported.join(", ")}`);for(let key of["version","sessionId","systemPrompt","systemPromptOptions"])if(!(key in value))throw new Error(`before.agent.start data is missing required field: ${key}`);if(value.version!==2)throw new Error("before.agent.start data.version must be 2");if(assertString(value.sessionId,"before.agent.start data.sessionId"),typeof value.systemPrompt!="string")throw new Error("before.agent.start data.systemPrompt must be a string");if(!isPlainRecord2(value.systemPromptOptions))throw new Error("before.agent.start data.systemPromptOptions must be a plain object");return value}function beforeAgentStartV2EventDefinition(){return{id:BEFORE_AGENT_START_EVENT_ID,version:2,phase:"candidate",schema:"agent-forge/before.agent.start@2",allowedRegistrationKinds:["observe","transform"],validate:validateBeforeAgentStartEventDataV2}}function validateUIPromptBoundaryEventDataV1(value){if(!isPlainRecord2(value))throw new Error("ui.prompt lifecycle data must be a plain object");let keys=Object.keys(value).sort();if(keys.join(",")!=="kind,sessionId,version"&&keys.join(",")!=="kind,sessionId,title,version")throw new Error("ui.prompt lifecycle data has unsupported fields");if(value.version!==1)throw new Error("ui.prompt lifecycle data.version must be 1");return assertString(value.sessionId,"ui.prompt lifecycle data.sessionId"),assertString(value.kind,"ui.prompt lifecycle data.kind"),value.title!==void 0&&assertString(value.title,"ui.prompt lifecycle data.title"),value}function validateResourcesDiscoverEventDataV1(value){if(!isPlainRecord2(value))throw new Error("resources.discover data must be a plain object");if(Object.keys(value).sort().join(",")!=="cwd,reason,sessionId,version")throw new Error("resources.discover data has unsupported fields");if(value.version!==1)throw new Error("resources.discover data.version must be 1");if(assertString(value.sessionId,"resources.discover data.sessionId"),assertString(value.cwd,"resources.discover data.cwd"),value.reason!=="startup"&&value.reason!=="reload")throw new Error("resources.discover data.reason is invalid");return value}function uiPromptStartEventDefinition(){return{id:UI_PROMPT_START_EVENT_ID,version:1,phase:"committed",schema:"agent-forge/ui.prompt.start@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateUIPromptBoundaryEventDataV1}}function uiPromptEndEventDefinition(){return{id:UI_PROMPT_END_EVENT_ID,version:1,phase:"committed",schema:"agent-forge/ui.prompt.end@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateUIPromptBoundaryEventDataV1}}function resourcesDiscoverEventDefinition(){return{id:RESOURCES_DISCOVER_EVENT_ID,version:1,phase:"committed",schema:"agent-forge/resources.discover@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateResourcesDiscoverEventDataV1}}function validateResourcesDiscoverContributionV2(value,label){if(!Array.isArray(value))throw new Error(`${label} must be an array`);for(let[index3,entry]of value.entries()){if(!isPlainRecord2(entry))throw new Error(`${label}[${index3}] must be a plain object`);if(Object.keys(entry).sort().join(",")!=="extensionPath,path")throw new Error(`${label}[${index3}] has unsupported fields`);assertString(entry.path,`${label}[${index3}].path`),assertString(entry.extensionPath,`${label}[${index3}].extensionPath`)}}function validateResourcesDiscoverEventDataV2(value){if(!isPlainRecord2(value))throw new Error("resources.discover data must be a plain object");let allowed=new Set(["version","sessionId","cwd","reason","skillPaths","promptPaths","themePaths"]),unsupported=Object.keys(value).filter(key=>!allowed.has(key));if(unsupported.length>0)throw new Error(`resources.discover data has unsupported fields: ${unsupported.join(", ")}`);for(let key of["version","sessionId","cwd","reason"])if(!(key in value))throw new Error(`resources.discover data is missing required field: ${key}`);if(value.version!==2)throw new Error("resources.discover data.version must be 2");if(assertString(value.sessionId,"resources.discover data.sessionId"),assertString(value.cwd,"resources.discover data.cwd"),value.reason!=="startup"&&value.reason!=="reload")throw new Error("resources.discover data.reason is invalid");return value.skillPaths!==void 0&&validateResourcesDiscoverContributionV2(value.skillPaths,"resources.discover data.skillPaths"),value.promptPaths!==void 0&&validateResourcesDiscoverContributionV2(value.promptPaths,"resources.discover data.promptPaths"),value.themePaths!==void 0&&validateResourcesDiscoverContributionV2(value.themePaths,"resources.discover data.themePaths"),value}function resourcesDiscoverV2EventDefinition(){return{id:RESOURCES_DISCOVER_EVENT_ID,version:2,phase:"candidate",schema:"agent-forge/resources.discover@2",allowedRegistrationKinds:["observe","transform"],validate:validateResourcesDiscoverEventDataV2}}function validateContextAssembledEventDataV1(value){if(!isPlainRecord2(value))throw new Error("context.assembled data must be a plain object");if(Object.keys(value).sort().join(",")!=="messageCount,sessionId,version")throw new Error("context.assembled data has unsupported fields");if(value.version!==1)throw new Error("context.assembled data.version must be 1");if(assertString(value.sessionId,"context.assembled data.sessionId"),typeof value.messageCount!="number"||!Number.isSafeInteger(value.messageCount)||value.messageCount<0)throw new Error("context.assembled data.messageCount must be a non-negative safe integer");return value}function validateInputReceivedEventDataV1(value){if(!isPlainRecord2(value))throw new Error("input.received data must be a plain object");if(Object.keys(value).sort().join(",")!=="sessionId,textLength,version,source".split(",").sort().join(","))throw new Error("input.received data has unsupported fields");if(value.version!==1)throw new Error("input.received data.version must be 1");if(assertString(value.sessionId,"input.received data.sessionId"),assertString(value.source,"input.received data.source"),typeof value.textLength!="number"||!Number.isSafeInteger(value.textLength)||value.textLength<0)throw new Error("input.received data.textLength must be a non-negative safe integer");return value}function validateUserBashEventDataV1(value){if(!isPlainRecord2(value))throw new Error("user.bash data must be a plain object");if(Object.keys(value).sort().join(",")!=="cwd,excludeFromContext,sessionId,version")throw new Error("user.bash data has unsupported fields");if(value.version!==1)throw new Error("user.bash data.version must be 1");if(assertString(value.sessionId,"user.bash data.sessionId"),assertString(value.cwd,"user.bash data.cwd"),typeof value.excludeFromContext!="boolean")throw new Error("user.bash data.excludeFromContext must be a boolean");return value}function contextAssembledEventDefinition(){return{id:CONTEXT_ASSEMBLED_EVENT_ID,version:1,phase:"committed",schema:"agent-forge/context.assembled@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateContextAssembledEventDataV1}}function inputReceivedEventDefinition(){return{id:INPUT_RECEIVED_EVENT_ID,version:1,phase:"committed",schema:"agent-forge/input.received@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateInputReceivedEventDataV1}}function userBashEventDefinition(){return{id:USER_BASH_EVENT_ID,version:1,phase:"committed",schema:"agent-forge/user.bash@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateUserBashEventDataV1}}function validateSessionStartEventDataV1(value){if(!isPlainRecord2(value))throw new Error("session.start data must be a plain object");let keys=Object.keys(value).sort();if(keys.join(",")!=="reason,sessionId,version"&&keys.join(",")!=="previousSessionFile,reason,sessionId,version")throw new Error("session.start data has unsupported fields");if(value.version!==1)throw new Error("session.start data.version must be 1");if(assertString(value.sessionId,"session.start data.sessionId"),value.reason!=="startup"&&value.reason!=="reload"&&value.reason!=="new"&&value.reason!=="resume"&&value.reason!=="fork")throw new Error("session.start data.reason is invalid");return value.previousSessionFile!==void 0&&assertString(value.previousSessionFile,"session.start data.previousSessionFile"),value}function sessionStartEventDefinition(){return{id:SESSION_START_EVENT_ID,version:1,phase:"committed",schema:"agent-forge/session.start@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateSessionStartEventDataV1}}function validateModelResponseEventDataV1(value){if(!value||typeof value!="object"||Array.isArray(value)||Object.getPrototypeOf(value)!==Object.prototype)throw new Error("model.response data must be a plain object");let record=value,allowed=new Set(["version","sessionId","entryId","revision","provider","model","stopReason","message","errorMessage"]),unsupported=Object.keys(record).filter(key=>!allowed.has(key));if(unsupported.length>0)throw new Error(`model.response data has unsupported fields: ${unsupported.join(", ")}`);for(let key of["version","sessionId","entryId","revision","provider","model","stopReason","message"])if(!(key in record))throw new Error(`model.response data is missing required field: ${key}`);if(record.version!==1)throw new Error("model.response data.version must be 1");if(assertString(record.sessionId,"model.response data.sessionId"),assertString(record.entryId,"model.response data.entryId"),assertString(record.provider,"model.response data.provider"),assertString(record.model,"model.response data.model"),record.stopReason!=="pending"&&record.stopReason!=="stop"&&record.stopReason!=="length"&&record.stopReason!=="toolUse"&&record.stopReason!=="error"&&record.stopReason!=="aborted"&&record.stopReason!=="deferred")throw new Error("model.response data.stopReason is invalid");if(!record.message||typeof record.message!="object"||Array.isArray(record.message))throw new Error("model.response data.message must be an assistant message object");if(record.message.role!=="assistant")throw new Error("model.response data.message.role must be assistant");if(!isPlainRecord2(record.revision))throw new Error("model.response data.revision must be a plain object");let revision=record.revision;if(Object.keys(revision).sort().join(",")!=="leafId,sequence,sessionId,version")throw new Error("model.response data.revision has unsupported fields");if(revision.version!==1)throw new Error("model.response data.revision.version must be 1");if(assertString(revision.sessionId,"model.response data.revision.sessionId"),typeof revision.sequence!="number"||!Number.isSafeInteger(revision.sequence)||revision.sequence<0)throw new Error("model.response data.revision.sequence must be a non-negative safe integer");if(revision.leafId!==null&&assertString(revision.leafId,"model.response data.revision.leafId"),revision.sessionId!==record.sessionId)throw new Error("model.response data.revision.sessionId must match sessionId");return record.errorMessage!==void 0&&assertString(record.errorMessage,"model.response data.errorMessage"),value}function isPlainRecord2(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)&&Object.getPrototypeOf(value)===Object.prototype}function modelResponseEventDefinition(){return{id:MODEL_RESPONSE_EVENT_ID,version:1,phase:"committed",schema:"agent-forge/model.response@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateModelResponseEventDataV1}}var modelStreamEvents=new Set(["start","text_start","text_delta","text_end","thinking_start","thinking_delta","thinking_end","toolcall_start","toolcall_delta","toolcall_end","done","error"]);function validateModelStreamEventDataV1(value){if(!isPlainRecord2(value))throw new Error("model.stream data must be a plain object");let allowed=new Set(["version","sessionId","streamId","sequence","phase","event","partial","terminal","error"]),unsupported=Object.keys(value).filter(key=>!allowed.has(key));if(unsupported.length>0)throw new Error(`model.stream data has unsupported fields: ${unsupported.join(", ")}`);for(let key of["version","sessionId","streamId","sequence","phase","event","partial","terminal","error"])if(!(key in value))throw new Error(`model.stream data is missing required field: ${key}`);if(value.version!==1)throw new Error("model.stream data.version must be 1");if(assertString(value.sessionId,"model.stream data.sessionId"),assertString(value.streamId,"model.stream data.streamId"),typeof value.sequence!="number"||!Number.isSafeInteger(value.sequence)||value.sequence<1)throw new Error("model.stream data.sequence must be a positive safe integer");if(value.phase!=="raw"&&value.phase!=="candidate"&&value.phase!=="committed")throw new Error("model.stream data.phase is invalid");if(typeof value.event!="string"||!modelStreamEvents.has(value.event))throw new Error("model.stream data.event is invalid");if(value.phase==="committed"&&value.event!=="done"&&value.event!=="error")throw new Error("model.stream committed phase only permits terminal events");let terminal=value.event==="done"||value.event==="error";if(value.terminal!==terminal)throw new Error("model.stream data.terminal does not match event");if(value.partial!==null&&assertJsonSafe(value.partial,"model.stream data.partial"),terminal&&value.event==="done"&&value.error!==null)throw new Error("model.stream done event cannot contain error");if(terminal&&value.event==="error"){if(!isPlainRecord2(value.error))throw new Error("model.stream error event requires error object");if(Object.keys(value.error).some(key=>key!=="code"&&key!=="message"&&key!=="name"))throw new Error("model.stream error has unsupported fields");assertString(value.error.code,"model.stream data.error.code"),assertString(value.error.message,"model.stream data.error.message"),value.error.name!==void 0&&assertString(value.error.name,"model.stream data.error.name")}else if(value.error!==null)throw new Error("model.stream non-terminal event cannot contain error");return value}function modelStreamEventDefinition(){return{id:MODEL_STREAM_EVENT_ID,version:1,phase:"raw",allowedPhases:["raw","candidate","committed"],schema:"agent-forge/model.stream@1",allowedRegistrationKinds:["observe"],validate:validateModelStreamEventDataV1}}function validateToolResultEventDataV1(value){if(!isPlainRecord2(value))throw new Error("tool.result data must be a plain object");let allowed=new Set(["version","sessionId","entryId","revision","toolCallId","toolName","isError","message"]),unsupported=Object.keys(value).filter(key=>!allowed.has(key));if(unsupported.length>0)throw new Error(`tool.result data has unsupported fields: ${unsupported.join(", ")}`);for(let key of["version","sessionId","entryId","revision","toolCallId","toolName","isError","message"])if(!(key in value))throw new Error(`tool.result data is missing required field: ${key}`);if(value.version!==1)throw new Error("tool.result data.version must be 1");if(assertString(value.sessionId,"tool.result data.sessionId"),assertString(value.entryId,"tool.result data.entryId"),assertString(value.toolCallId,"tool.result data.toolCallId"),assertString(value.toolName,"tool.result data.toolName"),typeof value.isError!="boolean")throw new Error("tool.result data.isError must be boolean");if(!isPlainRecord2(value.message))throw new Error("tool.result data.message must be a tool result message object");if(value.message.role!=="toolResult")throw new Error("tool.result data.message.role must be toolResult");if(assertString(value.message.toolCallId,"tool.result data.message.toolCallId"),assertString(value.message.toolName,"tool.result data.message.toolName"),!Array.isArray(value.message.content))throw new Error("tool.result data.message.content must be an array");if(typeof value.message.isError!="boolean")throw new Error("tool.result data.message.isError must be boolean");if(value.message.toolCallId!==value.toolCallId)throw new Error("tool.result data.message.toolCallId must match toolCallId");if(value.message.toolName!==value.toolName)throw new Error("tool.result data.message.toolName must match toolName");if(value.message.isError!==value.isError)throw new Error("tool.result data.message.isError must match isError");if(!isPlainRecord2(value.revision))throw new Error("tool.result data.revision must be a plain object");let revision=value.revision;if(Object.keys(revision).sort().join(",")!=="leafId,sequence,sessionId,version")throw new Error("tool.result data.revision has unsupported fields");if(revision.version!==1)throw new Error("tool.result data.revision.version must be 1");if(assertString(revision.sessionId,"tool.result data.revision.sessionId"),typeof revision.sequence!="number"||!Number.isSafeInteger(revision.sequence)||revision.sequence<0)throw new Error("tool.result data.revision.sequence must be a non-negative safe integer");if(revision.leafId!==null&&assertString(revision.leafId,"tool.result data.revision.leafId"),revision.sessionId!==value.sessionId)throw new Error("tool.result data.revision.sessionId must match sessionId");return value}function toolResultEventDefinition(){return{id:TOOL_RESULT_EVENT_ID,version:1,phase:"committed",schema:"agent-forge/tool.result@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateToolResultEventDataV1}}function validateToolCallEventDataV1(value){if(!isPlainRecord2(value))throw new Error("tool.call data must be a plain object");let allowed=new Set(["version","sessionId","revision","toolCallId","toolName","input"]),unsupported=Object.keys(value).filter(key=>!allowed.has(key));if(unsupported.length>0)throw new Error(`tool.call data has unsupported fields: ${unsupported.join(", ")}`);for(let key of["version","sessionId","revision","toolCallId","toolName","input"])if(!(key in value))throw new Error(`tool.call data is missing required field: ${key}`);if(value.version!==1)throw new Error("tool.call data.version must be 1");if(assertString(value.sessionId,"tool.call data.sessionId"),assertString(value.toolCallId,"tool.call data.toolCallId"),assertString(value.toolName,"tool.call data.toolName"),!isPlainRecord2(value.revision))throw new Error("tool.call data.revision must be a plain object");let revision=value.revision;if(Object.keys(revision).sort().join(",")!=="leafId,sequence,sessionId,version")throw new Error("tool.call data.revision has unsupported fields");if(revision.version!==1)throw new Error("tool.call data.revision.version must be 1");if(assertString(revision.sessionId,"tool.call data.revision.sessionId"),typeof revision.sequence!="number"||!Number.isSafeInteger(revision.sequence)||revision.sequence<0)throw new Error("tool.call data.revision.sequence must be a non-negative safe integer");if(revision.leafId!==null&&assertString(revision.leafId,"tool.call data.revision.leafId"),revision.sessionId!==value.sessionId)throw new Error("tool.call data.revision.sessionId must match sessionId");return assertJsonSafe(value.input,"tool.call data.input"),value}function toolCallEventDefinition(){return{id:TOOL_CALL_EVENT_ID,version:1,phase:"candidate",schema:"agent-forge/tool.call@1",allowedRegistrationKinds:["observe","transform"],validate:validateToolCallEventDataV1}}function validateToolExecuteEventDataV1(value){if(!isPlainRecord2(value))throw new Error("tool.execute data must be a plain object");let allowed=new Set(["version","sessionId","revision","toolCallId","toolName","input","isError","content"]),unsupported=Object.keys(value).filter(key=>!allowed.has(key));if(unsupported.length>0)throw new Error(`tool.execute data has unsupported fields: ${unsupported.join(", ")}`);for(let key of["version","sessionId","revision","toolCallId","toolName","input","isError","content"])if(!(key in value))throw new Error(`tool.execute data is missing required field: ${key}`);if(value.version!==1)throw new Error("tool.execute data.version must be 1");if(assertString(value.sessionId,"tool.execute data.sessionId"),assertString(value.toolCallId,"tool.execute data.toolCallId"),assertString(value.toolName,"tool.execute data.toolName"),typeof value.isError!="boolean")throw new Error("tool.execute data.isError must be boolean");return assertJsonSafe(value.input,"tool.execute data.input"),validateToolResultRawEventDataV1({version:1,sessionId:value.sessionId,revision:value.revision,toolCallId:value.toolCallId,toolName:value.toolName,isError:value.isError,content:value.content}),value}function toolExecuteEventDefinition(){return{id:TOOL_EXECUTE_EVENT_ID,version:1,phase:"committed",schema:"agent-forge/tool.execute@1",allowedRegistrationKinds:["observe","execute"],validate:validateToolExecuteEventDataV1}}function validateToolCommitEventDataV1(value){if(!isPlainRecord2(value))throw new Error("tool.commit data must be a plain object");let allowed=new Set(["version","sessionId","entryId","revision","toolCallId","toolName","isError"]),unsupported=Object.keys(value).filter(key=>!allowed.has(key));if(unsupported.length>0)throw new Error(`tool.commit data has unsupported fields: ${unsupported.join(", ")}`);for(let key of["version","sessionId","entryId","revision","toolCallId","toolName","isError"])if(!(key in value))throw new Error(`tool.commit data is missing required field: ${key}`);if(value.version!==1)throw new Error("tool.commit data.version must be 1");if(assertString(value.sessionId,"tool.commit data.sessionId"),assertString(value.entryId,"tool.commit data.entryId"),assertString(value.toolCallId,"tool.commit data.toolCallId"),assertString(value.toolName,"tool.commit data.toolName"),typeof value.isError!="boolean")throw new Error("tool.commit data.isError must be boolean");if(!isPlainRecord2(value.revision))throw new Error("tool.commit data.revision must be a plain object");let revision=value.revision;if(Object.keys(revision).sort().join(",")!=="leafId,sequence,sessionId,version")throw new Error("tool.commit data.revision has unsupported fields");if(revision.version!==1)throw new Error("tool.commit data.revision.version must be 1");if(assertString(revision.sessionId,"tool.commit data.revision.sessionId"),typeof revision.sequence!="number"||!Number.isSafeInteger(revision.sequence)||revision.sequence<0)throw new Error("tool.commit data.revision.sequence must be a non-negative safe integer");if(revision.leafId!==null&&assertString(revision.leafId,"tool.commit data.revision.leafId"),revision.sessionId!==value.sessionId)throw new Error("tool.commit data.revision.sessionId must match sessionId");return value}function toolCommitEventDefinition(){return{id:TOOL_COMMIT_EVENT_ID,version:1,phase:"committed",schema:"agent-forge/tool.commit@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateToolCommitEventDataV1}}function validateToolResultRawEventDataV1(value){if(!isPlainRecord2(value))throw new Error("tool.result.raw data must be a plain object");let allowed=new Set(["version","sessionId","revision","toolCallId","toolName","isError","content"]),unsupported=Object.keys(value).filter(key=>!allowed.has(key));if(unsupported.length>0)throw new Error(`tool.result.raw data has unsupported fields: ${unsupported.join(", ")}`);for(let key of["version","sessionId","revision","toolCallId","toolName","isError","content"])if(!(key in value))throw new Error(`tool.result.raw data is missing required field: ${key}`);if(value.version!==1)throw new Error("tool.result.raw data.version must be 1");if(assertString(value.sessionId,"tool.result.raw data.sessionId"),assertString(value.toolCallId,"tool.result.raw data.toolCallId"),assertString(value.toolName,"tool.result.raw data.toolName"),typeof value.isError!="boolean")throw new Error("tool.result.raw data.isError must be boolean");if(!isPlainRecord2(value.revision))throw new Error("tool.result.raw data.revision must be a plain object");let revision=value.revision;if(Object.keys(revision).sort().join(",")!=="leafId,sequence,sessionId,version")throw new Error("tool.result.raw data.revision has unsupported fields");if(revision.version!==1)throw new Error("tool.result.raw data.revision.version must be 1");if(assertString(revision.sessionId,"tool.result.raw data.revision.sessionId"),typeof revision.sequence!="number"||!Number.isSafeInteger(revision.sequence)||revision.sequence<0)throw new Error("tool.result.raw data.revision.sequence must be a non-negative safe integer");if(revision.leafId!==null&&assertString(revision.leafId,"tool.result.raw data.revision.leafId"),revision.sessionId!==value.sessionId)throw new Error("tool.result.raw data.revision.sessionId must match sessionId");if(!Array.isArray(value.content))throw new Error("tool.result.raw data.content must be an array");for(let[index3,content]of value.content.entries()){if(!isPlainRecord2(content))throw new Error(`tool.result.raw data.content[${index3}] must be a plain object`);if(content.type==="text"){let keys=Object.keys(content).sort().join(",");if(keys!=="text,type"&&keys!=="text,textSignature,type")throw new Error(`tool.result.raw data.content[${index3}] has unsupported text fields`);assertString(content.text,`tool.result.raw data.content[${index3}].text`),content.textSignature!==void 0&&assertString(content.textSignature,`tool.result.raw data.content[${index3}].textSignature`);continue}if(content.type==="image"){if(Object.keys(content).sort().join(",")!=="data,mimeType,type")throw new Error(`tool.result.raw data.content[${index3}] has unsupported image fields`);assertString(content.data,`tool.result.raw data.content[${index3}].data`),assertString(content.mimeType,`tool.result.raw data.content[${index3}].mimeType`);continue}throw new Error(`tool.result.raw data.content[${index3}].type is invalid`)}return value}function toolResultRawEventDefinition(){return{id:TOOL_RESULT_RAW_EVENT_ID,version:1,phase:"raw",schema:"agent-forge/tool.result.raw@1",allowedRegistrationKinds:["observe"],validate:validateToolResultRawEventDataV1}}var TOOL_RESULT_TRANSFORM_EVENT_ID="tool.result.transform",TOOL_RESULT_TRANSFORM_EVENT_VERSION=1;function validateToolResultTransformEventDataV1(value){if(!isPlainRecord2(value))throw new Error("tool.result.transform data must be a plain object");let allowed=new Set(["version","sessionId","revision","toolCallId","toolName","isError","content"]),unsupported=Object.keys(value).filter(key=>!allowed.has(key));if(unsupported.length>0)throw new Error(`tool.result.transform data has unsupported fields: ${unsupported.join(", ")}`);for(let key of["version","sessionId","revision","toolCallId","toolName","isError","content"])if(!(key in value))throw new Error(`tool.result.transform data is missing required field: ${key}`);if(value.version!==1)throw new Error("tool.result.transform data.version must be 1");if(assertString(value.sessionId,"tool.result.transform data.sessionId"),assertString(value.toolCallId,"tool.result.transform data.toolCallId"),assertString(value.toolName,"tool.result.transform data.toolName"),typeof value.isError!="boolean")throw new Error("tool.result.transform data.isError must be boolean");if(!isPlainRecord2(value.revision))throw new Error("tool.result.transform data.revision must be a plain object");let revision=value.revision;if(Object.keys(revision).sort().join(",")!=="leafId,sequence,sessionId,version")throw new Error("tool.result.transform data.revision has unsupported fields");if(revision.version!==1)throw new Error("tool.result.transform data.revision.version must be 1");if(assertString(revision.sessionId,"tool.result.transform data.revision.sessionId"),typeof revision.sequence!="number"||!Number.isSafeInteger(revision.sequence)||revision.sequence<0)throw new Error("tool.result.transform data.revision.sequence must be a non-negative safe integer");if(revision.leafId!==null&&assertString(revision.leafId,"tool.result.transform data.revision.leafId"),revision.sessionId!==value.sessionId)throw new Error("tool.result.transform data.revision.sessionId must match sessionId");if(!Array.isArray(value.content))throw new Error("tool.result.transform data.content must be an array");for(let[index3,content]of value.content.entries()){if(!isPlainRecord2(content))throw new Error(`tool.result.transform data.content[${index3}] must be a plain object`);if(content.type==="text"){let keys=Object.keys(content).sort().join(",");if(keys!=="text,type"&&keys!=="text,textSignature,type")throw new Error(`tool.result.transform data.content[${index3}] has unsupported text fields`);assertString(content.text,`tool.result.transform data.content[${index3}].text`),content.textSignature!==void 0&&assertString(content.textSignature,`tool.result.transform data.content[${index3}].textSignature`);continue}if(content.type==="image"){if(Object.keys(content).sort().join(",")!=="data,mimeType,type")throw new Error(`tool.result.transform data.content[${index3}] has unsupported image fields`);assertString(content.data,`tool.result.transform data.content[${index3}].data`),assertString(content.mimeType,`tool.result.transform data.content[${index3}].mimeType`);continue}throw new Error(`tool.result.transform data.content[${index3}].type is invalid`)}return value}function toolResultTransformEventDefinition(){return{id:TOOL_RESULT_TRANSFORM_EVENT_ID,version:TOOL_RESULT_TRANSFORM_EVENT_VERSION,phase:"candidate",schema:"agent-forge/tool.result.transform@1",allowedRegistrationKinds:["observe","transform"],validate:validateToolResultTransformEventDataV1}}function validateOperationEndEventDataV1(value){if(!isPlainRecord2(value))throw new Error("operation.end data must be a plain object");let allowed=new Set(["version","operationId","operationKind","status","errorMessage","reason"]),unsupported=Object.keys(value).filter(key=>!allowed.has(key));if(unsupported.length>0)throw new Error(`operation.end data has unsupported fields: ${unsupported.join(", ")}`);for(let key of["version","operationId","operationKind","status"])if(!(key in value))throw new Error(`operation.end data is missing required field: ${key}`);if(value.version!==1)throw new Error("operation.end data.version must be 1");if(assertString(value.operationId,"operation.end data.operationId"),assertString(value.operationKind,"operation.end data.operationKind"),value.status!=="succeeded"&&value.status!=="failed"&&value.status!=="cancelled")throw new Error("operation.end data.status is invalid");return value.errorMessage!==void 0&&assertString(value.errorMessage,"operation.end data.errorMessage"),value.reason!==void 0&&assertString(value.reason,"operation.end data.reason"),value}function operationEndEventDefinition(){return{id:OPERATION_END_EVENT_ID,version:1,phase:"committed",schema:"agent-forge/operation.end@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateOperationEndEventDataV1}}var CAPABILITY_CALL_EVENT_ID="capability.call",CAPABILITY_CALL_EVENT_VERSION=1,capabilityCallEvents=new Set(["start","cancel","end"]),capabilityCallStatuses=new Set(["succeeded","failed","cancelled"]);function validateCapabilityCallEventDataV1(value){if(!isPlainRecord2(value))throw new Error("capability.call data must be a plain object");let allowed=new Set(["version","operationId","capabilityId","capabilityVersion","capabilityKind","callerPluginId","providerPluginId","event","status","error"]),unsupported=Object.keys(value).filter(key=>!allowed.has(key));if(unsupported.length>0)throw new Error(`capability.call data has unsupported fields: ${unsupported.join(", ")}`);for(let key of["version","operationId","capabilityId","capabilityVersion","capabilityKind","callerPluginId","providerPluginId","event"])if(!(key in value))throw new Error(`capability.call data is missing required field: ${key}`);if(value.version!==1)throw new Error("capability.call data.version must be 1");if(assertString(value.operationId,"capability.call data.operationId"),assertString(value.capabilityId,"capability.call data.capabilityId"),typeof value.capabilityVersion!="number"||!Number.isSafeInteger(value.capabilityVersion)||value.capabilityVersion<1)throw new Error("capability.call data.capabilityVersion must be a positive safe integer");if(value.capabilityKind!=="service"&&value.capabilityKind!=="contribution"&&value.capabilityKind!=="transform")throw new Error("capability.call data.capabilityKind is invalid");if(assertString(value.callerPluginId,"capability.call data.callerPluginId"),assertString(value.providerPluginId,"capability.call data.providerPluginId"),typeof value.event!="string"||!capabilityCallEvents.has(value.event))throw new Error("capability.call data.event is invalid");if((value.event==="start"||value.event==="cancel")&&value.status!==void 0)throw new Error("capability.call start/cancel must not include status");if(value.event==="end"&&value.status===void 0)throw new Error("capability.call end requires status");if(value.status!==void 0&&(typeof value.status!="string"||!capabilityCallStatuses.has(value.status)))throw new Error("capability.call data.status is invalid");if(value.error!==void 0){if(!isPlainRecord2(value.error))throw new Error("capability.call data.error must be a plain object");if(Object.keys(value.error).some(key=>key!=="code"&&key!=="message"&&key!=="name"))throw new Error("capability.call data.error has unsupported fields");if(!("code"in value.error))throw new Error("capability.call data.error is missing required field: code");if(!("message"in value.error))throw new Error("capability.call data.error is missing required field: message");assertString(value.error.code,"capability.call data.error.code"),assertString(value.error.message,"capability.call data.error.message"),value.error.name!==void 0&&assertString(value.error.name,"capability.call data.error.name")}if(value.event!=="end"&&value.error!==void 0)throw new Error("capability.call start/cancel must not include error");if(value.event==="end"&&value.status==="succeeded"&&value.error!==void 0)throw new Error("capability.call succeeded end must not include error");return value}function capabilityCallEventDefinition(){return{id:CAPABILITY_CALL_EVENT_ID,version:CAPABILITY_CALL_EVENT_VERSION,phase:"committed",schema:"agent-forge/capability.call@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateCapabilityCallEventDataV1}}var OPERATION_START_EVENT_ID="operation.start",OPERATION_START_EVENT_VERSION=1,OPERATION_STEP_EVENT_ID="operation.step",OPERATION_STEP_EVENT_VERSION=1;function validateOperationStartEventDataV1(value){if(!isPlainRecord2(value))throw new Error("operation.start data must be a plain object");if(Object.keys(value).sort().join(",")!=="operationId,operationKind,version")throw new Error("operation.start data has unsupported fields");if(value.version!==1)throw new Error("operation.start data.version must be 1");return assertString(value.operationId,"operation.start data.operationId"),assertString(value.operationKind,"operation.start data.operationKind"),value}function operationStartEventDefinition(){return{id:OPERATION_START_EVENT_ID,version:OPERATION_START_EVENT_VERSION,phase:"committed",schema:"agent-forge/operation.start@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateOperationStartEventDataV1}}function validateOperationStepEventDataV1(value){if(!isPlainRecord2(value))throw new Error("operation.step data must be a plain object");let allowed=new Set(["version","operationId","operationKind","step","message","data"]);if(Object.keys(value).filter(key=>!allowed.has(key)).length>0)throw new Error("operation.step data has unsupported fields");if(value.version!==1)throw new Error("operation.step data.version must be 1");if(assertString(value.operationId,"operation.step data.operationId"),assertString(value.operationKind,"operation.step data.operationKind"),typeof value.step!="number"||!Number.isSafeInteger(value.step)||value.step<1)throw new Error("operation.step data.step must be a positive safe integer");return value.message!==void 0&&assertString(value.message,"operation.step data.message"),value.data!==void 0&&assertJsonSafe(value.data,"operation.step data.data"),value}function operationStepEventDefinition(){return{id:OPERATION_STEP_EVENT_ID,version:OPERATION_STEP_EVENT_VERSION,phase:"committed",schema:"agent-forge/operation.step@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateOperationStepEventDataV1}}var OPERATION_CANCEL_EVENT_ID="operation.cancel",OPERATION_CANCEL_EVENT_VERSION=1;function validateOperationCancelEventDataV1(value){if(!isPlainRecord2(value))throw new Error("operation.cancel data must be a plain object");if(Object.keys(value).sort().join(",")!=="operationId,operationKind,version")throw new Error("operation.cancel data has unsupported fields");if(value.version!==1)throw new Error("operation.cancel data.version must be 1");return assertString(value.operationId,"operation.cancel data.operationId"),assertString(value.operationKind,"operation.cancel data.operationKind"),value}function operationCancelEventDefinition(){return{id:OPERATION_CANCEL_EVENT_ID,version:OPERATION_CANCEL_EVENT_VERSION,phase:"committed",schema:"agent-forge/operation.cancel@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateOperationCancelEventDataV1}}var SESSION_AUTO_RETRY_EVENT_ID="session.auto.retry",SESSION_AUTO_RETRY_EVENT_VERSION=1,SESSION_COMPACTION_DECISION_EVENT_ID="session.compaction.decision",SESSION_COMPACTION_DECISION_EVENT_VERSION=1,SESSION_COMPACTION_FAILED_EVENT_ID="session.compaction.failed",SESSION_COMPACTION_FAILED_EVENT_VERSION=1;function assertNonNegativeSafeInteger2(value,label){if(typeof value!="number"||!Number.isSafeInteger(value)||value<0)throw new Error(`${label} must be a non-negative safe integer`)}function assertPositiveSafeInteger2(value,label){if(typeof value!="number"||!Number.isSafeInteger(value)||value<1)throw new Error(`${label} must be a positive safe integer`)}function validateSessionAutoRetryEventDataV1(value){if(!isPlainRecord2(value))throw new Error("session.auto.retry data must be a plain object");let allowed=new Set(["version","sessionId","attempt","maxAttempts","delayMs","errorMessage"]),unsupported=Object.keys(value).filter(key=>!allowed.has(key));if(unsupported.length>0)throw new Error(`session.auto.retry data has unsupported fields: ${unsupported.join(", ")}`);for(let key of["version","sessionId","attempt","maxAttempts","delayMs","errorMessage"])if(!(key in value))throw new Error(`session.auto.retry data is missing required field: ${key}`);if(value.version!==1)throw new Error("session.auto.retry data.version must be 1");return assertString(value.sessionId,"session.auto.retry data.sessionId"),assertPositiveSafeInteger2(value.attempt,"session.auto.retry data.attempt"),assertPositiveSafeInteger2(value.maxAttempts,"session.auto.retry data.maxAttempts"),assertNonNegativeSafeInteger2(value.delayMs,"session.auto.retry data.delayMs"),assertString(value.errorMessage,"session.auto.retry data.errorMessage"),value}function sessionAutoRetryEventDefinition(){return{id:SESSION_AUTO_RETRY_EVENT_ID,version:SESSION_AUTO_RETRY_EVENT_VERSION,phase:"committed",schema:"agent-forge/session.auto.retry@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateSessionAutoRetryEventDataV1}}var sessionCompactionDecisionReasons=new Set(["overflow","threshold"]);function assertOptionalPositiveSafeInteger(value,label){value!==void 0&&assertPositiveSafeInteger2(value,label)}function validateSessionCompactionDecisionEventDataV1(value){if(!isPlainRecord2(value))throw new Error("session.compaction.decision data must be a plain object");let allowed=new Set(["version","sessionId","reason","compact","willRetry","contextTokens","contextWindow","reserveTokens","failureMessage"]),unsupported=Object.keys(value).filter(key=>!allowed.has(key));if(unsupported.length>0)throw new Error(`session.compaction.decision data has unsupported fields: ${unsupported.join(", ")}`);for(let key of["version","sessionId","reason","compact","willRetry"])if(!(key in value))throw new Error(`session.compaction.decision data is missing required field: ${key}`);if(value.version!==1)throw new Error("session.compaction.decision data.version must be 1");if(assertString(value.sessionId,"session.compaction.decision data.sessionId"),typeof value.reason!="string"||!sessionCompactionDecisionReasons.has(value.reason))throw new Error("session.compaction.decision data.reason is invalid");if(typeof value.compact!="boolean")throw new Error("session.compaction.decision data.compact must be a boolean");if(typeof value.willRetry!="boolean")throw new Error("session.compaction.decision data.willRetry must be a boolean");return assertOptionalPositiveSafeInteger(value.contextTokens,"session.compaction.decision data.contextTokens"),assertOptionalPositiveSafeInteger(value.contextWindow,"session.compaction.decision data.contextWindow"),assertOptionalPositiveSafeInteger(value.reserveTokens,"session.compaction.decision data.reserveTokens"),value.failureMessage!==void 0&&assertString(value.failureMessage,"session.compaction.decision data.failureMessage"),value}function sessionCompactionDecisionEventDefinition(){return{id:SESSION_COMPACTION_DECISION_EVENT_ID,version:SESSION_COMPACTION_DECISION_EVENT_VERSION,phase:"committed",schema:"agent-forge/session.compaction.decision@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateSessionCompactionDecisionEventDataV1}}var sessionCompactionFailedReasons=new Set(["manual","overflow","threshold"]);function validateSessionCompactionFailedEventDataV1(value){if(!isPlainRecord2(value))throw new Error("session.compaction.failed data must be a plain object");let allowed=new Set(["version","sessionId","reason","errorMessage"]),unsupported=Object.keys(value).filter(key=>!allowed.has(key));if(unsupported.length>0)throw new Error(`session.compaction.failed data has unsupported fields: ${unsupported.join(", ")}`);for(let key of["version","sessionId","reason","errorMessage"])if(!(key in value))throw new Error(`session.compaction.failed data is missing required field: ${key}`);if(value.version!==1)throw new Error("session.compaction.failed data.version must be 1");if(assertString(value.sessionId,"session.compaction.failed data.sessionId"),typeof value.reason!="string"||!sessionCompactionFailedReasons.has(value.reason))throw new Error("session.compaction.failed data.reason is invalid");return assertString(value.errorMessage,"session.compaction.failed data.errorMessage"),value}function sessionCompactionFailedEventDefinition(){return{id:SESSION_COMPACTION_FAILED_EVENT_ID,version:SESSION_COMPACTION_FAILED_EVENT_VERSION,phase:"committed",schema:"agent-forge/session.compaction.failed@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateSessionCompactionFailedEventDataV1}}var SESSION_END_EVENT_ID="session.end",SESSION_END_EVENT_VERSION=1;function validateSessionEndEventDataV1(value){if(!isPlainRecord2(value))throw new Error("session.end data must be a plain object");if(Object.keys(value).sort().join(",")!=="sessionId,version")throw new Error("session.end data has unsupported fields");if(value.version!==1)throw new Error("session.end data.version must be 1");return assertString(value.sessionId,"session.end data.sessionId"),value}function sessionEndEventDefinition(){return{id:SESSION_END_EVENT_ID,version:SESSION_END_EVENT_VERSION,phase:"committed",schema:"agent-forge/session.end@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateSessionEndEventDataV1}}var AGENT_TASK_SETTLED_EVENT_ID="agent.task.settled",AGENT_TASK_SETTLED_EVENT_VERSION=1,agentTaskSettledStatuses=new Set(["queued","admitted","running","succeeded","failed","cancelled","timed_out","drain_timeout","runner_lost"]);function validateAgentTaskSettledEventDataV1(value){if(!isPlainRecord2(value))throw new Error("agent.task.settled data must be a plain object");let allowed=new Set(["version","sessionId","taskSessionId","taskId","status","reasonCode"]),unsupported=Object.keys(value).filter(key=>!allowed.has(key));if(unsupported.length>0)throw new Error(`agent.task.settled data has unsupported fields: ${unsupported.join(", ")}`);for(let key of["version","sessionId","taskSessionId","taskId","status"])if(!(key in value))throw new Error(`agent.task.settled data is missing required field: ${key}`);if(value.version!==1)throw new Error("agent.task.settled data.version must be 1");if(assertString(value.sessionId,"agent.task.settled data.sessionId"),assertString(value.taskSessionId,"agent.task.settled data.taskSessionId"),assertString(value.taskId,"agent.task.settled data.taskId"),typeof value.status!="string"||!agentTaskSettledStatuses.has(value.status))throw new Error("agent.task.settled data.status is invalid");return value.reasonCode!==void 0&&assertString(value.reasonCode,"agent.task.settled data.reasonCode"),value}function agentTaskSettledEventDefinition(){return{id:AGENT_TASK_SETTLED_EVENT_ID,version:AGENT_TASK_SETTLED_EVENT_VERSION,phase:"committed",schema:"agent-forge/agent.task.settled@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateAgentTaskSettledEventDataV1}}function validateToolGateBlockedEventDataV1(value){if(!isPlainRecord2(value))throw new Error("tool.gate.blocked data must be a plain object");let allowed=new Set(["version","sessionId","toolCallId","toolName","reason"]),unsupported=Object.keys(value).filter(key=>!allowed.has(key));if(unsupported.length>0)throw new Error(`tool.gate.blocked data has unsupported fields: ${unsupported.join(", ")}`);for(let key of["version","sessionId","toolCallId","toolName"])if(!(key in value))throw new Error(`tool.gate.blocked data is missing required field: ${key}`);if(value.version!==1)throw new Error("tool.gate.blocked data.version must be 1");return assertString(value.sessionId,"tool.gate.blocked data.sessionId"),assertString(value.toolCallId,"tool.gate.blocked data.toolCallId"),assertString(value.toolName,"tool.gate.blocked data.toolName"),value.reason!==void 0&&assertString(value.reason,"tool.gate.blocked data.reason"),value}function toolGateBlockedEventDefinition(){return{id:TOOL_GATE_BLOCKED_EVENT_ID,version:1,phase:"committed",schema:"agent-forge/tool.gate.blocked@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateToolGateBlockedEventDataV1}}function validateInputGateBlockedEventDataV1(value){if(!isPlainRecord2(value))throw new Error("input.gate.blocked data must be a plain object");let allowed=new Set(["version","sessionId","source","textLength","reason"]),unsupported=Object.keys(value).filter(key=>!allowed.has(key));if(unsupported.length>0)throw new Error(`input.gate.blocked data has unsupported fields: ${unsupported.join(", ")}`);for(let key of["version","sessionId","source","textLength"])if(!(key in value))throw new Error(`input.gate.blocked data is missing required field: ${key}`);if(value.version!==1)throw new Error("input.gate.blocked data.version must be 1");if(assertString(value.sessionId,"input.gate.blocked data.sessionId"),assertString(value.source,"input.gate.blocked data.source"),typeof value.textLength!="number"||!Number.isInteger(value.textLength)||value.textLength<0)throw new Error("input.gate.blocked data.textLength must be a non-negative integer");return value.reason!==void 0&&assertString(value.reason,"input.gate.blocked data.reason"),value}function inputGateBlockedEventDefinition(){return{id:INPUT_GATE_BLOCKED_EVENT_ID,version:1,phase:"committed",schema:"agent-forge/input.gate.blocked@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateInputGateBlockedEventDataV1}}import{lstatSync,readdirSync as readdirSync3,realpathSync as realpathSync3,statSync as statSync4}from"node:fs";import{readFile as readFile2}from"node:fs/promises";import{createRequire as createRequire3}from"node:module";import*as path3 from"node:path";var session_lineage_exports={};__export(session_lineage_exports,{findSessionFile:()=>findSessionFile,isAgentSessionId:()=>isAgentSessionId,readAgentSessionHead:()=>readAgentSessionHead,readAgentSessionLineage:()=>readAgentSessionLineage});import{closeSync,openSync,readdirSync,readSync,statSync as statSync2}from"node:fs";import{join as join8}from"node:path";var HEADER_SCAN_BYTES=8192;function isAgentSessionId(value){return value.length===0||value.length>128?!1:value.startsWith("st:")?/^st:[0-9]+:[a-z0-9-]+$/i.test(value):/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value)}function agentSessionsDir(agentDir){return join8(agentDir,"sessions","_agents")}function findSessionFile(dir,sessionId){let names2;try{names2=readdirSync(dir)}catch{return}let suffix=`_${sessionId}.jsonl`,match2=names2.find(name=>name===`${sessionId}.jsonl`||name.endsWith(suffix));return match2===void 0?void 0:join8(dir,match2)}function parseHeader(line){try{let parsed=JSON.parse(line);if(parsed===null||typeof parsed!="object"||Array.isArray(parsed))return;let record=parsed;return record.type==="session"?record:void 0}catch{return}}function readFirstLine(filePath){let handle;try{handle=openSync(filePath,"r");let buffer=Buffer.alloc(HEADER_SCAN_BYTES),read=readSync(handle,buffer,0,HEADER_SCAN_BYTES,0);return read<=0?void 0:buffer.toString("utf8",0,read).split(`
|
|
503
|
-
`,1)[0]??""}catch{return}finally{handle!==void 0&&closeSync(handle)}}function readAgentSessionHead(agentDir,sessionId){if(!isAgentSessionId(sessionId))return;let filePath=findSessionFile(agentSessionsDir(agentDir),sessionId);if(filePath===void 0)return;let bytes,firstLine;try{bytes=statSync2(filePath).size,firstLine=readFirstLine(filePath)}catch{return}if(firstLine===void 0)return;let header=parseHeader(firstLine);if(header===void 0)return;let parentAgentSession=typeof header.parentAgentSession=="string"?header.parentAgentSession:void 0,agentRole=typeof header.agentRole=="string"?header.agentRole:void 0,createdAt=typeof header.timestamp=="string"?header.timestamp:void 0;return{sessionId,...parentAgentSession===void 0?{}:{parentAgentSession},...agentRole===void 0?{}:{agentRole},...createdAt===void 0?{}:{createdAt},bytes}}function readAgentSessionLineage(agentDir,sessionId,maxDepth){let self=readAgentSessionHead(agentDir,sessionId);if(self===void 0)return{self:void 0,ancestors:[],truncated:!1};let ancestors=[],current=self;for(let step=0;step<maxDepth;step+=1){let parent=current.parentAgentSession;if(parent===void 0||parent===current.sessionId)return{self,ancestors,truncated:!1};let head=readAgentSessionHead(agentDir,parent);if(head===void 0)return{self,ancestors,truncated:!1};ancestors.push(head),current=head}return{self,ancestors,truncated:!0}}var subagent_exports={};__export(subagent_exports,{SUBAGENT_MAILBOX_MAX_ESCALATIONS:()=>SUBAGENT_MAILBOX_MAX_ESCALATIONS,SUBAGENT_MAILBOX_MAX_INBOX:()=>SUBAGENT_MAILBOX_MAX_INBOX,SUBAGENT_MAILBOX_MAX_MESSAGE_BYTES:()=>SUBAGENT_MAILBOX_MAX_MESSAGE_BYTES,SUBAGENT_TASK_PROTOCOL_VERSION:()=>SUBAGENT_TASK_PROTOCOL_VERSION,SubagentMailboxErrorV1:()=>SubagentMailboxErrorV1,SubagentTaskProtocolError:()=>SubagentTaskProtocolError,boundServerMessagesV1:()=>boundServerMessagesV1,createSubagentMailbox:()=>createSubagentMailbox,createSubagentTaskChannelPairV1:()=>createSubagentTaskChannelPairV1,createSubagentTaskEnvelopeDecoderV1:()=>createSubagentTaskEnvelopeDecoderV1,createSubagentTaskServer:()=>createSubagentTaskServer,createSubagentTaskStdioChannelV1:()=>createSubagentTaskStdioChannelV1,createTurnProgressSourceV1:()=>createTurnProgressSourceV1,decodeEnvelopeV1:()=>decodeEnvelopeV1,encodeEnvelopeV1:()=>encodeEnvelopeV1,subagentMailboxExists:()=>subagentMailboxExists,subscribeTaskProgressV1:()=>subscribeTaskProgressV1});import{randomUUID}from"node:crypto";import{mkdirSync as mkdirSync2,readdirSync as readdirSync2,readFileSync as readFileSync3,renameSync,rmSync,statSync as statSync3,writeFileSync as writeFileSync2}from"node:fs";import{join as join9}from"node:path";var SUBAGENT_MAILBOX_MAX_MESSAGE_BYTES=2048,SUBAGENT_MAILBOX_MAX_ESCALATIONS=8,SUBAGENT_MAILBOX_MAX_INBOX=32,SubagentMailboxErrorV1=class extends Error{code;constructor(code,message){super(message),this.name="SubagentMailboxErrorV1",this.code=code}};function utf8ByteLength(text){return new TextEncoder().encode(text).length}function mailboxRoot(agentDir,ownerParentSessionId){if(!isAgentSessionId(ownerParentSessionId))throw new SubagentMailboxErrorV1("subagent_unknown_session","mailbox owner id is not a session id");return join9(agentDir,"mailboxes",ownerParentSessionId)}function escalationsDir(root){return join9(root,"escalations")}function inboxDir(root,sessionId){if(!isAgentSessionId(sessionId))throw new SubagentMailboxErrorV1("subagent_unknown_session","mailbox target id is not a session id");return join9(root,"inboxes",sessionId)}function postMessage(dir,namePrefix,payload2){mkdirSync2(dir,{recursive:!0});let name=`${namePrefix}${Date.now().toString(36)}-${randomUUID().slice(0,8)}.json`;writeFileSync2(join9(dir,`.${name}.tmp`),JSON.stringify(payload2),"utf8"),renameSync(join9(dir,`.${name}.tmp`),join9(dir,name))}function listMessageFiles(dir){let names2;try{names2=readdirSync2(dir)}catch{return[]}let messages=[];for(let name of names2.sort()){if(name.endsWith(".tmp")){try{rmSync(join9(dir,name))}catch{}continue}name.endsWith(".json")&&messages.push(name)}return messages}function takeMessage(dir,name){let text;try{text=readFileSync3(join9(dir,name),"utf8")}catch{return}try{rmSync(join9(dir,name))}catch{}try{return JSON.parse(text)}catch{return}}function createSubagentMailbox(options){let rootFor=()=>{let owner=options.ownerParentSessionId();if(owner===void 0)throw new SubagentMailboxErrorV1("subagent_unknown_session","mailbox owner session is not bound yet");return mailboxRoot(options.agentDir,owner)},assertBounded=(text,pendingCount,maxCount,quotaCode)=>{if(utf8ByteLength(text)>SUBAGENT_MAILBOX_MAX_MESSAGE_BYTES)throw new SubagentMailboxErrorV1("subagent_message_too_large",`message exceeds ${SUBAGENT_MAILBOX_MAX_MESSAGE_BYTES} utf-8 bytes`);if(pendingCount>=maxCount)throw new SubagentMailboxErrorV1(quotaCode,`mailbox has ${maxCount} pending messages already`)};return{postEscalate(fromSessionId,text){if(!isAgentSessionId(fromSessionId))throw new SubagentMailboxErrorV1("subagent_unknown_session","sender id is not a session id");let dir=escalationsDir(rootFor()),prefix=`${fromSessionId}__`,pending=listMessageFiles(dir).filter(name=>name.startsWith(prefix)).length;assertBounded(text,pending,SUBAGENT_MAILBOX_MAX_ESCALATIONS,"subagent_escalate_quota"),postMessage(dir,prefix,{from:fromSessionId,text})},drainEscalations(sessionId){let dir=escalationsDir(rootFor()),prefix=`${sessionId}__`,drained=[];for(let name of listMessageFiles(dir)){if(!name.startsWith(prefix))continue;let message=takeMessage(dir,name);message!==void 0&&typeof message.text=="string"&&drained.push(message.text)}return drained},postSibling(fromSessionId,toSessionId,text){let root=rootFor(),owner=options.ownerParentSessionId(),fromHead=readAgentSessionHead(options.agentDir,fromSessionId);if(owner===void 0||fromHead===void 0||fromHead.parentAgentSession!==owner)throw new SubagentMailboxErrorV1("subagent_unknown_session","sender is not a known child of this session");let toHead=readAgentSessionHead(options.agentDir,toSessionId);if(toHead===void 0||toHead.parentAgentSession!==owner)throw new SubagentMailboxErrorV1("subagent_unknown_session","recipient is not a known sibling under this session");let dir=inboxDir(root,toSessionId);assertBounded(text,listMessageFiles(dir).length,SUBAGENT_MAILBOX_MAX_INBOX,"subagent_inbox_quota"),postMessage(dir,`${fromSessionId}__`,{from:fromSessionId,text})},drainInbox(sessionId,limit){let dir=inboxDir(rootFor(),sessionId),drained=[];for(let name of listMessageFiles(dir)){if(drained.length>=Math.max(0,limit))break;let message=takeMessage(dir,name);message!==void 0&&(typeof message.from!="string"||typeof message.text!="string"||drained.push({from:message.from,text:message.text}))}return drained}}}function subagentMailboxExists(agentDir,ownerParentSessionId){try{return statSync3(mailboxRoot(agentDir,ownerParentSessionId)),!0}catch{return!1}}function subscribeTaskProgressV1(adapter,taskId,listener){return adapter.onTaskProgress?.(taskId,listener)??(()=>{})}var MAX_TOOL_NAMES=3;function createTurnProgressSourceV1(session){return handler=>{let turn=0,tools=new Set;return session.subscribe(event=>{if(typeof event!="object"||event===null)return;let typed=event;if(typed.type==="turn_start"){turn+=1,tools.clear();return}if(typed.type==="tool_execution_start"&&typeof typed.toolName=="string"){tools.size<MAX_TOOL_NAMES&&tools.add(typed.toolName);return}if(typed.type!=="turn_end")return;let names2=[...tools];handler(`turn ${Math.max(turn,1)} done${names2.length===0?"":` (${names2.join(", ")})`}`)})}}var CborError=class extends Error{constructor(message){super(message),this.name="CborError"}},textEncoder=new TextEncoder,textDecoder=new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0});function resolveLimit(name,value,maximum){if(!Number.isSafeInteger(value)||value<0||value>maximum)throw new RangeError(`${name} must be an integer between 0 and ${maximum}`);return value}function resolveOptions(options){return{maxByteLength:resolveLimit("maxByteLength",options?.maxByteLength??16777216,4294967295),maxContainerLength:resolveLimit("maxContainerLength",options?.maxContainerLength??1e6,4294967295),maxDepth:resolveLimit("maxDepth",options?.maxDepth??64,512)}}var CborReader=class{bytes;offset=0;options;constructor(bytes,options){this.bytes=bytes,this.options=options}decode(){let value=this.readItem(0);if(this.offset!==this.bytes.byteLength)throw new CborError("CBOR payload contains trailing data");return value}readItem(depth){if(depth>this.options.maxDepth)throw new CborError(`CBOR nesting depth exceeds configured limit of ${this.options.maxDepth}`);let initial=this.readByte(),majorType=initial>>>5,additionalInformation=initial&31;switch(majorType){case 0:return this.readArgument(additionalInformation);case 1:{let value=-1-this.readArgument(additionalInformation);if(!Number.isSafeInteger(value))throw new CborError("Decoded CBOR integer is outside the safe range");return value}case 2:{let length=this.readLength(additionalInformation,"byte string",this.options.maxByteLength);return new Uint8Array(this.readBytes(length))}case 3:{let length=this.readLength(additionalInformation,"text string",this.options.maxByteLength),bytes=this.readBytes(length);try{return textDecoder.decode(bytes)}catch{throw new CborError("CBOR text string contains invalid UTF-8")}}case 4:{let length=this.readLength(additionalInformation,"array",this.options.maxContainerLength),result=[];for(let index3=0;index3<length;index3++)result.push(this.readItem(depth+1));return result}case 5:{let length=this.readLength(additionalInformation,"map",this.options.maxContainerLength),result={},keys=new Set;for(let index3=0;index3<length;index3++){let key=this.readItem(depth+1);if(typeof key!="string")throw new CborError("CBOR map keys must be strings");if(keys.has(key))throw new CborError("CBOR map contains a duplicate key");keys.add(key),Object.defineProperty(result,key,{configurable:!0,enumerable:!0,value:this.readItem(depth+1),writable:!0})}return result}case 6:throw new CborError("CBOR tags are not supported");case 7:return this.readSimple(additionalInformation);default:throw new CborError("Malformed CBOR major type")}}readSimple(additionalInformation){switch(additionalInformation){case 20:return!1;case 21:return!0;case 22:return null;case 27:{let bytes=this.readBytes(8),value=new DataView(bytes.buffer,bytes.byteOffset,bytes.byteLength).getFloat64(0,!1);if(!Number.isFinite(value))throw new CborError("Decoded CBOR number must be finite");if(Number.isInteger(value)&&!Number.isSafeInteger(value))throw new CborError("Decoded CBOR integer is outside the safe range");return value}case 31:throw new CborError("CBOR break marker is not supported");default:throw new CborError("Unsupported CBOR simple value or floating-point width")}}readLength(additionalInformation,kind,limit){if(additionalInformation===31)throw new CborError(`Indefinite-length CBOR ${kind}s are not supported`);let length=this.readArgument(additionalInformation);if(length>limit)throw new CborError(`CBOR ${kind} length exceeds configured limit of ${limit}`);return length}readArgument(additionalInformation){if(additionalInformation<24)return additionalInformation;switch(additionalInformation){case 24:return this.readByte();case 25:{let bytes=this.readBytes(2);return bytes[0]*256+bytes[1]}case 26:{let bytes=this.readBytes(4);return bytes[0]*16777216+bytes[1]*65536+bytes[2]*256+bytes[3]}case 27:{let high=this.readArgument(26),low=this.readArgument(26);if(high>2097151)throw new CborError("Decoded CBOR integer or length is outside the safe range");return high*4294967296+low}case 31:throw new CborError("Indefinite-length CBOR items are not supported");default:throw new CborError("Malformed CBOR additional information")}}readByte(){if(this.offset>=this.bytes.byteLength)throw new CborError("Truncated CBOR payload");let value=this.bytes[this.offset];return this.offset++,value}readBytes(length){if(length>this.bytes.byteLength-this.offset)throw new CborError("Truncated CBOR payload");let value=this.bytes.subarray(this.offset,this.offset+length);return this.offset+=length,value}};function decodeCbor(bytes,options){if(!(bytes instanceof Uint8Array))throw new TypeError("CBOR input must be a Uint8Array");let resolved=resolveOptions(options);if(bytes.byteLength>resolved.maxByteLength)throw new CborError(`CBOR byte length exceeds configured limit of ${resolved.maxByteLength}`);return new CborReader(bytes,resolved).decode()}var CborWriter=class{buffer;offset=0;maxByteLength;constructor(maxByteLength){this.maxByteLength=maxByteLength,this.buffer=new Uint8Array(Math.min(256,maxByteLength))}writeByte(value){this.ensureCapacity(1),this.buffer[this.offset]=value,this.offset++}writeBytes(bytes){this.ensureCapacity(bytes.byteLength),this.buffer.set(bytes,this.offset),this.offset+=bytes.byteLength}writeUint16(value){this.ensureCapacity(2),this.buffer[this.offset]=value>>>8,this.buffer[this.offset+1]=value,this.offset+=2}writeUint32(value){this.ensureCapacity(4),this.buffer[this.offset]=value>>>24,this.buffer[this.offset+1]=value>>>16,this.buffer[this.offset+2]=value>>>8,this.buffer[this.offset+3]=value,this.offset+=4}writeUint64(value){let high=Math.floor(value/4294967296),low=value-high*4294967296;this.writeUint32(high),this.writeUint32(low)}writeFloat64(value){this.ensureCapacity(9),this.buffer[this.offset]=251,new DataView(this.buffer.buffer).setFloat64(this.offset+1,value,!1),this.offset+=9}finish(){return this.buffer.slice(0,this.offset)}ensureCapacity(additionalBytes){let required=this.offset+additionalBytes;if(required>this.maxByteLength)throw new CborError(`CBOR byte length exceeds configured limit of ${this.maxByteLength}`);if(required<=this.buffer.byteLength)return;let capacity=Math.max(1,this.buffer.byteLength);for(;capacity<required;)capacity=Math.min(this.maxByteLength,Math.max(required,capacity*2));let expanded=new Uint8Array(capacity);expanded.set(this.buffer),this.buffer=expanded}};function writeArgument(writer,majorType,value){let prefix=majorType<<5;value<24?writer.writeByte(prefix|value):value<=255?(writer.writeByte(prefix|24),writer.writeByte(value)):value<=65535?(writer.writeByte(prefix|25),writer.writeUint16(value)):value<=4294967295?(writer.writeByte(prefix|26),writer.writeUint32(value)):(writer.writeByte(prefix|27),writer.writeUint64(value))}function isPlainObject(value){if(typeof value!="object"||value===null)return!1;let prototype=Object.getPrototypeOf(value);return prototype===Object.prototype||prototype===null}function encodeText(writer,value,options){let bytes=textEncoder.encode(value);if(bytes.byteLength>options.maxByteLength)throw new CborError(`CBOR text string length exceeds configured limit of ${options.maxByteLength}`);if(textDecoder.decode(bytes)!==value)throw new CborError("CBOR text strings must contain valid Unicode scalar values");writeArgument(writer,3,bytes.byteLength),writer.writeBytes(bytes)}function encodeValue(writer,value,options,depth,ancestors){if(depth>options.maxDepth)throw new CborError(`CBOR nesting depth exceeds configured limit of ${options.maxDepth}`);if(value===null){writer.writeByte(246);return}if(typeof value=="boolean"){writer.writeByte(value?245:244);return}if(typeof value=="number"){if(!Number.isFinite(value))throw new CborError("CBOR numbers must be finite");if(Number.isInteger(value)&&!Object.is(value,-0)){if(!Number.isSafeInteger(value))throw new CborError("CBOR integers must be safe JavaScript integers");value>=0?writeArgument(writer,0,value):writeArgument(writer,1,-1-value)}else writer.writeFloat64(value);return}if(typeof value=="string"){encodeText(writer,value,options);return}if(value instanceof Uint8Array){if(value.byteLength>options.maxByteLength)throw new CborError(`CBOR byte string length exceeds configured limit of ${options.maxByteLength}`);writeArgument(writer,2,value.byteLength),writer.writeBytes(value);return}if(Array.isArray(value)){if(ancestors.has(value))throw new CborError("CBOR values must not contain cycles");if(value.length>options.maxContainerLength)throw new CborError(`CBOR array length exceeds configured limit of ${options.maxContainerLength}`);ancestors.add(value);try{writeArgument(writer,4,value.length);for(let index3=0;index3<value.length;index3++){if(!Object.hasOwn(value,index3)||value[index3]===void 0)throw new CborError("CBOR arrays must not contain holes or undefined values");encodeValue(writer,value[index3],options,depth+1,ancestors)}}finally{ancestors.delete(value)}return}if(isPlainObject(value)){if(ancestors.has(value))throw new CborError("CBOR values must not contain cycles");for(let symbol of Object.getOwnPropertySymbols(value))if(Object.prototype.propertyIsEnumerable.call(value,symbol))throw new CborError("CBOR map keys must be strings");let entries=[];for(let key of Object.keys(value)){let entryValue=value[key];entryValue!==void 0&&entries.push([key,entryValue])}if(entries.length>options.maxContainerLength)throw new CborError(`CBOR map length exceeds configured limit of ${options.maxContainerLength}`);ancestors.add(value);try{writeArgument(writer,5,entries.length);for(let[key,entryValue]of entries)encodeText(writer,key,options),encodeValue(writer,entryValue,options,depth+1,ancestors)}finally{ancestors.delete(value)}return}throw new CborError(`Unsupported CBOR value type: ${typeof value}`)}function encodeCbor(value,options){let resolved=resolveOptions(options),writer=new CborWriter(resolved.maxByteLength);return encodeValue(writer,value,resolved,0,new Set),writer.finish()}var FrameError=class extends Error{constructor(message){super(message),this.name="FrameError"}};function resolveMaxFrameLength(options){let value=options?.maxFrameLength??16777216;if(!Number.isSafeInteger(value)||value<0||value>4294967295)throw new RangeError(`maxFrameLength must be an integer between 0 and ${4294967295}`);return value}function encodeFrame(payload2){if(!(payload2 instanceof Uint8Array))throw new TypeError("Frame payload must be a Uint8Array");if(payload2.byteLength>4294967295)throw new RangeError("Frame payload exceeds the unsigned 32-bit length limit");let frame=new Uint8Array(4+payload2.byteLength),length=payload2.byteLength;return frame[0]=length>>>24,frame[1]=length>>>16,frame[2]=length>>>8,frame[3]=length,frame.set(payload2,4),frame}var FrameDecoder=class{header=new Uint8Array(4);headerLength=0;maxFrameLength;payloadBlocks=[];currentPayloadBlock;currentPayloadBlockLength=0;expectedPayloadLength;payloadLength=0;state="open";constructor(options){this.maxFrameLength=resolveMaxFrameLength(options)}push(chunk){if(this.state==="ended")throw new FrameError("Frame decoder has ended");if(this.state==="failed")throw new FrameError("Frame decoder has failed");if(!(chunk instanceof Uint8Array))throw new TypeError("Frame chunk must be a Uint8Array");let frames=[],chunkOffset=0;for(;chunkOffset<chunk.byteLength;){if(this.expectedPayloadLength===void 0){let headerBytes=Math.min(4-this.headerLength,chunk.byteLength-chunkOffset);if(this.header.set(chunk.subarray(chunkOffset,chunkOffset+headerBytes),this.headerLength),this.headerLength+=headerBytes,chunkOffset+=headerBytes,this.headerLength<4)continue;let frameLength=this.header[0]*16777216+this.header[1]*65536+this.header[2]*256+this.header[3];if(this.headerLength=0,frameLength>this.maxFrameLength&&this.fail(`Frame length ${frameLength} exceeds configured limit of ${this.maxFrameLength}`),frameLength===0){frames.push(new Uint8Array);continue}this.expectedPayloadLength=frameLength,this.payloadBlocks=[],this.currentPayloadBlock=void 0,this.currentPayloadBlockLength=0,this.payloadLength=0}let expectedPayloadLength=this.expectedPayloadLength;if(expectedPayloadLength!==void 0){for(;chunkOffset<chunk.byteLength&&this.payloadLength<expectedPayloadLength;){let block=this.currentPayloadBlock;(!block||this.currentPayloadBlockLength===block.byteLength)&&(block=new Uint8Array(Math.min(65536,expectedPayloadLength-this.payloadLength)),this.payloadBlocks.push(block),this.currentPayloadBlock=block,this.currentPayloadBlockLength=0);let payloadBytes=Math.min(block.byteLength-this.currentPayloadBlockLength,chunk.byteLength-chunkOffset);block.set(chunk.subarray(chunkOffset,chunkOffset+payloadBytes),this.currentPayloadBlockLength),this.currentPayloadBlockLength+=payloadBytes,this.payloadLength+=payloadBytes,chunkOffset+=payloadBytes}if(this.payloadLength===expectedPayloadLength){if(this.payloadBlocks.length===1)frames.push(this.payloadBlocks[0]);else{let payload2=new Uint8Array(expectedPayloadLength),offset=0;for(let payloadBlock of this.payloadBlocks)payload2.set(payloadBlock,offset),offset+=payloadBlock.byteLength;frames.push(payload2)}this.payloadBlocks=[],this.currentPayloadBlock=void 0,this.currentPayloadBlockLength=0,this.expectedPayloadLength=void 0,this.payloadLength=0}}}return frames}end(){if(this.state==="ended")throw new FrameError("Frame decoder has ended");if(this.state==="failed")throw new FrameError("Frame decoder has failed");(this.headerLength!==0||this.expectedPayloadLength!==void 0)&&this.fail("Truncated frame at end of stream"),this.state="ended"}fail(message){throw this.state="failed",this.headerLength=0,this.payloadBlocks=[],this.currentPayloadBlock=void 0,this.currentPayloadBlockLength=0,this.expectedPayloadLength=void 0,this.payloadLength=0,new FrameError(message)}};var SUBAGENT_TASK_PROTOCOL_VERSION=1,SubagentTaskProtocolError=class extends Error{code;constructor(message,code){super(message),this.name="SubagentTaskProtocolError",this.code=code}},OPS=["hello","create","run","cancel","dispose","result","steer"],ERROR_CODES=["invalid_request","unknown_task","task_terminal","session_error","runner_lost","cross_task_response"];function isString(value){return typeof value=="string"}function isNonEmptyString(value){return typeof value=="string"&&value.length>0}var REQUEST_KEYS=["v","kind","id","op","taskId","prompt","runId","reason","profile","parentSessionId","resumeSessionId","parentTraceId","text"],EVENT_KEYS=["v","kind","taskId","runId","type","message","seq"],OK_RESPONSE_KEYS=["appliedProfile","sessionId","v","kind","id","ok","taskId","runId","messages","truncated","protocolVersion","status"],ERROR_RESPONSE_KEYS=["v","kind","id","ok","code","message"];function assertAllowedKeys(env2,allowed,label){for(let key of Object.keys(env2))if(!allowed.includes(key))throw new SubagentTaskProtocolError(`${label} envelope has an unknown field: ${key}`,"invalid_request")}function assertOptionalString2(env2,key,label){let value=env2[key];if(value!==void 0&&!isString(value))throw new SubagentTaskProtocolError(`${label} envelope field ${key} must be a string`,"invalid_request")}function validateEnvelope(value){if(typeof value!="object"||value===null)throw new SubagentTaskProtocolError("envelope must be an object","invalid_request");let env2=value;if(env2.v!==SUBAGENT_TASK_PROTOCOL_VERSION)throw new SubagentTaskProtocolError(`unsupported envelope version: ${String(env2.v)}`,"invalid_request");if(env2.kind==="request"){if(assertAllowedKeys(env2,REQUEST_KEYS,"request"),!isNonEmptyString(env2.id)||!isString(env2.op)||!OPS.includes(env2.op))throw new SubagentTaskProtocolError("request envelope requires id and a known op","invalid_request");if(assertOptionalString2(env2,"taskId","request"),assertOptionalString2(env2,"prompt","request"),assertOptionalString2(env2,"runId","request"),assertOptionalString2(env2,"reason","request"),assertOptionalString2(env2,"parentSessionId","request"),assertOptionalString2(env2,"resumeSessionId","request"),assertOptionalString2(env2,"parentTraceId","request"),assertOptionalString2(env2,"text","request"),env2.profile!==void 0&&(env2.profile===null||typeof env2.profile!="object"||Array.isArray(env2.profile)))throw new SubagentTaskProtocolError("request profile must be an object","invalid_request");return env2}if(env2.kind==="event"){if(assertAllowedKeys(env2,EVENT_KEYS,"event"),!isNonEmptyString(env2.taskId)||env2.type!=="progress"||typeof env2.seq!="number"||!Number.isInteger(env2.seq)||env2.seq<0)throw new SubagentTaskProtocolError("event envelope requires taskId, type=progress and a non-negative integer seq","invalid_request");return assertOptionalString2(env2,"runId","event"),assertOptionalString2(env2,"message","event"),env2}if(env2.kind==="response"){if(!isNonEmptyString(env2.id)||typeof env2.ok!="boolean")throw new SubagentTaskProtocolError("response envelope requires id and boolean ok","invalid_request");if(env2.ok===!1){if(assertAllowedKeys(env2,ERROR_RESPONSE_KEYS,"error response"),!isString(env2.code)||!ERROR_CODES.includes(env2.code)||!isString(env2.message))throw new SubagentTaskProtocolError("error response requires a known code and a message","invalid_request");return env2}if(assertAllowedKeys(env2,OK_RESPONSE_KEYS,"ok response"),assertOptionalString2(env2,"taskId","ok response"),assertOptionalString2(env2,"runId","ok response"),assertOptionalString2(env2,"status","ok response"),assertOptionalString2(env2,"sessionId","ok response"),env2.appliedProfile!==void 0){let applied=env2.appliedProfile;if(applied===null||typeof applied!="object"||Array.isArray(applied))throw new SubagentTaskProtocolError("ok response appliedProfile must be an object","invalid_request");let record=applied,modelFacts=record.model;if(record.activeTools!==void 0&&(!Array.isArray(record.activeTools)||record.activeTools.some(name=>!isString(name)))||record.thinkingLevel!==void 0&&!isString(record.thinkingLevel)||record.systemPromptAppend!==void 0&&!isString(record.systemPromptAppend)||record.capabilityMode!==void 0&&!isString(record.capabilityMode)||modelFacts!==void 0&&(!isString(modelFacts.provider)||!isString(modelFacts.id)||typeof modelFacts.contextWindow!="number"||typeof modelFacts.maxTokens!="number"||typeof modelFacts.reasoning!="boolean"))throw new SubagentTaskProtocolError("ok response appliedProfile must carry activeTools/capabilityMode and complete model facts","invalid_request")}if(env2.messages!==void 0&&!Array.isArray(env2.messages))throw new SubagentTaskProtocolError("ok response field messages must be an array","invalid_request");if(env2.truncated!==void 0&&typeof env2.truncated!="boolean")throw new SubagentTaskProtocolError("ok response field truncated must be a boolean","invalid_request");if(env2.protocolVersion!==void 0&&(typeof env2.protocolVersion!="number"||!Number.isInteger(env2.protocolVersion)))throw new SubagentTaskProtocolError("ok response field protocolVersion must be an integer","invalid_request");return env2}throw new SubagentTaskProtocolError(`unknown envelope kind: ${String(env2.kind)}`,"invalid_request")}function encodeEnvelopeV1(env2){return encodeFrame(encodeCbor(env2))}function decodeEnvelopeV1(framePayload){let decoded;try{decoded=decodeCbor(framePayload)}catch(error2){throw new SubagentTaskProtocolError(`envelope payload is not valid CBOR: ${error2 instanceof Error?error2.message:String(error2)}`,"invalid_request")}return validateEnvelope(decoded)}function createSubagentTaskEnvelopeDecoderV1(){let decoder=new FrameDecoder;return{push(chunk){return decoder.push(chunk).map(payload2=>decodeEnvelopeV1(payload2))},end(){decoder.end()}}}var CHANNEL_CAPACITY=256,EnvelopeQueue=class{items=[];spaceWaiters=[];dataWaiters=[];closed=!1;push(env2){return this.closed?Promise.resolve():this.items.length>=CHANNEL_CAPACITY?new Promise(resolve25=>{this.spaceWaiters.push(()=>{this.deliver(env2),resolve25()})}):(this.deliver(env2),Promise.resolve())}close(){this.closed=!0;for(let wake of this.spaceWaiters.splice(0))wake();for(let resolve25 of this.dataWaiters.splice(0))resolve25({value:void 0,done:!0})}take(){let item=this.items.shift();return item!==void 0?(this.wakeSpace(),Promise.resolve({value:item,done:!1})):this.closed?Promise.resolve({value:void 0,done:!0}):new Promise(resolve25=>this.dataWaiters.push(resolve25))}deliver(env2){let resolve25=this.dataWaiters.shift();resolve25!==void 0?resolve25({value:env2,done:!1}):this.items.push(env2)}wakeSpace(){let wake=this.spaceWaiters.shift();wake!==void 0&&wake()}},QueueChannel=class{out;inQueue;constructor(out,inQueue){this.out=out,this.inQueue=inQueue}write(env2){return this.out.push(env2)}[Symbol.asyncIterator](){return{next:()=>this.inQueue.take()}}};function createSubagentTaskChannelPairV1(){let clientToServer=new EnvelopeQueue,serverToClient=new EnvelopeQueue;return{client:new QueueChannel(clientToServer,serverToClient),server:new QueueChannel(serverToClient,clientToServer),close(){clientToServer.close(),serverToClient.close()}}}import{randomUUID as randomUUID2}from"node:crypto";var DEFAULT_MAX_MESSAGES=2e3,DEFAULT_MAX_RESULT_BYTES=524288;function utf8ByteLength2(value){return new TextEncoder().encode(value).length}function safeStringify(value){try{let serialized=JSON.stringify(value);return serialized===void 0?"":serialized}catch{return""}}function boundServerMessagesV1(messages,maxMessages,maxResultBytes){let truncated=!1,selected=messages;selected.length>maxMessages&&(selected=selected.slice(0,maxMessages),truncated=!0);let bounded=[],used=0;for(let message of selected){let size=utf8ByteLength2(safeStringify(message));if(used+size>maxResultBytes){truncated=!0;break}used+=size,bounded.push(message)}return{messages:bounded,truncated}}function verifyAppliedProfile(session,requested){let requestedRecord=requested,facts=session.facts?.();if(facts===void 0||requestedRecord.tools!==void 0&&(facts.activeTools===void 0||facts.activeTools.some(name=>!requestedRecord.tools?.includes(name)))||requestedRecord.mode==="readonly"&&facts.capabilityMode!=="readonly")return"unverified";if(requestedRecord.model!==void 0&&facts.model?.id!==requestedRecord.model)return`model: requested ${requestedRecord.model}, got ${facts.model?.id??"none"}`;if(requestedRecord.thinkingLevel!==void 0&&facts.thinkingLevel!==requestedRecord.thinkingLevel)return`thinkingLevel: requested ${requestedRecord.thinkingLevel}, got ${facts.thinkingLevel??"none"}`;if(requestedRecord.systemPromptAppend!==void 0){if(facts.systemPromptAppend===void 0)return"systemPromptAppend: not verifiable (facts missing)";if(!facts.systemPromptAppend.includes(requestedRecord.systemPromptAppend))return"systemPromptAppend: requested append is not in effect (suite APPEND_SYSTEM.md gating may have dropped it)"}return{...facts.activeTools===void 0?{}:{activeTools:facts.activeTools},...facts.model===void 0?{}:{model:facts.model},...facts.capabilityMode===void 0?{}:{capabilityMode:facts.capabilityMode},...facts.thinkingLevel===void 0?{}:{thinkingLevel:facts.thinkingLevel},...facts.systemPromptAppend===void 0?{}:{systemPromptAppend:facts.systemPromptAppend}}}function createSubagentTaskServer(options,out){let maxMessages=options.maxMessages??DEFAULT_MAX_MESSAGES,maxResultBytes=options.maxResultBytes??DEFAULT_MAX_RESULT_BYTES,tasks=new Map,taskSequence=0,serverDisposed=!1,writeState={pending:0,coalesced:0},settleWrite=result=>result!==void 0&&typeof result.then=="function"?result:Promise.resolve(),send=env2=>{writeState.pending+=1,settleWrite(out.write(env2)).finally(()=>{writeState.pending-=1})},sendProgress=(entry,env2)=>{if(entry.progressInFlight){entry.pendingProgress=env2,writeState.coalesced+=1;return}entry.progressInFlight=!0,writeState.pending+=1,settleWrite(out.write(env2)).finally(()=>{writeState.pending-=1,entry.progressInFlight=!1;let next=entry.pendingProgress;entry.pendingProgress=void 0,next!==void 0&&!entry.disposed&&sendProgress(entry,next)})},okResponse=(id,fields)=>{send({v:SUBAGENT_TASK_PROTOCOL_VERSION,kind:"response",id,ok:!0,...fields})},errorResponse=(id,code,message)=>{send({v:SUBAGENT_TASK_PROTOCOL_VERSION,kind:"response",id,ok:!1,code,message})},lookup=id=>{if(id===void 0)return;let entry=tasks.get(id);return entry!==void 0&&!entry.disposed?entry:void 0},handleHello=env2=>{okResponse(env2.id,{protocolVersion:SUBAGENT_TASK_PROTOCOL_VERSION})},handleCreate=async env2=>{if(typeof env2.prompt!="string"){errorResponse(env2.id,"invalid_request","create requires a string prompt");return}try{let session=await options.createSession({prompt:env2.prompt,...env2.profile===void 0?{}:{profile:env2.profile},...env2.parentSessionId===void 0?{}:{parentSessionId:env2.parentSessionId},...env2.resumeSessionId===void 0?{}:{resumeSessionId:env2.resumeSessionId},...env2.parentTraceId===void 0?{}:{parentTraceId:env2.parentTraceId}}),appliedProfile=env2.profile===void 0?void 0:verifyAppliedProfile(session,env2.profile);if(typeof appliedProfile=="string"){await session.dispose().catch(()=>{}),errorResponse(env2.id,"session_error",`runner session could not prove the requested child task profile was applied: ${appliedProfile}`);return}let taskId=`st:${++taskSequence}:${randomUUID2().slice(0,8)}`;tasks.set(taskId,{taskId,session,disposed:!1,cancelledBeforeRun:!1,runActive:!1,progressSeq:0,progressInFlight:!1}),okResponse(env2.id,{taskId,sessionId:session.getSessionId(),...appliedProfile===void 0?{}:{appliedProfile}})}catch(error2){errorResponse(env2.id,"session_error",`session creation failed: ${error2 instanceof Error?error2.message:String(error2)}`)}},handleRun=env2=>{if(env2.taskId===void 0){errorResponse(env2.id,"invalid_request","run requires taskId");return}let entry=lookup(env2.taskId);if(entry===void 0){errorResponse(env2.id,"unknown_task","run requires a live task");return}if(typeof env2.prompt!="string"||typeof env2.runId!="string"){errorResponse(env2.id,"invalid_request","run requires prompt and runId");return}if(entry.cancelledBeforeRun){errorResponse(env2.id,"task_terminal","task was cancelled before the run started");return}if(entry.runActive){errorResponse(env2.id,"task_terminal","a run is already active for this task");return}let controller=new AbortController;if(entry.controller=controller,entry.runActive=!0,entry.unsubscribeProgress=void 0,entry.session.onProgress!==void 0){let unsubscribe=entry.session.onProgress(message=>{entry.disposed||sendProgress(entry,{v:SUBAGENT_TASK_PROTOCOL_VERSION,kind:"event",taskId:entry.taskId,runId:env2.runId,type:"progress",message,seq:++entry.progressSeq})});entry.unsubscribeProgress=typeof unsubscribe=="function"?unsubscribe:void 0}let settleRun=()=>{entry.runActive=!1,entry.controller=void 0,entry.unsubscribeProgress?.(),entry.unsubscribeProgress=void 0};entry.session.run(env2.prompt,controller.signal).then(outcome=>{entry.disposed||(settleRun(),entry.lastRunStatus=outcome.status==="done"?"succeeded":"cancelled",okResponse(env2.id,{taskId:entry.taskId,runId:env2.runId,status:entry.lastRunStatus}))}).catch(error2=>{entry.disposed||(settleRun(),errorResponse(env2.id,"session_error",`run failed: ${error2 instanceof Error?error2.message:String(error2)}`))})},handleCancel=async env2=>{if(env2.taskId===void 0){errorResponse(env2.id,"invalid_request","cancel requires taskId");return}let entry=lookup(env2.taskId);if(entry===void 0){errorResponse(env2.id,"unknown_task","cancel requires a live task");return}try{entry.runActive||(entry.cancelledBeforeRun=!0),entry.controller?.abort(env2.reason??"cancelled"),await entry.session.cancel(env2.reason),okResponse(env2.id,{taskId:entry.taskId})}catch(error2){errorResponse(env2.id,"session_error",`cancel failed: ${error2 instanceof Error?error2.message:String(error2)}`)}},handleSteer=async env2=>{if(env2.taskId===void 0){errorResponse(env2.id,"invalid_request","steer requires taskId");return}let entry=lookup(env2.taskId);if(entry===void 0){errorResponse(env2.id,"unknown_task","steer requires a live task");return}if(typeof env2.text!="string"||env2.text.trim()===""){errorResponse(env2.id,"invalid_request","steer requires non-empty text");return}if(entry.session.steer===void 0){errorResponse(env2.id,"session_error","runner session does not support steer");return}try{await entry.session.steer(env2.text),okResponse(env2.id,{taskId:entry.taskId})}catch(error2){errorResponse(env2.id,"session_error",`steer failed: ${error2 instanceof Error?error2.message:String(error2)}`)}},handleDispose=async env2=>{if(env2.taskId===void 0){errorResponse(env2.id,"invalid_request","dispose requires taskId");return}let entry=lookup(env2.taskId);if(entry===void 0){errorResponse(env2.id,"unknown_task","dispose requires a live task");return}entry.disposed=!0,entry.runActive=!1,entry.unsubscribeProgress?.(),entry.unsubscribeProgress=void 0,entry.controller?.abort("subagent task disposed"),entry.controller=void 0,tasks.delete(entry.taskId);try{await entry.session.dispose(),okResponse(env2.id,{taskId:entry.taskId})}catch(error2){errorResponse(env2.id,"session_error",`dispose failed: ${error2 instanceof Error?error2.message:String(error2)}`)}},handleResult=env2=>{if(env2.taskId===void 0){errorResponse(env2.id,"invalid_request","result requires taskId");return}let entry=lookup(env2.taskId);if(entry===void 0){errorResponse(env2.id,"unknown_task","result requires a live task");return}let bounded=boundServerMessagesV1(entry.session.getMessages(),maxMessages,maxResultBytes);okResponse(env2.id,{taskId:entry.taskId,messages:bounded.messages,truncated:bounded.truncated,...entry.lastRunStatus===void 0?{}:{status:entry.lastRunStatus}})};return{inspect(){return{pendingWrites:writeState.pending,coalescedProgress:writeState.coalesced}},handle(env2){if(serverDisposed)return env2.kind==="request"&&errorResponse(env2.id,"task_terminal","subagent task server is disposed"),Promise.resolve();if(env2.kind!=="request")return Promise.resolve();try{switch(env2.op){case"hello":return handleHello(env2),Promise.resolve();case"create":return handleCreate(env2);case"run":return handleRun(env2),Promise.resolve();case"cancel":return handleCancel(env2);case"dispose":return handleDispose(env2);case"result":return handleResult(env2),Promise.resolve();case"steer":return handleSteer(env2)}}catch(error2){return errorResponse(env2.id,"session_error",`request failed: ${error2 instanceof Error?error2.message:String(error2)}`),Promise.resolve()}return Promise.resolve()},async dispose(){serverDisposed=!0;let entries=[...tasks.values()];tasks.clear();for(let entry of entries){entry.disposed=!0,entry.unsubscribeProgress?.(),entry.unsubscribeProgress=void 0,entry.controller?.abort("subagent task server disposed"),entry.controller=void 0;try{await entry.session.dispose()}catch{}}}}}function createSubagentTaskStdioChannelV1(streams){let decoder=createSubagentTaskEnvelopeDecoderV1(),pending=[],waiters=[],closed=!1,failure2,close=error2=>{if(!closed){closed=!0,failure2=error2;for(let waiter of waiters.splice(0))error2!==void 0?waiter.reject(error2):waiter.resolve({value:void 0,done:!0});streams.onClosed?.(error2)}};return streams.input.on("data",chunk=>{if(closed)return;let bytes=typeof chunk=="string"?new TextEncoder().encode(chunk):new Uint8Array(chunk);try{for(let env2 of decoder.push(bytes)){let waiter=waiters.shift();waiter!==void 0?waiter.resolve({value:env2,done:!1}):pending.push(env2)}}catch(error2){close(error2 instanceof Error?error2:new Error(String(error2)))}}),streams.input.on("end",()=>{try{decoder.end()}catch(error2){close(error2 instanceof Error?error2:new Error(String(error2)));return}close()}),streams.input.on("error",error2=>close(error2)),streams.output.on("error",error2=>close(error2)),{async write(env2){if(closed)return;let frame=encodeEnvelopeV1(env2);streams.output.write(frame)||await new Promise((resolve25,reject2)=>{let onDrain=()=>{streams.output.off("error",onError),resolve25()},onError=error2=>{streams.output.off("drain",onDrain),reject2(error2)};streams.output.once("drain",onDrain),streams.output.once("error",onError)})},[Symbol.asyncIterator](){return{next:()=>{let item=pending.shift();return item!==void 0?Promise.resolve({value:item,done:!1}):failure2!==void 0?Promise.reject(failure2):closed?Promise.resolve({value:void 0,done:!0}):new Promise((resolve25,reject2)=>waiters.push({resolve:resolve25,reject:reject2}))}}}}}import{createRequire as createRequire2}from"node:module";var require3=createRequire2(import.meta.url),createJitiImpl;function createJiti(...args){return createJitiImpl??=require3("jiti").createJiti,createJitiImpl(...args)}var activePlugins=new WeakMap,hostHeavyDependencyAliases=new Set(["@lancedb/lancedb","@huggingface/transformers","onnxruntime-node"]),resolvedHeavyDependencyAliases=new Map,defaultHostDependencyAliasResolution={resolve:specifier=>createRequire3(import.meta.url).resolve(specifier),cache:resolvedHeavyDependencyAliases};function buildHostDependencyAliases(specifiers,resolution){let aliases={};for(let specifier of specifiers){let cached=resolution.cache.get(specifier);if(cached!==void 0){aliases[specifier]=cached;continue}try{let resolved=resolution.resolve(specifier);resolution.cache.set(specifier,resolved),aliases[specifier]=resolved}catch{}}return aliases}function hostDependencyPathsConfig(){let paths={};for(let[specifier,entryPath]of Object.entries(buildHostDependencyAliases(hostHeavyDependencyAliases,defaultHostDependencyAliasResolution)))paths[camelCaseDependencyKey(specifier)]=entryPath;return paths}function camelCaseDependencyKey(specifier){return specifier.replace(/^@[^/]+\//,"").replace(/[-.](.)/g,(_2,character)=>character.toUpperCase())}function isPluginInstance(value){return typeof value=="object"&&value!==null&&typeof value.dispose=="function"}function normalizePluginInstance(value,manifest){if(value!==void 0){if(!isPluginInstance(value))throw new Error(`Capability plugin factory must return void or an instance with dispose(): ${manifest.id}`);return value}}function normalizePluginSyncInstance(value,manifest){if(value!==void 0){if(!isPluginInstance(value))throw new Error(`Synchronous capability plugin factory must return void or an instance with dispose(): ${manifest.id}`);return value}}function throwCleanupErrors(errors,manifestId){if(errors.length!==0)throw errors.length===1?errors[0]:new AggregateError(errors,`Capability plugin cleanup failed: ${manifestId}`)}async function dispatchPluginDisposeEvent(runtime,manifest,status2){runtime.hasLifecycleEvent(PLUGIN_DISPOSE_EVENT_ID,1)&&await runtime.dispatchLifecycle({type:PLUGIN_DISPOSE_EVENT_ID,version:1,phase:"committed",data:{version:1,pluginId:manifest.id,pluginVersion:manifest.version,status:status2},source:"capability-plugin"})}async function dispatchPluginReadyEvent(runtime,manifest){runtime.hasLifecycleEvent(PLUGIN_READY_EVENT_ID,1)&&await runtime.dispatchLifecycle({type:PLUGIN_READY_EVENT_ID,version:1,phase:"committed",data:{version:1,pluginId:manifest.id,pluginVersion:manifest.version},source:"capability-plugin"})}function isMissingPathError(error2){return typeof error2=="object"&&error2!==null&&"code"in error2&&error2.code==="ENOENT"}function compareNames(left,right){return left<right?-1:left>right?1:0}function discoverCapabilityPluginManifests(pluginDirectories){let manifests2=[],seenDirectories=new Set,seenManifests=new Set,visit=(directory,optional)=>{let resolvedDirectory=path3.resolve(directory),stats;try{stats=statSync4(resolvedDirectory)}catch(error2){if(optional&&isMissingPathError(error2))try{if(!lstatSync(resolvedDirectory).isSymbolicLink())return}catch(linkError){if(isMissingPathError(linkError))return;throw new Error(`Failed to inspect capability plugin directory ${resolvedDirectory}: ${linkError instanceof Error?linkError.message:String(linkError)}`)}throw new Error(`Failed to inspect capability plugin directory ${resolvedDirectory}: ${error2 instanceof Error?error2.message:String(error2)}`)}if(!stats.isDirectory())throw new Error(`Capability plugin path must be a directory: ${resolvedDirectory}`);let canonicalDirectory;try{canonicalDirectory=realpathSync3(resolvedDirectory)}catch(error2){throw new Error(`Failed to resolve capability plugin directory ${resolvedDirectory}: ${error2 instanceof Error?error2.message:String(error2)}`)}if(seenDirectories.has(canonicalDirectory))return;seenDirectories.add(canonicalDirectory);let entries;try{entries=readdirSync3(resolvedDirectory,{withFileTypes:!0,encoding:"utf8"})}catch(error2){throw new Error(`Failed to read capability plugin directory ${resolvedDirectory}: ${error2 instanceof Error?error2.message:String(error2)}`)}for(let entry of entries.sort((left,right)=>compareNames(left.name,right.name))){if(entry.name==="node_modules"||entry.name.startsWith("."))continue;let entryPath=path3.join(resolvedDirectory,entry.name);if(entry.isDirectory()){visit(entryPath,!1);continue}if(!entry.isFile()||entry.name!=="plugin.json")continue;let canonicalManifest;try{canonicalManifest=realpathSync3(entryPath)}catch(error2){throw new Error(`Failed to resolve capability plugin manifest ${entryPath}: ${error2 instanceof Error?error2.message:String(error2)}`)}seenManifests.has(canonicalManifest)||(seenManifests.add(canonicalManifest),manifests2.push(canonicalManifest))}};for(let pluginDirectory of pluginDirectories)visit(pluginDirectory,!0);return manifests2}async function loadCapabilityPlugin(runtime,manifest,factory){let active=activePlugins.get(runtime)??new Map;if(active.has(manifest.id))throw new Error(`Capability plugin is already loaded: ${manifest.id}`);let ownerToken=Symbol(manifest.id);active.set(manifest.id,ownerToken),activePlugins.set(runtime,active);let api,instance,cleanup=async notifyDispose=>{let errors=[];api&&runtime.revokeAPI(api);try{await runtime.disposePlugin(manifest.id)}catch(error2){errors.push(error2)}try{await instance?.dispose()}catch(error2){errors.push(error2)}if(notifyDispose)try{await dispatchPluginDisposeEvent(runtime,manifest,errors.length===0?"disposed":"failed")}catch(error2){errors.push(error2)}throwCleanupErrors(errors,manifest.id)};try{api=runtime.createAPI(manifest),instance=normalizePluginInstance(await factory(api),manifest),await dispatchPluginReadyEvent(runtime,manifest);let pluginApi=api,disposePromise;return{manifest,api:pluginApi,ready:Promise.resolve(),dispose:async()=>(disposePromise??=(async()=>{try{await cleanup(!0)}finally{active.get(manifest.id)===ownerToken&&active.delete(manifest.id)}})(),disposePromise)}}catch(error2){try{await cleanup(!1)}catch(cleanupError){throw new AggregateError([error2,cleanupError],`Capability plugin startup cleanup failed: ${manifest.id}`)}finally{active.get(manifest.id)===ownerToken&&active.delete(manifest.id)}throw error2}}function loadCapabilityPluginSync(runtime,manifest,factory){let active=activePlugins.get(runtime)??new Map;if(active.has(manifest.id))throw new Error(`Capability plugin is already loaded: ${manifest.id}`);let ownerToken=Symbol(manifest.id);active.set(manifest.id,ownerToken),activePlugins.set(runtime,active);let api,instance,cleanupRegistrationsSync=()=>{let errors=[];api&&runtime.revokeAPI(api);try{runtime.disposePluginSync(manifest.id)}catch(error2){errors.push(error2)}return errors},cleanupSync=async()=>{let errors=cleanupRegistrationsSync(),result;try{result=instance?.dispose()}catch(error2){errors.push(error2)}if(result&&typeof result.then=="function"){let contractError=new Error(`Synchronous capability plugin disposer must not return a Promise: ${manifest.id}`);try{await result}catch(error2){errors.push(error2)}errors.push(contractError)}try{await dispatchPluginDisposeEvent(runtime,manifest,errors.length===0?"disposed":"failed")}catch(error2){errors.push(error2)}throwCleanupErrors(errors,manifest.id)};try{api=runtime.createAPI(manifest),instance=normalizePluginSyncInstance(factory(api),manifest)}catch(error2){try{throwCleanupErrors(cleanupRegistrationsSync(),manifest.id)}catch(cleanupError){throw new AggregateError([error2,cleanupError],`Capability plugin startup cleanup failed: ${manifest.id}`)}finally{active.get(manifest.id)===ownerToken&&active.delete(manifest.id)}throw error2}let ready=dispatchPluginReadyEvent(runtime,manifest);ready.catch(()=>{});let disposePromise;return{manifest,api,ready,dispose:async()=>(disposePromise??=(async()=>{let readyError;try{await ready}catch(error2){readyError=error2}try{if(await cleanupSync(),readyError!==void 0)throw readyError}catch(error2){throw readyError!==void 0&&error2!==readyError?new AggregateError([readyError,error2],`Capability plugin cleanup failed: ${manifest.id}`):error2}finally{active.get(manifest.id)===ownerToken&&active.delete(manifest.id)}})(),disposePromise)}}async function loadCapabilityPluginFromManifest(runtime,manifestPath,options){let raw;try{raw=JSON.parse(await readFile2(manifestPath,"utf8"))}catch(error2){throw new Error(`Failed to read capability plugin manifest ${manifestPath}: ${error2 instanceof Error?error2.message:String(error2)}`)}let parsed=parseCapabilityPluginManifest(raw,manifestPath),hostDependencyOverride={hostDependencyPaths:hostDependencyPathsConfig()},callerOverride=options?.configOverride,manifest=callerOverride===void 0||Object.keys(callerOverride).length===0?{...parsed,config:{...parsed.config,...hostDependencyOverride}}:{...parsed,config:{...parsed.config,...hostDependencyOverride,...callerOverride}},entryPath=path3.resolve(path3.dirname(manifestPath),manifest.entry),jiti=createJiti(import.meta.url,{moduleCache:!1,tsconfigPaths:!0,alias:buildHostDependencyAliases(hostHeavyDependencyAliases,defaultHostDependencyAliasResolution),virtualModules:{"@agent-forge/plugin-sdk":dist_exports,"@agent-forge/plugin-sdk/session-lineage":session_lineage_exports,"@agent-forge/protocol/subagent":subagent_exports,typebox:build_exports,"typebox/value":value_exports2}}),factory;try{factory=await jiti.import(entryPath,{default:!0})}catch(error2){throw new Error(`Failed to import capability plugin entry ${entryPath}: ${error2 instanceof Error?error2.message:String(error2)}`)}if(typeof factory!="function")throw new Error(`Capability plugin entry must default-export a factory function: ${entryPath}`);return loadCapabilityPlugin(runtime,manifest,factory)}var ecosystem_exports={};__export(ecosystem_exports,{AGENT_FORGE_NPM_REGISTRY_ENV_V1:()=>AGENT_FORGE_NPM_REGISTRY_ENV_V1,AGENT_FORGE_NPM_TOKEN_ENV_V1:()=>AGENT_FORGE_NPM_TOKEN_ENV_V1,DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1:()=>DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1,DEFAULT_PLUGIN_INSTALL_STORE_DIR_V1:()=>DEFAULT_PLUGIN_INSTALL_STORE_DIR_V1,DEFAULT_PLUGIN_STATE_FILE_V1:()=>DEFAULT_PLUGIN_STATE_FILE_V1,MAX_NODE_DISK_REGISTRY_INDEX_BYTES_V1:()=>MAX_NODE_DISK_REGISTRY_INDEX_BYTES_V1,MAX_NODE_DISK_REGISTRY_MANIFEST_BYTES_V1:()=>MAX_NODE_DISK_REGISTRY_MANIFEST_BYTES_V1,MAX_NODE_DISK_REGISTRY_RECORDS_V1:()=>MAX_NODE_DISK_REGISTRY_RECORDS_V1,MAX_PLUGIN_ACQUISITION_NPM_NAME_CHARS_V1:()=>MAX_PLUGIN_ACQUISITION_NPM_NAME_CHARS_V1,MAX_PLUGIN_ACQUISITION_REF_CHARS_V1:()=>MAX_PLUGIN_ACQUISITION_REF_CHARS_V1,MAX_PLUGIN_DISTRIBUTION_ARTIFACT_BYTES_V1:()=>MAX_PLUGIN_DISTRIBUTION_ARTIFACT_BYTES_V1,MAX_PLUGIN_DISTRIBUTION_ARTIFACT_REF_CHARS_V1:()=>MAX_PLUGIN_DISTRIBUTION_ARTIFACT_REF_CHARS_V1,MAX_PLUGIN_DISTRIBUTION_DESCRIPTOR_BYTES_V1:()=>MAX_PLUGIN_DISTRIBUTION_DESCRIPTOR_BYTES_V1,MAX_PLUGIN_DISTRIBUTION_FIELD_CHARS_V1:()=>MAX_PLUGIN_DISTRIBUTION_FIELD_CHARS_V1,MAX_PLUGIN_DISTRIBUTION_METADATA_BYTES_V1:()=>MAX_PLUGIN_DISTRIBUTION_METADATA_BYTES_V1,MAX_PLUGIN_ECOSYSTEM_CLI_ARGS_V1:()=>MAX_PLUGIN_ECOSYSTEM_CLI_ARGS_V1,MAX_PLUGIN_ECOSYSTEM_CLI_LIST_ENTRIES_V1:()=>MAX_PLUGIN_ECOSYSTEM_CLI_LIST_ENTRIES_V1,MAX_PLUGIN_ECOSYSTEM_CLI_OUTPUT_BYTES_V1:()=>MAX_PLUGIN_ECOSYSTEM_CLI_OUTPUT_BYTES_V1,MAX_PLUGIN_REGISTRY_MANIFESTS_V1:()=>MAX_PLUGIN_REGISTRY_MANIFESTS_V1,MAX_PLUGIN_REGISTRY_MANIFEST_BYTES_V1:()=>MAX_PLUGIN_REGISTRY_MANIFEST_BYTES_V1,MAX_PLUGIN_REGISTRY_PROOF_CHARS_V1:()=>MAX_PLUGIN_REGISTRY_PROOF_CHARS_V1,MAX_PLUGIN_REGISTRY_SOURCE_CHARS_V1:()=>MAX_PLUGIN_REGISTRY_SOURCE_CHARS_V1,MAX_PLUGIN_SCOPE_REF_CHARS_V1:()=>MAX_PLUGIN_SCOPE_REF_CHARS_V1,MAX_PLUGIN_SELECTION_IDS_V1:()=>MAX_PLUGIN_SELECTION_IDS_V1,MAX_PLUGIN_SELECTION_ID_CHARS_V1:()=>MAX_PLUGIN_SELECTION_ID_CHARS_V1,MAX_PLUGIN_SELECTION_PROFILES_V1:()=>MAX_PLUGIN_SELECTION_PROFILES_V1,MAX_PLUGIN_SELECTION_STORE_PATH_CHARS_V1:()=>MAX_PLUGIN_SELECTION_STORE_PATH_CHARS_V1,MAX_PLUGIN_STATE_ID_CHARS_V1:()=>MAX_PLUGIN_STATE_ID_CHARS_V1,MAX_PLUGIN_STATE_INSTALLATION_REF_CHARS_V1:()=>MAX_PLUGIN_STATE_INSTALLATION_REF_CHARS_V1,MAX_PLUGIN_STATE_RECORDS_V1:()=>MAX_PLUGIN_STATE_RECORDS_V1,MAX_PLUGIN_STATE_SOURCE_CHARS_V1:()=>MAX_PLUGIN_STATE_SOURCE_CHARS_V1,MAX_PLUGIN_STATE_STRING_CHARS_V1:()=>MAX_PLUGIN_STATE_STRING_CHARS_V1,NODE_PACKAGE_FORMAT_VERSION_V1:()=>NODE_PACKAGE_FORMAT_VERSION_V12,NODE_PLUGIN_TRUST_ROOT_VERSION_V1:()=>NODE_PLUGIN_TRUST_ROOT_VERSION_V1,NodeDiskRegistrySourceErrorV1:()=>NodeDiskRegistrySourceErrorV1,NodeHttpPluginRegistrySourceErrorV1:()=>NodeHttpPluginRegistrySourceErrorV1,NodeNpmRegistrySourceErrorV1:()=>NodeNpmRegistrySourceErrorV1,NodePackageInstallErrorV1:()=>NodePackageInstallErrorV1,NodePackageInstallPersistenceErrorV1:()=>NodePackageInstallPersistenceErrorV1,NodeReleasePackageSourceErrorV1:()=>NodeReleasePackageSourceErrorV1,NodeTarWriterErrorV1:()=>NodeTarWriterErrorV1,NodeUrlPackageSourceErrorV1:()=>NodeUrlPackageSourceErrorV1,PLUGIN_DISTRIBUTION_CONTRACT_VERSION_V1:()=>PLUGIN_DISTRIBUTION_CONTRACT_VERSION_V1,PLUGIN_ECOSYSTEM_CLI_VERSION_V1:()=>PLUGIN_ECOSYSTEM_CLI_VERSION_V1,PLUGIN_SELECTION_STORE_VERSION_V1:()=>PLUGIN_SELECTION_STORE_VERSION_V1,PLUGIN_SELECTION_VERSION_V1:()=>PLUGIN_SELECTION_VERSION_V1,PLUGIN_STATE_SNAPSHOT_VERSION_V1:()=>PLUGIN_STATE_SNAPSHOT_VERSION_V1,PluginAcquisitionErrorV1:()=>PluginAcquisitionErrorV1,PluginCatalogErrorV1:()=>PluginCatalogErrorV1,PluginDistributionErrorV1:()=>PluginDistributionErrorV1,PluginRegistryErrorV1:()=>PluginRegistryErrorV1,PluginSelectionErrorV1:()=>PluginSelectionErrorV1,activatePluginUpdateV1:()=>activatePluginUpdateV1,buildNodePluginDistributionSignaturePayloadV1:()=>buildNodePluginDistributionSignaturePayloadV1,buildNodeTarBytesV1:()=>buildNodeTarBytesV1,buildNodeTarGzBytesV1:()=>buildNodeTarGzBytesV1,buildPluginCatalogV1:()=>buildPluginCatalogV1,buildResolvedManifestV1:()=>buildResolvedManifestV1,collectLocalDirectoryPackageEntriesV1:()=>collectLocalDirectoryPackageEntriesV1,comparePluginVersionsV1:()=>comparePluginVersionsV1,createDefaultActivePluginBindingsResolverV1:()=>createDefaultActivePluginBindingsResolverV1,createDefaultPluginMarketWiringV1:()=>createDefaultPluginMarketWiringV1,createNodeDiskPluginRegistrySourceV1:()=>createNodeDiskPluginRegistrySourceV1,createNodeHttpPluginDistributionHostV1:()=>createNodeHttpPluginDistributionHostV1,createNodeHttpPluginDistributionStackV1:()=>createNodeHttpPluginDistributionStackV1,createNodeHttpPluginRegistrySourceV1:()=>createNodeHttpPluginRegistrySourceV1,createNodeNpmRegistrySourceV1:()=>createNodeNpmRegistrySourceV1,createNodePackageInstallHostForSessionV1:()=>createNodePackageInstallHostForSessionV1,createNodePackageInstallHostV1:()=>createNodePackageInstallHostV1,createNodePackageInstallPersistenceV1:()=>createNodePackageInstallPersistenceV1,createNodePackageInstallSessionLoaderV1:()=>createNodePackageInstallSessionLoaderV1,createNodePluginAcquisitionHostV1:()=>createNodePluginAcquisitionHostV1,createNodePluginPackageInstallStackV1:()=>createNodePluginPackageInstallStackV1,createNodePluginTrustRootV1:()=>createNodePluginTrustRootV1,createNodeReleasePackageSourceV1:()=>createNodeReleasePackageSourceV1,createPluginDistributionV1:()=>createPluginDistributionV1,createPluginEcosystemCliV1:()=>createPluginEcosystemCliV1,createPluginEcosystemRegistryAdapterV1:()=>createPluginEcosystemRegistryAdapterV1,createPluginInstallerV1:()=>createPluginInstallerV1,createPluginRegistryV1:()=>createPluginRegistryV1,createPluginSelectionStoreV1:()=>createPluginSelectionStoreV1,createPluginSelectionV1:()=>createPluginSelectionV1,createPluginStateStoreV1:()=>createPluginStateStoreV1,defaultPluginHostFactsV1:()=>defaultPluginHostFactsV1,defaultPluginInstallStoreDirectoryV1:()=>defaultPluginInstallStoreDirectoryV1,detectPluginPackageMediaTypeV1:()=>detectPluginPackageMediaTypeV1,downloadNodeUrlPackageV1:()=>downloadNodeUrlPackageV1,findPluginCatalogEntryV1:()=>findPluginCatalogEntryV1,isPluginAcquisitionRefTargetV1:()=>isPluginAcquisitionRefTargetV1,parseNodeTarGzPackageV1:()=>parseNodeTarGzPackageV1,parseNodeZipPackageV1:()=>parseNodeZipPackageV1,parsePluginAcquisitionRefV1:()=>parsePluginAcquisitionRefV1,parsePluginEcosystemCliCommandV1:()=>parsePluginEcosystemCliCommandV1,pluginAcquisitionManifestFromEntriesV1:()=>pluginAcquisitionManifestFromEntriesV1,pluginManifestDigestV1:()=>pluginManifestDigestV1,projectPluginScopeRefV1:()=>projectPluginScopeRefV1,readLocalPackageFileV1:()=>readLocalPackageFileV1,resolveActivePluginBindingsForScopesV1:()=>resolveActivePluginBindingsForScopesV1,resolveActivePluginBindingsV1:()=>resolveActivePluginBindingsV1,resolvePluginCompatibilityV1:()=>resolvePluginCompatibilityV1,resolvePluginProfileV1:()=>resolvePluginProfileV1,resolvePluginSelectionV1:()=>resolvePluginSelectionV1,rollbackPluginUpdateV1:()=>rollbackPluginUpdateV1,runPluginEcosystemCliV1:()=>runPluginEcosystemCliV1,selectNpmPackageVersionV1:()=>selectNpmPackageVersionV1,serializePluginSelectionV1:()=>serializePluginSelectionV1,sriToIntegrityV1:()=>sriToIntegrityV1,stagePluginUpdateV1:()=>stagePluginUpdateV1,verifyPluginUpdateV1:()=>verifyPluginUpdateV1});function diagnostic2(code,message,pluginId,pluginVersion){return Object.freeze({code,message,...pluginId===void 0?{}:{pluginId},...pluginVersion===void 0?{}:{pluginVersion}})}function unavailable(diagnostics){return Object.freeze({status:"unavailable",manifestOverrides:Object.freeze({}),verifiedPlugins:Object.freeze([]),installedManifestPaths:Object.freeze(new Map),diagnostics:Object.freeze([...diagnostics])})}async function resolveActivePluginBindingsV1(options){let stateResult2=await options.stateStore.read({signal:options.signal});if(stateResult2.status!=="ok"&&stateResult2.status!=="missing")return unavailable([diagnostic2("state_unavailable","Active plugin state is unavailable; no installed version was selected")]);let active=stateResult2.snapshot.records.filter(record=>record.state.scope===options.scope&&record.state.scopeRef===options.scopeRef&&record.state.enabled&&record.state.lifecycle==="active").sort((left,right)=>`${left.pluginId}@${left.pluginVersion}`.localeCompare(`${right.pluginId}@${right.pluginVersion}`));if(active.length===0)return Object.freeze({status:"ready",manifestOverrides:Object.freeze({}),verifiedPlugins:Object.freeze([]),installedManifestPaths:Object.freeze(new Map),diagnostics:Object.freeze([])});if(options.registry.resolve===void 0)return unavailable([diagnostic2("registry_unavailable","Active plugin registry cannot resolve manifests; no installed version was selected")]);let seen=new Set,selectedRecords=[],diagnostics=[];for(let record of active){if(seen.has(record.pluginId)){diagnostics.push(diagnostic2("duplicate_active","Multiple active versions exist for one plugin; no installed version was selected",record.pluginId,record.pluginVersion));continue}seen.add(record.pluginId),selectedRecords.push(record)}if(diagnostics.length>0)return unavailable(diagnostics);let resolved=new Map;for(let record of selectedRecords){let packageValue;try{packageValue=await options.registry.resolve({pluginId:record.pluginId,pluginVersion:record.pluginVersion,signal:options.signal})}catch{diagnostics.push(diagnostic2("manifest_unavailable","Active plugin manifest resolution failed; no installed version was selected",record.pluginId,record.pluginVersion));continue}if(packageValue===void 0){diagnostics.push(diagnostic2("manifest_unavailable","Active plugin manifest is unavailable; no installed version was selected",record.pluginId,record.pluginVersion));continue}let computedDigest=pluginManifestDigestV1(packageValue.manifest);if(packageValue.manifest.id!==record.pluginId||packageValue.manifest.pluginVersion!==record.pluginVersion||computedDigest!==record.manifestDigest||packageValue.expectedDigest!==record.manifestDigest){diagnostics.push(diagnostic2("manifest_mismatch","Active plugin manifest identity or digest does not match state; no installed version was selected",record.pluginId,record.pluginVersion));continue}let manifestPath;if(options.resolveInstallationManifestPath!==void 0&&(manifestPath=await options.resolveInstallationManifestPath({pluginId:record.pluginId,pluginVersion:record.pluginVersion,signal:options.signal}),manifestPath===void 0)){diagnostics.push(diagnostic2("manifest_unavailable","Active plugin installation manifest path is unavailable; no installed version was selected",record.pluginId,record.pluginVersion));continue}resolved.set(record.pluginId,{record,package:packageValue,...manifestPath===void 0?{}:{manifestPath}})}if(diagnostics.length>0)return unavailable(diagnostics);let manifestOverrides={},verifiedPlugins=[],installedManifestPaths=new Map;for(let[pluginId,value]of resolved)manifestOverrides[pluginId]=value.package.manifest,verifiedPlugins.push({pluginId,version:value.record.pluginVersion}),value.manifestPath!==void 0&&installedManifestPaths.set(pluginId,value.manifestPath);return Object.freeze({status:"ready",manifestOverrides:Object.freeze(manifestOverrides),verifiedPlugins:Object.freeze(verifiedPlugins),installedManifestPaths:Object.freeze(installedManifestPaths),diagnostics:Object.freeze([])})}async function resolveActivePluginBindingsForScopesV1(options){let scopes=[options.project,options.global].filter(scope=>scope!==void 0);if(scopes.length===0)return Object.freeze({status:"ready",manifestOverrides:Object.freeze({}),verifiedPlugins:Object.freeze([]),installedManifestPaths:Object.freeze(new Map),diagnostics:Object.freeze([])});let results=await Promise.all(scopes.map(scope=>resolveActivePluginBindingsV1({stateStore:scope.stateStore,registry:options.registry,scope:scope.scope,scopeRef:scope.scopeRef,...options.resolveInstallationManifestPath===void 0?{}:{resolveInstallationManifestPath:options.resolveInstallationManifestPath},signal:options.signal}))),unavailableDiagnostics=results.flatMap(result=>result.status==="unavailable"?result.diagnostics:[]);if(unavailableDiagnostics.length>0)return unavailable(unavailableDiagnostics);let manifestOverrides={},verifiedPlugins=[],installedManifestPaths=new Map,seen=new Set;for(let result of results){for(let[pluginId,manifest]of Object.entries(result.manifestOverrides))seen.has(pluginId)||(seen.add(pluginId),manifestOverrides[pluginId]=manifest);for(let verified of result.verifiedPlugins)verifiedPlugins.some(entry=>entry.pluginId===verified.pluginId)||verifiedPlugins.push(verified);for(let[pluginId,manifestPath]of result.installedManifestPaths)installedManifestPaths.has(pluginId)||installedManifestPaths.set(pluginId,manifestPath)}return Object.freeze({status:"ready",manifestOverrides:Object.freeze(manifestOverrides),verifiedPlugins:Object.freeze(verifiedPlugins),installedManifestPaths:Object.freeze(installedManifestPaths),diagnostics:Object.freeze([])})}import{Buffer as Buffer2}from"node:buffer";var MAX_INSTALLATION_REF_CHARS_V1=2048,MAX_PLUGIN_SCOPE_REF_CHARS_V1=2048,DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1="global:default";function opaqueInstallationRef(value){if(typeof value!="string"||value.trim()===""||value.length>MAX_INSTALLATION_REF_CHARS_V1)throw new Error("installation reference is invalid");if(/^(?:file:|[a-zA-Z]:[\\/]|[\\/]{1,2}|\\\\)/iu.test(value)||/\s/u.test(value))throw new Error("installation reference must be opaque");return value}function opaqueScopeRef(value){if(typeof value!="string"||value.trim()===""||value.length>MAX_PLUGIN_SCOPE_REF_CHARS_V1)throw new Error("plugin installation scope reference is invalid");if(/^(?:file:|[a-zA-Z]:[\\/]|[\\/]{1,2}|\\\\)/iu.test(value)||/\s/u.test(value))throw new Error("plugin installation scope reference must be opaque");return value}function installationFrom(record,installationRef,scopeIdentity,state2){return Object.freeze({version:1,pluginId:record.pluginId,pluginVersion:record.pluginVersion,manifestDigest:record.manifestDigest,scope:scopeIdentity.scope,scopeRef:scopeIdentity.scopeRef,installationRef:opaqueInstallationRef(installationRef),state:state2})}function cancelled(){return{status:"cancelled",error:{code:"cancelled",message:"Plugin installation operation was cancelled"}}}function failure(code){return{status:"failed",error:{code,message:code==="invalid_installation"?"The plugin installation handle is invalid":code==="unsupported_scope"?"The plugin installer does not support this scope":code==="install_failed"?"The host plugin installer failed":code==="activation_failed"?"The host plugin activation failed":code==="rollback_failed"?"The host plugin rollback failed":"The host plugin uninstall failed"}}}function validateInstallation(installation){if(installation.version!==1||typeof installation.pluginId!="string"||typeof installation.pluginVersion!="string"||typeof installation.manifestDigest!="string"||installation.pluginId.trim()===""||installation.pluginVersion.trim()===""||installation.manifestDigest.trim()==="")throw new Error("plugin installation handle is invalid");if(installation.scope!=="global"&&installation.scope!=="project")throw new Error("plugin installation scope is invalid");let scopeRef=installation.scopeRef===void 0?installation.scope==="global"?DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1:(()=>{throw new Error("project installation scope reference is required")})():opaqueScopeRef(installation.scopeRef);if(installation.scope==="global"&&scopeRef!==DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1)throw new Error("plugin global installation scope reference is invalid");opaqueInstallationRef(installation.installationRef)}function ensureIdentity(installation,record,scopeIdentity){if(validateInstallation(installation),installation.pluginId!==record.pluginId||installation.pluginVersion!==record.pluginVersion||installation.manifestDigest!==record.manifestDigest||installation.scope!==scopeIdentity.scope||(installation.scopeRef??DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1)!==scopeIdentity.scopeRef)throw new Error("plugin installation identity mismatch")}function normalizeScope(scope){if(scope===void 0)return"global";if(scope==="global"||scope==="project")return scope;throw new Error("plugin installation scope is invalid")}function normalizeScopeIdentity(scope,scopeRef){let normalizedScope=normalizeScope(scope);if(scopeRef===void 0){if(normalizedScope!=="global")throw new Error("project installation scope reference is required");return Object.freeze({scope:normalizedScope,scopeRef:DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1})}let normalizedScopeRef=opaqueScopeRef(scopeRef);if(normalizedScope==="global"&&normalizedScopeRef!==DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1)throw new Error("plugin global installation scope reference is invalid");return Object.freeze({scope:normalizedScope,scopeRef:normalizedScopeRef})}function declaredScopes(host){return host.supportedScopes===void 0?Object.freeze(["global"]):!Array.isArray(host.supportedScopes)||new Set(host.supportedScopes).size!==host.supportedScopes.length||host.supportedScopes.some(scope=>scope!=="global"&&scope!=="project")?Object.freeze([]):Object.freeze([...host.supportedScopes])}function hostAcceptedScope(installation,scopeIdentity){if(!(scopeIdentity.scope==="global"&&installation.scope===void 0&&installation.scopeRef===void 0)&&(installation.scope!==scopeIdentity.scope||installation.scopeRef!==scopeIdentity.scopeRef))throw new Error("plugin installation scope mismatch")}function ensureArtifactIdentity(artifact,record){if(artifact.version!==1||artifact.pluginId!==record.pluginId||artifact.pluginVersion!==record.pluginVersion||artifact.manifestDigest!==record.manifestDigest||typeof artifact.artifactRef!="string"||artifact.artifactRef.trim()==="")throw new Error("plugin distribution artifact identity mismatch");opaqueInstallationRef(artifact.artifactRef)}function isInvalidInstallationError(value){return value instanceof Error&&(value.message==="plugin installation handle is invalid"||value.message==="plugin installation scope is invalid"||value.message==="plugin installation scope reference is invalid"||value.message==="plugin installation scope reference must be opaque"||value.message==="plugin global installation scope reference is invalid"||value.message==="project installation scope reference is required"||value.message==="plugin installation identity mismatch"||value.message==="plugin installation scope mismatch"||value.message==="plugin distribution artifact identity mismatch")}function createPluginInstallerV1(options){let supportedScopes=declaredScopes(options.host),supportsScope=scope=>supportedScopes.includes(scope);return{supportedScopes,prepare(input){let staged=stagePluginUpdateV1({manifest:input.manifest,source:input.source});return verifyPluginUpdateV1({record:staged,host:input.host,expectedDigest:input.expectedDigest,verifier:options.verifier})},async install(input){if(input.signal?.aborted)return cancelled();let scopeIdentity;try{scopeIdentity=normalizeScopeIdentity(input.scope,input.scopeRef)}catch{return failure("invalid_installation")}if(!supportsScope(scopeIdentity.scope))return failure("unsupported_scope");if(input.record.state!=="verified")return failure("invalid_installation");try{input.artifact!==void 0&&ensureArtifactIdentity(input.artifact,input.record);let installed=await options.host.install({record:input.record,scope:scopeIdentity.scope,scopeRef:scopeIdentity.scopeRef,...input.artifact===void 0?{}:{artifact:input.artifact},signal:input.signal});return hostAcceptedScope(installed,scopeIdentity),{status:"succeeded",installation:installationFrom(input.record,installed.installationRef,scopeIdentity,"installed")}}catch(error2){return isInvalidInstallationError(error2)?failure("invalid_installation"):input.signal?.aborted?cancelled():failure("install_failed")}},async activate(input){if(input.signal?.aborted)return cancelled();let scopeIdentity;try{return scopeIdentity=normalizeScopeIdentity(input.scope,input.scopeRef),supportsScope(scopeIdentity.scope)?(ensureIdentity(input.installation,input.record,scopeIdentity),input.installation.state!=="installed"||input.record.state!=="verified"?failure("invalid_installation"):(await options.host.activate({installation:input.installation,record:input.record,scope:scopeIdentity.scope,scopeRef:scopeIdentity.scopeRef,signal:input.signal}),{status:"succeeded",installation:Object.freeze({...input.installation,state:"active"})})):failure("unsupported_scope")}catch(error2){return isInvalidInstallationError(error2)?failure("invalid_installation"):input.signal?.aborted?cancelled():failure("activation_failed")}},async rollback(input){if(input.signal?.aborted)return cancelled();let scopeIdentity;try{return scopeIdentity=normalizeScopeIdentity(input.scope,input.scopeRef),supportsScope(scopeIdentity.scope)?(validateInstallation(input.failed),validateInstallation(input.previous),input.failed.state!=="installed"&&input.failed.state!=="active"||input.previous.state!=="active"||input.failed.pluginId!==input.previous.pluginId||input.failed.scope!==scopeIdentity.scope||input.previous.scope!==scopeIdentity.scope||(input.failed.scopeRef??DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1)!==scopeIdentity.scopeRef||(input.previous.scopeRef??DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1)!==scopeIdentity.scopeRef?failure("invalid_installation"):(await options.host.rollback({failed:input.failed,previous:input.previous,scope:scopeIdentity.scope,scopeRef:scopeIdentity.scopeRef,signal:input.signal}),{status:"succeeded",installation:Object.freeze({...input.previous,state:"active"})})):failure("unsupported_scope")}catch(error2){return isInvalidInstallationError(error2)?failure("invalid_installation"):input.signal?.aborted?cancelled():failure("rollback_failed")}},async remove(input){if(input.signal?.aborted)return cancelled();let scopeIdentity;try{if(scopeIdentity=normalizeScopeIdentity(input.scope,input.scopeRef),!supportsScope(scopeIdentity.scope))return failure("unsupported_scope");validateInstallation(input.installation)}catch{return failure("invalid_installation")}if(input.installation.state!=="installed"&&input.installation.state!=="active"&&input.installation.state!=="retained"||input.installation.scope!==scopeIdentity.scope||(input.installation.scopeRef??DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1)!==scopeIdentity.scopeRef)return failure("invalid_installation");if(options.host.uninstall===void 0)return failure("uninstall_failed");try{return await options.host.uninstall({installation:input.installation,scope:scopeIdentity.scope,scopeRef:scopeIdentity.scopeRef,signal:input.signal}),{status:"succeeded",installation:Object.freeze({...input.installation,state:"retained"})}}catch{return input.signal?.aborted?cancelled():failure("uninstall_failed")}}}}var MAX_PLUGIN_ACQUISITION_REF_CHARS_V1=2048,MAX_PLUGIN_ACQUISITION_NPM_NAME_CHARS_V1=214,ACQUISITION_ERROR_MESSAGES_V1={invalid_ref:"Plugin ref is invalid",unsupported_local_ref:"Local plugin ref exists but is neither a directory nor a .zip/.tgz file",unsupported_scheme:"Plugin ref URL scheme is not supported",invalid_digest_fragment:"Plugin ref #sha256 digest fragment is invalid",invalid_npm_ref:"Plugin npm package ref is invalid",cancelled:"Plugin package acquisition was cancelled",download_failed:"Plugin package download failed",package_not_found:"Plugin npm package was not found on the registry",version_not_found:"No npm package version matches the requested range",digest_mismatch:"Plugin package bytes do not match the expected digest",unsupported_media_type:"Plugin package bytes are neither a zip nor a tgz",package_invalid:"Plugin package contents are invalid",budget_exceeded:"Plugin package exceeds the configured size budget",release_not_found:"Plugin release was not found",release_asset_not_found:"Plugin release has no .zip/.tgz asset",release_asset_ambiguous:"Plugin release has multiple .zip/.tgz assets",rate_limited:"Plugin release API rate limit was exceeded"},PluginAcquisitionErrorV1=class extends Error{code;constructor(code,detail){super(detail===void 0||detail.length===0?ACQUISITION_ERROR_MESSAGES_V1[code]:`${ACQUISITION_ERROR_MESSAGES_V1[code]}: ${detail}`),this.name="PluginAcquisitionErrorV1",this.code=code}},DIGEST_FRAGMENT_SUFFIX_V1=/^#sha256:([0-9a-fA-F]{64})$/u;function boundedRef(ref){if(typeof ref!="string"||ref.length===0||ref.length>2048||/[\u0000-\u001f\s]/u.test(ref))throw new PluginAcquisitionErrorV1("invalid_ref");return ref}function splitDigestFragment(ref){let hash=ref.lastIndexOf("#");if(hash<0)return{value:ref};let fragment=ref.slice(hash),match2=DIGEST_FRAGMENT_SUFFIX_V1.exec(fragment);if(match2===null)throw new PluginAcquisitionErrorV1("invalid_digest_fragment");return{value:ref.slice(0,hash),digestHex:match2[1].toLowerCase()}}function ownerRepoTag(kind,value,digestHex){let match2=/^([A-Za-z0-9][A-Za-z0-9._-]{0,99})\/([A-Za-z0-9][A-Za-z0-9._-]{0,99})(?:@([A-Za-z0-9][A-Za-z0-9._+-]{0,127}))?$/u.exec(value);if(match2===null)throw new PluginAcquisitionErrorV1("invalid_ref");return{kind,owner:match2[1],repo:match2[2],...match2[3]===void 0?{}:{tag:match2[3]},...digestHex===void 0?{}:{expectedDigestHex:digestHex}}}function parseUrlRef(value,digestHex){let parsed;try{parsed=new URL(value)}catch{throw new PluginAcquisitionErrorV1("invalid_ref")}if(parsed.username!==""||parsed.password!=="")throw new PluginAcquisitionErrorV1("invalid_ref");if(parsed.hash!=="")throw new PluginAcquisitionErrorV1("invalid_digest_fragment");return{kind:"url",url:parsed.toString(),...digestHex===void 0?{}:{expectedDigestHex:digestHex}}}var NPM_RANGE_V1=/^(?:latest|[~^]?\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?)$/u,NPM_NAME_V1=/^@?[a-z0-9][a-z0-9-._]*(?:\/[a-z0-9][a-z0-9-._]*)?$/u;function parseNpmRef(ref){let at=ref.lastIndexOf("@"),name=at>0?ref.slice(0,at):ref,range2=at>0?ref.slice(at+1):void 0;if(name.length===0||name.length>214||!NPM_NAME_V1.test(name)||name.startsWith("@")&&!name.includes("/")||!name.startsWith("@")&&name.includes("/"))throw new PluginAcquisitionErrorV1("invalid_npm_ref");if(range2!==void 0&&!NPM_RANGE_V1.test(range2))throw new PluginAcquisitionErrorV1("invalid_npm_ref");return{kind:"npm",name,...range2===void 0?{}:{range:range2}}}function isLocalPackageFile(path15){let value=path15.toLowerCase();return value.endsWith(".zip")||value.endsWith(".tgz")||value.endsWith(".tar.gz")}function parsePluginAcquisitionRefV1(ref,probe){let value=boundedRef(ref);if(/^[a-zA-Z]:[\\/]/u.test(value))return localRef(value,probe);let scheme=/^([a-zA-Z][a-zA-Z\d+.-]*):/u.exec(value);if(scheme!==null){let prefix=scheme[1].toLowerCase(),stripped=splitDigestFragment(value);if(prefix==="github"||prefix==="gitee")return ownerRepoTag(prefix,stripped.value.slice(prefix.length+1),stripped.digestHex);if(prefix==="http"||prefix==="https")return parseUrlRef(stripped.value,stripped.digestHex);throw new PluginAcquisitionErrorV1("unsupported_scheme")}return localRef(value,probe)}function localRef(value,probe){let stat5=probe.statLocalRef(value);if(stat5==="directory")return{kind:"local-path",path:value};if(stat5==="file"){if(!isLocalPackageFile(value))throw new PluginAcquisitionErrorV1("unsupported_local_ref");return{kind:"local-file",path:value}}if(stat5==="other")throw new PluginAcquisitionErrorV1("unsupported_local_ref");return parseNpmRef(value)}function isPluginAcquisitionRefTargetV1(target){if(typeof target!="string"||target.length===0)return!1;if(target.startsWith("@")||/^[a-zA-Z]:[\\/]/u.test(target)||target.startsWith("/")||target.startsWith("\\")||target.startsWith("./")||target.startsWith(".\\")||target.startsWith("../")||target.startsWith("..\\")||/[:#]/u.test(target)||/[\\/]/u.test(target))return!0;let at=target.lastIndexOf("@");if(at>0){let suffix=target.slice(at+1);if(suffix==="latest"||suffix.startsWith("^")||suffix.startsWith("~"))return!0}return!1}var PLUGIN_SELECTION_VERSION_V1=1,MAX_PLUGIN_SELECTION_ID_CHARS_V1=128,MAX_PLUGIN_SELECTION_IDS_V1=128,PluginSelectionErrorV1=class extends Error{code;pluginId;constructor(code,message,pluginId){super(message),this.name="PluginSelectionErrorV1",this.code=code,this.pluginId=pluginId}};function validateId(value,label){if(typeof value!="string"||value.trim().length===0)throw new PluginSelectionErrorV1(label==="profileId"?"invalid_profile_id":"invalid_plugin_id",`${label} must be a non-empty string`,typeof value=="string"?value:void 0);if(value.length>MAX_PLUGIN_SELECTION_ID_CHARS_V1)throw new PluginSelectionErrorV1(label==="profileId"?"profile_id_too_long":"plugin_id_too_long",`${label} must be at most ${MAX_PLUGIN_SELECTION_ID_CHARS_V1} characters`,value);return value}function normalizeIds(ids,label){if(ids===void 0)return[];if(!Array.isArray(ids)||ids.length>MAX_PLUGIN_SELECTION_IDS_V1)throw new PluginSelectionErrorV1("too_many_plugin_ids",`${label} must contain at most ${MAX_PLUGIN_SELECTION_IDS_V1} plugin IDs`);let seen=new Set,normalized=[];for(let candidate of ids){let id=validateId(candidate,"pluginId");if(seen.has(id))throw new PluginSelectionErrorV1("duplicate_plugin_id",`${label} contains duplicate plugin ID: ${id}`,id);seen.add(id),normalized.push(id)}return normalized.sort((left,right)=>left.localeCompare(right)),Object.freeze(normalized)}function assertKnownIds(ids,knownIds){for(let id of ids)if(!knownIds.has(id))throw new PluginSelectionErrorV1("unknown_plugin_id",`Selection references unknown plugin ID: ${id}`,id)}function createPluginSelectionV1(input){let profileId=validateId(input.profileId,"profileId"),selectedPluginIds=normalizeIds(input.selectedPluginIds,"selectedPluginIds"),disabledPluginIds=normalizeIds(input.disabledPluginIds,"disabledPluginIds");return Object.freeze({version:PLUGIN_SELECTION_VERSION_V1,profileId,selectedPluginIds,disabledPluginIds})}function resolvePluginSelectionV1(input){for(let manifest of input.manifests)validateId(manifest.id,"pluginId");let knownIds=new Set(input.manifests.map(manifest=>manifest.id)),provisional=createPluginSelectionV1(input.selection);if(input.selection.selectedPluginIds===void 0&&knownIds.size>MAX_PLUGIN_SELECTION_IDS_V1)throw new PluginSelectionErrorV1("too_many_plugin_ids",`discovered plugin IDs exceed the selection limit of ${MAX_PLUGIN_SELECTION_IDS_V1}`);let selectedPluginIds=input.selection.selectedPluginIds===void 0?Object.freeze([...knownIds].sort((a,b2)=>a.localeCompare(b2))):provisional.selectedPluginIds,selection=Object.freeze({...provisional,selectedPluginIds});assertKnownIds(selection.selectedPluginIds,knownIds),assertKnownIds(selection.disabledPluginIds,knownIds);let catalog=buildPluginCatalogV1({manifests:input.manifests,host:input.host,required:input.required,disabledPluginIds:selection.disabledPluginIds,availableCapabilities:input.availableCapabilities,maxEntries:input.maxEntries}),selected=new Set(selection.selectedPluginIds),selectedCatalog=buildPluginCatalogV1({manifests:input.manifests.filter(manifest=>selected.has(manifest.id)),host:input.host,required:input.required,disabledPluginIds:selection.disabledPluginIds,availableCapabilities:input.availableCapabilities,maxEntries:Math.max(input.maxEntries??MAX_PLUGIN_SELECTION_IDS_V1,selection.selectedPluginIds.length)});if(selectedCatalog.truncated){let selectedEntryIds=new Set(selectedCatalog.entries.map(entry=>entry.pluginId)),omitted=selection.selectedPluginIds.find(id=>!selectedEntryIds.has(id));if(omitted!==void 0)throw new PluginSelectionErrorV1("catalog_truncated",`Catalog truncation omitted selected plugin ID: ${omitted}`,omitted)}let entries=Object.freeze(selectedCatalog.entries),diagnostics=Object.freeze(entries.flatMap(entry=>entry.resolution.diagnostics));return Object.freeze({selection,catalog,entries,diagnostics})}function serializePluginSelectionV1(selection){let normalized=createPluginSelectionV1(selection);return JSON.stringify(normalized)}var PLUGIN_ECOSYSTEM_CLI_VERSION_V1=1,MAX_PLUGIN_ECOSYSTEM_CLI_OUTPUT_BYTES_V1=64*1024,MAX_PLUGIN_ECOSYSTEM_CLI_LIST_ENTRIES_V1=128,MAX_PLUGIN_ECOSYSTEM_CLI_ARGS_V1=MAX_PLUGIN_SELECTION_IDS_V1+8,PLUGIN_ECOSYSTEM_CLI_COMMAND_USAGE_V1="catalog list | catalog-list | state list | state-list | selection list | selection-list | selection set <profile> <pluginId\u2026> | selection-set <profile> <pluginId\u2026> | selection clear <profile> | selection-clear <profile> | enable <pluginId[@version]> | disable <pluginId[@version]> | remove <pluginId[@version]> | state enable|disable|remove <pluginId[@version]> | install <pluginId[@version] | ref> | update <pluginId[@version]> [--scope global|project] [--json | --text | --format json|text]";function invalidInput(message){throw new Error(message)}var COMMAND_NAME_ALIASES_V1=Object.freeze({"catalog-list":["catalog","list"],"state-list":["state","list"],"selection-list":["selection","list"],"selection-set":["selection","set"],"selection-clear":["selection","clear"]});function validateToken(value,label){return(value.length===0||value.length>256||/[\u0000-\u001f\s]/u.test(value))&&invalidInput(`${label} is invalid`),value}function parseIdentity(value){let token=validateToken(value,"plugin identity"),at=token.lastIndexOf("@");if(at<=0)return{pluginId:token};let pluginId=token.slice(0,at),pluginVersion=token.slice(at+1);return pluginVersion.length===0&&invalidInput("plugin version is invalid"),{pluginId:validateToken(pluginId,"plugin ID"),pluginVersion:validateToken(pluginVersion,"plugin version")}}function parsePluginEcosystemCliCommandV1(argv,defaultFormat="text"){(!Array.isArray(argv)||argv.length===0||argv.length>MAX_PLUGIN_ECOSYSTEM_CLI_ARGS_V1)&&invalidInput("ecosystem command is invalid");let format=defaultFormat;format!=="json"&&format!=="text"&&invalidInput("output format is invalid");let args=[...argv],explicitFormat,scope,pluginIdsOption;for(let index3=args.length-1;index3>=0;index3-=1){let token=args[index3],selectedScope=(token.startsWith("--scope=")?token.slice(8):void 0)??(token==="--scope"?args[index3+1]:void 0);if(selectedScope!==void 0){selectedScope!=="global"&&selectedScope!=="project"&&invalidInput("state scope is invalid"),scope!==void 0&&scope!==selectedScope&&invalidInput("state scope is specified more than once"),scope=selectedScope,args.splice(index3,token==="--scope"?2:1);continue}let inlineFormat=token.startsWith("--format=")?token.slice(9):void 0,selected=token==="--json"||token==="--text"?token==="--json"?"json":"text":inlineFormat??(token==="--format"?args[index3+1]:void 0);if(selected!==void 0){selected!=="json"&&selected!=="text"&&invalidInput("output format is invalid"),explicitFormat!==void 0&&explicitFormat!==selected&&invalidInput("output format is specified more than once"),explicitFormat=selected,format=explicitFormat,args.splice(index3,token==="--format"?2:1);continue}let selectedPlugins=(token.startsWith("--plugins=")?token.slice(10):void 0)??(token==="--plugins"?args[index3+1]:void 0);if(selectedPlugins!==void 0){pluginIdsOption!==void 0&&invalidInput("plugin IDs are specified more than once");let ids=selectedPlugins.split(",");ids.length>MAX_PLUGIN_SELECTION_IDS_V1&&invalidInput("too many plugin IDs"),pluginIdsOption=Object.freeze(ids.map(id=>validateToken(id,"plugin ID"))),args.splice(index3,token==="--plugins"?2:1)}}args.length===0&&invalidInput("ecosystem command is invalid");let commandAlias=COMMAND_NAME_ALIASES_V1[args[0]];commandAlias!==void 0&&(args=[...commandAlias,...args.slice(1)]);let[group,action,target,...rest]=args;if(group==="selection"&&action==="set"&&target!==void 0){pluginIdsOption!==void 0&&rest.length>0&&invalidInput("plugin IDs must use one input form");let selectedPluginIds=pluginIdsOption??Object.freeze(rest.map(id=>validateToken(id,"plugin ID")));return selectedPluginIds.length>MAX_PLUGIN_SELECTION_IDS_V1&&invalidInput("too many plugin IDs"),Object.freeze({version:1,command:"selection-set",format,profileId:validateToken(target,"profile ID"),selectedPluginIds,...scope===void 0?{}:{scope}})}if(rest.length>0&&invalidInput("ecosystem command has unsupported arguments"),group==="catalog"&&action==="list"&&target===void 0)return Object.freeze({version:1,command:"catalog-list",format,...scope===void 0?{}:{scope}});if(group==="state"&&action==="list"&&target===void 0)return Object.freeze({version:1,command:"state-list",format,...scope===void 0?{}:{scope}});if(group==="selection"&&action==="list"&&target===void 0)return Object.freeze({version:1,command:"selection-list",format,...scope===void 0?{}:{scope}});if(group==="selection"&&action==="clear"&&target!==void 0)return Object.freeze({version:1,command:"selection-clear",format,profileId:validateToken(target,"profile ID"),...scope===void 0?{}:{scope}});if(group==="state"&&(action==="enable"||action==="disable"||action==="remove")&&target){let identity=parseIdentity(target);return Object.freeze({version:1,command:action,format,...scope===void 0?{}:{scope},...identity})}if((group==="enable"||group==="disable"||group==="remove")&&action){let identity=parseIdentity(action);return Object.freeze({version:1,command:group,format,...scope===void 0?{}:{scope},...identity})}if((group==="install"||group==="update")&&action){let identity=parseIdentity(action);return Object.freeze({version:1,command:group,format,target:action,...scope===void 0?{}:{scope},...identity})}invalidInput("ecosystem command is invalid")}function response(command,format,status2,error2,data){let safeData=data===void 0?void 0:boundData(data);if(safeData!==void 0&&Array.isArray(safeData.entries)){let entries=[...safeData.entries],originalEntryCount=entries.length;for(;entries.length>0;){let candidate={...safeData,entries,...entries.length<safeData.entries.length?{truncated:!0}:{}};if(responseWithinBudget(command,format,status2,error2,candidate)){safeData=Object.freeze(candidate);break}entries=entries.slice(0,-1)}entries.length===0&&originalEntryCount>0&&(safeData=Object.freeze({entries:Object.freeze([]),truncated:!0}))}responseWithinBudget(command,format,status2,error2,safeData)||(safeData=Object.freeze({truncated:!0}));let base=responseBase(command,format,status2,error2,safeData),humanText=error2?`${status2}: ${error2.message}`:formatText(command,status2,safeData),text=format==="json"?JSON.stringify(base):humanText;return Object.freeze({...base,text:boundText(text)})}function responseWithinBudget(command,format,status2,error2,data){let base=responseBase(command,format,status2,error2,data),humanText=error2?`${status2}: ${error2.message}`:formatText(command,status2,data),text=format==="json"?JSON.stringify(base):humanText;return responseByteLength({...base,text:boundText(text)})<=MAX_PLUGIN_ECOSYSTEM_CLI_OUTPUT_BYTES_V1}function responseBase(command,format,status2,error2,data){return{version:PLUGIN_ECOSYSTEM_CLI_VERSION_V1,command,format,status:status2,...data===void 0?{}:{data},...error2===void 0?{}:{error:error2}}}function responseByteLength(value){return Buffer2.byteLength(JSON.stringify(value),"utf8")}function boundText(value){if(Buffer2.byteLength(value,"utf8")<=MAX_PLUGIN_ECOSYSTEM_CLI_OUTPUT_BYTES_V1)return value;let suffix=`
|
|
503
|
+
`,1)[0]??""}catch{return}finally{handle!==void 0&&closeSync(handle)}}function readAgentSessionHead(agentDir,sessionId){if(!isAgentSessionId(sessionId))return;let filePath=findSessionFile(agentSessionsDir(agentDir),sessionId);if(filePath===void 0)return;let bytes,firstLine;try{bytes=statSync2(filePath).size,firstLine=readFirstLine(filePath)}catch{return}if(firstLine===void 0)return;let header=parseHeader(firstLine);if(header===void 0)return;let parentAgentSession=typeof header.parentAgentSession=="string"?header.parentAgentSession:void 0,agentRole=typeof header.agentRole=="string"?header.agentRole:void 0,createdAt=typeof header.timestamp=="string"?header.timestamp:void 0;return{sessionId,...parentAgentSession===void 0?{}:{parentAgentSession},...agentRole===void 0?{}:{agentRole},...createdAt===void 0?{}:{createdAt},bytes}}function readAgentSessionLineage(agentDir,sessionId,maxDepth){let self=readAgentSessionHead(agentDir,sessionId);if(self===void 0)return{self:void 0,ancestors:[],truncated:!1};let ancestors=[],current=self;for(let step=0;step<maxDepth;step+=1){let parent=current.parentAgentSession;if(parent===void 0||parent===current.sessionId)return{self,ancestors,truncated:!1};let head=readAgentSessionHead(agentDir,parent);if(head===void 0)return{self,ancestors,truncated:!1};ancestors.push(head),current=head}return{self,ancestors,truncated:!0}}var subagent_exports={};__export(subagent_exports,{SUBAGENT_MAILBOX_MAX_ESCALATIONS:()=>SUBAGENT_MAILBOX_MAX_ESCALATIONS,SUBAGENT_MAILBOX_MAX_INBOX:()=>SUBAGENT_MAILBOX_MAX_INBOX,SUBAGENT_MAILBOX_MAX_MESSAGE_BYTES:()=>SUBAGENT_MAILBOX_MAX_MESSAGE_BYTES,SUBAGENT_TASK_PROTOCOL_VERSION:()=>SUBAGENT_TASK_PROTOCOL_VERSION,SubagentMailboxErrorV1:()=>SubagentMailboxErrorV1,SubagentTaskProtocolError:()=>SubagentTaskProtocolError,boundServerMessagesV1:()=>boundServerMessagesV1,createSubagentMailbox:()=>createSubagentMailbox,createSubagentTaskChannelPairV1:()=>createSubagentTaskChannelPairV1,createSubagentTaskEnvelopeDecoderV1:()=>createSubagentTaskEnvelopeDecoderV1,createSubagentTaskServer:()=>createSubagentTaskServer,createSubagentTaskStdioChannelV1:()=>createSubagentTaskStdioChannelV1,createTurnProgressSourceV1:()=>createTurnProgressSourceV1,decodeEnvelopeV1:()=>decodeEnvelopeV1,encodeEnvelopeV1:()=>encodeEnvelopeV1,subagentMailboxExists:()=>subagentMailboxExists,subscribeTaskProgressV1:()=>subscribeTaskProgressV1});import{randomUUID}from"node:crypto";import{mkdirSync as mkdirSync2,readdirSync as readdirSync2,readFileSync as readFileSync3,renameSync,rmSync,statSync as statSync3,writeFileSync as writeFileSync2}from"node:fs";import{join as join9}from"node:path";var SUBAGENT_MAILBOX_MAX_MESSAGE_BYTES=2048,SUBAGENT_MAILBOX_MAX_ESCALATIONS=8,SUBAGENT_MAILBOX_MAX_INBOX=32,SubagentMailboxErrorV1=class extends Error{code;constructor(code,message){super(message),this.name="SubagentMailboxErrorV1",this.code=code}};function utf8ByteLength(text){return new TextEncoder().encode(text).length}function mailboxRoot(agentDir,ownerParentSessionId){if(!isAgentSessionId(ownerParentSessionId))throw new SubagentMailboxErrorV1("subagent_unknown_session","mailbox owner id is not a session id");return join9(agentDir,"mailboxes",ownerParentSessionId)}function escalationsDir(root){return join9(root,"escalations")}function inboxDir(root,sessionId){if(!isAgentSessionId(sessionId))throw new SubagentMailboxErrorV1("subagent_unknown_session","mailbox target id is not a session id");return join9(root,"inboxes",sessionId)}function postMessage(dir,namePrefix,payload2){mkdirSync2(dir,{recursive:!0});let name=`${namePrefix}${Date.now().toString(36)}-${randomUUID().slice(0,8)}.json`;writeFileSync2(join9(dir,`.${name}.tmp`),JSON.stringify(payload2),"utf8"),renameSync(join9(dir,`.${name}.tmp`),join9(dir,name))}function listMessageFiles(dir){let names2;try{names2=readdirSync2(dir)}catch{return[]}let messages=[];for(let name of names2.sort()){if(name.endsWith(".tmp")){try{rmSync(join9(dir,name))}catch{}continue}name.endsWith(".json")&&messages.push(name)}return messages}function takeMessage(dir,name){let text;try{text=readFileSync3(join9(dir,name),"utf8")}catch{return}try{rmSync(join9(dir,name))}catch{}try{return JSON.parse(text)}catch{return}}function createSubagentMailbox(options){let rootFor=()=>{let owner=options.ownerParentSessionId();if(owner===void 0)throw new SubagentMailboxErrorV1("subagent_unknown_session","mailbox owner session is not bound yet");return mailboxRoot(options.agentDir,owner)},assertBounded=(text,pendingCount,maxCount,quotaCode)=>{if(utf8ByteLength(text)>SUBAGENT_MAILBOX_MAX_MESSAGE_BYTES)throw new SubagentMailboxErrorV1("subagent_message_too_large",`message exceeds ${SUBAGENT_MAILBOX_MAX_MESSAGE_BYTES} utf-8 bytes`);if(pendingCount>=maxCount)throw new SubagentMailboxErrorV1(quotaCode,`mailbox has ${maxCount} pending messages already`)};return{postEscalate(fromSessionId,text){if(!isAgentSessionId(fromSessionId))throw new SubagentMailboxErrorV1("subagent_unknown_session","sender id is not a session id");let dir=escalationsDir(rootFor()),prefix=`${fromSessionId}__`,pending=listMessageFiles(dir).filter(name=>name.startsWith(prefix)).length;assertBounded(text,pending,SUBAGENT_MAILBOX_MAX_ESCALATIONS,"subagent_escalate_quota"),postMessage(dir,prefix,{from:fromSessionId,text})},drainEscalations(sessionId){let dir=escalationsDir(rootFor()),prefix=`${sessionId}__`,drained=[];for(let name of listMessageFiles(dir)){if(!name.startsWith(prefix))continue;let message=takeMessage(dir,name);message!==void 0&&typeof message.text=="string"&&drained.push(message.text)}return drained},postSibling(fromSessionId,toSessionId,text){let root=rootFor(),owner=options.ownerParentSessionId(),fromHead=readAgentSessionHead(options.agentDir,fromSessionId);if(owner===void 0||fromHead===void 0||fromHead.parentAgentSession!==owner)throw new SubagentMailboxErrorV1("subagent_unknown_session","sender is not a known child of this session");let toHead=readAgentSessionHead(options.agentDir,toSessionId);if(toHead===void 0||toHead.parentAgentSession!==owner)throw new SubagentMailboxErrorV1("subagent_unknown_session","recipient is not a known sibling under this session");let dir=inboxDir(root,toSessionId);assertBounded(text,listMessageFiles(dir).length,SUBAGENT_MAILBOX_MAX_INBOX,"subagent_inbox_quota"),postMessage(dir,`${fromSessionId}__`,{from:fromSessionId,text})},drainInbox(sessionId,limit){let dir=inboxDir(rootFor(),sessionId),drained=[];for(let name of listMessageFiles(dir)){if(drained.length>=Math.max(0,limit))break;let message=takeMessage(dir,name);message!==void 0&&(typeof message.from!="string"||typeof message.text!="string"||drained.push({from:message.from,text:message.text}))}return drained}}}function subagentMailboxExists(agentDir,ownerParentSessionId){try{return statSync3(mailboxRoot(agentDir,ownerParentSessionId)),!0}catch{return!1}}function subscribeTaskProgressV1(adapter,taskId,listener){return adapter.onTaskProgress?.(taskId,listener)??(()=>{})}var MAX_TOOL_NAMES=3;function createTurnProgressSourceV1(session){return handler=>{let turn=0,tools=new Set;return session.subscribe(event=>{if(typeof event!="object"||event===null)return;let typed=event;if(typed.type==="turn_start"){turn+=1,tools.clear();return}if(typed.type==="tool_execution_start"&&typeof typed.toolName=="string"){tools.size<MAX_TOOL_NAMES&&tools.add(typed.toolName);return}if(typed.type!=="turn_end")return;let names2=[...tools];handler(`turn ${Math.max(turn,1)} done${names2.length===0?"":` (${names2.join(", ")})`}`)})}}var CborError=class extends Error{constructor(message){super(message),this.name="CborError"}},textEncoder=new TextEncoder,textDecoder=new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0});function resolveLimit(name,value,maximum){if(!Number.isSafeInteger(value)||value<0||value>maximum)throw new RangeError(`${name} must be an integer between 0 and ${maximum}`);return value}function resolveOptions(options){return{maxByteLength:resolveLimit("maxByteLength",options?.maxByteLength??16777216,4294967295),maxContainerLength:resolveLimit("maxContainerLength",options?.maxContainerLength??1e6,4294967295),maxDepth:resolveLimit("maxDepth",options?.maxDepth??64,512)}}var CborReader=class{bytes;offset=0;options;constructor(bytes,options){this.bytes=bytes,this.options=options}decode(){let value=this.readItem(0);if(this.offset!==this.bytes.byteLength)throw new CborError("CBOR payload contains trailing data");return value}readItem(depth){if(depth>this.options.maxDepth)throw new CborError(`CBOR nesting depth exceeds configured limit of ${this.options.maxDepth}`);let initial=this.readByte(),majorType=initial>>>5,additionalInformation=initial&31;switch(majorType){case 0:return this.readArgument(additionalInformation);case 1:{let value=-1-this.readArgument(additionalInformation);if(!Number.isSafeInteger(value))throw new CborError("Decoded CBOR integer is outside the safe range");return value}case 2:{let length=this.readLength(additionalInformation,"byte string",this.options.maxByteLength);return new Uint8Array(this.readBytes(length))}case 3:{let length=this.readLength(additionalInformation,"text string",this.options.maxByteLength),bytes=this.readBytes(length);try{return textDecoder.decode(bytes)}catch{throw new CborError("CBOR text string contains invalid UTF-8")}}case 4:{let length=this.readLength(additionalInformation,"array",this.options.maxContainerLength),result=[];for(let index3=0;index3<length;index3++)result.push(this.readItem(depth+1));return result}case 5:{let length=this.readLength(additionalInformation,"map",this.options.maxContainerLength),result={},keys=new Set;for(let index3=0;index3<length;index3++){let key=this.readItem(depth+1);if(typeof key!="string")throw new CborError("CBOR map keys must be strings");if(keys.has(key))throw new CborError("CBOR map contains a duplicate key");keys.add(key),Object.defineProperty(result,key,{configurable:!0,enumerable:!0,value:this.readItem(depth+1),writable:!0})}return result}case 6:throw new CborError("CBOR tags are not supported");case 7:return this.readSimple(additionalInformation);default:throw new CborError("Malformed CBOR major type")}}readSimple(additionalInformation){switch(additionalInformation){case 20:return!1;case 21:return!0;case 22:return null;case 27:{let bytes=this.readBytes(8),value=new DataView(bytes.buffer,bytes.byteOffset,bytes.byteLength).getFloat64(0,!1);if(!Number.isFinite(value))throw new CborError("Decoded CBOR number must be finite");if(Number.isInteger(value)&&!Number.isSafeInteger(value))throw new CborError("Decoded CBOR integer is outside the safe range");return value}case 31:throw new CborError("CBOR break marker is not supported");default:throw new CborError("Unsupported CBOR simple value or floating-point width")}}readLength(additionalInformation,kind,limit){if(additionalInformation===31)throw new CborError(`Indefinite-length CBOR ${kind}s are not supported`);let length=this.readArgument(additionalInformation);if(length>limit)throw new CborError(`CBOR ${kind} length exceeds configured limit of ${limit}`);return length}readArgument(additionalInformation){if(additionalInformation<24)return additionalInformation;switch(additionalInformation){case 24:return this.readByte();case 25:{let bytes=this.readBytes(2);return bytes[0]*256+bytes[1]}case 26:{let bytes=this.readBytes(4);return bytes[0]*16777216+bytes[1]*65536+bytes[2]*256+bytes[3]}case 27:{let high=this.readArgument(26),low=this.readArgument(26);if(high>2097151)throw new CborError("Decoded CBOR integer or length is outside the safe range");return high*4294967296+low}case 31:throw new CborError("Indefinite-length CBOR items are not supported");default:throw new CborError("Malformed CBOR additional information")}}readByte(){if(this.offset>=this.bytes.byteLength)throw new CborError("Truncated CBOR payload");let value=this.bytes[this.offset];return this.offset++,value}readBytes(length){if(length>this.bytes.byteLength-this.offset)throw new CborError("Truncated CBOR payload");let value=this.bytes.subarray(this.offset,this.offset+length);return this.offset+=length,value}};function decodeCbor(bytes,options){if(!(bytes instanceof Uint8Array))throw new TypeError("CBOR input must be a Uint8Array");let resolved=resolveOptions(options);if(bytes.byteLength>resolved.maxByteLength)throw new CborError(`CBOR byte length exceeds configured limit of ${resolved.maxByteLength}`);return new CborReader(bytes,resolved).decode()}var CborWriter=class{buffer;offset=0;maxByteLength;constructor(maxByteLength){this.maxByteLength=maxByteLength,this.buffer=new Uint8Array(Math.min(256,maxByteLength))}writeByte(value){this.ensureCapacity(1),this.buffer[this.offset]=value,this.offset++}writeBytes(bytes){this.ensureCapacity(bytes.byteLength),this.buffer.set(bytes,this.offset),this.offset+=bytes.byteLength}writeUint16(value){this.ensureCapacity(2),this.buffer[this.offset]=value>>>8,this.buffer[this.offset+1]=value,this.offset+=2}writeUint32(value){this.ensureCapacity(4),this.buffer[this.offset]=value>>>24,this.buffer[this.offset+1]=value>>>16,this.buffer[this.offset+2]=value>>>8,this.buffer[this.offset+3]=value,this.offset+=4}writeUint64(value){let high=Math.floor(value/4294967296),low=value-high*4294967296;this.writeUint32(high),this.writeUint32(low)}writeFloat64(value){this.ensureCapacity(9),this.buffer[this.offset]=251,new DataView(this.buffer.buffer).setFloat64(this.offset+1,value,!1),this.offset+=9}finish(){return this.buffer.slice(0,this.offset)}ensureCapacity(additionalBytes){let required=this.offset+additionalBytes;if(required>this.maxByteLength)throw new CborError(`CBOR byte length exceeds configured limit of ${this.maxByteLength}`);if(required<=this.buffer.byteLength)return;let capacity=Math.max(1,this.buffer.byteLength);for(;capacity<required;)capacity=Math.min(this.maxByteLength,Math.max(required,capacity*2));let expanded=new Uint8Array(capacity);expanded.set(this.buffer),this.buffer=expanded}};function writeArgument(writer,majorType,value){let prefix=majorType<<5;value<24?writer.writeByte(prefix|value):value<=255?(writer.writeByte(prefix|24),writer.writeByte(value)):value<=65535?(writer.writeByte(prefix|25),writer.writeUint16(value)):value<=4294967295?(writer.writeByte(prefix|26),writer.writeUint32(value)):(writer.writeByte(prefix|27),writer.writeUint64(value))}function isPlainObject(value){if(typeof value!="object"||value===null)return!1;let prototype=Object.getPrototypeOf(value);return prototype===Object.prototype||prototype===null}function encodeText(writer,value,options){let bytes=textEncoder.encode(value);if(bytes.byteLength>options.maxByteLength)throw new CborError(`CBOR text string length exceeds configured limit of ${options.maxByteLength}`);if(textDecoder.decode(bytes)!==value)throw new CborError("CBOR text strings must contain valid Unicode scalar values");writeArgument(writer,3,bytes.byteLength),writer.writeBytes(bytes)}function encodeValue(writer,value,options,depth,ancestors){if(depth>options.maxDepth)throw new CborError(`CBOR nesting depth exceeds configured limit of ${options.maxDepth}`);if(value===null){writer.writeByte(246);return}if(typeof value=="boolean"){writer.writeByte(value?245:244);return}if(typeof value=="number"){if(!Number.isFinite(value))throw new CborError("CBOR numbers must be finite");if(Number.isInteger(value)&&!Object.is(value,-0)){if(!Number.isSafeInteger(value))throw new CborError("CBOR integers must be safe JavaScript integers");value>=0?writeArgument(writer,0,value):writeArgument(writer,1,-1-value)}else writer.writeFloat64(value);return}if(typeof value=="string"){encodeText(writer,value,options);return}if(value instanceof Uint8Array){if(value.byteLength>options.maxByteLength)throw new CborError(`CBOR byte string length exceeds configured limit of ${options.maxByteLength}`);writeArgument(writer,2,value.byteLength),writer.writeBytes(value);return}if(Array.isArray(value)){if(ancestors.has(value))throw new CborError("CBOR values must not contain cycles");if(value.length>options.maxContainerLength)throw new CborError(`CBOR array length exceeds configured limit of ${options.maxContainerLength}`);ancestors.add(value);try{writeArgument(writer,4,value.length);for(let index3=0;index3<value.length;index3++){if(!Object.hasOwn(value,index3)||value[index3]===void 0)throw new CborError("CBOR arrays must not contain holes or undefined values");encodeValue(writer,value[index3],options,depth+1,ancestors)}}finally{ancestors.delete(value)}return}if(isPlainObject(value)){if(ancestors.has(value))throw new CborError("CBOR values must not contain cycles");for(let symbol of Object.getOwnPropertySymbols(value))if(Object.prototype.propertyIsEnumerable.call(value,symbol))throw new CborError("CBOR map keys must be strings");let entries=[];for(let key of Object.keys(value)){let entryValue=value[key];entryValue!==void 0&&entries.push([key,entryValue])}if(entries.length>options.maxContainerLength)throw new CborError(`CBOR map length exceeds configured limit of ${options.maxContainerLength}`);ancestors.add(value);try{writeArgument(writer,5,entries.length);for(let[key,entryValue]of entries)encodeText(writer,key,options),encodeValue(writer,entryValue,options,depth+1,ancestors)}finally{ancestors.delete(value)}return}throw new CborError(`Unsupported CBOR value type: ${typeof value}`)}function encodeCbor(value,options){let resolved=resolveOptions(options),writer=new CborWriter(resolved.maxByteLength);return encodeValue(writer,value,resolved,0,new Set),writer.finish()}var FrameError=class extends Error{constructor(message){super(message),this.name="FrameError"}};function resolveMaxFrameLength(options){let value=options?.maxFrameLength??16777216;if(!Number.isSafeInteger(value)||value<0||value>4294967295)throw new RangeError(`maxFrameLength must be an integer between 0 and ${4294967295}`);return value}function encodeFrame(payload2){if(!(payload2 instanceof Uint8Array))throw new TypeError("Frame payload must be a Uint8Array");if(payload2.byteLength>4294967295)throw new RangeError("Frame payload exceeds the unsigned 32-bit length limit");let frame=new Uint8Array(4+payload2.byteLength),length=payload2.byteLength;return frame[0]=length>>>24,frame[1]=length>>>16,frame[2]=length>>>8,frame[3]=length,frame.set(payload2,4),frame}var FrameDecoder=class{header=new Uint8Array(4);headerLength=0;maxFrameLength;payloadBlocks=[];currentPayloadBlock;currentPayloadBlockLength=0;expectedPayloadLength;payloadLength=0;state="open";constructor(options){this.maxFrameLength=resolveMaxFrameLength(options)}push(chunk){if(this.state==="ended")throw new FrameError("Frame decoder has ended");if(this.state==="failed")throw new FrameError("Frame decoder has failed");if(!(chunk instanceof Uint8Array))throw new TypeError("Frame chunk must be a Uint8Array");let frames=[],chunkOffset=0;for(;chunkOffset<chunk.byteLength;){if(this.expectedPayloadLength===void 0){let headerBytes=Math.min(4-this.headerLength,chunk.byteLength-chunkOffset);if(this.header.set(chunk.subarray(chunkOffset,chunkOffset+headerBytes),this.headerLength),this.headerLength+=headerBytes,chunkOffset+=headerBytes,this.headerLength<4)continue;let frameLength=this.header[0]*16777216+this.header[1]*65536+this.header[2]*256+this.header[3];if(this.headerLength=0,frameLength>this.maxFrameLength&&this.fail(`Frame length ${frameLength} exceeds configured limit of ${this.maxFrameLength}`),frameLength===0){frames.push(new Uint8Array);continue}this.expectedPayloadLength=frameLength,this.payloadBlocks=[],this.currentPayloadBlock=void 0,this.currentPayloadBlockLength=0,this.payloadLength=0}let expectedPayloadLength=this.expectedPayloadLength;if(expectedPayloadLength!==void 0){for(;chunkOffset<chunk.byteLength&&this.payloadLength<expectedPayloadLength;){let block=this.currentPayloadBlock;(!block||this.currentPayloadBlockLength===block.byteLength)&&(block=new Uint8Array(Math.min(65536,expectedPayloadLength-this.payloadLength)),this.payloadBlocks.push(block),this.currentPayloadBlock=block,this.currentPayloadBlockLength=0);let payloadBytes=Math.min(block.byteLength-this.currentPayloadBlockLength,chunk.byteLength-chunkOffset);block.set(chunk.subarray(chunkOffset,chunkOffset+payloadBytes),this.currentPayloadBlockLength),this.currentPayloadBlockLength+=payloadBytes,this.payloadLength+=payloadBytes,chunkOffset+=payloadBytes}if(this.payloadLength===expectedPayloadLength){if(this.payloadBlocks.length===1)frames.push(this.payloadBlocks[0]);else{let payload2=new Uint8Array(expectedPayloadLength),offset=0;for(let payloadBlock of this.payloadBlocks)payload2.set(payloadBlock,offset),offset+=payloadBlock.byteLength;frames.push(payload2)}this.payloadBlocks=[],this.currentPayloadBlock=void 0,this.currentPayloadBlockLength=0,this.expectedPayloadLength=void 0,this.payloadLength=0}}}return frames}end(){if(this.state==="ended")throw new FrameError("Frame decoder has ended");if(this.state==="failed")throw new FrameError("Frame decoder has failed");(this.headerLength!==0||this.expectedPayloadLength!==void 0)&&this.fail("Truncated frame at end of stream"),this.state="ended"}fail(message){throw this.state="failed",this.headerLength=0,this.payloadBlocks=[],this.currentPayloadBlock=void 0,this.currentPayloadBlockLength=0,this.expectedPayloadLength=void 0,this.payloadLength=0,new FrameError(message)}};var SUBAGENT_TASK_PROTOCOL_VERSION=1,SubagentTaskProtocolError=class extends Error{code;constructor(message,code){super(message),this.name="SubagentTaskProtocolError",this.code=code}},OPS=["hello","create","run","cancel","dispose","result","steer"],ERROR_CODES=["invalid_request","unknown_task","task_terminal","session_error","runner_lost","cross_task_response"];function isString(value){return typeof value=="string"}function isNonEmptyString(value){return typeof value=="string"&&value.length>0}var REQUEST_KEYS=["v","kind","id","op","taskId","prompt","runId","reason","profile","parentSessionId","resumeSessionId","parentTraceId","text"],EVENT_KEYS=["v","kind","taskId","runId","type","message","seq"],OK_RESPONSE_KEYS=["appliedProfile","sessionId","v","kind","id","ok","taskId","runId","messages","truncated","protocolVersion","status"],ERROR_RESPONSE_KEYS=["v","kind","id","ok","code","message"];function assertAllowedKeys(env2,allowed,label){for(let key of Object.keys(env2))if(!allowed.includes(key))throw new SubagentTaskProtocolError(`${label} envelope has an unknown field: ${key}`,"invalid_request")}function assertOptionalString2(env2,key,label){let value=env2[key];if(value!==void 0&&!isString(value))throw new SubagentTaskProtocolError(`${label} envelope field ${key} must be a string`,"invalid_request")}function validateEnvelope(value){if(typeof value!="object"||value===null)throw new SubagentTaskProtocolError("envelope must be an object","invalid_request");let env2=value;if(env2.v!==SUBAGENT_TASK_PROTOCOL_VERSION)throw new SubagentTaskProtocolError(`unsupported envelope version: ${String(env2.v)}`,"invalid_request");if(env2.kind==="request"){if(assertAllowedKeys(env2,REQUEST_KEYS,"request"),!isNonEmptyString(env2.id)||!isString(env2.op)||!OPS.includes(env2.op))throw new SubagentTaskProtocolError("request envelope requires id and a known op","invalid_request");if(assertOptionalString2(env2,"taskId","request"),assertOptionalString2(env2,"prompt","request"),assertOptionalString2(env2,"runId","request"),assertOptionalString2(env2,"reason","request"),assertOptionalString2(env2,"parentSessionId","request"),assertOptionalString2(env2,"resumeSessionId","request"),assertOptionalString2(env2,"parentTraceId","request"),assertOptionalString2(env2,"text","request"),env2.profile!==void 0&&(env2.profile===null||typeof env2.profile!="object"||Array.isArray(env2.profile)))throw new SubagentTaskProtocolError("request profile must be an object","invalid_request");return env2}if(env2.kind==="event"){if(assertAllowedKeys(env2,EVENT_KEYS,"event"),!isNonEmptyString(env2.taskId)||env2.type!=="progress"||typeof env2.seq!="number"||!Number.isInteger(env2.seq)||env2.seq<0)throw new SubagentTaskProtocolError("event envelope requires taskId, type=progress and a non-negative integer seq","invalid_request");return assertOptionalString2(env2,"runId","event"),assertOptionalString2(env2,"message","event"),env2}if(env2.kind==="response"){if(!isNonEmptyString(env2.id)||typeof env2.ok!="boolean")throw new SubagentTaskProtocolError("response envelope requires id and boolean ok","invalid_request");if(env2.ok===!1){if(assertAllowedKeys(env2,ERROR_RESPONSE_KEYS,"error response"),!isString(env2.code)||!ERROR_CODES.includes(env2.code)||!isString(env2.message))throw new SubagentTaskProtocolError("error response requires a known code and a message","invalid_request");return env2}if(assertAllowedKeys(env2,OK_RESPONSE_KEYS,"ok response"),assertOptionalString2(env2,"taskId","ok response"),assertOptionalString2(env2,"runId","ok response"),assertOptionalString2(env2,"status","ok response"),assertOptionalString2(env2,"sessionId","ok response"),env2.appliedProfile!==void 0){let applied=env2.appliedProfile;if(applied===null||typeof applied!="object"||Array.isArray(applied))throw new SubagentTaskProtocolError("ok response appliedProfile must be an object","invalid_request");let record=applied,modelFacts=record.model;if(record.activeTools!==void 0&&(!Array.isArray(record.activeTools)||record.activeTools.some(name=>!isString(name)))||record.thinkingLevel!==void 0&&!isString(record.thinkingLevel)||record.systemPromptAppend!==void 0&&!isString(record.systemPromptAppend)||record.capabilityMode!==void 0&&!isString(record.capabilityMode)||modelFacts!==void 0&&(!isString(modelFacts.provider)||!isString(modelFacts.id)||typeof modelFacts.contextWindow!="number"||typeof modelFacts.maxTokens!="number"||typeof modelFacts.reasoning!="boolean"))throw new SubagentTaskProtocolError("ok response appliedProfile must carry activeTools/capabilityMode and complete model facts","invalid_request")}if(env2.messages!==void 0&&!Array.isArray(env2.messages))throw new SubagentTaskProtocolError("ok response field messages must be an array","invalid_request");if(env2.truncated!==void 0&&typeof env2.truncated!="boolean")throw new SubagentTaskProtocolError("ok response field truncated must be a boolean","invalid_request");if(env2.protocolVersion!==void 0&&(typeof env2.protocolVersion!="number"||!Number.isInteger(env2.protocolVersion)))throw new SubagentTaskProtocolError("ok response field protocolVersion must be an integer","invalid_request");return env2}throw new SubagentTaskProtocolError(`unknown envelope kind: ${String(env2.kind)}`,"invalid_request")}function encodeEnvelopeV1(env2){return encodeFrame(encodeCbor(env2))}function decodeEnvelopeV1(framePayload){let decoded;try{decoded=decodeCbor(framePayload)}catch(error2){throw new SubagentTaskProtocolError(`envelope payload is not valid CBOR: ${error2 instanceof Error?error2.message:String(error2)}`,"invalid_request")}return validateEnvelope(decoded)}function createSubagentTaskEnvelopeDecoderV1(){let decoder=new FrameDecoder;return{push(chunk){return decoder.push(chunk).map(payload2=>decodeEnvelopeV1(payload2))},end(){decoder.end()}}}var CHANNEL_CAPACITY=256,EnvelopeQueue=class{items=[];spaceWaiters=[];dataWaiters=[];closed=!1;push(env2){return this.closed?Promise.resolve():this.items.length>=CHANNEL_CAPACITY?new Promise(resolve25=>{this.spaceWaiters.push(()=>{this.deliver(env2),resolve25()})}):(this.deliver(env2),Promise.resolve())}close(){this.closed=!0;for(let wake of this.spaceWaiters.splice(0))wake();for(let resolve25 of this.dataWaiters.splice(0))resolve25({value:void 0,done:!0})}take(){let item=this.items.shift();return item!==void 0?(this.wakeSpace(),Promise.resolve({value:item,done:!1})):this.closed?Promise.resolve({value:void 0,done:!0}):new Promise(resolve25=>this.dataWaiters.push(resolve25))}deliver(env2){let resolve25=this.dataWaiters.shift();resolve25!==void 0?resolve25({value:env2,done:!1}):this.items.push(env2)}wakeSpace(){let wake=this.spaceWaiters.shift();wake!==void 0&&wake()}},QueueChannel=class{out;inQueue;constructor(out,inQueue){this.out=out,this.inQueue=inQueue}write(env2){return this.out.push(env2)}[Symbol.asyncIterator](){return{next:()=>this.inQueue.take()}}};function createSubagentTaskChannelPairV1(){let clientToServer=new EnvelopeQueue,serverToClient=new EnvelopeQueue;return{client:new QueueChannel(clientToServer,serverToClient),server:new QueueChannel(serverToClient,clientToServer),close(){clientToServer.close(),serverToClient.close()}}}import{randomUUID as randomUUID2}from"node:crypto";var DEFAULT_MAX_MESSAGES=2e3,DEFAULT_MAX_RESULT_BYTES=524288;function utf8ByteLength2(value){return new TextEncoder().encode(value).length}function safeStringify(value){try{let serialized=JSON.stringify(value);return serialized===void 0?"":serialized}catch{return""}}function boundServerMessagesV1(messages,maxMessages,maxResultBytes){let truncated=!1,selected=messages;selected.length>maxMessages&&(selected=selected.slice(0,maxMessages),truncated=!0);let bounded=[],used=0;for(let message of selected){let size=utf8ByteLength2(safeStringify(message));if(used+size>maxResultBytes){truncated=!0;break}used+=size,bounded.push(message)}return{messages:bounded,truncated}}function verifyAppliedProfile(session,requested){let requestedRecord=requested,facts=session.facts?.();if(facts===void 0||requestedRecord.tools!==void 0&&(facts.activeTools===void 0||facts.activeTools.some(name=>!requestedRecord.tools?.includes(name)))||requestedRecord.mode==="readonly"&&facts.capabilityMode!=="readonly")return"unverified";if(requestedRecord.model!==void 0&&facts.model?.id!==requestedRecord.model)return`model: requested ${requestedRecord.model}, got ${facts.model?.id??"none"}`;if(requestedRecord.thinkingLevel!==void 0&&facts.thinkingLevel!==requestedRecord.thinkingLevel)return`thinkingLevel: requested ${requestedRecord.thinkingLevel}, got ${facts.thinkingLevel??"none"}`;if(requestedRecord.systemPromptAppend!==void 0){if(facts.systemPromptAppend===void 0)return"systemPromptAppend: not verifiable (facts missing)";if(!facts.systemPromptAppend.includes(requestedRecord.systemPromptAppend))return"systemPromptAppend: requested append is not in effect (suite APPEND_SYSTEM.md gating may have dropped it)"}return{...facts.activeTools===void 0?{}:{activeTools:facts.activeTools},...facts.model===void 0?{}:{model:facts.model},...facts.capabilityMode===void 0?{}:{capabilityMode:facts.capabilityMode},...facts.thinkingLevel===void 0?{}:{thinkingLevel:facts.thinkingLevel},...facts.systemPromptAppend===void 0?{}:{systemPromptAppend:facts.systemPromptAppend}}}function createSubagentTaskServer(options,out){let maxMessages=options.maxMessages??DEFAULT_MAX_MESSAGES,maxResultBytes=options.maxResultBytes??DEFAULT_MAX_RESULT_BYTES,tasks=new Map,taskSequence=0,serverDisposed=!1,writeState={pending:0,coalesced:0},settleWrite=result=>result!==void 0&&typeof result.then=="function"?result:Promise.resolve(),send=env2=>{writeState.pending+=1,settleWrite(out.write(env2)).finally(()=>{writeState.pending-=1})},sendProgress=(entry,env2)=>{if(entry.progressInFlight){entry.pendingProgress=env2,writeState.coalesced+=1;return}entry.progressInFlight=!0,writeState.pending+=1,settleWrite(out.write(env2)).finally(()=>{writeState.pending-=1,entry.progressInFlight=!1;let next=entry.pendingProgress;entry.pendingProgress=void 0,next!==void 0&&!entry.disposed&&sendProgress(entry,next)})},okResponse=(id,fields)=>{send({v:SUBAGENT_TASK_PROTOCOL_VERSION,kind:"response",id,ok:!0,...fields})},errorResponse=(id,code,message)=>{send({v:SUBAGENT_TASK_PROTOCOL_VERSION,kind:"response",id,ok:!1,code,message})},lookup=id=>{if(id===void 0)return;let entry=tasks.get(id);return entry!==void 0&&!entry.disposed?entry:void 0},handleHello=env2=>{okResponse(env2.id,{protocolVersion:SUBAGENT_TASK_PROTOCOL_VERSION})},handleCreate=async env2=>{if(typeof env2.prompt!="string"){errorResponse(env2.id,"invalid_request","create requires a string prompt");return}try{let session=await options.createSession({prompt:env2.prompt,...env2.profile===void 0?{}:{profile:env2.profile},...env2.parentSessionId===void 0?{}:{parentSessionId:env2.parentSessionId},...env2.resumeSessionId===void 0?{}:{resumeSessionId:env2.resumeSessionId},...env2.parentTraceId===void 0?{}:{parentTraceId:env2.parentTraceId}}),appliedProfile=env2.profile===void 0?void 0:verifyAppliedProfile(session,env2.profile);if(typeof appliedProfile=="string"){await session.dispose().catch(()=>{}),errorResponse(env2.id,"session_error",`runner session could not prove the requested child task profile was applied: ${appliedProfile}`);return}let taskId=`st:${++taskSequence}:${randomUUID2().slice(0,8)}`;tasks.set(taskId,{taskId,session,disposed:!1,cancelledBeforeRun:!1,runActive:!1,progressSeq:0,progressInFlight:!1}),okResponse(env2.id,{taskId,sessionId:session.getSessionId(),...appliedProfile===void 0?{}:{appliedProfile}})}catch(error2){errorResponse(env2.id,"session_error",`session creation failed: ${error2 instanceof Error?error2.message:String(error2)}`)}},handleRun=env2=>{if(env2.taskId===void 0){errorResponse(env2.id,"invalid_request","run requires taskId");return}let entry=lookup(env2.taskId);if(entry===void 0){errorResponse(env2.id,"unknown_task","run requires a live task");return}if(typeof env2.prompt!="string"||typeof env2.runId!="string"){errorResponse(env2.id,"invalid_request","run requires prompt and runId");return}if(entry.cancelledBeforeRun){errorResponse(env2.id,"task_terminal","task was cancelled before the run started");return}if(entry.runActive){errorResponse(env2.id,"task_terminal","a run is already active for this task");return}let controller=new AbortController;if(entry.controller=controller,entry.runActive=!0,entry.unsubscribeProgress=void 0,entry.session.onProgress!==void 0){let unsubscribe=entry.session.onProgress(message=>{entry.disposed||sendProgress(entry,{v:SUBAGENT_TASK_PROTOCOL_VERSION,kind:"event",taskId:entry.taskId,runId:env2.runId,type:"progress",message,seq:++entry.progressSeq})});entry.unsubscribeProgress=typeof unsubscribe=="function"?unsubscribe:void 0}let settleRun=()=>{entry.runActive=!1,entry.controller=void 0,entry.unsubscribeProgress?.(),entry.unsubscribeProgress=void 0};entry.session.run(env2.prompt,controller.signal).then(outcome=>{entry.disposed||(settleRun(),entry.lastRunStatus=outcome.status==="done"?"succeeded":"cancelled",okResponse(env2.id,{taskId:entry.taskId,runId:env2.runId,status:entry.lastRunStatus}))}).catch(error2=>{entry.disposed||(settleRun(),errorResponse(env2.id,"session_error",`run failed: ${error2 instanceof Error?error2.message:String(error2)}`))})},handleCancel=async env2=>{if(env2.taskId===void 0){errorResponse(env2.id,"invalid_request","cancel requires taskId");return}let entry=lookup(env2.taskId);if(entry===void 0){errorResponse(env2.id,"unknown_task","cancel requires a live task");return}try{entry.runActive||(entry.cancelledBeforeRun=!0),entry.controller?.abort(env2.reason??"cancelled"),await entry.session.cancel(env2.reason),okResponse(env2.id,{taskId:entry.taskId})}catch(error2){errorResponse(env2.id,"session_error",`cancel failed: ${error2 instanceof Error?error2.message:String(error2)}`)}},handleSteer=async env2=>{if(env2.taskId===void 0){errorResponse(env2.id,"invalid_request","steer requires taskId");return}let entry=lookup(env2.taskId);if(entry===void 0){errorResponse(env2.id,"unknown_task","steer requires a live task");return}if(typeof env2.text!="string"||env2.text.trim()===""){errorResponse(env2.id,"invalid_request","steer requires non-empty text");return}if(entry.session.steer===void 0){errorResponse(env2.id,"session_error","runner session does not support steer");return}try{await entry.session.steer(env2.text),okResponse(env2.id,{taskId:entry.taskId})}catch(error2){errorResponse(env2.id,"session_error",`steer failed: ${error2 instanceof Error?error2.message:String(error2)}`)}},handleDispose=async env2=>{if(env2.taskId===void 0){errorResponse(env2.id,"invalid_request","dispose requires taskId");return}let entry=lookup(env2.taskId);if(entry===void 0){errorResponse(env2.id,"unknown_task","dispose requires a live task");return}entry.disposed=!0,entry.runActive=!1,entry.unsubscribeProgress?.(),entry.unsubscribeProgress=void 0,entry.controller?.abort("subagent task disposed"),entry.controller=void 0,tasks.delete(entry.taskId);try{await entry.session.dispose(),okResponse(env2.id,{taskId:entry.taskId})}catch(error2){errorResponse(env2.id,"session_error",`dispose failed: ${error2 instanceof Error?error2.message:String(error2)}`)}},handleResult=env2=>{if(env2.taskId===void 0){errorResponse(env2.id,"invalid_request","result requires taskId");return}let entry=lookup(env2.taskId);if(entry===void 0){errorResponse(env2.id,"unknown_task","result requires a live task");return}let bounded=boundServerMessagesV1(entry.session.getMessages(),maxMessages,maxResultBytes);okResponse(env2.id,{taskId:entry.taskId,messages:bounded.messages,truncated:bounded.truncated,...entry.lastRunStatus===void 0?{}:{status:entry.lastRunStatus}})};return{inspect(){return{pendingWrites:writeState.pending,coalescedProgress:writeState.coalesced}},handle(env2){if(serverDisposed)return env2.kind==="request"&&errorResponse(env2.id,"task_terminal","subagent task server is disposed"),Promise.resolve();if(env2.kind!=="request")return Promise.resolve();try{switch(env2.op){case"hello":return handleHello(env2),Promise.resolve();case"create":return handleCreate(env2);case"run":return handleRun(env2),Promise.resolve();case"cancel":return handleCancel(env2);case"dispose":return handleDispose(env2);case"result":return handleResult(env2),Promise.resolve();case"steer":return handleSteer(env2)}}catch(error2){return errorResponse(env2.id,"session_error",`request failed: ${error2 instanceof Error?error2.message:String(error2)}`),Promise.resolve()}return Promise.resolve()},async dispose(){serverDisposed=!0;let entries=[...tasks.values()];tasks.clear();for(let entry of entries){entry.disposed=!0,entry.unsubscribeProgress?.(),entry.unsubscribeProgress=void 0,entry.controller?.abort("subagent task server disposed"),entry.controller=void 0;try{await entry.session.dispose()}catch{}}}}}function createSubagentTaskStdioChannelV1(streams){let decoder=createSubagentTaskEnvelopeDecoderV1(),pending=[],waiters=[],closed=!1,failure2,close=error2=>{if(!closed){closed=!0,failure2=error2;for(let waiter of waiters.splice(0))error2!==void 0?waiter.reject(error2):waiter.resolve({value:void 0,done:!0});streams.onClosed?.(error2)}};return streams.input.on("data",chunk=>{if(closed)return;let bytes=typeof chunk=="string"?new TextEncoder().encode(chunk):new Uint8Array(chunk);try{for(let env2 of decoder.push(bytes)){let waiter=waiters.shift();waiter!==void 0?waiter.resolve({value:env2,done:!1}):pending.push(env2)}}catch(error2){close(error2 instanceof Error?error2:new Error(String(error2)))}}),streams.input.on("end",()=>{try{decoder.end()}catch(error2){close(error2 instanceof Error?error2:new Error(String(error2)));return}close()}),streams.input.on("error",error2=>close(error2)),streams.output.on("error",error2=>close(error2)),{async write(env2){if(closed)return;let frame=encodeEnvelopeV1(env2);streams.output.write(frame)||await new Promise((resolve25,reject2)=>{let onDrain=()=>{streams.output.off("error",onError),resolve25()},onError=error2=>{streams.output.off("drain",onDrain),reject2(error2)};streams.output.once("drain",onDrain),streams.output.once("error",onError)})},[Symbol.asyncIterator](){return{next:()=>{let item=pending.shift();return item!==void 0?Promise.resolve({value:item,done:!1}):failure2!==void 0?Promise.reject(failure2):closed?Promise.resolve({value:void 0,done:!0}):new Promise((resolve25,reject2)=>waiters.push({resolve:resolve25,reject:reject2}))}}}}}import{createRequire as createRequire2}from"node:module";var require3=createRequire2(import.meta.url),createJitiImpl;function createJiti(...args){return createJitiImpl??=require3("jiti").createJiti,createJitiImpl(...args)}var undici2=__toESM(require_undici(),1);var activePlugins=new WeakMap,hostHeavyDependencyAliases=new Set(["@lancedb/lancedb","@huggingface/transformers","onnxruntime-node"]),resolvedHeavyDependencyAliases=new Map,defaultHostDependencyAliasResolution={resolve:specifier=>createRequire3(import.meta.url).resolve(specifier),cache:resolvedHeavyDependencyAliases};function buildHostDependencyAliases(specifiers,resolution){let aliases={};for(let specifier of specifiers){let cached=resolution.cache.get(specifier);if(cached!==void 0){aliases[specifier]=cached;continue}try{let resolved=resolution.resolve(specifier);resolution.cache.set(specifier,resolved),aliases[specifier]=resolved}catch{}}return aliases}function hostDependencyPathsConfig(){let paths={};for(let[specifier,entryPath]of Object.entries(buildHostDependencyAliases(hostHeavyDependencyAliases,defaultHostDependencyAliasResolution)))paths[camelCaseDependencyKey(specifier)]=entryPath;return paths}function camelCaseDependencyKey(specifier){return specifier.replace(/^@[^/]+\//,"").replace(/[-.](.)/g,(_2,character)=>character.toUpperCase())}function isPluginInstance(value){return typeof value=="object"&&value!==null&&typeof value.dispose=="function"}function normalizePluginInstance(value,manifest){if(value!==void 0){if(!isPluginInstance(value))throw new Error(`Capability plugin factory must return void or an instance with dispose(): ${manifest.id}`);return value}}function normalizePluginSyncInstance(value,manifest){if(value!==void 0){if(!isPluginInstance(value))throw new Error(`Synchronous capability plugin factory must return void or an instance with dispose(): ${manifest.id}`);return value}}function throwCleanupErrors(errors,manifestId){if(errors.length!==0)throw errors.length===1?errors[0]:new AggregateError(errors,`Capability plugin cleanup failed: ${manifestId}`)}async function dispatchPluginDisposeEvent(runtime,manifest,status2){runtime.hasLifecycleEvent(PLUGIN_DISPOSE_EVENT_ID,1)&&await runtime.dispatchLifecycle({type:PLUGIN_DISPOSE_EVENT_ID,version:1,phase:"committed",data:{version:1,pluginId:manifest.id,pluginVersion:manifest.version,status:status2},source:"capability-plugin"})}async function dispatchPluginReadyEvent(runtime,manifest){runtime.hasLifecycleEvent(PLUGIN_READY_EVENT_ID,1)&&await runtime.dispatchLifecycle({type:PLUGIN_READY_EVENT_ID,version:1,phase:"committed",data:{version:1,pluginId:manifest.id,pluginVersion:manifest.version},source:"capability-plugin"})}function isMissingPathError(error2){return typeof error2=="object"&&error2!==null&&"code"in error2&&error2.code==="ENOENT"}function compareNames(left,right){return left<right?-1:left>right?1:0}function discoverCapabilityPluginManifests(pluginDirectories){let manifests2=[],seenDirectories=new Set,seenManifests=new Set,visit=(directory,optional)=>{let resolvedDirectory=path3.resolve(directory),stats;try{stats=statSync4(resolvedDirectory)}catch(error2){if(optional&&isMissingPathError(error2))try{if(!lstatSync(resolvedDirectory).isSymbolicLink())return}catch(linkError){if(isMissingPathError(linkError))return;throw new Error(`Failed to inspect capability plugin directory ${resolvedDirectory}: ${linkError instanceof Error?linkError.message:String(linkError)}`)}throw new Error(`Failed to inspect capability plugin directory ${resolvedDirectory}: ${error2 instanceof Error?error2.message:String(error2)}`)}if(!stats.isDirectory())throw new Error(`Capability plugin path must be a directory: ${resolvedDirectory}`);let canonicalDirectory;try{canonicalDirectory=realpathSync3(resolvedDirectory)}catch(error2){throw new Error(`Failed to resolve capability plugin directory ${resolvedDirectory}: ${error2 instanceof Error?error2.message:String(error2)}`)}if(seenDirectories.has(canonicalDirectory))return;seenDirectories.add(canonicalDirectory);let entries;try{entries=readdirSync3(resolvedDirectory,{withFileTypes:!0,encoding:"utf8"})}catch(error2){throw new Error(`Failed to read capability plugin directory ${resolvedDirectory}: ${error2 instanceof Error?error2.message:String(error2)}`)}for(let entry of entries.sort((left,right)=>compareNames(left.name,right.name))){if(entry.name==="node_modules"||entry.name.startsWith("."))continue;let entryPath=path3.join(resolvedDirectory,entry.name);if(entry.isDirectory()){visit(entryPath,!1);continue}if(!entry.isFile()||entry.name!=="plugin.json")continue;let canonicalManifest;try{canonicalManifest=realpathSync3(entryPath)}catch(error2){throw new Error(`Failed to resolve capability plugin manifest ${entryPath}: ${error2 instanceof Error?error2.message:String(error2)}`)}seenManifests.has(canonicalManifest)||(seenManifests.add(canonicalManifest),manifests2.push(canonicalManifest))}};for(let pluginDirectory of pluginDirectories)visit(pluginDirectory,!0);return manifests2}async function loadCapabilityPlugin(runtime,manifest,factory){let active=activePlugins.get(runtime)??new Map;if(active.has(manifest.id))throw new Error(`Capability plugin is already loaded: ${manifest.id}`);let ownerToken=Symbol(manifest.id);active.set(manifest.id,ownerToken),activePlugins.set(runtime,active);let api,instance,cleanup=async notifyDispose=>{let errors=[];api&&runtime.revokeAPI(api);try{await runtime.disposePlugin(manifest.id)}catch(error2){errors.push(error2)}try{await instance?.dispose()}catch(error2){errors.push(error2)}if(notifyDispose)try{await dispatchPluginDisposeEvent(runtime,manifest,errors.length===0?"disposed":"failed")}catch(error2){errors.push(error2)}throwCleanupErrors(errors,manifest.id)};try{api=runtime.createAPI(manifest),instance=normalizePluginInstance(await factory(api),manifest),await dispatchPluginReadyEvent(runtime,manifest);let pluginApi=api,disposePromise;return{manifest,api:pluginApi,ready:Promise.resolve(),dispose:async()=>(disposePromise??=(async()=>{try{await cleanup(!0)}finally{active.get(manifest.id)===ownerToken&&active.delete(manifest.id)}})(),disposePromise)}}catch(error2){try{await cleanup(!1)}catch(cleanupError){throw new AggregateError([error2,cleanupError],`Capability plugin startup cleanup failed: ${manifest.id}`)}finally{active.get(manifest.id)===ownerToken&&active.delete(manifest.id)}throw error2}}function loadCapabilityPluginSync(runtime,manifest,factory){let active=activePlugins.get(runtime)??new Map;if(active.has(manifest.id))throw new Error(`Capability plugin is already loaded: ${manifest.id}`);let ownerToken=Symbol(manifest.id);active.set(manifest.id,ownerToken),activePlugins.set(runtime,active);let api,instance,cleanupRegistrationsSync=()=>{let errors=[];api&&runtime.revokeAPI(api);try{runtime.disposePluginSync(manifest.id)}catch(error2){errors.push(error2)}return errors},cleanupSync=async()=>{let errors=cleanupRegistrationsSync(),result;try{result=instance?.dispose()}catch(error2){errors.push(error2)}if(result&&typeof result.then=="function"){let contractError=new Error(`Synchronous capability plugin disposer must not return a Promise: ${manifest.id}`);try{await result}catch(error2){errors.push(error2)}errors.push(contractError)}try{await dispatchPluginDisposeEvent(runtime,manifest,errors.length===0?"disposed":"failed")}catch(error2){errors.push(error2)}throwCleanupErrors(errors,manifest.id)};try{api=runtime.createAPI(manifest),instance=normalizePluginSyncInstance(factory(api),manifest)}catch(error2){try{throwCleanupErrors(cleanupRegistrationsSync(),manifest.id)}catch(cleanupError){throw new AggregateError([error2,cleanupError],`Capability plugin startup cleanup failed: ${manifest.id}`)}finally{active.get(manifest.id)===ownerToken&&active.delete(manifest.id)}throw error2}let ready=dispatchPluginReadyEvent(runtime,manifest);ready.catch(()=>{});let disposePromise;return{manifest,api,ready,dispose:async()=>(disposePromise??=(async()=>{let readyError;try{await ready}catch(error2){readyError=error2}try{if(await cleanupSync(),readyError!==void 0)throw readyError}catch(error2){throw readyError!==void 0&&error2!==readyError?new AggregateError([readyError,error2],`Capability plugin cleanup failed: ${manifest.id}`):error2}finally{active.get(manifest.id)===ownerToken&&active.delete(manifest.id)}})(),disposePromise)}}async function loadCapabilityPluginFromManifest(runtime,manifestPath,options){let raw;try{raw=JSON.parse(await readFile2(manifestPath,"utf8"))}catch(error2){throw new Error(`Failed to read capability plugin manifest ${manifestPath}: ${error2 instanceof Error?error2.message:String(error2)}`)}let parsed=parseCapabilityPluginManifest(raw,manifestPath),hostDependencyOverride={hostDependencyPaths:hostDependencyPathsConfig()},callerOverride=options?.configOverride,manifest=callerOverride===void 0||Object.keys(callerOverride).length===0?{...parsed,config:{...parsed.config,...hostDependencyOverride}}:{...parsed,config:{...parsed.config,...hostDependencyOverride,...callerOverride}},entryPath=path3.resolve(path3.dirname(manifestPath),manifest.entry),jiti=createJiti(import.meta.url,{moduleCache:!1,tsconfigPaths:!0,alias:buildHostDependencyAliases(hostHeavyDependencyAliases,defaultHostDependencyAliasResolution),virtualModules:{"@agent-forge/plugin-sdk":dist_exports,"@agent-forge/plugin-sdk/session-lineage":session_lineage_exports,"@agent-forge/protocol/subagent":subagent_exports,typebox:build_exports,"typebox/value":value_exports2,undici:undici2}}),factory;try{factory=await jiti.import(entryPath,{default:!0})}catch(error2){throw new Error(`Failed to import capability plugin entry ${entryPath}: ${error2 instanceof Error?error2.message:String(error2)}`)}if(typeof factory!="function")throw new Error(`Capability plugin entry must default-export a factory function: ${entryPath}`);return loadCapabilityPlugin(runtime,manifest,factory)}var ecosystem_exports={};__export(ecosystem_exports,{AGENT_FORGE_NPM_REGISTRY_ENV_V1:()=>AGENT_FORGE_NPM_REGISTRY_ENV_V1,AGENT_FORGE_NPM_TOKEN_ENV_V1:()=>AGENT_FORGE_NPM_TOKEN_ENV_V1,DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1:()=>DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1,DEFAULT_PLUGIN_INSTALL_STORE_DIR_V1:()=>DEFAULT_PLUGIN_INSTALL_STORE_DIR_V1,DEFAULT_PLUGIN_STATE_FILE_V1:()=>DEFAULT_PLUGIN_STATE_FILE_V1,MAX_NODE_DISK_REGISTRY_INDEX_BYTES_V1:()=>MAX_NODE_DISK_REGISTRY_INDEX_BYTES_V1,MAX_NODE_DISK_REGISTRY_MANIFEST_BYTES_V1:()=>MAX_NODE_DISK_REGISTRY_MANIFEST_BYTES_V1,MAX_NODE_DISK_REGISTRY_RECORDS_V1:()=>MAX_NODE_DISK_REGISTRY_RECORDS_V1,MAX_PLUGIN_ACQUISITION_NPM_NAME_CHARS_V1:()=>MAX_PLUGIN_ACQUISITION_NPM_NAME_CHARS_V1,MAX_PLUGIN_ACQUISITION_REF_CHARS_V1:()=>MAX_PLUGIN_ACQUISITION_REF_CHARS_V1,MAX_PLUGIN_DISTRIBUTION_ARTIFACT_BYTES_V1:()=>MAX_PLUGIN_DISTRIBUTION_ARTIFACT_BYTES_V1,MAX_PLUGIN_DISTRIBUTION_ARTIFACT_REF_CHARS_V1:()=>MAX_PLUGIN_DISTRIBUTION_ARTIFACT_REF_CHARS_V1,MAX_PLUGIN_DISTRIBUTION_DESCRIPTOR_BYTES_V1:()=>MAX_PLUGIN_DISTRIBUTION_DESCRIPTOR_BYTES_V1,MAX_PLUGIN_DISTRIBUTION_FIELD_CHARS_V1:()=>MAX_PLUGIN_DISTRIBUTION_FIELD_CHARS_V1,MAX_PLUGIN_DISTRIBUTION_METADATA_BYTES_V1:()=>MAX_PLUGIN_DISTRIBUTION_METADATA_BYTES_V1,MAX_PLUGIN_ECOSYSTEM_CLI_ARGS_V1:()=>MAX_PLUGIN_ECOSYSTEM_CLI_ARGS_V1,MAX_PLUGIN_ECOSYSTEM_CLI_LIST_ENTRIES_V1:()=>MAX_PLUGIN_ECOSYSTEM_CLI_LIST_ENTRIES_V1,MAX_PLUGIN_ECOSYSTEM_CLI_OUTPUT_BYTES_V1:()=>MAX_PLUGIN_ECOSYSTEM_CLI_OUTPUT_BYTES_V1,MAX_PLUGIN_REGISTRY_MANIFESTS_V1:()=>MAX_PLUGIN_REGISTRY_MANIFESTS_V1,MAX_PLUGIN_REGISTRY_MANIFEST_BYTES_V1:()=>MAX_PLUGIN_REGISTRY_MANIFEST_BYTES_V1,MAX_PLUGIN_REGISTRY_PROOF_CHARS_V1:()=>MAX_PLUGIN_REGISTRY_PROOF_CHARS_V1,MAX_PLUGIN_REGISTRY_SOURCE_CHARS_V1:()=>MAX_PLUGIN_REGISTRY_SOURCE_CHARS_V1,MAX_PLUGIN_SCOPE_REF_CHARS_V1:()=>MAX_PLUGIN_SCOPE_REF_CHARS_V1,MAX_PLUGIN_SELECTION_IDS_V1:()=>MAX_PLUGIN_SELECTION_IDS_V1,MAX_PLUGIN_SELECTION_ID_CHARS_V1:()=>MAX_PLUGIN_SELECTION_ID_CHARS_V1,MAX_PLUGIN_SELECTION_PROFILES_V1:()=>MAX_PLUGIN_SELECTION_PROFILES_V1,MAX_PLUGIN_SELECTION_STORE_PATH_CHARS_V1:()=>MAX_PLUGIN_SELECTION_STORE_PATH_CHARS_V1,MAX_PLUGIN_STATE_ID_CHARS_V1:()=>MAX_PLUGIN_STATE_ID_CHARS_V1,MAX_PLUGIN_STATE_INSTALLATION_REF_CHARS_V1:()=>MAX_PLUGIN_STATE_INSTALLATION_REF_CHARS_V1,MAX_PLUGIN_STATE_RECORDS_V1:()=>MAX_PLUGIN_STATE_RECORDS_V1,MAX_PLUGIN_STATE_SOURCE_CHARS_V1:()=>MAX_PLUGIN_STATE_SOURCE_CHARS_V1,MAX_PLUGIN_STATE_STRING_CHARS_V1:()=>MAX_PLUGIN_STATE_STRING_CHARS_V1,NODE_PACKAGE_FORMAT_VERSION_V1:()=>NODE_PACKAGE_FORMAT_VERSION_V12,NODE_PLUGIN_TRUST_ROOT_VERSION_V1:()=>NODE_PLUGIN_TRUST_ROOT_VERSION_V1,NodeDiskRegistrySourceErrorV1:()=>NodeDiskRegistrySourceErrorV1,NodeHttpPluginRegistrySourceErrorV1:()=>NodeHttpPluginRegistrySourceErrorV1,NodeNpmRegistrySourceErrorV1:()=>NodeNpmRegistrySourceErrorV1,NodePackageInstallErrorV1:()=>NodePackageInstallErrorV1,NodePackageInstallPersistenceErrorV1:()=>NodePackageInstallPersistenceErrorV1,NodeReleasePackageSourceErrorV1:()=>NodeReleasePackageSourceErrorV1,NodeTarWriterErrorV1:()=>NodeTarWriterErrorV1,NodeUrlPackageSourceErrorV1:()=>NodeUrlPackageSourceErrorV1,PLUGIN_DISTRIBUTION_CONTRACT_VERSION_V1:()=>PLUGIN_DISTRIBUTION_CONTRACT_VERSION_V1,PLUGIN_ECOSYSTEM_CLI_VERSION_V1:()=>PLUGIN_ECOSYSTEM_CLI_VERSION_V1,PLUGIN_SELECTION_STORE_VERSION_V1:()=>PLUGIN_SELECTION_STORE_VERSION_V1,PLUGIN_SELECTION_VERSION_V1:()=>PLUGIN_SELECTION_VERSION_V1,PLUGIN_STATE_SNAPSHOT_VERSION_V1:()=>PLUGIN_STATE_SNAPSHOT_VERSION_V1,PluginAcquisitionErrorV1:()=>PluginAcquisitionErrorV1,PluginCatalogErrorV1:()=>PluginCatalogErrorV1,PluginDistributionErrorV1:()=>PluginDistributionErrorV1,PluginRegistryErrorV1:()=>PluginRegistryErrorV1,PluginSelectionErrorV1:()=>PluginSelectionErrorV1,activatePluginUpdateV1:()=>activatePluginUpdateV1,buildNodePluginDistributionSignaturePayloadV1:()=>buildNodePluginDistributionSignaturePayloadV1,buildNodeTarBytesV1:()=>buildNodeTarBytesV1,buildNodeTarGzBytesV1:()=>buildNodeTarGzBytesV1,buildPluginCatalogV1:()=>buildPluginCatalogV1,buildResolvedManifestV1:()=>buildResolvedManifestV1,collectLocalDirectoryPackageEntriesV1:()=>collectLocalDirectoryPackageEntriesV1,comparePluginVersionsV1:()=>comparePluginVersionsV1,createDefaultActivePluginBindingsResolverV1:()=>createDefaultActivePluginBindingsResolverV1,createDefaultPluginMarketWiringV1:()=>createDefaultPluginMarketWiringV1,createNodeDiskPluginRegistrySourceV1:()=>createNodeDiskPluginRegistrySourceV1,createNodeHttpPluginDistributionHostV1:()=>createNodeHttpPluginDistributionHostV1,createNodeHttpPluginDistributionStackV1:()=>createNodeHttpPluginDistributionStackV1,createNodeHttpPluginRegistrySourceV1:()=>createNodeHttpPluginRegistrySourceV1,createNodeNpmRegistrySourceV1:()=>createNodeNpmRegistrySourceV1,createNodePackageInstallHostForSessionV1:()=>createNodePackageInstallHostForSessionV1,createNodePackageInstallHostV1:()=>createNodePackageInstallHostV1,createNodePackageInstallPersistenceV1:()=>createNodePackageInstallPersistenceV1,createNodePackageInstallSessionLoaderV1:()=>createNodePackageInstallSessionLoaderV1,createNodePluginAcquisitionHostV1:()=>createNodePluginAcquisitionHostV1,createNodePluginPackageInstallStackV1:()=>createNodePluginPackageInstallStackV1,createNodePluginTrustRootV1:()=>createNodePluginTrustRootV1,createNodeReleasePackageSourceV1:()=>createNodeReleasePackageSourceV1,createPluginDistributionV1:()=>createPluginDistributionV1,createPluginEcosystemCliV1:()=>createPluginEcosystemCliV1,createPluginEcosystemRegistryAdapterV1:()=>createPluginEcosystemRegistryAdapterV1,createPluginInstallerV1:()=>createPluginInstallerV1,createPluginRegistryV1:()=>createPluginRegistryV1,createPluginSelectionStoreV1:()=>createPluginSelectionStoreV1,createPluginSelectionV1:()=>createPluginSelectionV1,createPluginStateStoreV1:()=>createPluginStateStoreV1,defaultPluginHostFactsV1:()=>defaultPluginHostFactsV1,defaultPluginInstallStoreDirectoryV1:()=>defaultPluginInstallStoreDirectoryV1,detectPluginPackageMediaTypeV1:()=>detectPluginPackageMediaTypeV1,downloadNodeUrlPackageV1:()=>downloadNodeUrlPackageV1,findPluginCatalogEntryV1:()=>findPluginCatalogEntryV1,isPluginAcquisitionRefTargetV1:()=>isPluginAcquisitionRefTargetV1,parseNodeTarGzPackageV1:()=>parseNodeTarGzPackageV1,parseNodeZipPackageV1:()=>parseNodeZipPackageV1,parsePluginAcquisitionRefV1:()=>parsePluginAcquisitionRefV1,parsePluginEcosystemCliCommandV1:()=>parsePluginEcosystemCliCommandV1,pluginAcquisitionManifestFromEntriesV1:()=>pluginAcquisitionManifestFromEntriesV1,pluginManifestDigestV1:()=>pluginManifestDigestV1,projectPluginScopeRefV1:()=>projectPluginScopeRefV1,readLocalPackageFileV1:()=>readLocalPackageFileV1,resolveActivePluginBindingsForScopesV1:()=>resolveActivePluginBindingsForScopesV1,resolveActivePluginBindingsV1:()=>resolveActivePluginBindingsV1,resolvePluginCompatibilityV1:()=>resolvePluginCompatibilityV1,resolvePluginProfileV1:()=>resolvePluginProfileV1,resolvePluginSelectionV1:()=>resolvePluginSelectionV1,rollbackPluginUpdateV1:()=>rollbackPluginUpdateV1,runPluginEcosystemCliV1:()=>runPluginEcosystemCliV1,selectNpmPackageVersionV1:()=>selectNpmPackageVersionV1,serializePluginSelectionV1:()=>serializePluginSelectionV1,sriToIntegrityV1:()=>sriToIntegrityV1,stagePluginUpdateV1:()=>stagePluginUpdateV1,verifyPluginUpdateV1:()=>verifyPluginUpdateV1});function diagnostic2(code,message,pluginId,pluginVersion){return Object.freeze({code,message,...pluginId===void 0?{}:{pluginId},...pluginVersion===void 0?{}:{pluginVersion}})}function unavailable(diagnostics){return Object.freeze({status:"unavailable",manifestOverrides:Object.freeze({}),verifiedPlugins:Object.freeze([]),installedManifestPaths:Object.freeze(new Map),diagnostics:Object.freeze([...diagnostics])})}async function resolveActivePluginBindingsV1(options){let stateResult2=await options.stateStore.read({signal:options.signal});if(stateResult2.status!=="ok"&&stateResult2.status!=="missing")return unavailable([diagnostic2("state_unavailable","Active plugin state is unavailable; no installed version was selected")]);let active=stateResult2.snapshot.records.filter(record=>record.state.scope===options.scope&&record.state.scopeRef===options.scopeRef&&record.state.enabled&&record.state.lifecycle==="active").sort((left,right)=>`${left.pluginId}@${left.pluginVersion}`.localeCompare(`${right.pluginId}@${right.pluginVersion}`));if(active.length===0)return Object.freeze({status:"ready",manifestOverrides:Object.freeze({}),verifiedPlugins:Object.freeze([]),installedManifestPaths:Object.freeze(new Map),diagnostics:Object.freeze([])});if(options.registry.resolve===void 0)return unavailable([diagnostic2("registry_unavailable","Active plugin registry cannot resolve manifests; no installed version was selected")]);let seen=new Set,selectedRecords=[],diagnostics=[];for(let record of active){if(seen.has(record.pluginId)){diagnostics.push(diagnostic2("duplicate_active","Multiple active versions exist for one plugin; no installed version was selected",record.pluginId,record.pluginVersion));continue}seen.add(record.pluginId),selectedRecords.push(record)}if(diagnostics.length>0)return unavailable(diagnostics);let resolved=new Map;for(let record of selectedRecords){let packageValue;try{packageValue=await options.registry.resolve({pluginId:record.pluginId,pluginVersion:record.pluginVersion,signal:options.signal})}catch{diagnostics.push(diagnostic2("manifest_unavailable","Active plugin manifest resolution failed; no installed version was selected",record.pluginId,record.pluginVersion));continue}if(packageValue===void 0){diagnostics.push(diagnostic2("manifest_unavailable","Active plugin manifest is unavailable; no installed version was selected",record.pluginId,record.pluginVersion));continue}let computedDigest=pluginManifestDigestV1(packageValue.manifest);if(packageValue.manifest.id!==record.pluginId||packageValue.manifest.pluginVersion!==record.pluginVersion||computedDigest!==record.manifestDigest||packageValue.expectedDigest!==record.manifestDigest){diagnostics.push(diagnostic2("manifest_mismatch","Active plugin manifest identity or digest does not match state; no installed version was selected",record.pluginId,record.pluginVersion));continue}let manifestPath;if(options.resolveInstallationManifestPath!==void 0&&(manifestPath=await options.resolveInstallationManifestPath({pluginId:record.pluginId,pluginVersion:record.pluginVersion,signal:options.signal}),manifestPath===void 0)){diagnostics.push(diagnostic2("manifest_unavailable","Active plugin installation manifest path is unavailable; no installed version was selected",record.pluginId,record.pluginVersion));continue}resolved.set(record.pluginId,{record,package:packageValue,...manifestPath===void 0?{}:{manifestPath}})}if(diagnostics.length>0)return unavailable(diagnostics);let manifestOverrides={},verifiedPlugins=[],installedManifestPaths=new Map;for(let[pluginId,value]of resolved)manifestOverrides[pluginId]=value.package.manifest,verifiedPlugins.push({pluginId,version:value.record.pluginVersion}),value.manifestPath!==void 0&&installedManifestPaths.set(pluginId,value.manifestPath);return Object.freeze({status:"ready",manifestOverrides:Object.freeze(manifestOverrides),verifiedPlugins:Object.freeze(verifiedPlugins),installedManifestPaths:Object.freeze(installedManifestPaths),diagnostics:Object.freeze([])})}async function resolveActivePluginBindingsForScopesV1(options){let scopes=[options.project,options.global].filter(scope=>scope!==void 0);if(scopes.length===0)return Object.freeze({status:"ready",manifestOverrides:Object.freeze({}),verifiedPlugins:Object.freeze([]),installedManifestPaths:Object.freeze(new Map),diagnostics:Object.freeze([])});let results=await Promise.all(scopes.map(scope=>resolveActivePluginBindingsV1({stateStore:scope.stateStore,registry:options.registry,scope:scope.scope,scopeRef:scope.scopeRef,...options.resolveInstallationManifestPath===void 0?{}:{resolveInstallationManifestPath:options.resolveInstallationManifestPath},signal:options.signal}))),unavailableDiagnostics=results.flatMap(result=>result.status==="unavailable"?result.diagnostics:[]);if(unavailableDiagnostics.length>0)return unavailable(unavailableDiagnostics);let manifestOverrides={},verifiedPlugins=[],installedManifestPaths=new Map,seen=new Set;for(let result of results){for(let[pluginId,manifest]of Object.entries(result.manifestOverrides))seen.has(pluginId)||(seen.add(pluginId),manifestOverrides[pluginId]=manifest);for(let verified of result.verifiedPlugins)verifiedPlugins.some(entry=>entry.pluginId===verified.pluginId)||verifiedPlugins.push(verified);for(let[pluginId,manifestPath]of result.installedManifestPaths)installedManifestPaths.has(pluginId)||installedManifestPaths.set(pluginId,manifestPath)}return Object.freeze({status:"ready",manifestOverrides:Object.freeze(manifestOverrides),verifiedPlugins:Object.freeze(verifiedPlugins),installedManifestPaths:Object.freeze(installedManifestPaths),diagnostics:Object.freeze([])})}import{Buffer as Buffer2}from"node:buffer";var MAX_INSTALLATION_REF_CHARS_V1=2048,MAX_PLUGIN_SCOPE_REF_CHARS_V1=2048,DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1="global:default";function opaqueInstallationRef(value){if(typeof value!="string"||value.trim()===""||value.length>MAX_INSTALLATION_REF_CHARS_V1)throw new Error("installation reference is invalid");if(/^(?:file:|[a-zA-Z]:[\\/]|[\\/]{1,2}|\\\\)/iu.test(value)||/\s/u.test(value))throw new Error("installation reference must be opaque");return value}function opaqueScopeRef(value){if(typeof value!="string"||value.trim()===""||value.length>MAX_PLUGIN_SCOPE_REF_CHARS_V1)throw new Error("plugin installation scope reference is invalid");if(/^(?:file:|[a-zA-Z]:[\\/]|[\\/]{1,2}|\\\\)/iu.test(value)||/\s/u.test(value))throw new Error("plugin installation scope reference must be opaque");return value}function installationFrom(record,installationRef,scopeIdentity,state2){return Object.freeze({version:1,pluginId:record.pluginId,pluginVersion:record.pluginVersion,manifestDigest:record.manifestDigest,scope:scopeIdentity.scope,scopeRef:scopeIdentity.scopeRef,installationRef:opaqueInstallationRef(installationRef),state:state2})}function cancelled(){return{status:"cancelled",error:{code:"cancelled",message:"Plugin installation operation was cancelled"}}}function failure(code){return{status:"failed",error:{code,message:code==="invalid_installation"?"The plugin installation handle is invalid":code==="unsupported_scope"?"The plugin installer does not support this scope":code==="install_failed"?"The host plugin installer failed":code==="activation_failed"?"The host plugin activation failed":code==="rollback_failed"?"The host plugin rollback failed":"The host plugin uninstall failed"}}}function validateInstallation(installation){if(installation.version!==1||typeof installation.pluginId!="string"||typeof installation.pluginVersion!="string"||typeof installation.manifestDigest!="string"||installation.pluginId.trim()===""||installation.pluginVersion.trim()===""||installation.manifestDigest.trim()==="")throw new Error("plugin installation handle is invalid");if(installation.scope!=="global"&&installation.scope!=="project")throw new Error("plugin installation scope is invalid");let scopeRef=installation.scopeRef===void 0?installation.scope==="global"?DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1:(()=>{throw new Error("project installation scope reference is required")})():opaqueScopeRef(installation.scopeRef);if(installation.scope==="global"&&scopeRef!==DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1)throw new Error("plugin global installation scope reference is invalid");opaqueInstallationRef(installation.installationRef)}function ensureIdentity(installation,record,scopeIdentity){if(validateInstallation(installation),installation.pluginId!==record.pluginId||installation.pluginVersion!==record.pluginVersion||installation.manifestDigest!==record.manifestDigest||installation.scope!==scopeIdentity.scope||(installation.scopeRef??DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1)!==scopeIdentity.scopeRef)throw new Error("plugin installation identity mismatch")}function normalizeScope(scope){if(scope===void 0)return"global";if(scope==="global"||scope==="project")return scope;throw new Error("plugin installation scope is invalid")}function normalizeScopeIdentity(scope,scopeRef){let normalizedScope=normalizeScope(scope);if(scopeRef===void 0){if(normalizedScope!=="global")throw new Error("project installation scope reference is required");return Object.freeze({scope:normalizedScope,scopeRef:DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1})}let normalizedScopeRef=opaqueScopeRef(scopeRef);if(normalizedScope==="global"&&normalizedScopeRef!==DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1)throw new Error("plugin global installation scope reference is invalid");return Object.freeze({scope:normalizedScope,scopeRef:normalizedScopeRef})}function declaredScopes(host){return host.supportedScopes===void 0?Object.freeze(["global"]):!Array.isArray(host.supportedScopes)||new Set(host.supportedScopes).size!==host.supportedScopes.length||host.supportedScopes.some(scope=>scope!=="global"&&scope!=="project")?Object.freeze([]):Object.freeze([...host.supportedScopes])}function hostAcceptedScope(installation,scopeIdentity){if(!(scopeIdentity.scope==="global"&&installation.scope===void 0&&installation.scopeRef===void 0)&&(installation.scope!==scopeIdentity.scope||installation.scopeRef!==scopeIdentity.scopeRef))throw new Error("plugin installation scope mismatch")}function ensureArtifactIdentity(artifact,record){if(artifact.version!==1||artifact.pluginId!==record.pluginId||artifact.pluginVersion!==record.pluginVersion||artifact.manifestDigest!==record.manifestDigest||typeof artifact.artifactRef!="string"||artifact.artifactRef.trim()==="")throw new Error("plugin distribution artifact identity mismatch");opaqueInstallationRef(artifact.artifactRef)}function isInvalidInstallationError(value){return value instanceof Error&&(value.message==="plugin installation handle is invalid"||value.message==="plugin installation scope is invalid"||value.message==="plugin installation scope reference is invalid"||value.message==="plugin installation scope reference must be opaque"||value.message==="plugin global installation scope reference is invalid"||value.message==="project installation scope reference is required"||value.message==="plugin installation identity mismatch"||value.message==="plugin installation scope mismatch"||value.message==="plugin distribution artifact identity mismatch")}function createPluginInstallerV1(options){let supportedScopes=declaredScopes(options.host),supportsScope=scope=>supportedScopes.includes(scope);return{supportedScopes,prepare(input){let staged=stagePluginUpdateV1({manifest:input.manifest,source:input.source});return verifyPluginUpdateV1({record:staged,host:input.host,expectedDigest:input.expectedDigest,verifier:options.verifier})},async install(input){if(input.signal?.aborted)return cancelled();let scopeIdentity;try{scopeIdentity=normalizeScopeIdentity(input.scope,input.scopeRef)}catch{return failure("invalid_installation")}if(!supportsScope(scopeIdentity.scope))return failure("unsupported_scope");if(input.record.state!=="verified")return failure("invalid_installation");try{input.artifact!==void 0&&ensureArtifactIdentity(input.artifact,input.record);let installed=await options.host.install({record:input.record,scope:scopeIdentity.scope,scopeRef:scopeIdentity.scopeRef,...input.artifact===void 0?{}:{artifact:input.artifact},signal:input.signal});return hostAcceptedScope(installed,scopeIdentity),{status:"succeeded",installation:installationFrom(input.record,installed.installationRef,scopeIdentity,"installed")}}catch(error2){return isInvalidInstallationError(error2)?failure("invalid_installation"):input.signal?.aborted?cancelled():failure("install_failed")}},async activate(input){if(input.signal?.aborted)return cancelled();let scopeIdentity;try{return scopeIdentity=normalizeScopeIdentity(input.scope,input.scopeRef),supportsScope(scopeIdentity.scope)?(ensureIdentity(input.installation,input.record,scopeIdentity),input.installation.state!=="installed"||input.record.state!=="verified"?failure("invalid_installation"):(await options.host.activate({installation:input.installation,record:input.record,scope:scopeIdentity.scope,scopeRef:scopeIdentity.scopeRef,signal:input.signal}),{status:"succeeded",installation:Object.freeze({...input.installation,state:"active"})})):failure("unsupported_scope")}catch(error2){return isInvalidInstallationError(error2)?failure("invalid_installation"):input.signal?.aborted?cancelled():failure("activation_failed")}},async rollback(input){if(input.signal?.aborted)return cancelled();let scopeIdentity;try{return scopeIdentity=normalizeScopeIdentity(input.scope,input.scopeRef),supportsScope(scopeIdentity.scope)?(validateInstallation(input.failed),validateInstallation(input.previous),input.failed.state!=="installed"&&input.failed.state!=="active"||input.previous.state!=="active"||input.failed.pluginId!==input.previous.pluginId||input.failed.scope!==scopeIdentity.scope||input.previous.scope!==scopeIdentity.scope||(input.failed.scopeRef??DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1)!==scopeIdentity.scopeRef||(input.previous.scopeRef??DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1)!==scopeIdentity.scopeRef?failure("invalid_installation"):(await options.host.rollback({failed:input.failed,previous:input.previous,scope:scopeIdentity.scope,scopeRef:scopeIdentity.scopeRef,signal:input.signal}),{status:"succeeded",installation:Object.freeze({...input.previous,state:"active"})})):failure("unsupported_scope")}catch(error2){return isInvalidInstallationError(error2)?failure("invalid_installation"):input.signal?.aborted?cancelled():failure("rollback_failed")}},async remove(input){if(input.signal?.aborted)return cancelled();let scopeIdentity;try{if(scopeIdentity=normalizeScopeIdentity(input.scope,input.scopeRef),!supportsScope(scopeIdentity.scope))return failure("unsupported_scope");validateInstallation(input.installation)}catch{return failure("invalid_installation")}if(input.installation.state!=="installed"&&input.installation.state!=="active"&&input.installation.state!=="retained"||input.installation.scope!==scopeIdentity.scope||(input.installation.scopeRef??DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1)!==scopeIdentity.scopeRef)return failure("invalid_installation");if(options.host.uninstall===void 0)return failure("uninstall_failed");try{return await options.host.uninstall({installation:input.installation,scope:scopeIdentity.scope,scopeRef:scopeIdentity.scopeRef,signal:input.signal}),{status:"succeeded",installation:Object.freeze({...input.installation,state:"retained"})}}catch{return input.signal?.aborted?cancelled():failure("uninstall_failed")}}}}var MAX_PLUGIN_ACQUISITION_REF_CHARS_V1=2048,MAX_PLUGIN_ACQUISITION_NPM_NAME_CHARS_V1=214,ACQUISITION_ERROR_MESSAGES_V1={invalid_ref:"Plugin ref is invalid",unsupported_local_ref:"Local plugin ref exists but is neither a directory nor a .zip/.tgz file",unsupported_scheme:"Plugin ref URL scheme is not supported",invalid_digest_fragment:"Plugin ref #sha256 digest fragment is invalid",invalid_npm_ref:"Plugin npm package ref is invalid",cancelled:"Plugin package acquisition was cancelled",download_failed:"Plugin package download failed",package_not_found:"Plugin npm package was not found on the registry",version_not_found:"No npm package version matches the requested range",digest_mismatch:"Plugin package bytes do not match the expected digest",unsupported_media_type:"Plugin package bytes are neither a zip nor a tgz",package_invalid:"Plugin package contents are invalid",budget_exceeded:"Plugin package exceeds the configured size budget",release_not_found:"Plugin release was not found",release_asset_not_found:"Plugin release has no .zip/.tgz asset",release_asset_ambiguous:"Plugin release has multiple .zip/.tgz assets",rate_limited:"Plugin release API rate limit was exceeded"},PluginAcquisitionErrorV1=class extends Error{code;constructor(code,detail){super(detail===void 0||detail.length===0?ACQUISITION_ERROR_MESSAGES_V1[code]:`${ACQUISITION_ERROR_MESSAGES_V1[code]}: ${detail}`),this.name="PluginAcquisitionErrorV1",this.code=code}},DIGEST_FRAGMENT_SUFFIX_V1=/^#sha256:([0-9a-fA-F]{64})$/u;function boundedRef(ref){if(typeof ref!="string"||ref.length===0||ref.length>2048||/[\u0000-\u001f\s]/u.test(ref))throw new PluginAcquisitionErrorV1("invalid_ref");return ref}function splitDigestFragment(ref){let hash=ref.lastIndexOf("#");if(hash<0)return{value:ref};let fragment=ref.slice(hash),match2=DIGEST_FRAGMENT_SUFFIX_V1.exec(fragment);if(match2===null)throw new PluginAcquisitionErrorV1("invalid_digest_fragment");return{value:ref.slice(0,hash),digestHex:match2[1].toLowerCase()}}function ownerRepoTag(kind,value,digestHex){let match2=/^([A-Za-z0-9][A-Za-z0-9._-]{0,99})\/([A-Za-z0-9][A-Za-z0-9._-]{0,99})(?:@([A-Za-z0-9][A-Za-z0-9._+-]{0,127}))?$/u.exec(value);if(match2===null)throw new PluginAcquisitionErrorV1("invalid_ref");return{kind,owner:match2[1],repo:match2[2],...match2[3]===void 0?{}:{tag:match2[3]},...digestHex===void 0?{}:{expectedDigestHex:digestHex}}}function parseUrlRef(value,digestHex){let parsed;try{parsed=new URL(value)}catch{throw new PluginAcquisitionErrorV1("invalid_ref")}if(parsed.username!==""||parsed.password!=="")throw new PluginAcquisitionErrorV1("invalid_ref");if(parsed.hash!=="")throw new PluginAcquisitionErrorV1("invalid_digest_fragment");return{kind:"url",url:parsed.toString(),...digestHex===void 0?{}:{expectedDigestHex:digestHex}}}var NPM_RANGE_V1=/^(?:latest|[~^]?\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?)$/u,NPM_NAME_V1=/^@?[a-z0-9][a-z0-9-._]*(?:\/[a-z0-9][a-z0-9-._]*)?$/u;function parseNpmRef(ref){let at=ref.lastIndexOf("@"),name=at>0?ref.slice(0,at):ref,range2=at>0?ref.slice(at+1):void 0;if(name.length===0||name.length>214||!NPM_NAME_V1.test(name)||name.startsWith("@")&&!name.includes("/")||!name.startsWith("@")&&name.includes("/"))throw new PluginAcquisitionErrorV1("invalid_npm_ref");if(range2!==void 0&&!NPM_RANGE_V1.test(range2))throw new PluginAcquisitionErrorV1("invalid_npm_ref");return{kind:"npm",name,...range2===void 0?{}:{range:range2}}}function isLocalPackageFile(path15){let value=path15.toLowerCase();return value.endsWith(".zip")||value.endsWith(".tgz")||value.endsWith(".tar.gz")}function parsePluginAcquisitionRefV1(ref,probe){let value=boundedRef(ref);if(/^[a-zA-Z]:[\\/]/u.test(value))return localRef(value,probe);let scheme=/^([a-zA-Z][a-zA-Z\d+.-]*):/u.exec(value);if(scheme!==null){let prefix=scheme[1].toLowerCase(),stripped=splitDigestFragment(value);if(prefix==="github"||prefix==="gitee")return ownerRepoTag(prefix,stripped.value.slice(prefix.length+1),stripped.digestHex);if(prefix==="http"||prefix==="https")return parseUrlRef(stripped.value,stripped.digestHex);throw new PluginAcquisitionErrorV1("unsupported_scheme")}return localRef(value,probe)}function localRef(value,probe){let stat5=probe.statLocalRef(value);if(stat5==="directory")return{kind:"local-path",path:value};if(stat5==="file"){if(!isLocalPackageFile(value))throw new PluginAcquisitionErrorV1("unsupported_local_ref");return{kind:"local-file",path:value}}if(stat5==="other")throw new PluginAcquisitionErrorV1("unsupported_local_ref");return parseNpmRef(value)}function isPluginAcquisitionRefTargetV1(target){if(typeof target!="string"||target.length===0)return!1;if(target.startsWith("@")||/^[a-zA-Z]:[\\/]/u.test(target)||target.startsWith("/")||target.startsWith("\\")||target.startsWith("./")||target.startsWith(".\\")||target.startsWith("../")||target.startsWith("..\\")||/[:#]/u.test(target)||/[\\/]/u.test(target))return!0;let at=target.lastIndexOf("@");if(at>0){let suffix=target.slice(at+1);if(suffix==="latest"||suffix.startsWith("^")||suffix.startsWith("~"))return!0}return!1}var PLUGIN_SELECTION_VERSION_V1=1,MAX_PLUGIN_SELECTION_ID_CHARS_V1=128,MAX_PLUGIN_SELECTION_IDS_V1=128,PluginSelectionErrorV1=class extends Error{code;pluginId;constructor(code,message,pluginId){super(message),this.name="PluginSelectionErrorV1",this.code=code,this.pluginId=pluginId}};function validateId(value,label){if(typeof value!="string"||value.trim().length===0)throw new PluginSelectionErrorV1(label==="profileId"?"invalid_profile_id":"invalid_plugin_id",`${label} must be a non-empty string`,typeof value=="string"?value:void 0);if(value.length>MAX_PLUGIN_SELECTION_ID_CHARS_V1)throw new PluginSelectionErrorV1(label==="profileId"?"profile_id_too_long":"plugin_id_too_long",`${label} must be at most ${MAX_PLUGIN_SELECTION_ID_CHARS_V1} characters`,value);return value}function normalizeIds(ids,label){if(ids===void 0)return[];if(!Array.isArray(ids)||ids.length>MAX_PLUGIN_SELECTION_IDS_V1)throw new PluginSelectionErrorV1("too_many_plugin_ids",`${label} must contain at most ${MAX_PLUGIN_SELECTION_IDS_V1} plugin IDs`);let seen=new Set,normalized=[];for(let candidate of ids){let id=validateId(candidate,"pluginId");if(seen.has(id))throw new PluginSelectionErrorV1("duplicate_plugin_id",`${label} contains duplicate plugin ID: ${id}`,id);seen.add(id),normalized.push(id)}return normalized.sort((left,right)=>left.localeCompare(right)),Object.freeze(normalized)}function assertKnownIds(ids,knownIds){for(let id of ids)if(!knownIds.has(id))throw new PluginSelectionErrorV1("unknown_plugin_id",`Selection references unknown plugin ID: ${id}`,id)}function createPluginSelectionV1(input){let profileId=validateId(input.profileId,"profileId"),selectedPluginIds=normalizeIds(input.selectedPluginIds,"selectedPluginIds"),disabledPluginIds=normalizeIds(input.disabledPluginIds,"disabledPluginIds");return Object.freeze({version:PLUGIN_SELECTION_VERSION_V1,profileId,selectedPluginIds,disabledPluginIds})}function resolvePluginSelectionV1(input){for(let manifest of input.manifests)validateId(manifest.id,"pluginId");let knownIds=new Set(input.manifests.map(manifest=>manifest.id)),provisional=createPluginSelectionV1(input.selection);if(input.selection.selectedPluginIds===void 0&&knownIds.size>MAX_PLUGIN_SELECTION_IDS_V1)throw new PluginSelectionErrorV1("too_many_plugin_ids",`discovered plugin IDs exceed the selection limit of ${MAX_PLUGIN_SELECTION_IDS_V1}`);let selectedPluginIds=input.selection.selectedPluginIds===void 0?Object.freeze([...knownIds].sort((a,b2)=>a.localeCompare(b2))):provisional.selectedPluginIds,selection=Object.freeze({...provisional,selectedPluginIds});assertKnownIds(selection.selectedPluginIds,knownIds),assertKnownIds(selection.disabledPluginIds,knownIds);let catalog=buildPluginCatalogV1({manifests:input.manifests,host:input.host,required:input.required,disabledPluginIds:selection.disabledPluginIds,availableCapabilities:input.availableCapabilities,maxEntries:input.maxEntries}),selected=new Set(selection.selectedPluginIds),selectedCatalog=buildPluginCatalogV1({manifests:input.manifests.filter(manifest=>selected.has(manifest.id)),host:input.host,required:input.required,disabledPluginIds:selection.disabledPluginIds,availableCapabilities:input.availableCapabilities,maxEntries:Math.max(input.maxEntries??MAX_PLUGIN_SELECTION_IDS_V1,selection.selectedPluginIds.length)});if(selectedCatalog.truncated){let selectedEntryIds=new Set(selectedCatalog.entries.map(entry=>entry.pluginId)),omitted=selection.selectedPluginIds.find(id=>!selectedEntryIds.has(id));if(omitted!==void 0)throw new PluginSelectionErrorV1("catalog_truncated",`Catalog truncation omitted selected plugin ID: ${omitted}`,omitted)}let entries=Object.freeze(selectedCatalog.entries),diagnostics=Object.freeze(entries.flatMap(entry=>entry.resolution.diagnostics));return Object.freeze({selection,catalog,entries,diagnostics})}function serializePluginSelectionV1(selection){let normalized=createPluginSelectionV1(selection);return JSON.stringify(normalized)}var PLUGIN_ECOSYSTEM_CLI_VERSION_V1=1,MAX_PLUGIN_ECOSYSTEM_CLI_OUTPUT_BYTES_V1=64*1024,MAX_PLUGIN_ECOSYSTEM_CLI_LIST_ENTRIES_V1=128,MAX_PLUGIN_ECOSYSTEM_CLI_ARGS_V1=MAX_PLUGIN_SELECTION_IDS_V1+8,PLUGIN_ECOSYSTEM_CLI_COMMAND_USAGE_V1="catalog list | catalog-list | state list | state-list | selection list | selection-list | selection set <profile> <pluginId\u2026> | selection-set <profile> <pluginId\u2026> | selection clear <profile> | selection-clear <profile> | enable <pluginId[@version]> | disable <pluginId[@version]> | remove <pluginId[@version]> | state enable|disable|remove <pluginId[@version]> | install <pluginId[@version] | ref> | update <pluginId[@version]> [--scope global|project] [--json | --text | --format json|text]";function invalidInput(message){throw new Error(message)}var COMMAND_NAME_ALIASES_V1=Object.freeze({"catalog-list":["catalog","list"],"state-list":["state","list"],"selection-list":["selection","list"],"selection-set":["selection","set"],"selection-clear":["selection","clear"]});function validateToken(value,label){return(value.length===0||value.length>256||/[\u0000-\u001f\s]/u.test(value))&&invalidInput(`${label} is invalid`),value}function parseIdentity(value){let token=validateToken(value,"plugin identity"),at=token.lastIndexOf("@");if(at<=0)return{pluginId:token};let pluginId=token.slice(0,at),pluginVersion=token.slice(at+1);return pluginVersion.length===0&&invalidInput("plugin version is invalid"),{pluginId:validateToken(pluginId,"plugin ID"),pluginVersion:validateToken(pluginVersion,"plugin version")}}function parsePluginEcosystemCliCommandV1(argv,defaultFormat="text"){(!Array.isArray(argv)||argv.length===0||argv.length>MAX_PLUGIN_ECOSYSTEM_CLI_ARGS_V1)&&invalidInput("ecosystem command is invalid");let format=defaultFormat;format!=="json"&&format!=="text"&&invalidInput("output format is invalid");let args=[...argv],explicitFormat,scope,pluginIdsOption;for(let index3=args.length-1;index3>=0;index3-=1){let token=args[index3],selectedScope=(token.startsWith("--scope=")?token.slice(8):void 0)??(token==="--scope"?args[index3+1]:void 0);if(selectedScope!==void 0){selectedScope!=="global"&&selectedScope!=="project"&&invalidInput("state scope is invalid"),scope!==void 0&&scope!==selectedScope&&invalidInput("state scope is specified more than once"),scope=selectedScope,args.splice(index3,token==="--scope"?2:1);continue}let inlineFormat=token.startsWith("--format=")?token.slice(9):void 0,selected=token==="--json"||token==="--text"?token==="--json"?"json":"text":inlineFormat??(token==="--format"?args[index3+1]:void 0);if(selected!==void 0){selected!=="json"&&selected!=="text"&&invalidInput("output format is invalid"),explicitFormat!==void 0&&explicitFormat!==selected&&invalidInput("output format is specified more than once"),explicitFormat=selected,format=explicitFormat,args.splice(index3,token==="--format"?2:1);continue}let selectedPlugins=(token.startsWith("--plugins=")?token.slice(10):void 0)??(token==="--plugins"?args[index3+1]:void 0);if(selectedPlugins!==void 0){pluginIdsOption!==void 0&&invalidInput("plugin IDs are specified more than once");let ids=selectedPlugins.split(",");ids.length>MAX_PLUGIN_SELECTION_IDS_V1&&invalidInput("too many plugin IDs"),pluginIdsOption=Object.freeze(ids.map(id=>validateToken(id,"plugin ID"))),args.splice(index3,token==="--plugins"?2:1)}}args.length===0&&invalidInput("ecosystem command is invalid");let commandAlias=COMMAND_NAME_ALIASES_V1[args[0]];commandAlias!==void 0&&(args=[...commandAlias,...args.slice(1)]);let[group,action,target,...rest]=args;if(group==="selection"&&action==="set"&&target!==void 0){pluginIdsOption!==void 0&&rest.length>0&&invalidInput("plugin IDs must use one input form");let selectedPluginIds=pluginIdsOption??Object.freeze(rest.map(id=>validateToken(id,"plugin ID")));return selectedPluginIds.length>MAX_PLUGIN_SELECTION_IDS_V1&&invalidInput("too many plugin IDs"),Object.freeze({version:1,command:"selection-set",format,profileId:validateToken(target,"profile ID"),selectedPluginIds,...scope===void 0?{}:{scope}})}if(rest.length>0&&invalidInput("ecosystem command has unsupported arguments"),group==="catalog"&&action==="list"&&target===void 0)return Object.freeze({version:1,command:"catalog-list",format,...scope===void 0?{}:{scope}});if(group==="state"&&action==="list"&&target===void 0)return Object.freeze({version:1,command:"state-list",format,...scope===void 0?{}:{scope}});if(group==="selection"&&action==="list"&&target===void 0)return Object.freeze({version:1,command:"selection-list",format,...scope===void 0?{}:{scope}});if(group==="selection"&&action==="clear"&&target!==void 0)return Object.freeze({version:1,command:"selection-clear",format,profileId:validateToken(target,"profile ID"),...scope===void 0?{}:{scope}});if(group==="state"&&(action==="enable"||action==="disable"||action==="remove")&&target){let identity=parseIdentity(target);return Object.freeze({version:1,command:action,format,...scope===void 0?{}:{scope},...identity})}if((group==="enable"||group==="disable"||group==="remove")&&action){let identity=parseIdentity(action);return Object.freeze({version:1,command:group,format,...scope===void 0?{}:{scope},...identity})}if((group==="install"||group==="update")&&action){let identity=parseIdentity(action);return Object.freeze({version:1,command:group,format,target:action,...scope===void 0?{}:{scope},...identity})}invalidInput("ecosystem command is invalid")}function response(command,format,status2,error2,data){let safeData=data===void 0?void 0:boundData(data);if(safeData!==void 0&&Array.isArray(safeData.entries)){let entries=[...safeData.entries],originalEntryCount=entries.length;for(;entries.length>0;){let candidate={...safeData,entries,...entries.length<safeData.entries.length?{truncated:!0}:{}};if(responseWithinBudget(command,format,status2,error2,candidate)){safeData=Object.freeze(candidate);break}entries=entries.slice(0,-1)}entries.length===0&&originalEntryCount>0&&(safeData=Object.freeze({entries:Object.freeze([]),truncated:!0}))}responseWithinBudget(command,format,status2,error2,safeData)||(safeData=Object.freeze({truncated:!0}));let base=responseBase(command,format,status2,error2,safeData),humanText=error2?`${status2}: ${error2.message}`:formatText(command,status2,safeData),text=format==="json"?JSON.stringify(base):humanText;return Object.freeze({...base,text:boundText(text)})}function responseWithinBudget(command,format,status2,error2,data){let base=responseBase(command,format,status2,error2,data),humanText=error2?`${status2}: ${error2.message}`:formatText(command,status2,data),text=format==="json"?JSON.stringify(base):humanText;return responseByteLength({...base,text:boundText(text)})<=MAX_PLUGIN_ECOSYSTEM_CLI_OUTPUT_BYTES_V1}function responseBase(command,format,status2,error2,data){return{version:PLUGIN_ECOSYSTEM_CLI_VERSION_V1,command,format,status:status2,...data===void 0?{}:{data},...error2===void 0?{}:{error:error2}}}function responseByteLength(value){return Buffer2.byteLength(JSON.stringify(value),"utf8")}function boundText(value){if(Buffer2.byteLength(value,"utf8")<=MAX_PLUGIN_ECOSYSTEM_CLI_OUTPUT_BYTES_V1)return value;let suffix=`
|
|
504
504
|
[output truncated]`,lower=0,upper=value.length;for(;lower<upper;){let middle=Math.ceil((lower+upper)/2);Buffer2.byteLength(`${value.slice(0,middle)}${suffix}`,"utf8")<=MAX_PLUGIN_ECOSYSTEM_CLI_OUTPUT_BYTES_V1?lower=middle:upper=middle-1}return`${value.slice(0,lower)}${suffix}`}function boundData(data){let list=data.entries;return!Array.isArray(list)||list.length<=MAX_PLUGIN_ECOSYSTEM_CLI_LIST_ENTRIES_V1?Object.freeze({...data}):Object.freeze({...data,entries:Object.freeze(list.slice(0,MAX_PLUGIN_ECOSYSTEM_CLI_LIST_ENTRIES_V1)),truncated:!0})}function formatText(command,status2,data){if(data===void 0)return`${status2}: ${command}`;let entries=data.entries;if(Array.isArray(entries)){let lines=entries.map(entry=>{if(typeof entry!="object"||entry===null)return String(entry);let item=entry,id=typeof item.profileId=="string"?`profile:${item.profileId}`:typeof item.pluginId=="string"?item.pluginId:"plugin",version=typeof item.pluginVersion=="string"?`@${item.pluginVersion}`:"",state2=typeof item.status=="string"?` ${item.status}`:typeof item.lifecycle=="string"?` ${item.lifecycle}`:"";return`${id}${version}${state2}`});return[`${status2}: ${command}`,...lines,...data.truncated===!0?["[output truncated]"]:[]].join(`
|
|
505
505
|
`)}if(typeof data.profileId=="string"){let selected=Array.isArray(data.selectedPluginIds)?` selected=${data.selectedPluginIds.join(",")}`:"",disabled=Array.isArray(data.disabledPluginIds)?` disabled=${data.disabledPluginIds.join(",")}`:"";return`${status2}: ${command} profile:${data.profileId}${selected}${disabled}`}return`${status2}: ${command}`}function safeError(code){return Object.freeze({code,message:{invalid_command:"The plugin ecosystem command is invalid",unsupported_dependencies:"The plugin ecosystem operation is unavailable on this host",not_found:"The requested plugin was not found",not_installed:"The requested plugin is not installed",registry_failed:"The plugin registry operation failed",acquisition_failed:"The plugin package acquisition failed",distribution_failed:"The plugin distribution operation failed",incompatible:"The requested plugin is incompatible with this host",already_installed:"This plugin version is already installed in the requested scope",installer_failed:"The plugin installer operation failed",uninstall_failed:"The host plugin uninstall operation failed",state_failed:"The plugin state operation failed",selection_failed:"The plugin selection operation failed",cancelled:"Plugin ecosystem operation was cancelled"}[code]})}function invalidCommandError(argv,cause){let genericCauses=new Set(["ecosystem command is invalid","ecosystem command has unsupported arguments"]),causeMessage=cause instanceof Error?cause.message:void 0,reason=causeMessage!==void 0&&!genericCauses.has(causeMessage)?` (${causeMessage})`:"";return Object.freeze({code:"invalid_command",message:`The plugin ecosystem command is invalid: received argv [${argv.join(" ")}]${reason}; valid commands: ${PLUGIN_ECOSYSTEM_CLI_COMMAND_USAGE_V1}`})}function isCancelled(signal){return signal?.aborted===!0}function stateStoreOf(options,scope){return scope==="project"?options.projectStateStore:options.stateStore??options.stateHost}function operationScope(scope){return scope??"global"}function scopeRefOf(options,scope){return scope==="global"?DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1:options.projectScopeRef}function installerSupportsScope(installer,scope){return installer?.supportedScopes?.includes(scope)===!0}function selectionStoreOf(options,scope){return scope==="project"?options.projectSelectionStore:options.selectionStore??options.selectionHost}function stateEntry(record){return Object.freeze({pluginId:record.pluginId,pluginVersion:record.pluginVersion,manifestDigest:record.manifestDigest,scope:record.state.scope,scopeRef:record.state.scopeRef,enabled:record.state.enabled,lifecycle:record.state.lifecycle,...record.source===void 0?{}:{source:record.source}})}function selectionEntry(selection){return Object.freeze({profileId:selection.profileId,selectedPluginIds:Object.freeze([...selection.selectedPluginIds]),disabledPluginIds:Object.freeze([...selection.disabledPluginIds])})}function catalogEntry(entry){return Object.freeze({pluginId:entry.pluginId,pluginVersion:entry.pluginVersion,manifestDigest:entry.manifestDigest,status:entry.resolution.status,diagnosticCodes:Object.freeze(entry.resolution.diagnostics.map(item=>item.code).slice(0,16))})}function findStateRecord(records,pluginId,pluginVersion,scope,scopeRef){return records.find(record=>record.pluginId===pluginId&&(pluginVersion===void 0||record.pluginVersion===pluginVersion)&&(scope===void 0||record.state.scope===scope)&&(scopeRef===void 0||record.state.scopeRef===scopeRef))}function findCurrentStateRecord(records,pluginId,scope,scopeRef){return records.find(record=>record.pluginId===pluginId&&(scope===void 0||record.state.scope===scope)&&(scopeRef===void 0||record.state.scopeRef===scopeRef)&&record.state.lifecycle==="active")??findStateRecord(records,pluginId,void 0,scope,scopeRef)}function requireDependencies(options,scope,scopeRef){let requestedScope=operationScope(scope);if(!options.registry||!options.installer||scopeRef===void 0||!installerSupportsScope(options.installer,requestedScope)||!stateStoreOf(options,requestedScope)||!options.host)throw new Error("unsupported dependencies")}async function listManifests(options,signal){if(options.registry?.list)return await options.registry.list({signal});if(options.manifests)return options.manifests;throw new Error("unsupported dependencies")}function checkSignal(signal){if(isCancelled(signal))throw new Error("cancelled")}function createPluginEcosystemCliV1(options){let installTransactionTail=Promise.resolve();async function acquireInstallTransaction(){let release,turn=new Promise(resolve25=>{release=resolve25}),previous=installTransactionTail;return installTransactionTail=previous.then(()=>turn,()=>turn),await previous,release}async function execute(input){let parsed;try{parsed=parsePluginEcosystemCliCommandV1(input.argv,input.format??"text")}catch(error2){return response("invalid",input.format==="json"?"json":"text","failed",invalidCommandError(input.argv,error2))}let releaseInstallTransaction=parsed.command==="install"||parsed.command==="update"?await acquireInstallTransaction():void 0;try{let signal=input.signal,requestedScope=operationScope(parsed.scope),scopeRef=scopeRefOf(options,requestedScope);if(isCancelled(signal))return response(parsed.command,parsed.format,"cancelled",safeError("cancelled"));if(scopeRef===void 0)return response(parsed.command,parsed.format,"unsupported",safeError("unsupported_dependencies"));let phase="registry";try{if(parsed.command==="catalog-list"){if(!options.host)return response(parsed.command,parsed.format,"unsupported",safeError("unsupported_dependencies"));let manifests2=await listManifests(options,signal);checkSignal(signal);let snapshot2=buildPluginCatalogV1({manifests:manifests2,host:options.host,maxEntries:MAX_PLUGIN_ECOSYSTEM_CLI_LIST_ENTRIES_V1});return response(parsed.command,parsed.format,"succeeded",void 0,{version:snapshot2.version,entries:snapshot2.entries.map(catalogEntry),truncated:snapshot2.truncated})}if(parsed.command==="selection-list"){phase="selection";let selectionStore=selectionStoreOf(options,parsed.scope);if(!selectionStore)return response(parsed.command,parsed.format,"unsupported",safeError("unsupported_dependencies"));let result=await selectionStore.read({signal});return result.status==="cancelled"?response(parsed.command,parsed.format,"cancelled",safeError("cancelled")):result.status==="invalid"?response(parsed.command,parsed.format,"failed",safeError("selection_failed")):response(parsed.command,parsed.format,"succeeded",void 0,{version:result.snapshot.version,scope:parsed.scope??"global",entries:result.snapshot.selections.map(selectionEntry),truncated:!1})}if(parsed.command==="selection-set"){phase="selection";let selectionStore=selectionStoreOf(options,parsed.scope);if(!selectionStore)return response(parsed.command,parsed.format,"unsupported",safeError("unsupported_dependencies"));let selection;try{selection=createPluginSelectionV1({profileId:parsed.profileId,selectedPluginIds:parsed.selectedPluginIds??[],disabledPluginIds:[]})}catch{return response(parsed.command,parsed.format,"failed",safeError("selection_failed"))}let result=await selectionStore.set({selection,signal});return result.status==="cancelled"?response(parsed.command,parsed.format,"cancelled",safeError("cancelled")):result.status!=="ok"?response(parsed.command,parsed.format,"failed",safeError("selection_failed")):response(parsed.command,parsed.format,"succeeded",void 0,{profileId:selection.profileId,scope:parsed.scope??"global",selectedPluginIds:selection.selectedPluginIds,disabledPluginIds:selection.disabledPluginIds,changed:result.changed})}if(parsed.command==="selection-clear"){phase="selection";let selectionStore=selectionStoreOf(options,parsed.scope);if(!selectionStore)return response(parsed.command,parsed.format,"unsupported",safeError("unsupported_dependencies"));let result=await selectionStore.clear({profileId:parsed.profileId,signal});return result.status==="cancelled"?response(parsed.command,parsed.format,"cancelled",safeError("cancelled")):result.status!=="ok"?response(parsed.command,parsed.format,"failed",safeError("selection_failed")):response(parsed.command,parsed.format,"succeeded",void 0,{profileId:parsed.profileId,scope:parsed.scope??"global",changed:result.changed})}if(parsed.command==="state-list"){phase="state";let stateStore2=stateStoreOf(options,requestedScope);if(!stateStore2)return response(parsed.command,parsed.format,"unsupported",safeError("unsupported_dependencies"));let result=await stateStore2.read({signal});if(result.status==="cancelled")return response(parsed.command,parsed.format,"cancelled",safeError("cancelled"));if(result.status==="invalid")return response(parsed.command,parsed.format,"failed",safeError("state_failed"));let records=result.snapshot.records.filter(record=>record.state.scope===requestedScope&&record.state.scopeRef===scopeRef);return response(parsed.command,parsed.format,"succeeded",void 0,{version:result.snapshot.version,entries:records.map(stateEntry),truncated:!1})}if(parsed.command==="enable"||parsed.command==="disable"||parsed.command==="remove"){if(phase="state",parsed.command==="remove"&&requestedScope==="project"&&!installerSupportsScope(options.installer,requestedScope))return response(parsed.command,parsed.format,"unsupported",safeError("unsupported_dependencies"));let stateStore2=stateStoreOf(options,requestedScope);if(!stateStore2)return response(parsed.command,parsed.format,"unsupported",safeError("unsupported_dependencies"));let current=await stateStore2.read({signal});if(current.status==="cancelled")return response(parsed.command,parsed.format,"cancelled",safeError("cancelled"));if(current.status==="invalid")return response(parsed.command,parsed.format,"failed",safeError("state_failed"));let record=parsed.pluginVersion===void 0?findCurrentStateRecord(current.snapshot.records,parsed.pluginId,requestedScope,scopeRef):findStateRecord(current.snapshot.records,parsed.pluginId,parsed.pluginVersion,requestedScope,scopeRef);if(!record)return response(parsed.command,parsed.format,"failed",safeError("not_installed"));if(parsed.command==="remove"){if(options.installer!==void 0){let removedFromHost;try{removedFromHost=await options.installer.remove({installation:{version:1,pluginId:record.pluginId,pluginVersion:record.pluginVersion,manifestDigest:record.manifestDigest,scope:record.state.scope,scopeRef:record.state.scopeRef,installationRef:record.installationRef,state:record.state.lifecycle},scope:requestedScope,scopeRef,signal})}catch{return response(parsed.command,parsed.format,"failed",safeError("uninstall_failed"))}if(removedFromHost.status!=="succeeded")return response(parsed.command,parsed.format,removedFromHost.status==="cancelled"?"cancelled":"failed",safeError(removedFromHost.status==="cancelled"?"cancelled":"uninstall_failed"))}let removed=await stateStore2.remove({pluginId:record.pluginId,pluginVersion:record.pluginVersion,scope:requestedScope,scopeRef,signal});return removed.status==="cancelled"?response(parsed.command,parsed.format,"cancelled",safeError("cancelled")):removed.status!=="ok"?response(parsed.command,parsed.format,"failed",safeError("state_failed")):response(parsed.command,parsed.format,"succeeded",void 0,{pluginId:record.pluginId,pluginVersion:record.pluginVersion,...options.installer===void 0?{}:{hostRemoved:!0},changed:removed.changed})}let enabled=parsed.command==="enable",updated=await stateStore2.upsert({installation:{version:1,pluginId:record.pluginId,pluginVersion:record.pluginVersion,manifestDigest:record.manifestDigest,scope:record.state.scope,scopeRef:record.state.scopeRef,installationRef:record.installationRef,state:record.state.lifecycle},scope:requestedScope,enabled,...record.source===void 0?{}:{source:record.source},signal});return updated.status==="cancelled"?response(parsed.command,parsed.format,"cancelled",safeError("cancelled")):updated.status!=="ok"?response(parsed.command,parsed.format,"failed",safeError("state_failed")):response(parsed.command,parsed.format,"succeeded",void 0,{pluginId:record.pluginId,pluginVersion:record.pluginVersion,enabled,changed:updated.changed})}let stateStore=stateStoreOf(options,requestedScope),installer=options.installer,host=options.host,acquisitionTarget=parsed.command==="install"&&parsed.target!==void 0&&isPluginAcquisitionRefTargetV1(parsed.target)?parsed.target:void 0;if(!stateStore||!installer||!host||!installerSupportsScope(installer,requestedScope)||acquisitionTarget===void 0&&!options.registry)return response(parsed.command,parsed.format,"unsupported",safeError("unsupported_dependencies"));let runInstallFlow=async resolved=>{phase="state";let current=await stateStore.read({signal});if(current.status==="cancelled")return response(parsed.command,parsed.format,"cancelled",safeError("cancelled"));if(current.status==="invalid")return response(parsed.command,parsed.format,"failed",safeError("state_failed"));let previous=findCurrentStateRecord(current.snapshot.records,resolved.manifest.id,requestedScope,scopeRef);if(findStateRecord(current.snapshot.records,resolved.manifest.id,resolved.manifest.pluginVersion,requestedScope,scopeRef)!==void 0)return response(parsed.command,parsed.format,"failed",safeError("already_installed"));if(parsed.command==="update"&&(!previous||previous.state.lifecycle!=="active"))return response(parsed.command,parsed.format,"failed",safeError("not_installed"));phase="installer";let verified=installer.prepare({manifest:resolved.manifest,source:resolved.source,host,...resolved.expectedDigest===void 0?{}:{expectedDigest:resolved.expectedDigest}});if(verified.status!=="verified")return response(parsed.command,parsed.format,"failed",safeError("incompatible"));let artifact=resolved.acquired?.artifact;if(resolved.distribution!==void 0){if(options.distribution===void 0)return response(parsed.command,parsed.format,"unsupported",safeError("unsupported_dependencies"));phase="distribution";let descriptor=options.distribution.validateDescriptor(resolved.distribution);if(descriptor.pluginId!==verified.record.pluginId||descriptor.pluginVersion!==verified.record.pluginVersion||descriptor.manifestDigest!==verified.record.manifestDigest)return response(parsed.command,parsed.format,"failed",safeError("incompatible"));artifact=await options.distribution.acquireArtifact({descriptor,signal})}let artifactReleased=!1,releaseArtifact=async()=>{if(artifact===void 0||artifactReleased)return!0;let previousPhase=phase;phase="distribution";try{return resolved.acquired!==void 0?await resolved.acquired.release()?(artifactReleased=!0,phase=previousPhase,!0):!1:options.distribution===void 0?!1:(await options.distribution.releaseArtifact({artifact}),artifactReleased=!0,phase=previousPhase,!0)}catch{return!1}},transactionResponse,transactionError,artifactCleanupFailed=!1;try{transactionResponse=await(async()=>{checkSignal(signal),phase="installer";let installed=await installer.install({record:verified.record,scope:requestedScope,scopeRef,...artifact===void 0?{}:{artifact},signal});if(installed.status!=="succeeded")return await releaseArtifact()?response(parsed.command,parsed.format,installed.status==="cancelled"?"cancelled":"failed",safeError(installed.status==="cancelled"?"cancelled":"installer_failed")):response(parsed.command,parsed.format,isCancelled(signal)?"cancelled":"failed",safeError(isCancelled(signal)?"cancelled":"distribution_failed"));let activated=await installer.activate({installation:installed.installation,record:verified.record,scope:requestedScope,scopeRef,signal});if(activated.status!=="succeeded")return previous&&previous.state.lifecycle==="active"&&(await installer.rollback({failed:installed.installation,previous:{version:1,pluginId:previous.pluginId,pluginVersion:previous.pluginVersion,manifestDigest:previous.manifestDigest,scope:previous.state.scope,scopeRef:previous.state.scopeRef,installationRef:previous.installationRef,state:"active"},scope:requestedScope,scopeRef,signal:void 0})).status!=="succeeded"||(await installer.remove({installation:installed.installation,scope:requestedScope,scopeRef})).status!=="succeeded"?response(parsed.command,parsed.format,"failed",safeError("installer_failed")):await releaseArtifact()?response(parsed.command,parsed.format,activated.status==="cancelled"?"cancelled":"failed",safeError(activated.status==="cancelled"?"cancelled":"installer_failed")):response(parsed.command,parsed.format,isCancelled(signal)?"cancelled":"failed",safeError(isCancelled(signal)?"cancelled":"distribution_failed"));let restoreActivatedInstallation=async()=>{let replacesPrevious=previous!==void 0&&`${previous.pluginId}@${previous.pluginVersion}`!=`${activated.installation.pluginId}@${activated.installation.pluginVersion}`;return replacesPrevious&&previous.state.lifecycle==="active"&&(await installer.rollback({failed:activated.installation,previous:{version:1,pluginId:previous.pluginId,pluginVersion:previous.pluginVersion,manifestDigest:previous.manifestDigest,scope:previous.state.scope,scopeRef:previous.state.scopeRef,installationRef:previous.installationRef,state:"active"},scope:requestedScope,scopeRef})).status!=="succeeded"?!1:previous!==void 0&&!replacesPrevious?!0:(await installer.remove({installation:activated.installation,scope:requestedScope,scopeRef})).status==="succeeded"},restoreState=async()=>{let replacesPrevious=previous!==void 0&&`${previous.pluginId}@${previous.pluginVersion}`!=`${activated.installation.pluginId}@${activated.installation.pluginVersion}`,restored=!0;if((previous===void 0||replacesPrevious)&&(restored=(await stateStore.remove({pluginId:activated.installation.pluginId,pluginVersion:activated.installation.pluginVersion,scope:requestedScope,scopeRef}).catch(()=>{}))?.status==="ok"),previous!==void 0){let restoredPrevious=await stateStore.upsert({installation:{version:1,pluginId:previous.pluginId,pluginVersion:previous.pluginVersion,manifestDigest:previous.manifestDigest,scope:previous.state.scope,scopeRef:previous.state.scopeRef,installationRef:previous.installationRef,state:"active"},scope:requestedScope,enabled:previous.state.enabled,...previous.source===void 0?{}:{source:previous.source}}).catch(()=>{});restored=restored&&restoredPrevious?.status==="ok"}return restored},stateFailure=async status2=>{let[hostRestored,stateRestored]=await Promise.all([restoreActivatedInstallation().catch(()=>!1),restoreState().catch(()=>!1)]);return response(parsed.command,parsed.format,hostRestored&&stateRestored?status2:"failed",safeError(hostRestored&&stateRestored?status2==="cancelled"?"cancelled":"state_failed":"installer_failed"))};if(!await releaseArtifact()){phase="installer";let restored=await restoreActivatedInstallation().catch(()=>!1);return response(parsed.command,parsed.format,"failed",safeError(restored?"distribution_failed":"installer_failed"))}if(phase="state",previous&&`${previous.pluginId}@${previous.pluginVersion}`!=`${installed.installation.pluginId}@${installed.installation.pluginVersion}`&&(await stateStore.upsert({installation:{version:1,pluginId:previous.pluginId,pluginVersion:previous.pluginVersion,manifestDigest:previous.manifestDigest,scope:previous.state.scope,scopeRef:previous.state.scopeRef,installationRef:previous.installationRef,state:"retained"},scope:requestedScope,enabled:previous.state.enabled,...previous.source===void 0?{}:{source:previous.source},signal:void 0})).status!=="ok")return await stateFailure("failed");let persisted=await stateStore.upsert({installation:activated.installation,scope:requestedScope,enabled:previous?.state.enabled??!0,...resolved.acquired===void 0?{}:{source:resolved.source},signal});return persisted.status==="cancelled"?await stateFailure("cancelled"):persisted.status!=="ok"?await stateFailure("failed"):response(parsed.command,parsed.format,"succeeded",void 0,{pluginId:activated.installation.pluginId,pluginVersion:activated.installation.pluginVersion,lifecycle:"active",changed:persisted.changed,...resolved.acquired===void 0?{}:{source:resolved.source}})})()}catch(error2){transactionError=error2}finally{artifactCleanupFailed=!await releaseArtifact()}if(artifactCleanupFailed)return response(parsed.command,parsed.format,"failed",safeError("distribution_failed"));if(transactionError!==void 0)throw transactionError;if(transactionResponse===void 0)throw new Error("plugin installation transaction did not complete");return transactionResponse};if(acquisitionTarget!==void 0){if(options.acquisition===void 0)return response(parsed.command,parsed.format,"unsupported",safeError("unsupported_dependencies"));phase="distribution";let acquired;try{acquired=await options.acquisition.resolvePackage({ref:acquisitionTarget,signal})}catch(error2){if(isCancelled(signal)||error2 instanceof PluginAcquisitionErrorV1&&error2.code==="cancelled")return response(parsed.command,parsed.format,"cancelled",safeError("cancelled"));if(error2 instanceof PluginAcquisitionErrorV1)return response(parsed.command,parsed.format,"failed",{code:"acquisition_failed",message:error2.message});throw error2}return checkSignal(signal),await runInstallFlow({manifest:acquired.manifest,source:acquired.source,acquired})}try{requireDependencies(options,requestedScope,scopeRef)}catch{return response(parsed.command,parsed.format,"unsupported",safeError("unsupported_dependencies"))}let identity=parsed.pluginId,packageValue=await options.registry.resolve({pluginId:identity,pluginVersion:parsed.pluginVersion,signal});return checkSignal(signal),!packageValue||packageValue.manifest.id!==identity||parsed.pluginVersion!==void 0&&packageValue.manifest.pluginVersion!==parsed.pluginVersion?response(parsed.command,parsed.format,"failed",safeError("not_found")):await runInstallFlow({manifest:packageValue.manifest,source:packageValue.source,...packageValue.expectedDigest===void 0?{}:{expectedDigest:packageValue.expectedDigest},...packageValue.distribution===void 0?{}:{distribution:packageValue.distribution}})}catch(error2){return isCancelled(signal)||error2 instanceof Error&&error2.message==="cancelled"?response(parsed.command,parsed.format,"cancelled",safeError("cancelled")):error2 instanceof Error&&error2.message==="unsupported dependencies"?response(parsed.command,parsed.format,"unsupported",safeError("unsupported_dependencies")):response(parsed.command,parsed.format,"failed",safeError(phase==="registry"?"registry_failed":phase==="distribution"?"distribution_failed":phase==="state"?"state_failed":phase==="selection"?"selection_failed":"installer_failed"))}}finally{releaseInstallTransaction?.()}}return{execute}}async function runPluginEcosystemCliV1(options,input){return await createPluginEcosystemCliV1(options).execute(input)}import{createHash}from"node:crypto";import{join as join13,resolve as resolve4}from"node:path";import{open as open2}from"node:fs/promises";import{isAbsolute as isAbsolute2,join as join11,relative as relative2}from"node:path";var NODE_DISK_REGISTRY_SOURCE_VERSION_V1=1,MAX_NODE_DISK_REGISTRY_INDEX_BYTES_V1=1024*1024,MAX_NODE_DISK_REGISTRY_MANIFEST_BYTES_V1=64*1024,MAX_NODE_DISK_REGISTRY_RECORDS_V1=256,INDEX_FILE_V1="index.v1.json",ECOSYSTEM_MANIFEST_FILE_V1="agent-forge.json",CAPABILITY_MANIFEST_FILE_V1="plugin.json",NODE_PACKAGE_FORMAT_VERSION_V1=1,NodeDiskRegistrySourceErrorV1=class extends Error{code;constructor(code,message){super(message),this.name="NodeDiskRegistrySourceErrorV1",this.code=code}},INDEX_KEYS_V1=["installationRef","directory","pluginId","pluginVersion","manifestDigest","scope","scopeRef","state"];function opaqueField(value,max){return typeof value=="string"&&value.length>0&&value.length<=max&&!/[\u0000-\u001f\u007f]/u.test(value)&&!/\s/u.test(value)&&!/^(?:file:|[a-z]:[\\/]|[\\/]{1,2}|\\\\)/iu.test(value)}function boundedField(value,max){return typeof value=="string"&&value.length>0&&value.length<=max&&!/[\u0000-\u001f\u007f]/u.test(value)}function withinRoot(root,value){if(!isAbsolute2(value))return!1;let relativePath=relative2(root,value);return relativePath!==""&&!relativePath.startsWith("..")&&!isAbsolute2(relativePath)}function validateRecord(root,value,index3){if(value===null||typeof value!="object"||Array.isArray(value))throw new NodeDiskRegistrySourceErrorV1("invalid_index",`Index record ${index3} is not an object`);let record=value,keys=INDEX_KEYS_V1;if(Object.keys(record).length!==keys.length||keys.some(key=>!(key in record)))throw new NodeDiskRegistrySourceErrorV1("invalid_index",`Index record ${index3} has an invalid schema`);if(!opaqueField(record.installationRef,2048)||!boundedField(record.directory,2048)||!boundedField(record.pluginId,256)||!boundedField(record.pluginVersion,256)||!boundedField(record.manifestDigest,512)||!opaqueField(record.scopeRef,2048)||record.scope!=="global"&&record.scope!=="project"||record.state!=="installed"&&record.state!=="active"&&record.state!=="retained"||!withinRoot(root,record.directory))throw new NodeDiskRegistrySourceErrorV1("invalid_index",`Index record ${index3} is invalid`);return{installationRef:record.installationRef,directory:record.directory,pluginId:record.pluginId,pluginVersion:record.pluginVersion,manifestDigest:record.manifestDigest,scope:record.scope,scopeRef:record.scopeRef,state:record.state}}function parseIndex(root,raw){let parsed;try{parsed=JSON.parse(raw)}catch{throw new NodeDiskRegistrySourceErrorV1("invalid_index","Install store index JSON is invalid")}if(parsed===null||typeof parsed!="object"||Array.isArray(parsed))throw new NodeDiskRegistrySourceErrorV1("invalid_index","Install store index is not an object");let value=parsed;if(Object.keys(value).length!==2||value.version!==NODE_DISK_REGISTRY_SOURCE_VERSION_V1||!Array.isArray(value.records))throw new NodeDiskRegistrySourceErrorV1("invalid_index","Install store index schema is unsupported");if(value.records.length>MAX_NODE_DISK_REGISTRY_RECORDS_V1)throw new NodeDiskRegistrySourceErrorV1("too_many_records","Install store index exceeds the record limit");return value.records.map((record,index3)=>validateRecord(root,record,index3))}async function readBoundedFile(path15,maxBytes,label){let handle=await open2(path15,"r");try{let stat5=await handle.stat();if(!stat5.isFile()||stat5.size>maxBytes)throw new NodeDiskRegistrySourceErrorV1(label==="index"?"invalid_index":"invalid_manifest",`${label} exceeds the size limit`);return await handle.readFile("utf8")}finally{await handle.close().catch(()=>{})}}function parseManifest(record,raw){let parsed;try{parsed=JSON.parse(raw)}catch{throw new NodeDiskRegistrySourceErrorV1("invalid_manifest","Installed plugin manifest JSON is invalid")}if(parsed===null||typeof parsed!="object"||Array.isArray(parsed))throw new NodeDiskRegistrySourceErrorV1("invalid_manifest","Installed plugin manifest is not an object");let value={...parsed};if(value.packageFormatVersion!==void 0&&value.packageFormatVersion!==NODE_PACKAGE_FORMAT_VERSION_V1)throw new NodeDiskRegistrySourceErrorV1("invalid_manifest","Installed plugin package format is unsupported");if(delete value.packageFormatVersion,value.id!==record.pluginId||value.pluginVersion!==record.pluginVersion)throw new NodeDiskRegistrySourceErrorV1("identity_mismatch",`Installed plugin manifest identity does not match index record for ${record.pluginId}@${record.pluginVersion}`);return value}async function readIndexRecords(rootDirectory,signal){if(signal?.aborted)throw new NodeDiskRegistrySourceErrorV1("cancelled","Disk registry source read was cancelled");let rawIndex;try{rawIndex=await readBoundedFile(join11(rootDirectory,INDEX_FILE_V1),MAX_NODE_DISK_REGISTRY_INDEX_BYTES_V1,"index")}catch(error2){if(error2 instanceof NodeDiskRegistrySourceErrorV1)throw error2;if(error2 instanceof Error&&"code"in error2&&error2.code==="ENOENT")return;throw new NodeDiskRegistrySourceErrorV1("io_failed","Install store index could not be read")}return parseIndex(rootDirectory,rawIndex)}function createNodeDiskPluginRegistrySourceV1(options){let rootDirectory=options.rootDirectory;if(typeof rootDirectory!="string"||!isAbsolute2(rootDirectory)||rootDirectory.trim()==="")throw new NodeDiskRegistrySourceErrorV1("invalid_configuration","Install store root directory must be absolute");return{version:NODE_DISK_REGISTRY_SOURCE_VERSION_V1,list:async({signal}={})=>{let records=await readIndexRecords(rootDirectory,signal);if(records===void 0)return Object.freeze([]);let envelopes=[];for(let record of records){if(signal?.aborted)throw new NodeDiskRegistrySourceErrorV1("cancelled","Disk registry source read was cancelled");let rawManifest;try{rawManifest=await readBoundedFile(join11(record.directory,ECOSYSTEM_MANIFEST_FILE_V1),MAX_NODE_DISK_REGISTRY_MANIFEST_BYTES_V1,"manifest")}catch(error2){throw error2 instanceof NodeDiskRegistrySourceErrorV1?error2:new NodeDiskRegistrySourceErrorV1("io_failed","Installed plugin manifest could not be read")}let manifest=parseManifest(record,rawManifest);envelopes.push({manifest,source:record.installationRef,manifestDigest:record.manifestDigest})}return Object.freeze(envelopes)},resolveCapabilityManifestPath:async({pluginId,pluginVersion,signal})=>{let records=await readIndexRecords(rootDirectory,signal);if(records===void 0)return;let record=records.find(candidate=>candidate.pluginId===pluginId&&candidate.pluginVersion===pluginVersion);if(record===void 0)return;let manifestPath=join11(record.directory,CAPABILITY_MANIFEST_FILE_V1);try{await(await open2(manifestPath,"r")).close().catch(()=>{})}catch{return}return manifestPath}}}var PLUGIN_DISTRIBUTION_CONTRACT_VERSION_V1=1,MAX_PLUGIN_DISTRIBUTION_DESCRIPTOR_BYTES_V1=16*1024,MAX_PLUGIN_DISTRIBUTION_FIELD_CHARS_V1=2048,MAX_PLUGIN_DISTRIBUTION_METADATA_BYTES_V1=16*1024,MAX_PLUGIN_DISTRIBUTION_ARTIFACT_REF_CHARS_V1=2048,MAX_PLUGIN_DISTRIBUTION_ARTIFACT_BYTES_V1=512*1024*1024,ERROR_MESSAGES={unsupported:"Plugin distribution is unsupported on this host",cancelled:"Plugin distribution operation was cancelled",invalid_descriptor:"Plugin distribution descriptor is invalid",invalid_metadata:"Plugin distribution metadata is invalid",invalid_artifact:"Plugin distribution artifact handle is invalid",source_mismatch:"Plugin distribution source does not match the descriptor",identity_mismatch:"Plugin distribution plugin identity does not match the descriptor",digest_mismatch:"Plugin distribution digest does not match the descriptor",signature_invalid:"Plugin distribution signature was rejected",expired:"Plugin distribution descriptor has expired",size_mismatch:"Plugin distribution size does not match the descriptor",media_type_mismatch:"Plugin distribution media type does not match the descriptor",host_failed:"Plugin distribution host operation failed",release_failed:"Plugin distribution artifact release failed"},PluginDistributionErrorV1=class extends Error{code;constructor(code){super(ERROR_MESSAGES[code]),this.name="PluginDistributionErrorV1",this.code=code}},DESCRIPTOR_KEYS=["version","source","pluginId","pluginVersion","manifestDigest","artifactDigest","signature","expiresAt","sizeBytes","mediaType"],METADATA_KEYS=["version","source","pluginId","pluginVersion","manifestDigest","artifactDigest","expiresAt","sizeBytes","mediaType"],ARTIFACT_KEYS=["artifactRef","artifactDigest","sizeBytes","mediaType"];function reject(code){throw new PluginDistributionErrorV1(code)}function hasExactKeys(value,keys){let expected=new Set(keys);return Object.keys(value).every(key=>expected.has(key)&&expected.size===keys.length)&&keys.every(key=>key in value)}function boundedString(value,code){return(typeof value!="string"||value.trim().length===0||value.length>MAX_PLUGIN_DISTRIBUTION_FIELD_CHARS_V1||/[\u0000-\u001f\u007f]/u.test(value))&&reject(code),value}function identityString(value,code){let result=boundedString(value,code);return/\s/u.test(result)&&reject(code),result}function sourceString(value,code){let source=boundedString(value,code);if((/\s/u.test(source)||/^(?:file:|[a-zA-Z]:[\\/]|[\\/]{1,2}|\\\\)/iu.test(source))&&reject(code),/^https?:\/\//iu.test(source))try{let parsed=new URL(source);(parsed.username!==""||parsed.password!=="")&&(parsed.username="",parsed.password=""),parsed.search="",parsed.hash="";let pathname=parsed.pathname.length>512?`${parsed.pathname.slice(0,509)}...`:parsed.pathname;return`${parsed.origin}${pathname||"/"}`}catch{reject(code)}return source}function digestString(value,code){let digest=identityString(value,code);return/^(?:[a-z][a-z0-9+.-]{0,15}:[A-Za-z0-9._~-]{1,128}|[0-9a-f]{16,128})$/u.test(digest)||reject(code),digest}function signatureString(value){let signature=boundedString(value,"invalid_descriptor");return(signature.length>512||/\s/u.test(signature))&&reject("invalid_descriptor"),signature}function expiryString(value,code){let expiry=boundedString(value,code);/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/u.test(expiry)||reject(code);let timestamp=Date.parse(expiry);return(!Number.isFinite(timestamp)||new Date(timestamp).toISOString()!==expiry)&&reject(code),expiry}function positiveSize(value,code){return(typeof value!="number"||!Number.isSafeInteger(value)||value<1||value>MAX_PLUGIN_DISTRIBUTION_ARTIFACT_BYTES_V1)&&reject(code),value}function mediaTypeString(value,code){let mediaType=boundedString(value,code).toLowerCase();return(mediaType.length>256||!/^[a-z0-9!#$&^_.+-]+\/[a-z0-9!#$&^_.+-]+(?:\s*;\s*[a-z0-9!#$&^_.+-]+=[a-z0-9!#$&^_.+-]+)*$/u.test(mediaType))&&reject(code),mediaType}function serializedBytes(value,code){try{let serialized=JSON.stringify(value);return serialized===void 0&&reject(code),new TextEncoder().encode(serialized).byteLength}catch{reject(code)}}function descriptorValue(value){(!isPlainRecord(value)||!hasExactKeys(value,DESCRIPTOR_KEYS))&&reject("invalid_descriptor"),value.version!==PLUGIN_DISTRIBUTION_CONTRACT_VERSION_V1&&reject("invalid_descriptor");let descriptor={version:PLUGIN_DISTRIBUTION_CONTRACT_VERSION_V1,source:sourceString(value.source,"invalid_descriptor"),pluginId:identityString(value.pluginId,"invalid_descriptor"),pluginVersion:identityString(value.pluginVersion,"invalid_descriptor"),manifestDigest:digestString(value.manifestDigest,"invalid_descriptor"),artifactDigest:digestString(value.artifactDigest,"invalid_descriptor"),signature:signatureString(value.signature),expiresAt:expiryString(value.expiresAt,"invalid_descriptor"),sizeBytes:positiveSize(value.sizeBytes,"invalid_descriptor"),mediaType:mediaTypeString(value.mediaType,"invalid_descriptor")};return serializedBytes(descriptor,"invalid_descriptor")>MAX_PLUGIN_DISTRIBUTION_DESCRIPTOR_BYTES_V1&&reject("invalid_descriptor"),detachedFreeze(descriptor)}function metadataValue(value){(!isPlainRecord(value)||!hasExactKeys(value,METADATA_KEYS))&&reject("invalid_metadata"),value.version!==PLUGIN_DISTRIBUTION_CONTRACT_VERSION_V1&&reject("invalid_metadata");let metadata={version:PLUGIN_DISTRIBUTION_CONTRACT_VERSION_V1,source:sourceString(value.source,"invalid_metadata"),pluginId:identityString(value.pluginId,"invalid_metadata"),pluginVersion:identityString(value.pluginVersion,"invalid_metadata"),manifestDigest:digestString(value.manifestDigest,"invalid_metadata"),artifactDigest:digestString(value.artifactDigest,"invalid_metadata"),expiresAt:expiryString(value.expiresAt,"invalid_metadata"),sizeBytes:positiveSize(value.sizeBytes,"invalid_metadata"),mediaType:mediaTypeString(value.mediaType,"invalid_metadata")};return serializedBytes(metadata,"invalid_metadata")>MAX_PLUGIN_DISTRIBUTION_METADATA_BYTES_V1&&reject("invalid_metadata"),detachedFreeze(metadata)}function artifactHandleValue(value){(!isPlainRecord(value)||!hasExactKeys(value,ARTIFACT_KEYS))&&reject("invalid_artifact");let artifact={artifactRef:boundedString(value.artifactRef,"invalid_artifact"),artifactDigest:digestString(value.artifactDigest,"invalid_artifact"),sizeBytes:positiveSize(value.sizeBytes,"invalid_artifact"),mediaType:mediaTypeString(value.mediaType,"invalid_artifact")};return(/[\s\u0000-\u001f\u007f]/u.test(artifact.artifactRef)||/^(?:file:|[a-zA-Z]:[\\/]|[\\/]{1,2}|\\\\)/iu.test(artifact.artifactRef)||artifact.artifactRef.length>MAX_PLUGIN_DISTRIBUTION_ARTIFACT_REF_CHARS_V1)&&reject("invalid_artifact"),detachedFreeze(artifact)}function assertDescriptorMetadataMatch(descriptor,metadata){metadata.source!==descriptor.source&&reject("source_mismatch"),(metadata.pluginId!==descriptor.pluginId||metadata.pluginVersion!==descriptor.pluginVersion)&&reject("identity_mismatch"),(metadata.manifestDigest!==descriptor.manifestDigest||metadata.artifactDigest!==descriptor.artifactDigest)&&reject("digest_mismatch"),metadata.expiresAt!==descriptor.expiresAt&&reject("expired"),metadata.sizeBytes!==descriptor.sizeBytes&&reject("size_mismatch"),metadata.mediaType!==descriptor.mediaType&&reject("media_type_mismatch")}function assertArtifactMatch(descriptor,artifact){artifact.artifactDigest!==descriptor.artifactDigest&&reject("digest_mismatch"),artifact.sizeBytes!==descriptor.sizeBytes&&reject("size_mismatch"),artifact.mediaType!==descriptor.mediaType&&reject("media_type_mismatch")}function isCancelled2(error2,signal){return signal?.aborted===!0||error2 instanceof Error&&(error2.name==="AbortError"||error2.name==="AbortSignalError")}function assertNotExpired(descriptor,now){let current;try{current=now()}catch{reject("expired")}Number.isFinite(current)||reject("expired"),Date.parse(descriptor.expiresAt)<=current&&reject("expired")}async function verifyDescriptor(descriptor,verifySignature,now,signal){signal?.aborted&&reject("cancelled"),assertNotExpired(descriptor,now),verifySignature===void 0&&reject("unsupported");let verification;try{verification=await verifySignature({descriptor})}catch{reject("signature_invalid")}signal?.aborted&&reject("cancelled"),(!isPlainRecord(verification)||verification.status!=="accepted")&&reject("signature_invalid")}function createPluginDistributionV1(options={}){let verifySignature=options.verifySignature??options.verify,now=options.now??(()=>Date.now()),resolveMetadataForDescriptor=async(descriptor,signal)=>{signal?.aborted&&reject("cancelled"),options.host?.resolveMetadata===void 0&&reject("unsupported");let result;try{result=await options.host.resolveMetadata({descriptor,signal})}catch(error2){isCancelled2(error2,signal)&&reject("cancelled"),reject("host_failed")}signal?.aborted&&reject("cancelled");let metadata=metadataValue(result);return assertDescriptorMetadataMatch(descriptor,metadata),assertNotExpired(descriptor,now),metadata};return{validateDescriptor(input){return descriptorValue(input)},resolveMetadata:async input=>{let descriptor=descriptorValue(input.descriptor);return await verifyDescriptor(descriptor,verifySignature,now,input.signal),resolveMetadataForDescriptor(descriptor,input.signal)},acquireArtifact:async input=>{let descriptor=descriptorValue(input.descriptor);await verifyDescriptor(descriptor,verifySignature,now,input.signal),options.host?.acquireArtifact===void 0&&reject("unsupported");let metadata=input.metadata===void 0?await resolveMetadataForDescriptor(descriptor,input.signal):metadataValue(input.metadata);assertDescriptorMetadataMatch(descriptor,metadata),assertNotExpired(descriptor,now);let result,acquired;try{result=await options.host.acquireArtifact({descriptor,metadata,signal:input.signal});let handle=artifactHandleValue(result);return acquired=detachedFreeze({...metadata,artifactRef:handle.artifactRef}),assertArtifactMatch(descriptor,handle),assertNotExpired(descriptor,now),input.signal?.aborted&&reject("cancelled"),acquired}catch(error2){if(acquired!==void 0&&options.host.releaseArtifact!==void 0&&await options.host.releaseArtifact({artifact:acquired}).catch(()=>{}),error2 instanceof PluginDistributionErrorV1)throw error2;isCancelled2(error2,input.signal)&&reject("cancelled"),reject("host_failed")}},releaseArtifact:async input=>{input.signal?.aborted&&reject("cancelled"),options.host?.releaseArtifact===void 0&&reject("unsupported");let value=input.artifact;(!isPlainRecord(value)||!hasExactKeys(value,[...METADATA_KEYS,"artifactRef"]))&&reject("invalid_artifact");let metadataInput=Object.fromEntries(METADATA_KEYS.map(key=>[key,value[key]])),artifact={...metadataValue(metadataInput),artifactRef:artifactHandleValue({artifactRef:value.artifactRef,artifactDigest:value.artifactDigest,sizeBytes:value.sizeBytes,mediaType:value.mediaType}).artifactRef};try{await options.host.releaseArtifact({artifact:detachedFreeze(artifact),signal:input.signal})}catch(error2){isCancelled2(error2,input.signal)&&reject("cancelled"),reject("release_failed")}input.signal?.aborted&&reject("cancelled")}}}var MAX_PLUGIN_REGISTRY_MANIFEST_BYTES_V1=64*1024,MAX_PLUGIN_REGISTRY_MANIFESTS_V1=256,MAX_PLUGIN_REGISTRY_PAYLOAD_BYTES_V1=4*1024*1024,MAX_PLUGIN_REGISTRY_SOURCE_CHARS_V1=2048,MAX_PLUGIN_REGISTRY_PROOF_CHARS_V1=512,PluginRegistryErrorV1=class extends Error{code;cause;constructor(code,message,cause){super(message,cause===void 0?void 0:{cause}),this.name="PluginRegistryErrorV1",this.code=code,this.cause=cause}};function isAbortLike(error2,signal){return signal?.aborted===!0||error2 instanceof Error&&(error2.name==="AbortError"||error2.name==="AbortSignalError")}function boundedString2(value,label,max,code="invalid_source"){if(typeof value!="string"||value.trim()===""||value.length>max||/[\u0000-\u001f]/u.test(value))throw new PluginRegistryErrorV1(code,`${label} must be a non-empty bounded string`);return value}function assertAllowedKeys2(value,allowed,label){let expected=new Set(allowed);if(Object.keys(value).some(key=>!expected.has(key)))throw new PluginRegistryErrorV1("invalid_manifest",`${label} contains an unsupported field`)}function validateSource(source){let value=boundedString2(source,"source",MAX_PLUGIN_REGISTRY_SOURCE_CHARS_V1);if(/^(?:file:|[a-zA-Z]:[\\/]|[\\/]{1,2}|\\\\)/iu.test(value)||/\s/u.test(value))throw new PluginRegistryErrorV1("invalid_source","Plugin registry source must be an opaque URI, not a local path");if(/^https?:\/\//iu.test(value))try{let parsed=new URL(value),pathname=parsed.pathname.length>512?`${parsed.pathname.slice(0,511)}\u2026`:parsed.pathname;return`${parsed.origin}${pathname||"/"}`}catch(error2){throw new PluginRegistryErrorV1("invalid_source","Plugin registry source URL is invalid",error2)}return value}function validateManifest(manifest){if(typeof manifest!="object"||manifest===null||Array.isArray(manifest))throw new PluginRegistryErrorV1("invalid_manifest","Registry manifest must be an object");let value=manifest;if(assertAllowedKeys2(value,["id","pluginVersion","apiVersion","minHostVersion","maxHostVersion","capabilityRefs","requires","platform","testOnly"],"Registry manifest"),typeof value.id!="string"||value.id.trim()===""||value.id.length>256)throw new PluginRegistryErrorV1("invalid_manifest","Registry manifest id is invalid");if(typeof value.pluginVersion!="string"||value.pluginVersion.trim()===""||value.pluginVersion.length>256)throw new PluginRegistryErrorV1("invalid_manifest","Registry manifest pluginVersion is invalid");if(typeof value.apiVersion!="string"||value.apiVersion.trim()===""||value.apiVersion.length>256)throw new PluginRegistryErrorV1("invalid_manifest","Registry manifest apiVersion is invalid");if(value.minHostVersion===void 0&&value.maxHostVersion===void 0)throw new PluginRegistryErrorV1("invalid_manifest","Published plugins must declare host version compatibility range: set minHostVersion and/or maxHostVersion");let bytes;try{bytes=new TextEncoder().encode(JSON.stringify(manifest)).byteLength}catch(error2){throw new PluginRegistryErrorV1("invalid_manifest","Registry manifest cannot be serialized",error2)}if(bytes>MAX_PLUGIN_REGISTRY_MANIFEST_BYTES_V1)throw new PluginRegistryErrorV1("payload_too_large","Registry manifest exceeds the size limit");return Object.freeze({...value})}function validateEnvelope2(value){if(typeof value!="object"||value===null||Array.isArray(value))throw new PluginRegistryErrorV1("invalid_manifest","Registry response entry must be an object");let entry=value;assertAllowedKeys2(entry,["manifest","source","manifestDigest","signature","distribution"],"Registry response entry");let manifest=validateManifest(entry.manifest),source=validateSource(entry.source),manifestDigest=boundedString2(entry.manifestDigest,"manifestDigest",MAX_PLUGIN_REGISTRY_PROOF_CHARS_V1);entry.signature!==void 0&&boundedString2(entry.signature,"signature",MAX_PLUGIN_REGISTRY_PROOF_CHARS_V1);let distribution;if(entry.distribution!==void 0){try{distribution=createPluginDistributionV1().validateDescriptor(entry.distribution)}catch(error2){throw new PluginRegistryErrorV1("invalid_manifest","Registry distribution descriptor is invalid",error2)}if(distribution.pluginId!==manifest.id||distribution.pluginVersion!==manifest.pluginVersion||distribution.manifestDigest!==manifestDigest)throw new PluginRegistryErrorV1("invalid_manifest","Registry distribution descriptor does not match the manifest identity")}return Object.freeze({manifest,source,manifestDigest,...entry.signature===void 0?{}:{signature:entry.signature},...distribution===void 0?{}:{distribution}})}function validateMax(value){let max=value??MAX_PLUGIN_REGISTRY_MANIFESTS_V1;if(!Number.isSafeInteger(max)||max<1||max>MAX_PLUGIN_REGISTRY_MANIFESTS_V1)throw new PluginRegistryErrorV1("invalid_limit",`maxManifests must be an integer between 1 and ${MAX_PLUGIN_REGISTRY_MANIFESTS_V1}`);return max}async function validateSourceProof(entry,verifier,sourceVerifier){let actualDigest=pluginManifestDigestV1(entry.manifest);if(entry.manifestDigest!==actualDigest)throw new PluginRegistryErrorV1("invalid_digest",`Manifest digest mismatch for ${entry.manifest.id}@${entry.manifest.pluginVersion}`);try{let result2=await verifier.verify({manifest:entry.manifest,source:entry.source,manifestDigest:actualDigest,expectedDigest:entry.manifestDigest,signature:entry.signature});if(result2.status!=="accepted")throw new PluginRegistryErrorV1("source_rejected",result2.reason??"Registry source proof was rejected")}catch(error2){throw error2 instanceof PluginRegistryErrorV1?error2:new PluginRegistryErrorV1("source_rejected","Registry source proof was rejected",error2)}let result;try{result=sourceVerifier({pluginId:entry.manifest.id,pluginVersion:entry.manifest.pluginVersion,source:entry.source,manifestDigest:actualDigest})}catch(error2){throw new PluginRegistryErrorV1("source_rejected","Plugin source verifier failed",error2)}if(result.status!=="accepted")throw new PluginRegistryErrorV1("source_rejected",result.reason??"Plugin source was rejected")}function sourceIdentity(entries){return[...new Set(entries.map(entry=>entry.source))].sort((left,right)=>left.localeCompare(right)).join(",")}function createPluginRegistryV1(options){let maxManifests=validateMax(options.maxManifests);if(options.source===void 0||typeof options.source.list!="function")throw new PluginRegistryErrorV1("invalid_source","Registry source must provide list()");if(options.source.source!==void 0&&validateSource(options.source.source),options.verify===void 0||typeof options.verify.verify!="function")throw new PluginRegistryErrorV1("source_rejected","Registry source/digest verifier is required");if(options.sourceVerifier===void 0||typeof options.sourceVerifier!="function")throw new PluginRegistryErrorV1("source_rejected","Registry source verifier is required");let load=async(input={})=>{if(input.signal?.aborted)throw new PluginRegistryErrorV1("cancelled","Plugin registry operation was cancelled");let raw;try{raw=await options.source.list({signal:input.signal})}catch(error2){throw isAbortLike(error2,input.signal)?new PluginRegistryErrorV1("cancelled","Plugin registry operation was cancelled",error2):new PluginRegistryErrorV1("source_rejected","Plugin registry source failed",error2)}if(input.signal?.aborted)throw new PluginRegistryErrorV1("cancelled","Plugin registry operation was cancelled");if(!Array.isArray(raw))throw new PluginRegistryErrorV1("invalid_manifest","Registry source must return an array");if(raw.length>maxManifests)throw new PluginRegistryErrorV1("too_many_manifests","Registry response contains too many manifests");let entries=raw.map(validateEnvelope2);if(entries.reduce((total,entry)=>{let manifestBytes=new TextEncoder().encode(JSON.stringify(entry.manifest)).byteLength,distributionBytes=entry.distribution===void 0?0:new TextEncoder().encode(JSON.stringify(entry.distribution)).byteLength;return total+manifestBytes+distributionBytes+new TextEncoder().encode(entry.source).byteLength+new TextEncoder().encode(entry.manifestDigest).byteLength+(entry.signature===void 0?0:new TextEncoder().encode(entry.signature).byteLength)},0)>MAX_PLUGIN_REGISTRY_PAYLOAD_BYTES_V1)throw new PluginRegistryErrorV1("payload_too_large","Registry response exceeds the aggregate size limit");let seen=new Set,accepted=[],rejected=[];for(let entry of entries){let identity=`${entry.manifest.id}@${entry.manifest.pluginVersion}`;if(seen.has(identity))throw new PluginRegistryErrorV1("invalid_manifest",`Duplicate registry manifest: ${identity}`);seen.add(identity);try{await validateSourceProof(entry,options.verify,options.sourceVerifier)}catch(error2){if(!(error2 instanceof PluginRegistryErrorV1)||error2.cause!==void 0||error2.code!=="source_rejected"&&error2.code!=="invalid_digest")throw error2;rejected.push({pluginId:entry.manifest.id,pluginVersion:entry.manifest.pluginVersion,code:error2.code==="invalid_digest"?"digest_rejected":"source_rejected",reason:error2.code==="invalid_digest"?"Manifest digest mismatch":"Registry source proof was rejected"});continue}if(input.signal?.aborted)throw new PluginRegistryErrorV1("cancelled","Plugin registry operation was cancelled");accepted.push(entry)}let manifests2=accepted.map(entry=>entry.manifest),catalog=buildPluginCatalogV1({manifests:manifests2,host:options.host,availableCapabilities:options.availableCapabilities,maxEntries:maxManifests}),publicEntries=Object.freeze([...accepted].sort((left,right)=>{let idOrder=left.manifest.id.localeCompare(right.manifest.id);return idOrder===0?comparePluginVersionsV1(right.manifest.pluginVersion,left.manifest.pluginVersion):idOrder}).map(entry=>Object.freeze({pluginId:entry.manifest.id,pluginVersion:entry.manifest.pluginVersion,source:entry.source,manifestDigest:entry.manifestDigest,signed:entry.signature!==void 0}))),catalogByIdentity=new Map(catalog.entries.map(entry=>[`${entry.pluginId}@${entry.pluginVersion}`,entry])),verified=Object.freeze(publicEntries.flatMap(entry=>{let catalogEntry2=catalogByIdentity.get(`${entry.pluginId}@${entry.pluginVersion}`);if(catalogEntry2?.resolution.status==="installed-ready")return[{...entry,resolutionStatus:"installed-ready"}];let reason=catalogEntry2?.resolution.diagnostics[0]?.message??"Plugin is incompatible with this host";return rejected.push({pluginId:entry.pluginId,pluginVersion:entry.pluginVersion,code:"incompatible",reason}),[]}));return{accepted:Object.freeze(accepted),snapshot:Object.freeze({version:1,source:options.source.source===void 0?sourceIdentity(accepted):validateSource(options.source.source),entries:publicEntries,catalog,verified,rejected:Object.freeze(rejected)})}};return{list:async(input={})=>(await load(input)).snapshot,listManifests:async(input={})=>{let loaded=await load(input);return Object.freeze(loaded.snapshot.catalog.entries.flatMap(catalogEntry2=>loaded.accepted.filter(entry=>entry.manifest.id===catalogEntry2.pluginId&&entry.manifest.pluginVersion===catalogEntry2.pluginVersion).map(entry=>entry.manifest)))},resolve:async input=>{let loaded=await load({signal:input.signal}),verified=new Set(loaded.snapshot.verified.map(entry2=>`${entry2.pluginId}@${entry2.pluginVersion}`)),identity=input.pluginVersion===void 0?loaded.snapshot.catalog.entries.find(candidate=>candidate.pluginId===input.pluginId&&candidate.resolution.status==="installed-ready"&&verified.has(`${candidate.pluginId}@${candidate.pluginVersion}`)):loaded.snapshot.catalog.entries.find(candidate=>candidate.pluginId===input.pluginId&&candidate.pluginVersion===input.pluginVersion&&candidate.resolution.status==="installed-ready"&&verified.has(`${candidate.pluginId}@${candidate.pluginVersion}`)),entry=identity===void 0?void 0:loaded.accepted.find(candidate=>candidate.manifest.id===identity.pluginId&&candidate.manifest.pluginVersion===identity.pluginVersion);if(entry!==void 0)return Object.freeze({manifest:entry.manifest,source:entry.source,expectedDigest:entry.manifestDigest,...entry.distribution===void 0?{}:{distribution:entry.distribution}})}}}import{randomUUID as randomUUID3}from"node:crypto";import{mkdir,readFile as readFile3,rename,unlink,writeFile}from"node:fs/promises";import{basename as basename2,dirname as dirname6,isAbsolute as isAbsolute3,join as join12,resolve as resolve3}from"node:path";var PLUGIN_STATE_SNAPSHOT_VERSION_V1=1,MAX_PLUGIN_STATE_RECORDS_V1=256,MAX_PLUGIN_STATE_STRING_CHARS_V1=4096,MAX_PLUGIN_STATE_ID_CHARS_V1=256,MAX_PLUGIN_STATE_INSTALLATION_REF_CHARS_V1=2048,MAX_PLUGIN_STATE_SOURCE_CHARS_V1=128,EMPTY_SNAPSHOT=Object.freeze({version:PLUGIN_STATE_SNAPSHOT_VERSION_V1,records:Object.freeze([])});function diagnostic3(code,message,identity){return Object.freeze(identity===void 0?{code,message}:{code,message,identity})}function isAbortError(error2){return error2 instanceof Error&&(error2.name==="AbortError"||error2.name==="AbortSignalError")}function isMissingError(error2){return typeof error2!="object"||error2===null?!1:"code"in error2&&error2.code==="ENOENT"}function validateFilePath(value){if(typeof value!="string"||value.trim()===""||value.length>MAX_PLUGIN_STATE_STRING_CHARS_V1)throw new Error("invalid plugin state file path");if(value.includes("\0")||/[\u0000-\u001f]/u.test(value))throw new Error("invalid plugin state file path");if(/^file:/iu.test(value)||/^[a-z][a-z\d+.-]*:/iu.test(value)&&!/^[a-z]:[\\/]/iu.test(value))throw new Error("invalid plugin state file path");let normalized=isAbsolute3(value)?value:resolve3(value);if(basename2(normalized).length===0||basename2(normalized)==="."||basename2(normalized)==="..")throw new Error("invalid plugin state file path");return normalized}function validateOpaqueInstallationRef(value){if(typeof value!="string"||value.trim()===""||value.length>MAX_PLUGIN_STATE_INSTALLATION_REF_CHARS_V1)throw new Error("invalid installation reference");if(/^(?:file:|[a-zA-Z]:[\\/]|[\\/]{1,2}|\\\\)/u.test(value)||/\s/u.test(value))throw new Error("invalid installation reference");if(value.includes("\0")||/[\u0000-\u001f]/u.test(value))throw new Error("invalid installation reference");return value}function validateScopeRef(scope,value){if(typeof value!="string"||value.trim()===""||value.length>MAX_PLUGIN_SCOPE_REF_CHARS_V1)throw new Error("invalid plugin scope reference");if(/^(?:file:|[a-zA-Z]:[\\/]|[\\/]{1,2}|\\\\)/u.test(value)||/\s/u.test(value))throw new Error("invalid plugin scope reference");if(value.includes("\0")||/[\u0000-\u001f]/u.test(value))throw new Error("invalid plugin scope reference");if(scope==="global"&&value!==DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1)throw new Error("invalid plugin scope reference");return value}function validateString(value,label,max=MAX_PLUGIN_STATE_STRING_CHARS_V1){if(typeof value!="string"||value.trim().length===0||value.length>max||/[\u0000-\u001f]/u.test(value))throw new Error(`${label} is invalid`);return value}function validateSourceLabel(value){if(typeof value!="string"||value.length===0||value.length>MAX_PLUGIN_STATE_SOURCE_CHARS_V1||!/^[a-z][a-z0-9.:[\]_/@-]*$/u.test(value))throw new Error("record source label is invalid");return value}function identityOf(record){return`${record.state.scope}:${record.state.scopeRef}:${record.pluginId}@${record.pluginVersion}`}function isObject2(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function hasExactKeys2(value,keys){let expected=new Set(keys);return Object.keys(value).length===expected.size&&Object.keys(value).every(key=>expected.has(key))}function validateRecord2(value){let requiredKeys=["pluginId","pluginVersion","manifestDigest","installationRef","state"],allowedKeys=new Set([...requiredKeys,"source"]);if(!isObject2(value)||Object.keys(value).some(key=>!allowedKeys.has(key)))throw new Error("record schema is invalid");for(let key of requiredKeys)if(!(key in value))throw new Error("record schema is invalid");let pluginId=validateString(value.pluginId,"pluginId",MAX_PLUGIN_STATE_ID_CHARS_V1),pluginVersion=validateString(value.pluginVersion,"pluginVersion",MAX_PLUGIN_STATE_ID_CHARS_V1),manifestDigest=validateString(value.manifestDigest,"manifestDigest"),installationRef=validateOpaqueInstallationRef(value.installationRef),source=value.source===void 0?void 0:validateSourceLabel(value.source);if(!isObject2(value.state)||!hasExactKeys2(value.state,["scope","scopeRef","enabled","lifecycle"]))throw new Error("state schema is invalid");if(value.state.scope!=="global"&&value.state.scope!=="project")throw new Error("state scope is invalid");let scopeRef=validateScopeRef(value.state.scope,value.state.scopeRef);if(typeof value.state.enabled!="boolean")throw new Error("state enabled flag is invalid");if(value.state.lifecycle!=="installed"&&value.state.lifecycle!=="active"&&value.state.lifecycle!=="retained")throw new Error("state lifecycle is invalid");return Object.freeze({pluginId,pluginVersion,manifestDigest,installationRef,...source===void 0?{}:{source},state:Object.freeze({scope:value.state.scope,scopeRef,enabled:value.state.enabled,lifecycle:value.state.lifecycle})})}function validateSnapshot(value){if(!isObject2(value)||!hasExactKeys2(value,["version","records"]))throw new Error("snapshot schema is invalid");if(value.version!==PLUGIN_STATE_SNAPSHOT_VERSION_V1)throw new Error("snapshot version is unsupported");if(!Array.isArray(value.records))throw new Error("records must be an array");if(value.records.length>MAX_PLUGIN_STATE_RECORDS_V1)throw new Error("too many plugin state records");let records=value.records.map(validateRecord2),identities=new Set;for(let record of records){let identity=identityOf(record);if(identities.has(identity))throw new Error(`duplicate identity: ${identity}`);identities.add(identity)}return records.sort((left,right)=>identityOf(left).localeCompare(identityOf(right))),Object.freeze({version:PLUGIN_STATE_SNAPSHOT_VERSION_V1,records:Object.freeze(records)})}function invalidFromError(error2){let message=error2 instanceof Error?error2.message:"plugin state schema is invalid",duplicatePrefix="duplicate identity: ";return message.startsWith(duplicatePrefix)?diagnostic3("duplicate_identity",message,message.slice(duplicatePrefix.length)):diagnostic3(message==="too many plugin state records"?"too_many_records":message==="invalid installation reference"?"invalid_installation_ref":"invalid_schema",message)}function defaultFileSystem(){return{readFile:async path15=>await readFile3(path15,"utf8"),mkdir:async path15=>{await mkdir(path15,{recursive:!0})},writeFile:async(path15,data)=>{await writeFile(path15,data,"utf8")},rename,unlink}}function cancelledResult(){return Object.freeze({status:"cancelled",diagnostics:Object.freeze([diagnostic3("cancelled","Plugin state operation was cancelled")])})}function sortRecords(records){return Object.freeze([...records].sort((left,right)=>identityOf(left).localeCompare(identityOf(right))))}function makeRecord(installation,scope,enabled,source){if(installation.version!==1)throw new Error("plugin installation handle is invalid");let pluginId=validateString(installation.pluginId,"pluginId",MAX_PLUGIN_STATE_ID_CHARS_V1),pluginVersion=validateString(installation.pluginVersion,"pluginVersion",MAX_PLUGIN_STATE_ID_CHARS_V1),manifestDigest=validateString(installation.manifestDigest,"manifestDigest"),installationRef=validateOpaqueInstallationRef(installation.installationRef);if(scope!=="global"&&scope!=="project")throw new Error("state scope is invalid");if(installation.scope!==scope)throw new Error("installation scope does not match state scope");let scopeRef=validateScopeRef(scope,scope==="global"?installation.scopeRef??DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1:installation.scopeRef);if(typeof enabled!="boolean")throw new Error("state enabled flag is invalid");let sourceLabel=source===void 0?void 0:validateSourceLabel(source);return Object.freeze({pluginId,pluginVersion,manifestDigest,installationRef,...sourceLabel===void 0?{}:{source:sourceLabel},state:Object.freeze({scope,scopeRef,enabled,lifecycle:installation.state})})}function createPluginStateStoreV1(options){let filePath=validateFilePath(options.filePath),fileSystem=options.fileSystem??defaultFileSystem();async function read(signal){if(signal?.aborted)return cancelledResult();let content;try{content=await fileSystem.readFile(filePath)}catch(error2){if(isMissingError(error2))return Object.freeze({status:"missing",snapshot:EMPTY_SNAPSHOT});if(isAbortError(error2)||signal?.aborted)return cancelledResult();throw error2}if(signal?.aborted)return cancelledResult();let parsed;try{parsed=JSON.parse(content)}catch{return Object.freeze({status:"invalid",diagnostics:Object.freeze([diagnostic3("invalid_json","plugin state JSON is invalid")])})}try{return Object.freeze({status:"ok",snapshot:validateSnapshot(parsed)})}catch(error2){return Object.freeze({status:"invalid",diagnostics:Object.freeze([invalidFromError(error2)])})}}async function write(snapshot2,signal){if(signal?.aborted)return cancelledResult();let parent=dirname6(filePath),temporaryPath=join12(parent,`.${basename2(filePath)}.${randomUUID3()}.tmp`);try{return await fileSystem.mkdir(parent),signal?.aborted||(await fileSystem.writeFile(temporaryPath,`${JSON.stringify(snapshot2)}
|
|
506
506
|
`),signal?.aborted)?cancelledResult():(await fileSystem.rename(temporaryPath,filePath),Object.freeze({status:"ok",snapshot:snapshot2,changed:!0}))}finally{try{await fileSystem.unlink(temporaryPath)}catch{}}}let mutationTail=Promise.resolve();function enqueueMutation(operation){let result=mutationTail.then(operation,operation);return mutationTail=result.then(()=>{},()=>{}),result}return{read:async({signal}={})=>await read(signal),upsert:input=>enqueueMutation(async()=>{let record;try{record=makeRecord(input.installation,input.scope,input.enabled,input.source)}catch(error2){return Object.freeze({status:"invalid",diagnostics:Object.freeze([invalidFromError(error2)])})}let current=await read(input.signal);if(current.status!=="ok"&¤t.status!=="missing")return current;if(input.signal?.aborted)return cancelledResult();let records=current.snapshot.records.filter(candidate=>identityOf(candidate)!==identityOf(record));if(records.length>=MAX_PLUGIN_STATE_RECORDS_V1&&!current.snapshot.records.some(candidate=>identityOf(candidate)===identityOf(record)))return Object.freeze({status:"invalid",diagnostics:Object.freeze([diagnostic3("too_many_records","too many plugin state records")])});let snapshot2=Object.freeze({version:PLUGIN_STATE_SNAPSHOT_VERSION_V1,records:sortRecords([...records,record])});return await write(snapshot2,input.signal)}),remove:input=>enqueueMutation(async()=>{let pluginId,pluginVersion,scope,scopeRef;try{if(pluginId=validateString(input.pluginId,"pluginId",MAX_PLUGIN_STATE_ID_CHARS_V1),pluginVersion=validateString(input.pluginVersion,"pluginVersion",MAX_PLUGIN_STATE_ID_CHARS_V1),input.scope!=="global"&&input.scope!=="project")throw new Error("state scope is invalid");scope=input.scope,scopeRef=validateScopeRef(scope,input.scopeRef)}catch(error2){return Object.freeze({status:"invalid",diagnostics:Object.freeze([invalidFromError(error2)])})}let current=await read(input.signal);if(current.status!=="ok"&¤t.status!=="missing")return current;if(input.signal?.aborted)return cancelledResult();let identity=`${scope}:${scopeRef}:${pluginId}@${pluginVersion}`,records=current.snapshot.records.filter(candidate=>identityOf(candidate)!==identity);if(records.length===current.snapshot.records.length)return Object.freeze({status:"ok",snapshot:current.snapshot,changed:!1});let snapshot2=Object.freeze({version:PLUGIN_STATE_SNAPSHOT_VERSION_V1,records:sortRecords(records)});return await write(snapshot2,input.signal)})}}var DEFAULT_PLUGIN_INSTALL_STORE_DIR_V1="plugin-install-store-v1",DEFAULT_PLUGIN_STATE_FILE_V1="plugin-state.json";function projectPluginScopeRefV1(cwd){let canonicalPath=resolve4(cwd),identityPath=process.platform==="win32"?canonicalPath.toLowerCase():canonicalPath;return`project:sha256:${createHash("sha256").update(identityPath).digest("hex")}`}function defaultPluginInstallStoreDirectoryV1(agentDir){return join13(agentDir,DEFAULT_PLUGIN_INSTALL_STORE_DIR_V1)}function defaultPluginInstallStoreInstanceRootV1(agentDir){return join13(defaultPluginInstallStoreDirectoryV1(agentDir),"agent-forge-plugin-install-store-v1")}function defaultPluginHostFactsV1(){return{os:process.platform==="win32"?"windows":process.platform==="darwin"?"macos":process.platform,arch:process.arch,runtime:[{name:"node",version:process.versions.node}],apiVersion:"1",hostFeatures:[]}}function digestOnlyVerifierV1(){return{verify:({manifestDigest,expectedDigest:expectedDigest2})=>expectedDigest2===void 0||expectedDigest2===manifestDigest?{status:"accepted"}:{status:"rejected",reason:"Manifest digest does not match the expected digest"}}}function installStoreSourceVerifierV1(){return()=>({status:"accepted"})}function createDefaultActivePluginBindingsResolverV1(){return async input=>{let registrySource=createNodeDiskPluginRegistrySourceV1({rootDirectory:defaultPluginInstallStoreInstanceRootV1(input.agentDir)}),registry=createPluginRegistryV1({source:registrySource,host:defaultPluginHostFactsV1(),verify:digestOnlyVerifierV1(),sourceVerifier:installStoreSourceVerifierV1()});return await resolveActivePluginBindingsForScopesV1({registry,...registrySource.resolveCapabilityManifestPath===void 0?{}:{resolveInstallationManifestPath:registrySource.resolveCapabilityManifestPath},project:{stateStore:createPluginStateStoreV1({filePath:join13(input.cwd,CONFIG_DIR_NAME,DEFAULT_PLUGIN_STATE_FILE_V1)}),scope:"project",scopeRef:projectPluginScopeRefV1(input.cwd)},global:{stateStore:createPluginStateStoreV1({filePath:join13(input.agentDir,DEFAULT_PLUGIN_STATE_FILE_V1)}),scope:"global",scopeRef:DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1}})}}import{join as join18}from"node:path";import{createHash as createHash2,randomUUID as randomUUID4}from"node:crypto";import{createReadStream}from"node:fs";import{mkdir as mkdir2,mkdtemp,open as open3,rename as rename2,rm}from"node:fs/promises";import{tmpdir}from"node:os";import{isAbsolute as isAbsolute4,join as join14}from"node:path";import{createPublicKey,verify}from"node:crypto";var NODE_PLUGIN_TRUST_ROOT_VERSION_V1=1,MAX_KEY_ID_CHARS_V1=128,MAX_KEYS_V1=256,SIGNATURE_PREFIX_V1="ed25519-v1";function validKeyId(value){return value.length>0&&value.length<=MAX_KEY_ID_CHARS_V1&&/^[A-Za-z0-9_-]+$/u.test(value)}function parseValidity(value,label){if(value===void 0)return;if(!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/u.test(value))throw new Error(`${label} must be an ISO-8601 UTC timestamp`);let timestamp=Date.parse(value);if(!Number.isFinite(timestamp)||new Date(timestamp).toISOString()!==value)throw new Error(`${label} must be a valid ISO-8601 UTC timestamp`);return timestamp}function parsePublicKey(value){if(value.length===0||value.length>16*1024||/\u0000/u.test(value))throw new Error("publicKeyPem is invalid");let key;try{key=createPublicKey(value)}catch{throw new Error("publicKeyPem is invalid")}if(key.type!=="public"||key.asymmetricKeyType!=="ed25519")throw new Error("publicKeyPem must be an Ed25519 public key");return key}function payload(input){return Buffer.from(`agent-forge-plugin-distribution-v${NODE_PLUGIN_TRUST_ROOT_VERSION_V1}
|