@ai-agent-forge/agent-forge 0.88.9 → 0.88.10

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.
Files changed (29) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/bundled-plugins/agent-loop-policy/agent-forge.json +1 -1
  3. package/bundled-plugins/agent-loop-policy/plugin.json +1 -1
  4. package/bundled-plugins/alignment/agent-forge.json +1 -1
  5. package/bundled-plugins/alignment/plugin.json +1 -1
  6. package/bundled-plugins/browser-playwright/agent-forge.json +1 -1
  7. package/bundled-plugins/browser-playwright/plugin.json +1 -1
  8. package/bundled-plugins/coding-tools/agent-forge.json +1 -1
  9. package/bundled-plugins/coding-tools/plugin.json +1 -1
  10. package/bundled-plugins/compaction-policy/agent-forge.json +1 -1
  11. package/bundled-plugins/compaction-policy/plugin.json +1 -1
  12. package/bundled-plugins/overflow-policy/agent-forge.json +1 -1
  13. package/bundled-plugins/overflow-policy/plugin.json +1 -1
  14. package/bundled-plugins/provider-failover/agent-forge.json +1 -1
  15. package/bundled-plugins/provider-failover/plugin.json +1 -1
  16. package/bundled-plugins/retry-policy/agent-forge.json +1 -1
  17. package/bundled-plugins/retry-policy/plugin.json +1 -1
  18. package/dist/bundle/.build-manifest.json +3 -3
  19. package/dist/bundle/chunks/{chunk-VWNIFYQA.js → chunk-ZZCUNSGO.js} +1 -1
  20. package/dist/bundle/cli.js +1 -1
  21. package/dist/bundle/index.js +1 -1
  22. package/dist/bundle/rpc-entry.js +1 -1
  23. package/dist/plugins/ecosystem/node-disk-registry-source.d.ts.map +1 -1
  24. package/dist/plugins/ecosystem/node-disk-registry-source.js +12 -0
  25. package/dist/plugins/ecosystem/node-disk-registry-source.js.map +1 -1
  26. package/examples/extensions/with-deps/package-lock.json +2 -2
  27. package/examples/extensions/with-deps/package.json +1 -1
  28. package/examples/extensions/with-deps/plugin.json +1 -1
  29. package/package.json +1 -1
@@ -212,7 +212,7 @@ File: ${path8}`)}let providers=new Map;for(let[providerId,provider]of Object.ent
212
212
 
213
213
  `):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)}getImageModelCatalog(){return this.config.getImageModelCatalog()}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(resolve22=>{markStarted=resolve22}),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.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",t("Unknown provider: {provider}",{provider:model.provider}));let resolution=await this.getAuth(model,{apiKey:options?.apiKey,env:options?.env,signal:options?.signal});if(!resolution)throw new ModelsError("auth",t("Provider is not configured: {provider}",{provider:model.provider}));let{transformHeaders,...rawProviderOptions}=options??{},providerOptions=rawProviderOptions,headers=mergeHeaders(resolution.auth.headers,providerOptions.headers);transformHeaders&&(headers=await transformHeaders(headers??{}));let env=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}}}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(error){options.signal?.aborted||errors.set(providerId,error instanceof Error?error:new Error(String(error)))}}));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(t("Provider id must not be empty."));this.extensionProviders.delete(provider.id),this.nativeExtensionProviders.set(provider.id,provider),this.recomposeProvider(provider.id),this.updateModelSnapshot(),this.markProvisionallyConfigured(provider.id,configuredRequestAuthStatus(void 0),provider.auth.oauth&&!provider.auth.apiKey?"oauth":"api_key"),this.refresh({allowNetwork:!1})}markProvisionallyConfigured(providerId,configuredStatus,type){if(!this.snapshot.storedProviders.has(providerId)&&!configuredStatus?.configured)return;let configuredProviders=new Set(this.snapshot.configuredProviders).add(providerId),auth=new Map(this.snapshot.auth);auth.get(providerId)||auth.set(providerId,{type,source:"configured provider"}),this.snapshot={...this.snapshot,auth,configuredProviders,available:this.snapshot.all.filter(model=>configuredProviders.has(model.provider))}}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);this.extensionProviders.set(providerId,effective),this.recomposeProvider(providerId),this.updateModelSnapshot(),this.markProvisionallyConfigured(providerId,configuredRequestAuthStatus(effective),effective.oauth&&!effective.apiKey?"oauth":"api_key"),this.refresh({allowNetwork:!1})}unregisterProvider(providerId){this.extensionProviders.delete(providerId),this.nativeExtensionProviders.delete(providerId),this.recomposeProvider(providerId),this.updateModelSnapshot(),this.refresh({allowNetwork:!1})}};function assertNonEmpty(value,label){if(typeof value!="string"||value.trim().length===0)throw new Error(t("{label} must be a non-empty string",{label}))}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(t("capability {id} version must be a positive safe integer",{id:ref.id}));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 platform2=manifest.platform;if(platform2===void 0)return{diagnostics:[]};if(!matchesList(host.os,platform2.os))return{status:"installed-unavailable",diagnostics:[diagnostic("unsupported-platform",`Plugin ${manifest.id} does not support host OS ${host.os}`)]};if(!matchesList(host.arch,platform2.arch))return{status:"installed-unavailable",diagnostics:[diagnostic("unsupported-architecture",`Plugin ${manifest.id} does not support host architecture ${host.arch}`)]};let missingFeature=hasAllFeatures(host.hostFeatures,platform2.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 platform2.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 platform2=resolvePlatform(manifest,host);if(platform2.status!==void 0)return{pluginId:manifest.id,pluginVersion:manifest.pluginVersion,required,status:platform2.status,diagnostics:platform2.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,...platform2.selectedAdapter===void 0?{}:{selectedAdapter:platform2.selectedAdapter}};return{pluginId:manifest.id,pluginVersion:manifest.pluginVersion,required,status:"installed-ready",diagnostics:dependencyDiagnostics,resolved,...platform2.selectedAdapter===void 0?{}:{selectedAdapter:platform2.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,index,all)=>index===0||all[index-1].id!==ref.id||all[index-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})),platform2=manifest.platform,runtime=platform2?.runtime?.map(constraint=>Object.freeze({...constraint})),adapters=platform2?.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=platform2===void 0?void 0:Object.freeze({...platform2,os:Object.freeze([...platform2.os]),...platform2.arch===void 0?{}:{arch:Object.freeze([...platform2.arch])},...runtime===void 0?{}:{runtime:Object.freeze(runtime)},...platform2.hostFeatures===void 0?{}:{hostFeatures:Object.freeze([...platform2.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(t("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(t("Only a verified update can become active: {pluginId}",{pluginId:record.pluginId}));return Object.freeze({...record,state:"active"})}function rollbackPluginUpdateV1(input){if(input.previous.pluginId!==input.failed.pluginId)throw new Error(t("Cannot rollback updates for different plugins"));if(input.previous.state!=="active")throw new Error(t("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 parse3=value=>value.trim().replace(/^[vV]/u,"").split(/[.+-]/u).map(part=>/^\d+$/u.test(part)?Number.parseInt(part,10):part),leftParts=parse3(left),rightParts=parse3(right);for(let index=0;index<Math.max(leftParts.length,rightParts.length);index+=1){let a=leftParts[index]??0,b=rightParts[index]??0;if(a!==b)return typeof a=="number"&&typeof b=="number"?a<b?-1:1:typeof a=="number"?1:typeof b=="number"||a<b?-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",t("maxEntries must be an integer between 1 and {max}",{max:MAX_ENTRIES}));let manifests2=[...input.manifests].sort(compareCatalogEntries),seen=new Set,unique=[];for(let manifest of manifests2){let identity=`${manifest.id}@${manifest.pluginVersion}`;seen.has(identity)||(seen.add(identity),unique.push(manifest))}let disabled=new Set(input.disabledPluginIds??[]),entries=unique.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 assertNonEmptyString(value,label){if(typeof value!="string"||value.trim().length===0)throw new Error(t("{label} must be a non-empty string",{label}))}function assertPluginEntries(value,label){if(!Array.isArray(value))throw new Error(t("{label} must be an array",{label}));let seen=new Set;return value.map((item,index)=>{if(item===null||typeof item!="object"||Array.isArray(item))throw new Error(t("{label}[{index}] must be a plain object",{label,index}));let record=item;assertNonEmptyString(record.pluginId,`${label}[${index}].pluginId`),assertNonEmptyString(record.pluginVersion,`${label}[${index}].pluginVersion`);let key=`${record.pluginId}@${record.pluginVersion}`;if(seen.has(key))throw new Error(t("{label} contains duplicate entry: {key}",{label,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(t("{label}[{index}].selectedAdapter must be an object",{label,index}));let adapter=selectedAdapter;return assertNonEmptyString(adapter.id,`${label}[${index}].selectedAdapter.id`),assertNonEmptyString(adapter.version,`${label}[${index}].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){assertNonEmptyString(input.profileId,"Profile identity.profileId"),assertNonEmptyString(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(t("Profile identity.capabilityVersions version must be a positive safe integer: {id}",{id:ref.id}));return assertNonEmptyString(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",AGENT_START_EVENT_VERSION=1,AGENT_SETTLED_EVENT_ID="agent.settled",AGENT_SETTLED_EVENT_VERSION=1,TURN_START_EVENT_ID="turn.start",TURN_START_EVENT_VERSION=1,TURN_END_EVENT_ID="turn.end",TURN_END_EVENT_VERSION=1,MESSAGE_START_EVENT_ID="message.start",MESSAGE_START_EVENT_VERSION=1,MESSAGE_END_EVENT_ID="message.end",MESSAGE_END_EVENT_VERSION=1,TOOL_EXECUTION_START_EVENT_ID="tool.execution.start",TOOL_EXECUTION_START_EVENT_VERSION=1,MODEL_SELECT_EVENT_ID="model.select",MODEL_SELECT_EVENT_VERSION=1,THINKING_LEVEL_SELECT_EVENT_ID="thinking_level.select",THINKING_LEVEL_SELECT_EVENT_VERSION=1,SESSION_INFO_CHANGED_EVENT_ID="session.info.changed",SESSION_INFO_CHANGED_EVENT_VERSION=1,SESSION_ENTRY_APPENDED_EVENT_ID="session.entry.appended",SESSION_ENTRY_APPENDED_EVENT_VERSION=1,AGENT_END_EVENT_ID="agent.end",AGENT_END_EVENT_VERSION=1,BEFORE_AGENT_START_EVENT_ID="before.agent.start",BEFORE_AGENT_START_EVENT_VERSION=1,BEFORE_AGENT_START_EVENT_VERSION_V2=2,UI_PROMPT_START_EVENT_ID="ui.prompt.start",UI_PROMPT_START_EVENT_VERSION=1,UI_PROMPT_END_EVENT_ID="ui.prompt.end",UI_PROMPT_END_EVENT_VERSION=1,RESOURCES_DISCOVER_EVENT_ID="resources.discover",RESOURCES_DISCOVER_EVENT_VERSION=1,RESOURCES_DISCOVER_EVENT_VERSION_V2=2,CONTEXT_ASSEMBLED_EVENT_ID="context.assembled",CONTEXT_ASSEMBLED_EVENT_VERSION=1,INPUT_RECEIVED_EVENT_ID="input.received",INPUT_RECEIVED_EVENT_VERSION=1,USER_BASH_EVENT_ID="user.bash",USER_BASH_EVENT_VERSION=1,SESSION_START_EVENT_ID="session.start",SESSION_START_EVENT_VERSION=1,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",TOOL_GATE_BLOCKED_EVENT_VERSION=1,INPUT_GATE_BLOCKED_EVENT_ID="input.gate.blocked",INPUT_GATE_BLOCKED_EVENT_VERSION=1,OPERATION_END_EVENT_ID="operation.end",OPERATION_END_EVENT_VERSION=1;function assertString(value,label){if(typeof value!="string"||value.trim()==="")throw new Error(t("{label} must be a non-empty string",{label}))}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(t("{label} must contain only finite JSON numbers",{label}))}if(typeof value!="object")throw new Error(t("{label} must be JSON-safe",{label}));if(seen.has(value))throw new Error(t("{label} must not contain cycles",{label}));if(seen.add(value),Array.isArray(value))for(let[index,entry]of value.entries())assertJsonSafe(entry,`${label}[${index}]`,seen);else if(isPlainRecord2(value))for(let[key,entry]of Object.entries(value))assertJsonSafe(entry,`${label}.${key}`,seen);else throw new Error(t("{label} must contain only JSON arrays and plain objects",{label}));seen.delete(value)}}function validatePluginDisposeEventDataV1(value){if(!value||typeof value!="object"||Array.isArray(value)||Object.getPrototypeOf(value)!==Object.prototype)throw new Error(t("plugin.dispose data must be a plain object"));let record=value;if(Object.keys(record).sort().join(",")!=="pluginId,pluginVersion,status,version")throw new Error(t("plugin.dispose data has unsupported fields"));if(record.version!==1)throw new Error(t("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(t("plugin.dispose data.status is invalid"));return value}function pluginDisposeEventDefinition(){return{id:PLUGIN_DISPOSE_EVENT_ID,version:PLUGIN_DISPOSE_EVENT_VERSION,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(t("plugin.ready data must be a plain object"));let record=value;if(Object.keys(record).sort().join(",")!=="pluginId,pluginVersion,version")throw new Error(t("plugin.ready data has unsupported fields"));if(record.version!==1)throw new Error(t("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:PLUGIN_READY_EVENT_VERSION,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(t("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(t("plugin.rejected data has unsupported fields"));if(record.version!==1)throw new Error(t("plugin.rejected data.version must be 1"));if(record.pluginId!==void 0&&typeof record.pluginId!="string")throw new Error(t("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(t("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(t("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(t("session.context.replaced data has unsupported fields: {unsupported}",{unsupported:unsupported.join(", ")}));for(let key of["version","sessionId","reason","messageCount"])if(!(key in record))throw new Error(t("session.context.replaced data is missing required field: {key}",{key}));if(record.version!==1)throw new Error(t("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(t("session.context.replaced data.reason is invalid"));if(typeof record.messageCount!="number"||!Number.isSafeInteger(record.messageCount)||record.messageCount<0)throw new Error(t("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:SESSION_CONTEXT_REPLACED_EVENT_VERSION,phase:"committed",schema:"agent-forge/session.context.replaced@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateSessionContextReplacedEventDataV1}}function validateSessionReloadEventDataV1(value){if(!isPlainRecord2(value))throw new Error(t("session.reload data must be a plain object"));if(Object.keys(value).sort().join(",")!=="generation,reason,sessionId,version")throw new Error(t("session.reload data has unsupported fields"));if(value.version!==1)throw new Error(t("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(t("session.reload data.generation must be a positive safe integer"));if(value.reason!=="reload")throw new Error(t("session.reload data.reason is invalid"));return value}function sessionReloadEventDefinition(){return{id:SESSION_RELOAD_EVENT_ID,version:SESSION_RELOAD_EVENT_VERSION,phase:"committed",schema:"agent-forge/session.reload@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateSessionReloadEventDataV1}}function validateAgentLifecycleEventDataV1(value){if(!isPlainRecord2(value))throw new Error(t("agent lifecycle data must be a plain object"));if(Object.keys(value).sort().join(",")!=="sessionId,version")throw new Error(t("agent lifecycle data has unsupported fields"));if(value.version!==1)throw new Error(t("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:AGENT_START_EVENT_VERSION,phase:"committed",schema:"agent-forge/agent.start@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateAgentLifecycleEventDataV1}}function agentSettledEventDefinition(){return{id:AGENT_SETTLED_EVENT_ID,version:AGENT_SETTLED_EVENT_VERSION,phase:"committed",schema:"agent-forge/agent.settled@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateAgentLifecycleEventDataV1}}function validateTurnStartEventDataV1(value){if(!isPlainRecord2(value))throw new Error(t("turn.start data must be a plain object"));if(Object.keys(value).sort().join(",")!=="sessionId,turnIndex,version")throw new Error(t("turn.start data has unsupported fields"));if(value.version!==1)throw new Error(t("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(t("turn.start data.turnIndex must be a non-negative safe integer"));return value}function validateTurnEndEventDataV1(value){if(!isPlainRecord2(value))throw new Error(t("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(t("turn.end data has unsupported fields"));if(value.version!==1)throw new Error(t("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(t("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(t("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(t("turn.end data.outcome is invalid"));return value}function validateMessageBoundaryEventDataV1(value){if(!isPlainRecord2(value))throw new Error(t("message lifecycle data must be a plain object"));if(Object.keys(value).sort().join(",")!=="role,sessionId,version")throw new Error(t("message lifecycle data has unsupported fields"));if(value.version!==1)throw new Error(t("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:TURN_START_EVENT_VERSION,phase:"committed",schema:"agent-forge/turn.start@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateTurnStartEventDataV1}}function turnEndEventDefinition(){return{id:TURN_END_EVENT_ID,version:TURN_END_EVENT_VERSION,phase:"committed",schema:"agent-forge/turn.end@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateTurnEndEventDataV1}}function messageStartEventDefinition(){return{id:MESSAGE_START_EVENT_ID,version:MESSAGE_START_EVENT_VERSION,phase:"committed",schema:"agent-forge/message.start@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateMessageBoundaryEventDataV1}}function messageEndEventDefinition(){return{id:MESSAGE_END_EVENT_ID,version:MESSAGE_END_EVENT_VERSION,phase:"committed",schema:"agent-forge/message.end@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateMessageBoundaryEventDataV1}}function validateToolExecutionStartEventDataV1(value){if(!isPlainRecord2(value))throw new Error(t("tool.execution.start data must be a plain object"));if(Object.keys(value).sort().join(",")!=="sessionId,toolCallId,toolName,version")throw new Error(t("tool.execution.start data has unsupported fields"));if(value.version!==1)throw new Error(t("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:TOOL_EXECUTION_START_EVENT_VERSION,phase:"committed",schema:"agent-forge/tool.execution.start@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateToolExecutionStartEventDataV1}}function validateModelSelectEventDataV1(value){if(!isPlainRecord2(value))throw new Error(t("model.select data must be a plain object"));if(Object.keys(value).sort().join(",")!=="id,provider,sessionId,source,version")throw new Error(t("model.select data has unsupported fields"));if(value.version!==1)throw new Error(t("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(t("model.select data.source is invalid"));return value}function validateThinkingLevelSelectEventDataV1(value){if(!isPlainRecord2(value))throw new Error(t("thinking_level.select data must be a plain object"));if(Object.keys(value).sort().join(",")!=="level,previousLevel,sessionId,version")throw new Error(t("thinking_level.select data has unsupported fields"));if(value.version!==1)throw new Error(t("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:MODEL_SELECT_EVENT_VERSION,phase:"committed",schema:"agent-forge/model.select@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateModelSelectEventDataV1}}function thinkingLevelSelectEventDefinition(){return{id:THINKING_LEVEL_SELECT_EVENT_ID,version:THINKING_LEVEL_SELECT_EVENT_VERSION,phase:"committed",schema:"agent-forge/thinking_level.select@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateThinkingLevelSelectEventDataV1}}function validateSessionInfoChangedEventDataV1(value){if(!isPlainRecord2(value))throw new Error(t("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(t("session.info.changed data has unsupported fields"));if(value.version!==1)throw new Error(t("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(t("session.entry.appended data must be a plain object"));if(Object.keys(value).sort().join(",")!=="entryId,entryType,sessionId,version")throw new Error(t("session.entry.appended data has unsupported fields"));if(value.version!==1)throw new Error(t("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:SESSION_INFO_CHANGED_EVENT_VERSION,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:SESSION_ENTRY_APPENDED_EVENT_VERSION,phase:"committed",schema:"agent-forge/session.entry.appended@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateSessionEntryAppendedEventDataV1}}function validateAgentEndEventDataV1(value){if(!isPlainRecord2(value))throw new Error(t("agent.end data must be a plain object"));if(Object.keys(value).sort().join(",")!=="messageCount,sessionId,version")throw new Error(t("agent.end data has unsupported fields"));if(value.version!==1)throw new Error(t("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(t("agent.end data.messageCount must be a non-negative safe integer"));return value}function validateBeforeAgentStartEventDataV1(value){if(!isPlainRecord2(value))throw new Error(t("before.agent.start data must be a plain object"));if(Object.keys(value).sort().join(",")!=="hasImages,sessionId,version")throw new Error(t("before.agent.start data has unsupported fields"));if(value.version!==1)throw new Error(t("before.agent.start data.version must be 1"));if(assertString(value.sessionId,"before.agent.start data.sessionId"),typeof value.hasImages!="boolean")throw new Error(t("before.agent.start data.hasImages must be a boolean"));return value}function agentEndEventDefinition(){return{id:AGENT_END_EVENT_ID,version:AGENT_END_EVENT_VERSION,phase:"committed",schema:"agent-forge/agent.end@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateAgentEndEventDataV1}}function beforeAgentStartEventDefinition(){return{id:BEFORE_AGENT_START_EVENT_ID,version:BEFORE_AGENT_START_EVENT_VERSION,phase:"committed",schema:"agent-forge/before.agent.start@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateBeforeAgentStartEventDataV1}}function validateBeforeAgentStartEventDataV2(value){if(!isPlainRecord2(value))throw new Error(t("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(t("before.agent.start data has unsupported fields: {unsupported}",{unsupported:unsupported.join(", ")}));for(let key of["version","sessionId","systemPrompt","systemPromptOptions"])if(!(key in value))throw new Error(t("before.agent.start data is missing required field: {key}",{key}));if(value.version!==2)throw new Error(t("before.agent.start data.version must be 2"));if(assertString(value.sessionId,"before.agent.start data.sessionId"),typeof value.systemPrompt!="string")throw new Error(t("before.agent.start data.systemPrompt must be a string"));if(!isPlainRecord2(value.systemPromptOptions))throw new Error(t("before.agent.start data.systemPromptOptions must be a plain object"));return value}function beforeAgentStartV2EventDefinition(){return{id:BEFORE_AGENT_START_EVENT_ID,version:BEFORE_AGENT_START_EVENT_VERSION_V2,phase:"candidate",schema:"agent-forge/before.agent.start@2",allowedRegistrationKinds:["observe","transform"],validate:validateBeforeAgentStartEventDataV2}}function validateUIPromptBoundaryEventDataV1(value){if(!isPlainRecord2(value))throw new Error(t("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(t("ui.prompt lifecycle data has unsupported fields"));if(value.version!==1)throw new Error(t("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(t("resources.discover data must be a plain object"));if(Object.keys(value).sort().join(",")!=="cwd,reason,sessionId,version")throw new Error(t("resources.discover data has unsupported fields"));if(value.version!==1)throw new Error(t("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(t("resources.discover data.reason is invalid"));return value}function uiPromptStartEventDefinition(){return{id:UI_PROMPT_START_EVENT_ID,version:UI_PROMPT_START_EVENT_VERSION,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:UI_PROMPT_END_EVENT_VERSION,phase:"committed",schema:"agent-forge/ui.prompt.end@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateUIPromptBoundaryEventDataV1}}function resourcesDiscoverEventDefinition(){return{id:RESOURCES_DISCOVER_EVENT_ID,version:RESOURCES_DISCOVER_EVENT_VERSION,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(t("{label} must be an array",{label}));for(let[index,entry]of value.entries()){if(!isPlainRecord2(entry))throw new Error(t("{label}[{index}] must be a plain object",{label,index}));if(Object.keys(entry).sort().join(",")!=="extensionPath,path")throw new Error(t("{label}[{index}] has unsupported fields",{label,index}));assertString(entry.path,`${label}[${index}].path`),assertString(entry.extensionPath,`${label}[${index}].extensionPath`)}}function validateResourcesDiscoverEventDataV2(value){if(!isPlainRecord2(value))throw new Error(t("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(t("resources.discover data has unsupported fields: {unsupported}",{unsupported:unsupported.join(", ")}));for(let key of["version","sessionId","cwd","reason"])if(!(key in value))throw new Error(t("resources.discover data is missing required field: {key}",{key}));if(value.version!==2)throw new Error(t("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(t("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:RESOURCES_DISCOVER_EVENT_VERSION_V2,phase:"candidate",schema:"agent-forge/resources.discover@2",allowedRegistrationKinds:["observe","transform"],validate:validateResourcesDiscoverEventDataV2}}function validateContextAssembledEventDataV1(value){if(!isPlainRecord2(value))throw new Error(t("context.assembled data must be a plain object"));if(Object.keys(value).sort().join(",")!=="messageCount,sessionId,version")throw new Error(t("context.assembled data has unsupported fields"));if(value.version!==1)throw new Error(t("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(t("context.assembled data.messageCount must be a non-negative safe integer"));return value}function validateInputReceivedEventDataV1(value){if(!isPlainRecord2(value))throw new Error(t("input.received data must be a plain object"));if(Object.keys(value).sort().join(",")!=="sessionId,textLength,version,source".split(",").sort().join(","))throw new Error(t("input.received data has unsupported fields"));if(value.version!==1)throw new Error(t("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(t("input.received data.textLength must be a non-negative safe integer"));return value}function validateUserBashEventDataV1(value){if(!isPlainRecord2(value))throw new Error(t("user.bash data must be a plain object"));if(Object.keys(value).sort().join(",")!=="cwd,excludeFromContext,sessionId,version")throw new Error(t("user.bash data has unsupported fields"));if(value.version!==1)throw new Error(t("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(t("user.bash data.excludeFromContext must be a boolean"));return value}function contextAssembledEventDefinition(){return{id:CONTEXT_ASSEMBLED_EVENT_ID,version:CONTEXT_ASSEMBLED_EVENT_VERSION,phase:"committed",schema:"agent-forge/context.assembled@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateContextAssembledEventDataV1}}function inputReceivedEventDefinition(){return{id:INPUT_RECEIVED_EVENT_ID,version:INPUT_RECEIVED_EVENT_VERSION,phase:"committed",schema:"agent-forge/input.received@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateInputReceivedEventDataV1}}function userBashEventDefinition(){return{id:USER_BASH_EVENT_ID,version:USER_BASH_EVENT_VERSION,phase:"committed",schema:"agent-forge/user.bash@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateUserBashEventDataV1}}function validateSessionStartEventDataV1(value){if(!isPlainRecord2(value))throw new Error(t("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(t("session.start data has unsupported fields"));if(value.version!==1)throw new Error(t("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(t("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:SESSION_START_EVENT_VERSION,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(t("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(t("model.response data has unsupported fields: {unsupported}",{unsupported:unsupported.join(", ")}));for(let key of["version","sessionId","entryId","revision","provider","model","stopReason","message"])if(!(key in record))throw new Error(t("model.response data is missing required field: {key}",{key}));if(record.version!==1)throw new Error(t("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(t("model.response data.stopReason is invalid"));if(!record.message||typeof record.message!="object"||Array.isArray(record.message))throw new Error(t("model.response data.message must be an assistant message object"));if(record.message.role!=="assistant")throw new Error(t("model.response data.message.role must be assistant"));if(!isPlainRecord2(record.revision))throw new Error(t("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(t("model.response data.revision has unsupported fields"));if(revision.version!==1)throw new Error(t("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(t("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(t("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:MODEL_RESPONSE_EVENT_VERSION,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(t("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(t("model.stream data has unsupported fields: {unsupported}",{unsupported:unsupported.join(", ")}));for(let key of["version","sessionId","streamId","sequence","phase","event","partial","terminal","error"])if(!(key in value))throw new Error(t("model.stream data is missing required field: {key}",{key}));if(value.version!==1)throw new Error(t("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(t("model.stream data.sequence must be a positive safe integer"));if(value.phase!=="raw"&&value.phase!=="candidate"&&value.phase!=="committed")throw new Error(t("model.stream data.phase is invalid"));if(typeof value.event!="string"||!modelStreamEvents.has(value.event))throw new Error(t("model.stream data.event is invalid"));if(value.phase==="committed"&&value.event!=="done"&&value.event!=="error")throw new Error(t("model.stream committed phase only permits terminal events"));let terminal=value.event==="done"||value.event==="error";if(value.terminal!==terminal)throw new Error(t("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(t("model.stream done event cannot contain error"));if(terminal&&value.event==="error"){if(!isPlainRecord2(value.error))throw new Error(t("model.stream error event requires error object"));if(Object.keys(value.error).some(key=>key!=="code"&&key!=="message"&&key!=="name"))throw new Error(t("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(t("model.stream non-terminal event cannot contain error"));return value}function modelStreamEventDefinition(){return{id:MODEL_STREAM_EVENT_ID,version:MODEL_STREAM_EVENT_VERSION,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(t("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(t("tool.result data has unsupported fields: {unsupported}",{unsupported:unsupported.join(", ")}));for(let key of["version","sessionId","entryId","revision","toolCallId","toolName","isError","message"])if(!(key in value))throw new Error(t("tool.result data is missing required field: {key}",{key}));if(value.version!==1)throw new Error(t("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(t("tool.result data.isError must be boolean"));if(!isPlainRecord2(value.message))throw new Error(t("tool.result data.message must be a tool result message object"));if(value.message.role!=="toolResult")throw new Error(t("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(t("tool.result data.message.content must be an array"));if(typeof value.message.isError!="boolean")throw new Error(t("tool.result data.message.isError must be boolean"));if(value.message.toolCallId!==value.toolCallId)throw new Error(t("tool.result data.message.toolCallId must match toolCallId"));if(value.message.toolName!==value.toolName)throw new Error(t("tool.result data.message.toolName must match toolName"));if(value.message.isError!==value.isError)throw new Error(t("tool.result data.message.isError must match isError"));if(!isPlainRecord2(value.revision))throw new Error(t("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(t("tool.result data.revision has unsupported fields"));if(revision.version!==1)throw new Error(t("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(t("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(t("tool.result data.revision.sessionId must match sessionId"));return value}function toolResultEventDefinition(){return{id:TOOL_RESULT_EVENT_ID,version:TOOL_RESULT_EVENT_VERSION,phase:"committed",schema:"agent-forge/tool.result@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateToolResultEventDataV1}}function validateToolCallEventDataV1(value){if(!isPlainRecord2(value))throw new Error(t("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(t("tool.call data has unsupported fields: {unsupported}",{unsupported:unsupported.join(", ")}));for(let key of["version","sessionId","revision","toolCallId","toolName","input"])if(!(key in value))throw new Error(t("tool.call data is missing required field: {key}",{key}));if(value.version!==1)throw new Error(t("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(t("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(t("tool.call data.revision has unsupported fields"));if(revision.version!==1)throw new Error(t("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(t("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(t("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:TOOL_CALL_EVENT_VERSION,phase:"candidate",schema:"agent-forge/tool.call@1",allowedRegistrationKinds:["observe","transform"],validate:validateToolCallEventDataV1}}function validateToolExecuteEventDataV1(value){if(!isPlainRecord2(value))throw new Error(t("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(t("tool.execute data has unsupported fields: {unsupported}",{unsupported:unsupported.join(", ")}));for(let key of["version","sessionId","revision","toolCallId","toolName","input","isError","content"])if(!(key in value))throw new Error(t("tool.execute data is missing required field: {key}",{key}));if(value.version!==1)throw new Error(t("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(t("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:TOOL_EXECUTE_EVENT_VERSION,phase:"committed",schema:"agent-forge/tool.execute@1",allowedRegistrationKinds:["observe","execute"],validate:validateToolExecuteEventDataV1}}function validateToolCommitEventDataV1(value){if(!isPlainRecord2(value))throw new Error(t("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(t("tool.commit data has unsupported fields: {unsupported}",{unsupported:unsupported.join(", ")}));for(let key of["version","sessionId","entryId","revision","toolCallId","toolName","isError"])if(!(key in value))throw new Error(t("tool.commit data is missing required field: {key}",{key}));if(value.version!==1)throw new Error(t("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(t("tool.commit data.isError must be boolean"));if(!isPlainRecord2(value.revision))throw new Error(t("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(t("tool.commit data.revision has unsupported fields"));if(revision.version!==1)throw new Error(t("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(t("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(t("tool.commit data.revision.sessionId must match sessionId"));return value}function toolCommitEventDefinition(){return{id:TOOL_COMMIT_EVENT_ID,version:TOOL_COMMIT_EVENT_VERSION,phase:"committed",schema:"agent-forge/tool.commit@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateToolCommitEventDataV1}}function validateToolResultRawEventDataV1(value){if(!isPlainRecord2(value))throw new Error(t("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(t("tool.result.raw data has unsupported fields: {unsupported}",{unsupported:unsupported.join(", ")}));for(let key of["version","sessionId","revision","toolCallId","toolName","isError","content"])if(!(key in value))throw new Error(t("tool.result.raw data is missing required field: {key}",{key}));if(value.version!==1)throw new Error(t("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(t("tool.result.raw data.isError must be boolean"));if(!isPlainRecord2(value.revision))throw new Error(t("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(t("tool.result.raw data.revision has unsupported fields"));if(revision.version!==1)throw new Error(t("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(t("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(t("tool.result.raw data.revision.sessionId must match sessionId"));if(!Array.isArray(value.content))throw new Error(t("tool.result.raw data.content must be an array"));for(let[index,content]of value.content.entries()){if(!isPlainRecord2(content))throw new Error(t("tool.result.raw data.content[{index}] must be a plain object",{index}));if(content.type==="text"){let keys=Object.keys(content).sort().join(",");if(keys!=="text,type"&&keys!=="text,textSignature,type")throw new Error(t("tool.result.raw data.content[{index}] has unsupported text fields",{index}));assertString(content.text,`tool.result.raw data.content[${index}].text`),content.textSignature!==void 0&&assertString(content.textSignature,`tool.result.raw data.content[${index}].textSignature`);continue}if(content.type==="image"){if(Object.keys(content).sort().join(",")!=="data,mimeType,type")throw new Error(t("tool.result.raw data.content[{index}] has unsupported image fields",{index}));assertString(content.data,`tool.result.raw data.content[${index}].data`),assertString(content.mimeType,`tool.result.raw data.content[${index}].mimeType`);continue}throw new Error(t("tool.result.raw data.content[{index}].type is invalid",{index}))}return value}function toolResultRawEventDefinition(){return{id:TOOL_RESULT_RAW_EVENT_ID,version:TOOL_RESULT_RAW_EVENT_VERSION,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(t("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(t("tool.result.transform data has unsupported fields: {unsupported}",{unsupported:unsupported.join(", ")}));for(let key of["version","sessionId","revision","toolCallId","toolName","isError","content"])if(!(key in value))throw new Error(t("tool.result.transform data is missing required field: {key}",{key}));if(value.version!==1)throw new Error(t("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(t("tool.result.transform data.isError must be boolean"));if(!isPlainRecord2(value.revision))throw new Error(t("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(t("tool.result.transform data.revision has unsupported fields"));if(revision.version!==1)throw new Error(t("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(t("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(t("tool.result.transform data.revision.sessionId must match sessionId"));if(!Array.isArray(value.content))throw new Error(t("tool.result.transform data.content must be an array"));for(let[index,content]of value.content.entries()){if(!isPlainRecord2(content))throw new Error(t("tool.result.transform data.content[{index}] must be a plain object",{index}));if(content.type==="text"){let keys=Object.keys(content).sort().join(",");if(keys!=="text,type"&&keys!=="text,textSignature,type")throw new Error(t("tool.result.transform data.content[{index}] has unsupported text fields",{index}));assertString(content.text,`tool.result.transform data.content[${index}].text`),content.textSignature!==void 0&&assertString(content.textSignature,`tool.result.transform data.content[${index}].textSignature`);continue}if(content.type==="image"){if(Object.keys(content).sort().join(",")!=="data,mimeType,type")throw new Error(t("tool.result.transform data.content[{index}] has unsupported image fields",{index}));assertString(content.data,`tool.result.transform data.content[${index}].data`),assertString(content.mimeType,`tool.result.transform data.content[${index}].mimeType`);continue}throw new Error(t("tool.result.transform data.content[{index}].type is invalid",{index}))}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(t("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(t("operation.end data has unsupported fields: {unsupported}",{unsupported:unsupported.join(", ")}));for(let key of["version","operationId","operationKind","status"])if(!(key in value))throw new Error(t("operation.end data is missing required field: {key}",{key}));if(value.version!==1)throw new Error(t("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(t("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:OPERATION_END_EVENT_VERSION,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(t("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(t("capability.call data has unsupported fields: {unsupported}",{unsupported:unsupported.join(", ")}));for(let key of["version","operationId","capabilityId","capabilityVersion","capabilityKind","callerPluginId","providerPluginId","event"])if(!(key in value))throw new Error(t("capability.call data is missing required field: {key}",{key}));if(value.version!==1)throw new Error(t("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(t("capability.call data.capabilityVersion must be a positive safe integer"));if(value.capabilityKind!=="service"&&value.capabilityKind!=="contribution"&&value.capabilityKind!=="transform")throw new Error(t("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(t("capability.call data.event is invalid"));if((value.event==="start"||value.event==="cancel")&&value.status!==void 0)throw new Error(t("capability.call start/cancel must not include status"));if(value.event==="end"&&value.status===void 0)throw new Error(t("capability.call end requires status"));if(value.status!==void 0&&(typeof value.status!="string"||!capabilityCallStatuses.has(value.status)))throw new Error(t("capability.call data.status is invalid"));if(value.error!==void 0){if(!isPlainRecord2(value.error))throw new Error(t("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(t("capability.call data.error has unsupported fields"));if(!("code"in value.error))throw new Error(t("capability.call data.error is missing required field: code"));if(!("message"in value.error))throw new Error(t("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(t("capability.call start/cancel must not include error"));if(value.event==="end"&&value.status==="succeeded"&&value.error!==void 0)throw new Error(t("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(t("operation.start data must be a plain object"));if(Object.keys(value).sort().join(",")!=="operationId,operationKind,version")throw new Error(t("operation.start data has unsupported fields"));if(value.version!==1)throw new Error(t("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(t("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(t("operation.step data has unsupported fields"));if(value.version!==1)throw new Error(t("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(t("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(t("operation.cancel data must be a plain object"));if(Object.keys(value).sort().join(",")!=="operationId,operationKind,version")throw new Error(t("operation.cancel data has unsupported fields"));if(value.version!==1)throw new Error(t("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 assertNonNegativeSafeInteger(value,label){if(typeof value!="number"||!Number.isSafeInteger(value)||value<0)throw new Error(t("{label} must be a non-negative safe integer",{label}))}function assertPositiveSafeInteger(value,label){if(typeof value!="number"||!Number.isSafeInteger(value)||value<1)throw new Error(t("{label} must be a positive safe integer",{label}))}function validateSessionAutoRetryEventDataV1(value){if(!isPlainRecord2(value))throw new Error(t("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(t("session.auto.retry data has unsupported fields: {unsupported}",{unsupported:unsupported.join(", ")}));for(let key of["version","sessionId","attempt","maxAttempts","delayMs","errorMessage"])if(!(key in value))throw new Error(t("session.auto.retry data is missing required field: {key}",{key}));if(value.version!==1)throw new Error(t("session.auto.retry data.version must be 1"));return assertString(value.sessionId,"session.auto.retry data.sessionId"),assertPositiveSafeInteger(value.attempt,"session.auto.retry data.attempt"),assertPositiveSafeInteger(value.maxAttempts,"session.auto.retry data.maxAttempts"),assertNonNegativeSafeInteger(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&&assertPositiveSafeInteger(value,label)}function validateSessionCompactionDecisionEventDataV1(value){if(!isPlainRecord2(value))throw new Error(t("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(t("session.compaction.decision data has unsupported fields: {unsupported}",{unsupported:unsupported.join(", ")}));for(let key of["version","sessionId","reason","compact","willRetry"])if(!(key in value))throw new Error(t("session.compaction.decision data is missing required field: {key}",{key}));if(value.version!==1)throw new Error(t("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(t("session.compaction.decision data.reason is invalid"));if(typeof value.compact!="boolean")throw new Error(t("session.compaction.decision data.compact must be a boolean"));if(typeof value.willRetry!="boolean")throw new Error(t("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(t("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(t("session.compaction.failed data has unsupported fields: {unsupported}",{unsupported:unsupported.join(", ")}));for(let key of["version","sessionId","reason","errorMessage"])if(!(key in value))throw new Error(t("session.compaction.failed data is missing required field: {key}",{key}));if(value.version!==1)throw new Error(t("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(t("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(t("session.end data must be a plain object"));if(Object.keys(value).sort().join(",")!=="sessionId,version")throw new Error(t("session.end data has unsupported fields"));if(value.version!==1)throw new Error(t("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(t("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(t("agent.task.settled data has unsupported fields: {unsupported}",{unsupported:unsupported.join(", ")}));for(let key of["version","sessionId","taskSessionId","taskId","status"])if(!(key in value))throw new Error(t("agent.task.settled data is missing required field: {key}",{key}));if(value.version!==1)throw new Error(t("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(t("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(t("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(t("tool.gate.blocked data has unsupported fields: {unsupported}",{unsupported:unsupported.join(", ")}));for(let key of["version","sessionId","toolCallId","toolName"])if(!(key in value))throw new Error(t("tool.gate.blocked data is missing required field: {key}",{key}));if(value.version!==1)throw new Error(t("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:TOOL_GATE_BLOCKED_EVENT_VERSION,phase:"committed",schema:"agent-forge/tool.gate.blocked@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateToolGateBlockedEventDataV1}}function validateInputGateBlockedEventDataV1(value){if(!isPlainRecord2(value))throw new Error(t("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(t("input.gate.blocked data has unsupported fields: {unsupported}",{unsupported:unsupported.join(", ")}));for(let key of["version","sessionId","source","textLength"])if(!(key in value))throw new Error(t("input.gate.blocked data is missing required field: {key}",{key}));if(value.version!==1)throw new Error(t("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(t("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:INPUT_GATE_BLOCKED_EVENT_VERSION,phase:"committed",schema:"agent-forge/input.gate.blocked@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateInputGateBlockedEventDataV1}}var PROVIDER_FAILOVER_SWITCHED_EVENT_ID="provider.failover.switched",PROVIDER_FAILOVER_SWITCHED_EVENT_VERSION=1,PROVIDER_FAILOVER_RECOVERED_EVENT_ID="provider.failover.recovered",PROVIDER_FAILOVER_RECOVERED_EVENT_VERSION=1,PROVIDER_FAILOVER_PROBE_FAILED_EVENT_ID="provider.failover.probe.failed",PROVIDER_FAILOVER_PROBE_FAILED_EVENT_VERSION=1,isModelReference=value=>{let separator=value.indexOf("/");return separator>0&&separator<value.length-1};function validateFailoverModelReference(value,label){if(assertString(value,label),!isModelReference(value))throw new Error(t("{label} must be a provider/modelId reference",{label}))}function validateProviderFailoverSwitchedEventDataV1(value){if(!isPlainRecord2(value))throw new Error(t("provider.failover.switched data must be a plain object"));let allowed=new Set(["version","chainId","from","to","attempt","rawError"]),unsupported=Object.keys(value).filter(key=>!allowed.has(key));if(unsupported.length>0)throw new Error(t("provider.failover.switched data has unsupported fields: {unsupported}",{unsupported:unsupported.join(", ")}));for(let key of["version","chainId","from","to","attempt","rawError"])if(!(key in value))throw new Error(t("provider.failover.switched data is missing required field: {key}",{key}));if(value.version!==1)throw new Error(t("provider.failover.switched data.version must be 1"));return validateFailoverModelReference(value.chainId,"provider.failover.switched data.chainId"),validateFailoverModelReference(value.from,"provider.failover.switched data.from"),validateFailoverModelReference(value.to,"provider.failover.switched data.to"),assertPositiveSafeInteger(value.attempt,"provider.failover.switched data.attempt"),assertString(value.rawError,"provider.failover.switched data.rawError"),value}function providerFailoverSwitchedEventDefinition(){return{id:PROVIDER_FAILOVER_SWITCHED_EVENT_ID,version:PROVIDER_FAILOVER_SWITCHED_EVENT_VERSION,phase:"committed",schema:"agent-forge/provider.failover.switched@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateProviderFailoverSwitchedEventDataV1}}function validateProviderFailoverRecoveredEventDataV1(value){if(!isPlainRecord2(value))throw new Error(t("provider.failover.recovered data must be a plain object"));if(Object.keys(value).sort().join(",")!=="chainId,provider,version")throw new Error(t("provider.failover.recovered data has unsupported fields"));if(value.version!==1)throw new Error(t("provider.failover.recovered data.version must be 1"));return validateFailoverModelReference(value.chainId,"provider.failover.recovered data.chainId"),assertString(value.provider,"provider.failover.recovered data.provider"),value}function providerFailoverRecoveredEventDefinition(){return{id:PROVIDER_FAILOVER_RECOVERED_EVENT_ID,version:PROVIDER_FAILOVER_RECOVERED_EVENT_VERSION,phase:"committed",schema:"agent-forge/provider.failover.recovered@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateProviderFailoverRecoveredEventDataV1}}function validateProviderFailoverProbeFailedEventDataV1(value){if(!isPlainRecord2(value))throw new Error(t("provider.failover.probe.failed data must be a plain object"));let allowed=new Set(["version","chainId","provider","rawError","nextCooldownMs"]),unsupported=Object.keys(value).filter(key=>!allowed.has(key));if(unsupported.length>0)throw new Error(t("provider.failover.probe.failed data has unsupported fields: {unsupported}",{unsupported:unsupported.join(", ")}));for(let key of["version","chainId","provider","rawError","nextCooldownMs"])if(!(key in value))throw new Error(t("provider.failover.probe.failed data is missing required field: {key}",{key}));if(value.version!==1)throw new Error(t("provider.failover.probe.failed data.version must be 1"));return validateFailoverModelReference(value.chainId,"provider.failover.probe.failed data.chainId"),assertString(value.provider,"provider.failover.probe.failed data.provider"),assertString(value.rawError,"provider.failover.probe.failed data.rawError"),assertPositiveSafeInteger(value.nextCooldownMs,"provider.failover.probe.failed data.nextCooldownMs"),value}function providerFailoverProbeFailedEventDefinition(){return{id:PROVIDER_FAILOVER_PROBE_FAILED_EVENT_ID,version:PROVIDER_FAILOVER_PROBE_FAILED_EVENT_VERSION,phase:"committed",schema:"agent-forge/provider.failover.probe.failed@1",allowedRegistrationKinds:["observe","after-commit"],validate:validateProviderFailoverProbeFailedEventDataV1}}import{lstatSync,readdirSync,realpathSync,statSync}from"node:fs";import{readFile as readFile2}from"node:fs/promises";import{createRequire}from"node:module";import*as path2 from"node:path";var activePlugins=new WeakMap,createJitiPromise;function getCreateJiti(){return createJitiPromise??=import("./jiti-static-loader-CDSTNEDU.js").then(module=>module.createJiti),createJitiPromise}var virtualModulesPromise;function getVirtualModules(){return virtualModulesPromise??=import("./virtual-modules-UQRUJLPM.js").then(module=>module.VIRTUAL_MODULES),virtualModulesPromise}var hostHeavyDependencyAliases=new Set(["@lancedb/lancedb","@huggingface/transformers","onnxruntime-node"]),resolvedHeavyDependencyAliases=new Map,defaultHostDependencyAliasResolution={resolve:specifier=>createRequire(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,(_,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(t("Capability plugin factory must return void or an instance with dispose(): {id}",{id:manifest.id}));return value}}function normalizePluginSyncInstance(value,manifest){if(value!==void 0){if(!isPluginInstance(value))throw new Error(t("Synchronous capability plugin factory must return void or an instance with dispose(): {id}",{id: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,status){runtime.hasLifecycleEvent(PLUGIN_DISPOSE_EVENT_ID,PLUGIN_DISPOSE_EVENT_VERSION)&&await runtime.dispatchLifecycle({type:PLUGIN_DISPOSE_EVENT_ID,version:PLUGIN_DISPOSE_EVENT_VERSION,phase:"committed",data:{version:1,pluginId:manifest.id,pluginVersion:manifest.version,status},source:"capability-plugin"})}async function dispatchPluginReadyEvent(runtime,manifest){runtime.hasLifecycleEvent(PLUGIN_READY_EVENT_ID,PLUGIN_READY_EVENT_VERSION)&&await runtime.dispatchLifecycle({type:PLUGIN_READY_EVENT_ID,version:PLUGIN_READY_EVENT_VERSION,phase:"committed",data:{version:1,pluginId:manifest.id,pluginVersion:manifest.version},source:"capability-plugin"})}function isMissingPathError(error){return typeof error=="object"&&error!==null&&"code"in error&&error.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=path2.resolve(directory),stats;try{stats=statSync(resolvedDirectory)}catch(error){if(optional&&isMissingPathError(error))try{if(!lstatSync(resolvedDirectory).isSymbolicLink())return}catch(linkError){if(isMissingPathError(linkError))return;throw new Error(t("Failed to inspect capability plugin directory {directory}: {reason}",{directory:resolvedDirectory,reason:linkError instanceof Error?linkError.message:String(linkError)}))}throw new Error(t("Failed to inspect capability plugin directory {directory}: {reason}",{directory:resolvedDirectory,reason:error instanceof Error?error.message:String(error)}))}if(!stats.isDirectory())throw new Error(t("Capability plugin path must be a directory: {directory}",{directory:resolvedDirectory}));let canonicalDirectory;try{canonicalDirectory=realpathSync(resolvedDirectory)}catch(error){throw new Error(t("Failed to resolve capability plugin directory {directory}: {reason}",{directory:resolvedDirectory,reason:error instanceof Error?error.message:String(error)}))}if(seenDirectories.has(canonicalDirectory))return;seenDirectories.add(canonicalDirectory);let entries;try{entries=readdirSync(resolvedDirectory,{withFileTypes:!0,encoding:"utf8"})}catch(error){throw new Error(t("Failed to read capability plugin directory {directory}: {reason}",{directory:resolvedDirectory,reason:error instanceof Error?error.message:String(error)}))}for(let entry of entries.sort((left,right)=>compareNames(left.name,right.name))){if(entry.name==="node_modules"||entry.name.startsWith("."))continue;let entryPath=path2.join(resolvedDirectory,entry.name);if(entry.isDirectory()){visit(entryPath,!1);continue}if(!entry.isFile()||entry.name!=="plugin.json")continue;let canonicalManifest;try{canonicalManifest=realpathSync(entryPath)}catch(error){throw new Error(t("Failed to resolve capability plugin manifest {path}: {reason}",{path:entryPath,reason:error instanceof Error?error.message:String(error)}))}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(t("Capability plugin is already loaded: {id}",{id: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(error){errors.push(error)}try{await instance?.dispose()}catch(error){errors.push(error)}if(notifyDispose)try{await dispatchPluginDisposeEvent(runtime,manifest,errors.length===0?"disposed":"failed")}catch(error){errors.push(error)}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(error){try{await cleanup(!1)}catch(cleanupError){throw new AggregateError([error,cleanupError],`Capability plugin startup cleanup failed: ${manifest.id}`)}finally{active.get(manifest.id)===ownerToken&&active.delete(manifest.id)}throw error}}function loadCapabilityPluginSync(runtime,manifest,factory){let active=activePlugins.get(runtime)??new Map;if(active.has(manifest.id))throw new Error(t("Capability plugin is already loaded: {id}",{id: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(error){errors.push(error)}return errors},cleanupSync=async()=>{let errors=cleanupRegistrationsSync(),result;try{result=instance?.dispose()}catch(error){errors.push(error)}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(error){errors.push(error)}errors.push(contractError)}try{await dispatchPluginDisposeEvent(runtime,manifest,errors.length===0?"disposed":"failed")}catch(error){errors.push(error)}throwCleanupErrors(errors,manifest.id)};try{api=runtime.createAPI(manifest),instance=normalizePluginSyncInstance(factory(api),manifest)}catch(error){try{throwCleanupErrors(cleanupRegistrationsSync(),manifest.id)}catch(cleanupError){throw new AggregateError([error,cleanupError],`Capability plugin startup cleanup failed: ${manifest.id}`)}finally{active.get(manifest.id)===ownerToken&&active.delete(manifest.id)}throw error}let ready=dispatchPluginReadyEvent(runtime,manifest);ready.catch(()=>{});let disposePromise;return{manifest,api,ready,dispose:async()=>(disposePromise??=(async()=>{let readyError;try{await ready}catch(error){readyError=error}try{if(await cleanupSync(),readyError!==void 0)throw readyError}catch(error){throw readyError!==void 0&&error!==readyError?new AggregateError([readyError,error],`Capability plugin cleanup failed: ${manifest.id}`):error}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(error){throw new Error(t("Failed to read capability plugin manifest {path}: {reason}",{path:manifestPath,reason:error instanceof Error?error.message:String(error)}))}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=path2.resolve(path2.dirname(manifestPath),manifest.entry),[createJitiImpl,virtualModules]=await Promise.all([getCreateJiti(),getVirtualModules()]),jiti=createJitiImpl(import.meta.url,{moduleCache:!1,tsconfigPaths:!0,alias:buildHostDependencyAliases(hostHeavyDependencyAliases,defaultHostDependencyAliasResolution),virtualModules}),factory;try{factory=await jiti.import(entryPath,{default:!0})}catch(error){throw new Error(t("Failed to import capability plugin entry {path}: {reason}",{path:entryPath,reason:error instanceof Error?error.message:String(error)}))}if(typeof factory!="function")throw new Error(t("Capability plugin entry must default-export a factory function: {entryPath}",{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(t("installation reference is invalid"));if(/^(?:file:|[a-zA-Z]:[\\/]|[\\/]{1,2}|\\\\)/iu.test(value)||/\s/u.test(value))throw new Error(t("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,state){return Object.freeze({version:1,pluginId:record.pluginId,pluginVersion:record.pluginVersion,manifestDigest:record.manifestDigest,scope:scopeIdentity.scope,scopeRef:scopeIdentity.scopeRef,installationRef:opaqueInstallationRef(installationRef),state})}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(error){return isInvalidInstallationError(error)?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(error){return isInvalidInstallationError(error)?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(error){return isInvalidInstallationError(error)?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?t(ACQUISITION_ERROR_MESSAGES_V1[code]):`${t(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>MAX_PLUGIN_ACQUISITION_REF_CHARS_V1||/[\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>MAX_PLUGIN_ACQUISITION_NPM_NAME_CHARS_V1||!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(path8){let value=path8.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",t("{label} must be a non-empty string",{label}),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",t("{label} must be at most {max} characters",{label,max:MAX_PLUGIN_SELECTION_ID_CHARS_V1}),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",t("{label} must contain at most {max} plugin IDs",{label,max:MAX_PLUGIN_SELECTION_IDS_V1}));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",t("{label} contains duplicate plugin ID: {id}",{label,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",t("Selection references unknown plugin ID: {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",t("discovered plugin IDs exceed the selection limit of {limit}",{limit:MAX_PLUGIN_SELECTION_IDS_V1}));let selectedPluginIds=input.selection.selectedPluginIds===void 0?Object.freeze([...knownIds].sort((a,b)=>a.localeCompare(b))):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",t("Catalog truncation omitted selected plugin ID: {id}",{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 <builtinPluginProfileId> <pluginId\u2026> | selection-set <builtinPluginProfileId> <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 index=args.length-1;index>=0;index-=1){let token=args[index],selectedScope=(token.startsWith("--scope=")?token.slice(8):void 0)??(token==="--scope"?args[index+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(index,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[index+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(index,token==="--format"?2:1);continue}let selectedPlugins=(token.startsWith("--plugins=")?token.slice(10):void 0)??(token==="--plugins"?args[index+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(index,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,status,error,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,status,error,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,status,error,safeData)||(safeData=Object.freeze({truncated:!0}));let base=responseBase(command,format,status,error,safeData),humanText=error?`${status}: ${error.message}`:formatText(command,status,safeData),text=format==="json"?JSON.stringify(base):humanText;return Object.freeze({...base,text:boundText(text)})}function responseWithinBudget(command,format,status,error,data){let base=responseBase(command,format,status,error,data),humanText=error?`${status}: ${error.message}`:formatText(command,status,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,status,error,data){return{version:PLUGIN_ECOSYSTEM_CLI_VERSION_V1,command,format,status,...data===void 0?{}:{data},...error===void 0?{}:{error}}}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=`
214
214
  [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,status,data){if(data===void 0)return`${status}: ${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}`:"",state=typeof item.status=="string"?` ${item.status}`:typeof item.lifecycle=="string"?` ${item.lifecycle}`:"",visibility=item.enabled===!1?" disabled":"";return`${id}${version}${state}${visibility}`});return[`${status}: ${command}`,...lines,...data.truncated===!0?["[output truncated]"]:[]].join(`
215
- `)}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`${status}: ${command} profile:${data.profileId}${selected}${disabled}`}let note=typeof data.note=="string"?` ${data.note}`:"";return`${status}: ${command}${note}`}function safeError(code,cause){let messages={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"};return Object.freeze({code,message:cause!==void 0&&cause!==""?`${messages[code]} (${cause})`:messages[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(resolve22=>{release=resolve22}),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(error){return response("invalid",input.format==="json"?"json":"text","failed",invalidCommandError(input.argv,error))}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});if(updated.status==="cancelled")return response(parsed.command,parsed.format,"cancelled",safeError("cancelled"));if(updated.status!=="ok")return response(parsed.command,parsed.format,"failed",safeError("state_failed"));let retainedNote=parsed.command==="enable"&&record.state.lifecycle!=="active"?t("only toggles the enabled flag; the record lifecycle is {lifecycle} and the runtime will not load it",{lifecycle:record.state.lifecycle}):void 0;return response(parsed.command,parsed.format,"succeeded",void 0,{pluginId:record.pluginId,pluginVersion:record.pluginVersion,enabled,changed:updated.changed,...retainedNote===void 0?{}:{note:retainedNote}})}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",installed.status==="failed"?installed.error.message:void 0)):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 status=>{let[hostRestored,stateRestored]=await Promise.all([restoreActivatedInstallation().catch(()=>!1),restoreState().catch(()=>!1)]);return response(parsed.command,parsed.format,hostRestored&&stateRestored?status:"failed",safeError(hostRestored&&stateRestored?status==="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(error){transactionError=error}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(t("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(error){if(isCancelled(signal)||error instanceof PluginAcquisitionErrorV1&&error.code==="cancelled")return response(parsed.command,parsed.format,"cancelled",safeError("cancelled"));if(error instanceof PluginAcquisitionErrorV1)return response(parsed.command,parsed.format,"failed",{code:"acquisition_failed",message:error.message});throw error}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(error){return isCancelled(signal)||error instanceof Error&&error.message==="cancelled"?response(parsed.command,parsed.format,"cancelled",safeError("cancelled")):error instanceof Error&&error.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 join8,resolve as resolve3}from"node:path";import{open}from"node:fs/promises";import{isAbsolute as isAbsolute2,join as join6}from"node:path";import{realpathSync as realpathSync2}from"node:fs";import{basename,dirname as dirname4,isAbsolute,join as join5,relative}from"node:path";var stripDevicePrefix=value=>value.replace(/^\\\\\?\\/,""),normalizePath2=value=>{try{return stripDevicePrefix(realpathSync2.native(value))}catch{return}},normalizeWithAncestry=value=>{let missing=[],current=value;for(;;){let normalized=normalizePath2(current);if(normalized!==void 0)return missing.length===0?normalized:join5(normalized,...missing.reverse());let parent=dirname4(current);if(parent===current)return;missing.push(basename(current)),current=parent}};function withinInstallStoreRoot(root,value){if(!isAbsolute(value))return!1;let normalizedRoot=normalizeWithAncestry(root),normalizedValue=normalizeWithAncestry(value),relativePath=relative(normalizedRoot!==void 0&&normalizedValue!==void 0?normalizedRoot:root,normalizedRoot!==void 0&&normalizedValue!==void 0?normalizedValue:value);return relativePath!==""&&!relativePath.startsWith("..")&&!isAbsolute(relativePath)}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 validateRecord(root,value,index){if(value===null||typeof value!="object"||Array.isArray(value))throw new NodeDiskRegistrySourceErrorV1("invalid_index",t("Index record {index} is not an object",{index}));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",t("Index record {index} has an invalid schema",{index}));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"||!withinInstallStoreRoot(root,record.directory))throw new NodeDiskRegistrySourceErrorV1("invalid_index",t("Index record {index} is invalid",{index}));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",t("Install store index JSON is invalid"))}if(parsed===null||typeof parsed!="object"||Array.isArray(parsed))throw new NodeDiskRegistrySourceErrorV1("invalid_index",t("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",t("Install store index schema is unsupported"));if(value.records.length>MAX_NODE_DISK_REGISTRY_RECORDS_V1)throw new NodeDiskRegistrySourceErrorV1("too_many_records",t("Install store index exceeds the record limit"));return value.records.map((record,index)=>validateRecord(root,record,index))}async function readBoundedFile(path8,maxBytes,label){let handle=await open(path8,"r");try{let stat5=await handle.stat();if(!stat5.isFile()||stat5.size>maxBytes)throw new NodeDiskRegistrySourceErrorV1(label==="index"?"invalid_index":"invalid_manifest",t("{label} exceeds the size limit",{label}));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",t("Installed plugin manifest JSON is invalid"))}if(parsed===null||typeof parsed!="object"||Array.isArray(parsed))throw new NodeDiskRegistrySourceErrorV1("invalid_manifest",t("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",t("Installed plugin package format is unsupported"));if(delete value.packageFormatVersion,value.id!==record.pluginId||value.pluginVersion!==record.pluginVersion)throw new NodeDiskRegistrySourceErrorV1("identity_mismatch",t("Installed plugin manifest identity does not match index record for {identity}",{identity:`${record.pluginId}@${record.pluginVersion}`}));return value}async function readIndexRecords(rootDirectory,signal){if(signal?.aborted)throw new NodeDiskRegistrySourceErrorV1("cancelled",t("Disk registry source read was cancelled"));let rawIndex;try{rawIndex=await readBoundedFile(join6(rootDirectory,INDEX_FILE_V1),MAX_NODE_DISK_REGISTRY_INDEX_BYTES_V1,"index")}catch(error){if(error instanceof NodeDiskRegistrySourceErrorV1)throw error;if(error instanceof Error&&"code"in error&&error.code==="ENOENT")return;throw new NodeDiskRegistrySourceErrorV1("io_failed",t("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",t("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",t("Disk registry source read was cancelled"));let rawManifest;try{rawManifest=await readBoundedFile(join6(record.directory,ECOSYSTEM_MANIFEST_FILE_V1),MAX_NODE_DISK_REGISTRY_MANIFEST_BYTES_V1,"manifest")}catch(error){throw error instanceof NodeDiskRegistrySourceErrorV1?error:new NodeDiskRegistrySourceErrorV1("io_failed",t("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=join6(record.directory,CAPABILITY_MANIFEST_FILE_V1);try{await(await open(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(t(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(error,signal){return signal?.aborted===!0||error instanceof Error&&(error.name==="AbortError"||error.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(error){isCancelled2(error,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(error){if(acquired!==void 0&&options.host.releaseArtifact!==void 0&&await options.host.releaseArtifact({artifact:acquired}).catch(()=>{}),error instanceof PluginDistributionErrorV1)throw error;isCancelled2(error,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(error){isCancelled2(error,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(error,signal){return signal?.aborted===!0||error instanceof Error&&(error.name==="AbortError"||error.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,t("{label} must be a non-empty bounded string",{label}));return value}function assertAllowedKeys(value,allowed,label){let expected=new Set(allowed);if(Object.keys(value).some(key=>!expected.has(key)))throw new PluginRegistryErrorV1("invalid_manifest",t("{label} contains an unsupported field",{label}))}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",t("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(error){throw new PluginRegistryErrorV1("invalid_source",t("Plugin registry source URL is invalid"),error)}return value}function validateManifest(manifest){if(typeof manifest!="object"||manifest===null||Array.isArray(manifest))throw new PluginRegistryErrorV1("invalid_manifest",t("Registry manifest must be an object"));let value=manifest;if(assertAllowedKeys(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",t("Registry manifest id is invalid"));if(typeof value.pluginVersion!="string"||value.pluginVersion.trim()===""||value.pluginVersion.length>256)throw new PluginRegistryErrorV1("invalid_manifest",t("Registry manifest pluginVersion is invalid"));if(typeof value.apiVersion!="string"||value.apiVersion.trim()===""||value.apiVersion.length>256)throw new PluginRegistryErrorV1("invalid_manifest",t("Registry manifest apiVersion is invalid"));if(value.minHostVersion===void 0&&value.maxHostVersion===void 0)throw new PluginRegistryErrorV1("invalid_manifest",t("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(error){throw new PluginRegistryErrorV1("invalid_manifest",t("Registry manifest cannot be serialized"),error)}if(bytes>MAX_PLUGIN_REGISTRY_MANIFEST_BYTES_V1)throw new PluginRegistryErrorV1("payload_too_large",t("Registry manifest exceeds the size limit"));return Object.freeze({...value})}function validateEnvelope(value){if(typeof value!="object"||value===null||Array.isArray(value))throw new PluginRegistryErrorV1("invalid_manifest",t("Registry response entry must be an object"));let entry=value;assertAllowedKeys(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(error){throw new PluginRegistryErrorV1("invalid_manifest",t("Registry distribution descriptor is invalid"),error)}if(distribution.pluginId!==manifest.id||distribution.pluginVersion!==manifest.pluginVersion||distribution.manifestDigest!==manifestDigest)throw new PluginRegistryErrorV1("invalid_manifest",t("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",t("maxManifests must be an integer between 1 and {max}",{max: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",t("Manifest digest mismatch for {identity}",{identity:`${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??t("Registry source proof was rejected"))}catch(error){throw error instanceof PluginRegistryErrorV1?error:new PluginRegistryErrorV1("source_rejected",t("Registry source proof was rejected"),error)}let result;try{result=sourceVerifier({pluginId:entry.manifest.id,pluginVersion:entry.manifest.pluginVersion,source:entry.source,manifestDigest:actualDigest})}catch(error){throw new PluginRegistryErrorV1("source_rejected",t("Plugin source verifier failed"),error)}if(result.status!=="accepted")throw new PluginRegistryErrorV1("source_rejected",result.reason??t("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",t("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",t("Registry source/digest verifier is required"));if(options.sourceVerifier===void 0||typeof options.sourceVerifier!="function")throw new PluginRegistryErrorV1("source_rejected",t("Registry source verifier is required"));let load=async(input={})=>{if(input.signal?.aborted)throw new PluginRegistryErrorV1("cancelled",t("Plugin registry operation was cancelled"));let raw;try{raw=await options.source.list({signal:input.signal})}catch(error){throw isAbortLike(error,input.signal)?new PluginRegistryErrorV1("cancelled",t("Plugin registry operation was cancelled"),error):new PluginRegistryErrorV1("source_rejected",t("Plugin registry source failed"),error)}if(input.signal?.aborted)throw new PluginRegistryErrorV1("cancelled",t("Plugin registry operation was cancelled"));if(!Array.isArray(raw))throw new PluginRegistryErrorV1("invalid_manifest",t("Registry source must return an array"));if(raw.length>maxManifests)throw new PluginRegistryErrorV1("too_many_manifests",t("Registry response contains too many manifests"));let entries=raw.map(validateEnvelope);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",t("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",t("Duplicate registry manifest: {identity}",{identity}));seen.add(identity);try{await validateSourceProof(entry,options.verify,options.sourceVerifier)}catch(error){if(!(error instanceof PluginRegistryErrorV1)||error.cause!==void 0||error.code!=="source_rejected"&&error.code!=="invalid_digest")throw error;rejected.push({pluginId:entry.manifest.id,pluginVersion:entry.manifest.pluginVersion,code:error.code==="invalid_digest"?"digest_rejected":"source_rejected",reason:error.code==="invalid_digest"?"Manifest digest mismatch":"Registry source proof was rejected"});continue}if(input.signal?.aborted)throw new PluginRegistryErrorV1("cancelled",t("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}from"node:crypto";import{mkdir,readFile as readFile3,rename,unlink,writeFile}from"node:fs/promises";import{basename as basename2,dirname as dirname5,isAbsolute as isAbsolute3,join as join7,resolve as resolve2}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(error){return error instanceof Error&&(error.name==="AbortError"||error.name==="AbortSignalError")}function isMissingError(error){return typeof error!="object"||error===null?!1:"code"in error&&error.code==="ENOENT"}function validateFilePath(value){if(typeof value!="string"||value.trim()===""||value.length>MAX_PLUGIN_STATE_STRING_CHARS_V1)throw new Error(t("invalid plugin state file path"));if(value.includes("\0")||/[\u0000-\u001f]/u.test(value))throw new Error(t("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(t("invalid plugin state file path"));let normalized=isAbsolute3(value)?value:resolve2(value);if(basename2(normalized).length===0||basename2(normalized)==="."||basename2(normalized)==="..")throw new Error(t("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(t("invalid plugin scope reference"));if(/^(?:file:|[a-zA-Z]:[\\/]|[\\/]{1,2}|\\\\)/u.test(value)||/\s/u.test(value))throw new Error(t("invalid plugin scope reference"));if(value.includes("\0")||/[\u0000-\u001f]/u.test(value))throw new Error(t("invalid plugin scope reference"));if(scope==="global"&&value!==DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1)throw new Error(t("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(t("{label} is invalid",{label}));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(t("record source label is invalid"));return value}function identityOf(record){return`${record.state.scope}:${record.state.scopeRef}:${record.pluginId}@${record.pluginVersion}`}function isObject(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(!isObject(value)||Object.keys(value).some(key=>!allowedKeys.has(key)))throw new Error(t("record schema is invalid"));for(let key of requiredKeys)if(!(key in value))throw new Error(t("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(!isObject(value.state)||!hasExactKeys2(value.state,["scope","scopeRef","enabled","lifecycle"]))throw new Error(t("state schema is invalid"));if(value.state.scope!=="global"&&value.state.scope!=="project")throw new Error(t("state scope is invalid"));let scopeRef=validateScopeRef(value.state.scope,value.state.scopeRef);if(typeof value.state.enabled!="boolean")throw new Error(t("state enabled flag is invalid"));if(value.state.lifecycle!=="installed"&&value.state.lifecycle!=="active"&&value.state.lifecycle!=="retained")throw new Error(t("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(!isObject(value)||!hasExactKeys2(value,["version","records"]))throw new Error(t("snapshot schema is invalid"));if(value.version!==PLUGIN_STATE_SNAPSHOT_VERSION_V1)throw new Error(t("snapshot version is unsupported"));if(!Array.isArray(value.records))throw new Error(t("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(error){let message=error instanceof Error?error.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 path8=>await readFile3(path8,"utf8"),mkdir:async path8=>{await mkdir(path8,{recursive:!0})},writeFile:async(path8,data)=>{await writeFile(path8,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(t("state scope is invalid"));if(installation.scope!==scope)throw new Error(t("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(t("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(error){if(isMissingError(error))return Object.freeze({status:"missing",snapshot:EMPTY_SNAPSHOT});if(isAbortError(error)||signal?.aborted)return cancelledResult();throw error}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(error){return Object.freeze({status:"invalid",diagnostics:Object.freeze([invalidFromError(error)])})}}async function write(snapshot2,signal){if(signal?.aborted)return cancelledResult();let parent=dirname5(filePath),temporaryPath=join7(parent,`.${basename2(filePath)}.${randomUUID()}.tmp`);try{return await fileSystem.mkdir(parent),signal?.aborted||(await fileSystem.writeFile(temporaryPath,`${JSON.stringify(snapshot2)}
215
+ `)}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`${status}: ${command} profile:${data.profileId}${selected}${disabled}`}let note=typeof data.note=="string"?` ${data.note}`:"";return`${status}: ${command}${note}`}function safeError(code,cause){let messages={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"};return Object.freeze({code,message:cause!==void 0&&cause!==""?`${messages[code]} (${cause})`:messages[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(resolve22=>{release=resolve22}),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(error){return response("invalid",input.format==="json"?"json":"text","failed",invalidCommandError(input.argv,error))}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});if(updated.status==="cancelled")return response(parsed.command,parsed.format,"cancelled",safeError("cancelled"));if(updated.status!=="ok")return response(parsed.command,parsed.format,"failed",safeError("state_failed"));let retainedNote=parsed.command==="enable"&&record.state.lifecycle!=="active"?t("only toggles the enabled flag; the record lifecycle is {lifecycle} and the runtime will not load it",{lifecycle:record.state.lifecycle}):void 0;return response(parsed.command,parsed.format,"succeeded",void 0,{pluginId:record.pluginId,pluginVersion:record.pluginVersion,enabled,changed:updated.changed,...retainedNote===void 0?{}:{note:retainedNote}})}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",installed.status==="failed"?installed.error.message:void 0)):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 status=>{let[hostRestored,stateRestored]=await Promise.all([restoreActivatedInstallation().catch(()=>!1),restoreState().catch(()=>!1)]);return response(parsed.command,parsed.format,hostRestored&&stateRestored?status:"failed",safeError(hostRestored&&stateRestored?status==="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(error){transactionError=error}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(t("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(error){if(isCancelled(signal)||error instanceof PluginAcquisitionErrorV1&&error.code==="cancelled")return response(parsed.command,parsed.format,"cancelled",safeError("cancelled"));if(error instanceof PluginAcquisitionErrorV1)return response(parsed.command,parsed.format,"failed",{code:"acquisition_failed",message:error.message});throw error}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(error){return isCancelled(signal)||error instanceof Error&&error.message==="cancelled"?response(parsed.command,parsed.format,"cancelled",safeError("cancelled")):error instanceof Error&&error.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 join8,resolve as resolve3}from"node:path";import{open}from"node:fs/promises";import{isAbsolute as isAbsolute2,join as join6}from"node:path";import{realpathSync as realpathSync2}from"node:fs";import{basename,dirname as dirname4,isAbsolute,join as join5,relative}from"node:path";var stripDevicePrefix=value=>value.replace(/^\\\\\?\\/,""),normalizePath2=value=>{try{return stripDevicePrefix(realpathSync2.native(value))}catch{return}},normalizeWithAncestry=value=>{let missing=[],current=value;for(;;){let normalized=normalizePath2(current);if(normalized!==void 0)return missing.length===0?normalized:join5(normalized,...missing.reverse());let parent=dirname4(current);if(parent===current)return;missing.push(basename(current)),current=parent}};function withinInstallStoreRoot(root,value){if(!isAbsolute(value))return!1;let normalizedRoot=normalizeWithAncestry(root),normalizedValue=normalizeWithAncestry(value),relativePath=relative(normalizedRoot!==void 0&&normalizedValue!==void 0?normalizedRoot:root,normalizedRoot!==void 0&&normalizedValue!==void 0?normalizedValue:value);return relativePath!==""&&!relativePath.startsWith("..")&&!isAbsolute(relativePath)}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 validateRecord(root,value,index){if(value===null||typeof value!="object"||Array.isArray(value))throw new NodeDiskRegistrySourceErrorV1("invalid_index",t("Index record {index} is not an object",{index}));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",t("Index record {index} has an invalid schema",{index}));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"||!withinInstallStoreRoot(root,record.directory))throw new NodeDiskRegistrySourceErrorV1("invalid_index",t("Index record {index} is invalid",{index}));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",t("Install store index JSON is invalid"))}if(parsed===null||typeof parsed!="object"||Array.isArray(parsed))throw new NodeDiskRegistrySourceErrorV1("invalid_index",t("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",t("Install store index schema is unsupported"));if(value.records.length>MAX_NODE_DISK_REGISTRY_RECORDS_V1)throw new NodeDiskRegistrySourceErrorV1("too_many_records",t("Install store index exceeds the record limit"));return value.records.map((record,index)=>validateRecord(root,record,index))}async function readBoundedFile(path8,maxBytes,label){let handle=await open(path8,"r");try{let stat5=await handle.stat();if(!stat5.isFile()||stat5.size>maxBytes)throw new NodeDiskRegistrySourceErrorV1(label==="index"?"invalid_index":"invalid_manifest",t("{label} exceeds the size limit",{label}));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",t("Installed plugin manifest JSON is invalid"))}if(parsed===null||typeof parsed!="object"||Array.isArray(parsed))throw new NodeDiskRegistrySourceErrorV1("invalid_manifest",t("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",t("Installed plugin package format is unsupported"));if(delete value.packageFormatVersion,value.id!==record.pluginId||value.pluginVersion!==record.pluginVersion)throw new NodeDiskRegistrySourceErrorV1("identity_mismatch",t("Installed plugin manifest identity does not match index record for {identity}",{identity:`${record.pluginId}@${record.pluginVersion}`}));return value}async function readIndexRecords(rootDirectory,signal){if(signal?.aborted)throw new NodeDiskRegistrySourceErrorV1("cancelled",t("Disk registry source read was cancelled"));let rawIndex;try{rawIndex=await readBoundedFile(join6(rootDirectory,INDEX_FILE_V1),MAX_NODE_DISK_REGISTRY_INDEX_BYTES_V1,"index")}catch(error){if(error instanceof NodeDiskRegistrySourceErrorV1)throw error;if(error instanceof Error&&"code"in error&&error.code==="ENOENT")return;throw new NodeDiskRegistrySourceErrorV1("io_failed",t("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",t("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=[],projectedDigests=new Map;for(let record of records){if(signal?.aborted)throw new NodeDiskRegistrySourceErrorV1("cancelled",t("Disk registry source read was cancelled"));let identity=`${record.pluginId}@${record.pluginVersion}`,projectedDigest=projectedDigests.get(identity);if(projectedDigest!==void 0){if(projectedDigest!==record.manifestDigest)throw new NodeDiskRegistrySourceErrorV1("invalid_index",t("Install store index contains conflicting manifests for {identity}",{identity}));continue}let rawManifest;try{rawManifest=await readBoundedFile(join6(record.directory,ECOSYSTEM_MANIFEST_FILE_V1),MAX_NODE_DISK_REGISTRY_MANIFEST_BYTES_V1,"manifest")}catch(error){throw error instanceof NodeDiskRegistrySourceErrorV1?error:new NodeDiskRegistrySourceErrorV1("io_failed",t("Installed plugin manifest could not be read"))}let manifest=parseManifest(record,rawManifest);envelopes.push({manifest,source:record.installationRef,manifestDigest:record.manifestDigest}),projectedDigests.set(identity,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=join6(record.directory,CAPABILITY_MANIFEST_FILE_V1);try{await(await open(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(t(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(error,signal){return signal?.aborted===!0||error instanceof Error&&(error.name==="AbortError"||error.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(error){isCancelled2(error,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(error){if(acquired!==void 0&&options.host.releaseArtifact!==void 0&&await options.host.releaseArtifact({artifact:acquired}).catch(()=>{}),error instanceof PluginDistributionErrorV1)throw error;isCancelled2(error,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(error){isCancelled2(error,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(error,signal){return signal?.aborted===!0||error instanceof Error&&(error.name==="AbortError"||error.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,t("{label} must be a non-empty bounded string",{label}));return value}function assertAllowedKeys(value,allowed,label){let expected=new Set(allowed);if(Object.keys(value).some(key=>!expected.has(key)))throw new PluginRegistryErrorV1("invalid_manifest",t("{label} contains an unsupported field",{label}))}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",t("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(error){throw new PluginRegistryErrorV1("invalid_source",t("Plugin registry source URL is invalid"),error)}return value}function validateManifest(manifest){if(typeof manifest!="object"||manifest===null||Array.isArray(manifest))throw new PluginRegistryErrorV1("invalid_manifest",t("Registry manifest must be an object"));let value=manifest;if(assertAllowedKeys(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",t("Registry manifest id is invalid"));if(typeof value.pluginVersion!="string"||value.pluginVersion.trim()===""||value.pluginVersion.length>256)throw new PluginRegistryErrorV1("invalid_manifest",t("Registry manifest pluginVersion is invalid"));if(typeof value.apiVersion!="string"||value.apiVersion.trim()===""||value.apiVersion.length>256)throw new PluginRegistryErrorV1("invalid_manifest",t("Registry manifest apiVersion is invalid"));if(value.minHostVersion===void 0&&value.maxHostVersion===void 0)throw new PluginRegistryErrorV1("invalid_manifest",t("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(error){throw new PluginRegistryErrorV1("invalid_manifest",t("Registry manifest cannot be serialized"),error)}if(bytes>MAX_PLUGIN_REGISTRY_MANIFEST_BYTES_V1)throw new PluginRegistryErrorV1("payload_too_large",t("Registry manifest exceeds the size limit"));return Object.freeze({...value})}function validateEnvelope(value){if(typeof value!="object"||value===null||Array.isArray(value))throw new PluginRegistryErrorV1("invalid_manifest",t("Registry response entry must be an object"));let entry=value;assertAllowedKeys(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(error){throw new PluginRegistryErrorV1("invalid_manifest",t("Registry distribution descriptor is invalid"),error)}if(distribution.pluginId!==manifest.id||distribution.pluginVersion!==manifest.pluginVersion||distribution.manifestDigest!==manifestDigest)throw new PluginRegistryErrorV1("invalid_manifest",t("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",t("maxManifests must be an integer between 1 and {max}",{max: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",t("Manifest digest mismatch for {identity}",{identity:`${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??t("Registry source proof was rejected"))}catch(error){throw error instanceof PluginRegistryErrorV1?error:new PluginRegistryErrorV1("source_rejected",t("Registry source proof was rejected"),error)}let result;try{result=sourceVerifier({pluginId:entry.manifest.id,pluginVersion:entry.manifest.pluginVersion,source:entry.source,manifestDigest:actualDigest})}catch(error){throw new PluginRegistryErrorV1("source_rejected",t("Plugin source verifier failed"),error)}if(result.status!=="accepted")throw new PluginRegistryErrorV1("source_rejected",result.reason??t("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",t("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",t("Registry source/digest verifier is required"));if(options.sourceVerifier===void 0||typeof options.sourceVerifier!="function")throw new PluginRegistryErrorV1("source_rejected",t("Registry source verifier is required"));let load=async(input={})=>{if(input.signal?.aborted)throw new PluginRegistryErrorV1("cancelled",t("Plugin registry operation was cancelled"));let raw;try{raw=await options.source.list({signal:input.signal})}catch(error){throw isAbortLike(error,input.signal)?new PluginRegistryErrorV1("cancelled",t("Plugin registry operation was cancelled"),error):new PluginRegistryErrorV1("source_rejected",t("Plugin registry source failed"),error)}if(input.signal?.aborted)throw new PluginRegistryErrorV1("cancelled",t("Plugin registry operation was cancelled"));if(!Array.isArray(raw))throw new PluginRegistryErrorV1("invalid_manifest",t("Registry source must return an array"));if(raw.length>maxManifests)throw new PluginRegistryErrorV1("too_many_manifests",t("Registry response contains too many manifests"));let entries=raw.map(validateEnvelope);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",t("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",t("Duplicate registry manifest: {identity}",{identity}));seen.add(identity);try{await validateSourceProof(entry,options.verify,options.sourceVerifier)}catch(error){if(!(error instanceof PluginRegistryErrorV1)||error.cause!==void 0||error.code!=="source_rejected"&&error.code!=="invalid_digest")throw error;rejected.push({pluginId:entry.manifest.id,pluginVersion:entry.manifest.pluginVersion,code:error.code==="invalid_digest"?"digest_rejected":"source_rejected",reason:error.code==="invalid_digest"?"Manifest digest mismatch":"Registry source proof was rejected"});continue}if(input.signal?.aborted)throw new PluginRegistryErrorV1("cancelled",t("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}from"node:crypto";import{mkdir,readFile as readFile3,rename,unlink,writeFile}from"node:fs/promises";import{basename as basename2,dirname as dirname5,isAbsolute as isAbsolute3,join as join7,resolve as resolve2}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(error){return error instanceof Error&&(error.name==="AbortError"||error.name==="AbortSignalError")}function isMissingError(error){return typeof error!="object"||error===null?!1:"code"in error&&error.code==="ENOENT"}function validateFilePath(value){if(typeof value!="string"||value.trim()===""||value.length>MAX_PLUGIN_STATE_STRING_CHARS_V1)throw new Error(t("invalid plugin state file path"));if(value.includes("\0")||/[\u0000-\u001f]/u.test(value))throw new Error(t("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(t("invalid plugin state file path"));let normalized=isAbsolute3(value)?value:resolve2(value);if(basename2(normalized).length===0||basename2(normalized)==="."||basename2(normalized)==="..")throw new Error(t("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(t("invalid plugin scope reference"));if(/^(?:file:|[a-zA-Z]:[\\/]|[\\/]{1,2}|\\\\)/u.test(value)||/\s/u.test(value))throw new Error(t("invalid plugin scope reference"));if(value.includes("\0")||/[\u0000-\u001f]/u.test(value))throw new Error(t("invalid plugin scope reference"));if(scope==="global"&&value!==DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1)throw new Error(t("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(t("{label} is invalid",{label}));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(t("record source label is invalid"));return value}function identityOf(record){return`${record.state.scope}:${record.state.scopeRef}:${record.pluginId}@${record.pluginVersion}`}function isObject(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(!isObject(value)||Object.keys(value).some(key=>!allowedKeys.has(key)))throw new Error(t("record schema is invalid"));for(let key of requiredKeys)if(!(key in value))throw new Error(t("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(!isObject(value.state)||!hasExactKeys2(value.state,["scope","scopeRef","enabled","lifecycle"]))throw new Error(t("state schema is invalid"));if(value.state.scope!=="global"&&value.state.scope!=="project")throw new Error(t("state scope is invalid"));let scopeRef=validateScopeRef(value.state.scope,value.state.scopeRef);if(typeof value.state.enabled!="boolean")throw new Error(t("state enabled flag is invalid"));if(value.state.lifecycle!=="installed"&&value.state.lifecycle!=="active"&&value.state.lifecycle!=="retained")throw new Error(t("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(!isObject(value)||!hasExactKeys2(value,["version","records"]))throw new Error(t("snapshot schema is invalid"));if(value.version!==PLUGIN_STATE_SNAPSHOT_VERSION_V1)throw new Error(t("snapshot version is unsupported"));if(!Array.isArray(value.records))throw new Error(t("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(error){let message=error instanceof Error?error.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 path8=>await readFile3(path8,"utf8"),mkdir:async path8=>{await mkdir(path8,{recursive:!0})},writeFile:async(path8,data)=>{await writeFile(path8,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(t("state scope is invalid"));if(installation.scope!==scope)throw new Error(t("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(t("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(error){if(isMissingError(error))return Object.freeze({status:"missing",snapshot:EMPTY_SNAPSHOT});if(isAbortError(error)||signal?.aborted)return cancelledResult();throw error}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(error){return Object.freeze({status:"invalid",diagnostics:Object.freeze([invalidFromError(error)])})}}async function write(snapshot2,signal){if(signal?.aborted)return cancelledResult();let parent=dirname5(filePath),temporaryPath=join7(parent,`.${basename2(filePath)}.${randomUUID()}.tmp`);try{return await fileSystem.mkdir(parent),signal?.aborted||(await fileSystem.writeFile(temporaryPath,`${JSON.stringify(snapshot2)}
216
216
  `),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(error){return Object.freeze({status:"invalid",diagnostics:Object.freeze([invalidFromError(error)])})}let current=await read(input.signal);if(current.status!=="ok"&&current.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(t("state scope is invalid"));scope=input.scope,scopeRef=validateScopeRef(scope,input.scopeRef)}catch(error){return Object.freeze({status:"invalid",diagnostics:Object.freeze([invalidFromError(error)])})}let current=await read(input.signal);if(current.status!=="ok"&&current.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=resolve3(cwd),identityPath=process.platform==="win32"?canonicalPath.toLowerCase():canonicalPath;return`project:sha256:${createHash("sha256").update(identityPath).digest("hex")}`}function defaultPluginInstallStoreDirectoryV1(agentDir){return join8(agentDir,DEFAULT_PLUGIN_INSTALL_STORE_DIR_V1)}function defaultPluginInstallStoreInstanceRootV1(agentDir){return join8(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:join8(input.cwd,CONFIG_DIR_NAME,DEFAULT_PLUGIN_STATE_FILE_V1)}),scope:"project",scopeRef:projectPluginScopeRefV1(input.cwd)},global:{stateStore:createPluginStateStoreV1({filePath:join8(input.agentDir,DEFAULT_PLUGIN_STATE_FILE_V1)}),scope:"global",scopeRef:DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1}})}}import{join as join13}from"node:path";import{createHash as createHash2,randomUUID as randomUUID2}from"node:crypto";import{createReadStream}from"node:fs";import{mkdir as mkdir2,mkdtemp,open as open2,rename as rename2,rm}from"node:fs/promises";import{tmpdir}from"node:os";import{isAbsolute as isAbsolute4,join as join9}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(t("{label} must be an ISO-8601 UTC timestamp",{label}));let timestamp=Date.parse(value);if(!Number.isFinite(timestamp)||new Date(timestamp).toISOString()!==value)throw new Error(t("{label} must be a valid ISO-8601 UTC timestamp",{label}));return timestamp}function parsePublicKey(value){if(value.length===0||value.length>16*1024||/\u0000/u.test(value))throw new Error(t("publicKeyPem is invalid"));let key;try{key=createPublicKey(value)}catch{throw new Error(t("publicKeyPem is invalid"))}if(key.type!=="public"||key.asymmetricKeyType!=="ed25519")throw new Error(t("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}
217
217
  ${JSON.stringify([input.version,input.source,input.pluginId,input.pluginVersion,input.manifestDigest,input.artifactDigest,input.expiresAt,input.sizeBytes,input.mediaType])}`,"utf8")}function buildNodePluginDistributionSignaturePayloadV1(input){return new Uint8Array(payload(input))}function parseSignature(value){let parts=value.split(".");if(parts.length!==3||parts[0]!==SIGNATURE_PREFIX_V1||!validKeyId(parts[1]??""))return;let encoded=parts[2]??"";if(!/^[A-Za-z0-9_-]+$/u.test(encoded))return;let bytes=Buffer.from(encoded,"base64url");if(bytes.byteLength===64)return{keyId:parts[1],bytes}}function validAt(key,current){return(key.notBefore===void 0||current>=key.notBefore)&&(key.notAfter===void 0||current<key.notAfter)}function createNodePluginTrustRootV1(options){if(!Array.isArray(options.keys)||options.keys.length===0||options.keys.length>MAX_KEYS_V1)throw new Error(t("keys must contain between 1 and {max} entries",{max:MAX_KEYS_V1}));let revokedKeyIds=new Set(options.revokedKeyIds??[]);if([...revokedKeyIds].some(keyId=>!validKeyId(keyId))||options.revokedKeyIds!==void 0&&revokedKeyIds.size!==options.revokedKeyIds.length)throw new Error(t("revokedKeyIds is invalid or duplicated"));let keys=new Map;for(let input of options.keys){if(!validKeyId(input.keyId)||keys.has(input.keyId))throw new Error(t("keyId is invalid or duplicated"));let notBefore=parseValidity(input.notBefore,"notBefore"),notAfter=parseValidity(input.notAfter,"notAfter");if(notBefore!==void 0&&notAfter!==void 0&&notBefore>=notAfter)throw new Error(t("notBefore must be earlier than notAfter"));keys.set(input.keyId,{keyId:input.keyId,publicKey:parsePublicKey(input.publicKeyPem),...notBefore===void 0?{}:{notBefore},...notAfter===void 0?{}:{notAfter}})}let now=options.now??(()=>Date.now());return({descriptor})=>{let signature=parseSignature(descriptor.signature);if(signature===void 0)return{status:"rejected"};let key=keys.get(signature.keyId);if(key===void 0||revokedKeyIds.has(signature.keyId))return{status:"rejected"};let current;try{current=now()}catch{return{status:"rejected"}}if(!Number.isFinite(current)||!validAt(key,current))return{status:"rejected"};try{return verify(null,payload(descriptor),key.publicKey,signature.bytes)?{status:"accepted"}:{status:"rejected"}}catch{return{status:"rejected"}}}}var NODE_DISTRIBUTION_HOST_VERSION_V1=1,DEFAULT_TIMEOUT_MS_V1=3e4,MAX_TIMEOUT_MS_V1=12e4,DEFAULT_REDIRECTS_V1=3,MAX_REDIRECTS_V1=5,REDIRECT_STATUS=new Set([301,302,303,307,308]);function cancelledRequestError(){let error=new Error(t("plugin request was cancelled"));return error.name="AbortError",error}function throwIfRequestCancelled(request){if(request.timedOut())throw new Error(t("plugin request timed out"));if(request.signal.aborted)throw cancelledRequestError()}function boundedPositive(value,fallback,maximum,label){let result=value??fallback;if(!Number.isSafeInteger(result)||result<=0||result>maximum)throw new Error(t("{label} must be a positive integer at most {maximum}",{label,maximum}));return result}function allowedOrigin(value){let parsed;try{parsed=new URL(value)}catch{throw new Error(t("allowed origin is invalid"))}if(parsed.protocol!=="http:"&&parsed.protocol!=="https:"||parsed.username||parsed.password)throw new Error(t("allowed origin must be an http(s) origin"));if(parsed.pathname!=="/"||parsed.search!==""||parsed.hash!=="")throw new Error(t("allowed origin must not include a path or query"));return parsed.origin}function requestUrl(value,origins){let parsed;try{parsed=new URL(value)}catch{throw new Error(t("plugin source URL is invalid"))}if(parsed.protocol!=="http:"&&parsed.protocol!=="https:"||parsed.username||parsed.password)throw new Error(t("plugin source URL must use http(s) without credentials"));if(!origins.has(parsed.origin))throw new Error(t("plugin source origin is not allowed"));return parsed}function requestSignal(parent,timeoutMs){let controller=new AbortController,didTimeout=!1,abort=()=>controller.abort(parent?.reason);parent?.aborted===!0?abort():parent?.addEventListener("abort",abort,{once:!0});let timeout=setTimeout(()=>{didTimeout=!0,controller.abort()},timeoutMs);return{signal:controller.signal,timedOut:()=>didTimeout,cleanup:()=>{clearTimeout(timeout),parent?.removeEventListener("abort",abort)}}}function contentLength(response2){let value=response2.headers.get("content-length");if(value===null)return;if(!/^\d+$/u.test(value))throw new Error(t("plugin response content length is invalid"));let result=Number(value);if(!Number.isSafeInteger(result))throw new Error(t("plugin response content length is invalid"));return result}function contentType(response2){let value=response2.headers.get("content-type");if(value!==null)return value.split(";",1)[0]?.trim().toLowerCase()||void 0}function assertResponseMetadata(response2,descriptor){if(contentLength(response2)!==descriptor.sizeBytes)throw new Error(t("plugin response size mismatch"));if(contentType(response2)!==descriptor.mediaType.toLowerCase())throw new Error(t("plugin response media type mismatch"))}async function cancelBody(response2){response2.body!==null&&await response2.body.cancel().catch(()=>{})}function expectedDigest(value){let prefixed=/^(sha256|sha512):([0-9a-f]+)$/iu.exec(value);if(prefixed!==null){let algorithm=prefixed[1]?.toLowerCase(),hex=prefixed[2]?.toLowerCase();if(algorithm==="sha256"&&hex?.length===64||algorithm==="sha512"&&hex?.length===128)return{algorithm,hex}}if(/^[0-9a-f]{64}$/iu.test(value))return{algorithm:"sha256",hex:value.toLowerCase()};if(/^[0-9a-f]{128}$/iu.test(value))return{algorithm:"sha512",hex:value.toLowerCase()};throw new Error(t("plugin artifact digest algorithm is unsupported"))}function metadataFromDescriptor(descriptor){return{version:1,source:descriptor.source,pluginId:descriptor.pluginId,pluginVersion:descriptor.pluginVersion,manifestDigest:descriptor.manifestDigest,artifactDigest:descriptor.artifactDigest,expiresAt:descriptor.expiresAt,sizeBytes:descriptor.sizeBytes,mediaType:descriptor.mediaType}}function artifactMatchesDescriptor(artifact,descriptor){return artifact.version===1&&artifact.pluginId===descriptor.pluginId&&artifact.pluginVersion===descriptor.pluginVersion&&artifact.manifestDigest===descriptor.manifestDigest&&artifact.artifactDigest===descriptor.artifactDigest&&artifact.sizeBytes===descriptor.sizeBytes&&artifact.mediaType===descriptor.mediaType&&artifact.source===descriptor.source&&artifact.expiresAt===descriptor.expiresAt}async function writeFully(file,chunk){let offset=0;for(;offset<chunk.byteLength;){let result=await file.write(chunk,offset,chunk.byteLength-offset,null);if(result.bytesWritten<=0)throw new Error(t("plugin artifact file write failed"));offset+=result.bytesWritten}}async function createNodeHttpPluginDistributionHostV1(options){let transport=options.fetch??globalThis.fetch;if(typeof transport!="function")throw new Error(t("Node fetch is unavailable"));if(!Array.isArray(options.allowedOrigins)||options.allowedOrigins.length===0)throw new Error(t("at least one allowed origin is required"));let origins=new Set(options.allowedOrigins.map(allowedOrigin)),timeoutMs=boundedPositive(options.requestTimeoutMs,DEFAULT_TIMEOUT_MS_V1,MAX_TIMEOUT_MS_V1,"requestTimeoutMs"),maxRedirects=options.maxRedirects??DEFAULT_REDIRECTS_V1;if(!Number.isSafeInteger(maxRedirects)||maxRedirects<0||maxRedirects>MAX_REDIRECTS_V1)throw new Error(t("maxRedirects must be an integer between 0 and {max}",{max:MAX_REDIRECTS_V1}));let userAgent=options.userAgent??"agent-forge-plugin-distribution/1";if(userAgent.length===0||userAgent.length>256||/[\r\n]/u.test(userAgent))throw new Error(t("userAgent is invalid"));let configuredDirectory=options.artifactDirectory;if(configuredDirectory!==void 0&&!isAbsolute4(configuredDirectory))throw new Error(t("artifactDirectory must be absolute"));let baseDirectoryPromise=configuredDirectory===void 0?mkdtemp(join9(tmpdir(),"agent-forge-plugin-distribution-")):(async()=>(await mkdir2(configuredDirectory,{recursive:!0}),await mkdtemp(join9(configuredDirectory,"agent-forge-plugin-distribution-"))))(),artifacts=new Map,activeOperations=new Set,operationsDrained,closePromise,closed=!1,assertOpen=()=>{if(closed)throw new Error(t("plugin distribution host is closed"))},beginOperation=()=>{assertOpen();let controller=new AbortController;return activeOperations.add(controller),controller},endOperation=controller=>{activeOperations.delete(controller),activeOperations.size===0&&(operationsDrained?.(),operationsDrained=void 0)},waitForOperations=async()=>{activeOperations.size!==0&&await new Promise(resolve22=>{operationsDrained=resolve22})},fetchResponse=async(value,method,parentSignal,operationSignal2)=>{let current=requestUrl(value,origins);for(let redirect=0;;redirect+=1){if(operationSignal2.aborted)throw cancelledRequestError();assertOpen();let request=requestSignal(AbortSignal.any([parentSignal,operationSignal2].filter(Boolean)),timeoutMs),response2;try{response2=await transport(current.toString(),{method,headers:{accept:"*/*","user-agent":userAgent},redirect:"manual",signal:request.signal})}catch(error){throw request.cleanup(),throwIfRequestCancelled(request),error}if(!REDIRECT_STATUS.has(response2.status))return{response:response2,request};let location=response2.headers.get("location");if(await cancelBody(response2),request.cleanup(),location===null||redirect>=maxRedirects)throw new Error(t("plugin redirect limit exceeded"));current=requestUrl(new URL(location,current).toString(),origins)}};return{version:NODE_DISTRIBUTION_HOST_VERSION_V1,host:{resolveMetadata:async input=>{let operation=beginOperation();try{let{response:response2,request}=await fetchResponse(input.descriptor.source,"HEAD",input.signal,operation.signal);try{if(response2.status<200||response2.status>=300)throw new Error(t("plugin metadata request failed"));return assertResponseMetadata(response2,input.descriptor),metadataFromDescriptor(input.descriptor)}finally{await cancelBody(response2),request.cleanup()}}finally{endOperation(operation)}},acquireArtifact:async input=>{let operation=beginOperation(),temporaryPath,finalPath,published=!1;try{let digest=expectedDigest(input.descriptor.artifactDigest),{response:response2,request}=await fetchResponse(input.descriptor.source,"GET",input.signal,operation.signal),file;try{if(response2.status<200||response2.status>=300)throw new Error(t("plugin artifact request failed"));if(assertResponseMetadata(response2,input.descriptor),response2.body===null)throw new Error(t("plugin artifact response has no body"));let directory=await baseDirectoryPromise;temporaryPath=join9(directory,`.partial-${randomUUID2()}`),finalPath=join9(directory,`artifact-${randomUUID2()}`),file=await open2(temporaryPath,"wx");let reader=response2.body.getReader(),hash=createHash2(digest.algorithm),total=0;try{for(;;){throwIfRequestCancelled(request);let item=await reader.read();if(item.done)break;let chunk=item.value;if(total+=chunk.byteLength,total>input.descriptor.sizeBytes)throw new Error(t("plugin artifact exceeds its size limit"));hash.update(chunk),await writeFully(file,chunk)}}finally{reader.releaseLock()}if(throwIfRequestCancelled(request),total!==input.descriptor.sizeBytes)throw new Error(t("plugin artifact size mismatch"));if(hash.digest("hex")!==digest.hex)throw new Error(t("plugin artifact digest mismatch"));await file.close(),file=void 0,await rename2(temporaryPath,finalPath),assertOpen();let artifactRef=`artifact://node-http/${randomUUID2()}`;return artifacts.set(artifactRef,{path:finalPath,descriptor:input.descriptor,readers:0}),published=!0,{artifactRef,artifactDigest:input.descriptor.artifactDigest,sizeBytes:input.descriptor.sizeBytes,mediaType:input.descriptor.mediaType}}catch(error){throw throwIfRequestCancelled(request),error}finally{file!==void 0&&await file.close().catch(()=>{}),await cancelBody(response2),request.cleanup()}}finally{temporaryPath!==void 0&&await rm(temporaryPath,{force:!0}).catch(()=>{}),!published&&finalPath!==void 0&&await rm(finalPath,{force:!0}).catch(()=>{}),endOperation(operation)}},releaseArtifact:async input=>{if(assertOpen(),input.signal?.aborted)throw new Error(t("plugin artifact release was cancelled"));let record=artifacts.get(input.artifact.artifactRef);if(record===void 0)throw new Error(t("plugin artifact reference is unknown"));if(record.readers>0)throw new Error(t("plugin artifact is still being read"));await rm(record.path,{force:!1}),artifacts.delete(input.artifact.artifactRef)}},openArtifact:input=>(async function*(){let operation=beginOperation(),stream,acquiredRecord,abort=()=>stream?.destroy(new Error("plugin artifact read was cancelled"));try{if(input.signal?.aborted)throw new Error(t("plugin artifact read was cancelled"));let record=artifacts.get(input.artifact.artifactRef);if(record===void 0||!artifactMatchesDescriptor(input.artifact,record.descriptor))throw new Error(t("plugin artifact reference is unknown"));record.readers+=1,acquiredRecord=record,stream=createReadStream(record.path,{highWaterMark:64*1024}),input.signal?.addEventListener("abort",abort,{once:!0}),operation.signal.addEventListener("abort",abort,{once:!0});for await(let chunk of stream){if(input.signal?.aborted||operation.signal.aborted)throw new Error(t("plugin artifact read was cancelled"));yield new Uint8Array(chunk)}}finally{input.signal?.removeEventListener("abort",abort),operation.signal.removeEventListener("abort",abort),stream?.destroy(),acquiredRecord!==void 0&&acquiredRecord.readers>0&&(acquiredRecord.readers-=1),endOperation(operation)}})(),close:async()=>{if(closePromise!==void 0)return await closePromise;closed=!0;for(let operation of activeOperations)operation.abort();return closePromise=(async()=>{await waitForOperations();let directory=await baseDirectoryPromise;await Promise.all([...artifacts.values()].map(record=>rm(record.path,{force:!0}))),artifacts.clear(),await rm(directory,{recursive:!0,force:!0})})(),await closePromise}}}async function createNodeHttpPluginDistributionStackV1(options){let{trustRoot,now:configuredNow,...hostOptions}=options,host=await createNodeHttpPluginDistributionHostV1(hostOptions);try{let now=configuredNow??trustRoot.now??(()=>Date.now()),verifySignature=createNodePluginTrustRootV1({...trustRoot,now}),distribution=createPluginDistributionV1({host:host.host,verifySignature,now});return Object.freeze({...host,distribution})}catch(error){throw await host.close().catch(()=>{}),error}}import{spawn}from"node:child_process";import{createHash as createHash3,randomUUID as randomUUID4}from"node:crypto";import{mkdir as mkdir4,mkdtemp as mkdtemp2,rename as rename4,rm as rm3,writeFile as writeFile3}from"node:fs/promises";import{tmpdir as tmpdir2}from"node:os";import{isAbsolute as isAbsolute6,join as join11}from"node:path";import{inflateRawSync}from"node:zlib";import{randomUUID as randomUUID3}from"node:crypto";import{mkdir as mkdir3,open as open3,readFile as readFile4,rename as rename3,rm as rm2,writeFile as writeFile2}from"node:fs/promises";import{isAbsolute as isAbsolute5,join as join10}from"node:path";var PERSISTENCE_VERSION_V1=1,DEFAULT_LOCK_TIMEOUT_MS_V1=5e3,MAX_LOCK_TIMEOUT_MS_V1=6e4,MAX_RECORDS_V1=8192,MAX_FIELD_CHARS_V1=2048,NodePackageInstallPersistenceErrorV1=class extends Error{code;constructor(code){super(t("Node package install persistence failed: {code}",{code})),this.name="NodePackageInstallPersistenceErrorV1",this.code=code}},INDEX_FILE_V12="index.v1.json",LOCK_FILE_V1="index.v1.lock";function positiveLockTimeout(value){let result=value??DEFAULT_LOCK_TIMEOUT_MS_V1;if(!Number.isSafeInteger(result)||result<1||result>MAX_LOCK_TIMEOUT_MS_V1)throw new Error(t("lockTimeoutMs must be a positive integer at most {max}",{max:MAX_LOCK_TIMEOUT_MS_V1}));return result}function field(value){return typeof value=="string"&&value.length>0&&value.length<=MAX_FIELD_CHARS_V1&&!/[\u0000-\u001f\u007f]/u.test(value)}function opaque(value){return field(value)&&!/\s/u.test(value)&&!/^(?:file:|[a-z]:[\\/]|[\\/]{1,2}|\\\\)/iu.test(value)}function recordKey(record){return`${record.scope}\0${record.scopeRef}\0${record.pluginId}`}function validateRecord3(root,value){if(value===null||typeof value!="object"||Array.isArray(value))throw new NodePackageInstallPersistenceErrorV1("invalid_state");let record=value,keys=["installationRef","directory","pluginId","pluginVersion","manifestDigest","scope","scopeRef","state"];if(Object.keys(record).length!==keys.length||keys.some(key=>!(key in record)))throw new NodePackageInstallPersistenceErrorV1("invalid_state");if(!opaque(record.installationRef)||!field(record.directory)||!field(record.pluginId)||!field(record.pluginVersion)||!field(record.manifestDigest)||!opaque(record.scopeRef)||record.scope!=="global"&&record.scope!=="project"||record.state!=="installed"&&record.state!=="active"&&record.state!=="retained"||!withinInstallStoreRoot(root,record.directory))throw new NodePackageInstallPersistenceErrorV1("invalid_state");return Object.freeze({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 snapshot(root,values){if(values.length>MAX_RECORDS_V1)throw new NodePackageInstallPersistenceErrorV1("invalid_state");let byRef=new Set,active=new Set,result=values.map(value=>validateRecord3(root,value));for(let record of result){if(byRef.has(record.installationRef))throw new NodePackageInstallPersistenceErrorV1("invalid_state");if(byRef.add(record.installationRef),record.state==="active"){let key=recordKey(record);if(active.has(key))throw new NodePackageInstallPersistenceErrorV1("invalid_state");active.add(key)}}return Object.freeze(result)}function parseIndex2(root,raw){let parsed;try{parsed=JSON.parse(raw)}catch{throw new NodePackageInstallPersistenceErrorV1("invalid_state")}if(parsed===null||typeof parsed!="object"||Array.isArray(parsed))throw new NodePackageInstallPersistenceErrorV1("invalid_state");let value=parsed;if(Object.keys(value).length!==2||value.version!==PERSISTENCE_VERSION_V1||!Array.isArray(value.records))throw new NodePackageInstallPersistenceErrorV1("invalid_state");return snapshot(root,value.records)}function serialize(root,records){return JSON.stringify({version:PERSISTENCE_VERSION_V1,records:snapshot(root,records)})}function delay(milliseconds,signal){return new Promise((resolve22,reject2)=>{let timer=setTimeout(resolve22,milliseconds);if(signal===void 0)return;let abort=()=>{clearTimeout(timer),reject2(new NodePackageInstallPersistenceErrorV1("cancelled"))};signal.aborted?abort():signal.addEventListener("abort",abort,{once:!0})})}async function createNodePackageInstallPersistenceV1(options){if(!isAbsolute5(options.rootDirectory))throw new Error(t("rootDirectory must be absolute"));let lockTimeoutMs=positiveLockTimeout(options.lockTimeoutMs),rootDirectory=options.rootDirectory,indexPath=join10(rootDirectory,INDEX_FILE_V12),lockPath=join10(rootDirectory,LOCK_FILE_V1);await mkdir3(rootDirectory,{recursive:!0,mode:448});let closed=!1,closePromise,read=async()=>{try{return parseIndex2(rootDirectory,await readFile4(indexPath,"utf8"))}catch(error){if(error instanceof NodePackageInstallPersistenceErrorV1)throw error;if(error instanceof Error&&"code"in error&&error.code==="ENOENT")return Object.freeze([]);throw new NodePackageInstallPersistenceErrorV1("io_failed")}},acquire=async signal=>{let deadline=Date.now()+lockTimeoutMs;for(;;){if(signal?.aborted)throw new NodePackageInstallPersistenceErrorV1("cancelled");try{return await open3(lockPath,"wx",384)}catch(error){if(!(error instanceof Error&&"code"in error&&error.code==="EEXIST"))throw new NodePackageInstallPersistenceErrorV1("io_failed");if(Date.now()>=deadline)throw new NodePackageInstallPersistenceErrorV1("busy");await delay(10,signal)}}},release=async handle=>{await handle.close().catch(()=>{}),await rm2(lockPath,{force:!0}).catch(()=>{})},write=async records=>{let temporary=`${indexPath}.${randomUUID3()}.tmp`;try{await writeFile2(temporary,serialize(rootDirectory,records),{flag:"wx",mode:384}),await rename3(temporary,indexPath)}catch{throw await rm2(temporary,{force:!0}).catch(()=>{}),new NodePackageInstallPersistenceErrorV1("io_failed")}};return{rootDirectory,load:async(input={})=>{if(closed)throw new NodePackageInstallPersistenceErrorV1("closed");if(input.signal?.aborted)throw new NodePackageInstallPersistenceErrorV1("cancelled");return await read()},mutate:async input=>{if(closed)throw new NodePackageInstallPersistenceErrorV1("closed");if(typeof input.update!="function")throw new NodePackageInstallPersistenceErrorV1("invalid_state");let handle=await acquire(input.signal);try{let current=await read(),records=new Map(current.map(record=>[record.installationRef,record]));await input.update(records);let result=snapshot(rootDirectory,[...records.values()]);return await write(result),result}finally{await release(handle)}},close:async()=>closePromise!==void 0?await closePromise:(closed=!0,closePromise=Promise.resolve(),await closePromise)}}import{createGunzip}from"node:zlib";var TAR_BLOCK_BYTES_V1=512,TAR_NAME_LENGTH_V1=100,TAR_SIZE_OFFSET_V1=124,TAR_SIZE_LENGTH_V1=12,TAR_CHECKSUM_OFFSET_V1=148,TAR_CHECKSUM_LENGTH_V1=8,TAR_TYPEFLAG_OFFSET_V1=156,TAR_MAGIC_OFFSET_V1=257,TAR_PREFIX_OFFSET_V1=345,TAR_PREFIX_LENGTH_V1=155,USTAR_MAGIC_V1=[117,115,116,97,114];function readHeaderString(bytes,offset,length){let end=offset+length,stop=offset;for(;stop<end&&bytes[stop]!==0;)stop+=1;try{return new TextDecoder("utf-8",{fatal:!0}).decode(bytes.subarray(offset,stop))}catch{throw new NodePackageInstallErrorV1("archive_invalid")}}function readOctalHeaderField(header,offset,length){let end=offset+length,start=offset;for(;start<end&&header[start]===32;)start+=1;let stop=end;for(;stop>start&&(header[stop-1]===0||header[stop-1]===32);)stop-=1;let value=0;for(let index=start;index<stop;index+=1){let byte=header[index];if(byte<48||byte>55)throw new NodePackageInstallErrorV1("archive_invalid");if(value=value*8+(byte-48),value>Number.MAX_SAFE_INTEGER)throw new NodePackageInstallErrorV1("archive_invalid")}return value}function verifyHeaderChecksum(header){let sum=0;for(let index=0;index<TAR_BLOCK_BYTES_V1;index+=1)sum+=index>=TAR_CHECKSUM_OFFSET_V1&&index<TAR_CHECKSUM_OFFSET_V1+TAR_CHECKSUM_LENGTH_V1?32:header[index];if(readOctalHeaderField(header,TAR_CHECKSUM_OFFSET_V1,TAR_CHECKSUM_LENGTH_V1)!==sum)throw new NodePackageInstallErrorV1("archive_invalid")}function headerEntryName(header){for(let index=0;index<USTAR_MAGIC_V1.length;index+=1)if(header[TAR_MAGIC_OFFSET_V1+index]!==USTAR_MAGIC_V1[index])throw new NodePackageInstallErrorV1("archive_invalid");let name=readHeaderString(header,0,TAR_NAME_LENGTH_V1),prefix=readHeaderString(header,TAR_PREFIX_OFFSET_V1,TAR_PREFIX_LENGTH_V1);return prefix===""?name:`${prefix}/${name}`}function isZeroBlock(tar,offset){for(let index=0;index<TAR_BLOCK_BYTES_V1;index+=1)if(tar[offset+index]!==0)return!1;return!0}function verifyZeroPadding(tar,dataEnd,paddedEnd){for(let index=dataEnd;index<paddedEnd;index+=1)if(tar[index]!==0)throw new NodePackageInstallErrorV1("archive_invalid")}function parsePaxPath(data){let offset=0,path8;for(;offset<data.byteLength;){let space=offset;for(;space<data.byteLength&&data[space]!==32;)space+=1;if(space>=data.byteLength)throw new NodePackageInstallErrorV1("archive_invalid");let recordLength=0;for(let index=offset;index<space;index+=1){let byte=data[index];if(byte<48||byte>57)throw new NodePackageInstallErrorV1("archive_invalid");if(recordLength=recordLength*10+(byte-48),recordLength>data.byteLength)throw new NodePackageInstallErrorV1("archive_invalid")}if(recordLength<=space-offset+1)throw new NodePackageInstallErrorV1("archive_invalid");let end=offset+recordLength;if(end>data.byteLength||data[end-1]!==10)throw new NodePackageInstallErrorV1("archive_invalid");let equals=space+1;for(;equals<end-1&&data[equals]!==61;)equals+=1;if(equals>=end-1)throw new NodePackageInstallErrorV1("archive_invalid");readHeaderString(data,space+1,equals-space-1)==="path"&&(path8=readHeaderString(data,equals+1,end-1-equals-1)),offset=end}return path8}function readGnuLongName(data){let end=data.byteLength;if(end>0&&data[end-1]===0&&(end-=1),end===0)throw new NodePackageInstallErrorV1("archive_invalid");try{return new TextDecoder("utf-8",{fatal:!0}).decode(data.subarray(0,end))}catch{throw new NodePackageInstallErrorV1("archive_invalid")}}function gunzipBounded(input,maxBytes){return new Promise((resolve22,reject2)=>{let gunzip=createGunzip(),chunks=[],total=0,settled=!1,fail=error=>{settled||(settled=!0,gunzip.destroy(),reject2(error))};gunzip.on("data",chunk=>{if(!settled){if(total+=chunk.byteLength,total>maxBytes){fail(new NodePackageInstallErrorV1("archive_budget_exceeded"));return}chunks.push(chunk)}}),gunzip.on("end",()=>{if(settled)return;settled=!0;let result=new Uint8Array(total),offset=0;for(let chunk of chunks)result.set(chunk,offset),offset+=chunk.byteLength;resolve22(result)}),gunzip.on("error",()=>{fail(new NodePackageInstallErrorV1("archive_invalid"))}),gunzip.end(input)})}function parseTarEntries(tar,limits){let entries=[],names=new Set,extractedBytes=0,offset=0,pendingPath;for(;offset+TAR_BLOCK_BYTES_V1<=tar.byteLength;){let header=tar.subarray(offset,offset+TAR_BLOCK_BYTES_V1);if(isZeroBlock(tar,offset)){if(offset+2*TAR_BLOCK_BYTES_V1>tar.byteLength||!isZeroBlock(tar,offset+TAR_BLOCK_BYTES_V1))throw new NodePackageInstallErrorV1("archive_invalid");if(pendingPath!==void 0)throw new NodePackageInstallErrorV1("archive_invalid");for(let index=offset+2*TAR_BLOCK_BYTES_V1;index<tar.byteLength;index+=1)if(tar[index]!==0)throw new NodePackageInstallErrorV1("archive_invalid");return Object.freeze(entries)}verifyHeaderChecksum(header);let typeflag=String.fromCharCode(header[TAR_TYPEFLAG_OFFSET_V1]),size=readOctalHeaderField(header,TAR_SIZE_OFFSET_V1,TAR_SIZE_LENGTH_V1);if(size>limits.maxEntryBytes)throw new NodePackageInstallErrorV1("archive_budget_exceeded");let dataStart=offset+TAR_BLOCK_BYTES_V1,dataEnd=dataStart+size;if(dataEnd>tar.byteLength)throw new NodePackageInstallErrorV1("archive_invalid");let paddedEnd=Math.ceil(dataEnd/TAR_BLOCK_BYTES_V1)*TAR_BLOCK_BYTES_V1;verifyZeroPadding(tar,dataEnd,paddedEnd);let data=tar.subarray(dataStart,dataEnd);if(typeflag==="L"){pendingPath=readGnuLongName(data),offset=paddedEnd;continue}if(typeflag==="x"){let paxPath=parsePaxPath(data);paxPath!==void 0&&(pendingPath=paxPath),offset=paddedEnd;continue}if(typeflag==="g"){offset=paddedEnd;continue}if(typeflag==="1"||typeflag==="2")throw new NodePackageInstallErrorV1("archive_invalid");if(typeflag!=="\0"&&typeflag!=="0"&&typeflag!=="5")throw new NodePackageInstallErrorV1("archive_invalid");let rawName=pendingPath??headerEntryName(header);pendingPath=void 0,typeflag==="5"&&!rawName.endsWith("/")&&(rawName+="/");let normalized=normalizedEntryName(rawName);if(normalized.directory&&size!==0)throw new NodePackageInstallErrorV1("archive_invalid");if(names.has(normalized.name))throw new NodePackageInstallErrorV1("archive_invalid");if(names.add(normalized.name),entries.length+1>limits.maxEntries)throw new NodePackageInstallErrorV1("archive_budget_exceeded");let bytes=normalized.directory?new Uint8Array:new Uint8Array(data);if(extractedBytes+=bytes.byteLength,extractedBytes>limits.maxExtractedBytes)throw new NodePackageInstallErrorV1("archive_budget_exceeded");entries.push(Object.freeze({name:normalized.name,directory:normalized.directory,bytes})),offset=paddedEnd}throw new NodePackageInstallErrorV1("archive_invalid")}function stripNpmPackageRoot(entries){if(entries.length===0)return entries;let rootSegment=entries[0].name.split("/")[0];if(rootSegment!=="package")return entries;let sharesRoot=entry=>{if(entry.name===rootSegment)return entry.directory;let parts=entry.name.split("/");return parts.length>=2&&parts[0]===rootSegment};if(!entries.every(sharesRoot))return entries;let stripped=[];for(let entry of entries)entry.name!==rootSegment&&stripped.push(Object.freeze({...entry,name:entry.name.slice(rootSegment.length+1)}));return Object.freeze(stripped)}async function parseNodeTarGzPackageV1(input,limitsInput={}){if(!(input instanceof Uint8Array))throw new NodePackageInstallErrorV1("archive_invalid");let limits=resolveNodePackageLimitsV1(limitsInput);if(input.byteLength>limits.maxArchiveBytes)throw new NodePackageInstallErrorV1("archive_budget_exceeded");let tar=await gunzipBounded(input,limits.maxExtractedBytes);return stripNpmPackageRoot(parseTarEntries(tar,limits))}var NODE_PACKAGE_INSTALL_HOST_VERSION_V1=1,NODE_PACKAGE_FORMAT_VERSION_V12=1,DEFAULT_MAX_ARCHIVE_BYTES_V1=128*1024*1024,MAX_ARCHIVE_BYTES_V1=512*1024*1024,DEFAULT_MAX_EXTRACTED_BYTES_V1=256*1024*1024,MAX_EXTRACTED_BYTES_V1=1024*1024*1024,DEFAULT_MAX_ENTRY_BYTES_V1=64*1024*1024,MAX_ENTRY_BYTES_V1=256*1024*1024,DEFAULT_MAX_ENTRIES_V1=2048,MAX_ENTRIES_V1=8192,MAX_PACKAGE_MANIFEST_BYTES_V1=64*1024,ECOSYSTEM_MANIFEST_FILE_V12="agent-forge.json",CAPABILITY_MANIFEST_FILE_V12="plugin.json",HOST_SUPPLIED_DEPENDENCY_PREFIXES_V1=["@agent-forge/","@ai-agent-forge/"],HOST_SUPPLIED_DEPENDENCIES_V1=new Set(["typebox"]),LOCAL_FILE_HEADER_V1=67324752,CENTRAL_FILE_HEADER_V1=33639248,END_OF_CENTRAL_DIRECTORY_V1=101010256,ZIP64_END_OF_CENTRAL_DIRECTORY_V1=101075792,ZIP64_END_OF_CENTRAL_DIRECTORY_LOCATOR_V1=117853008,NodePackageInstallErrorV1=class extends Error{code;constructor(code){super(t("Node package installation failed: {code}",{code})),this.name="NodePackageInstallErrorV1",this.code=code}};function createNodePackageInstallSessionLoaderV1(session){return async({manifestPath})=>({dispose:(await session.loadCapabilityPluginManifest(manifestPath)).dispose})}async function createNodePackageInstallHostForSessionV1(options,session){if(options.loadPlugin!==void 0)throw new Error(t("loadPlugin must be omitted when binding a session"));return await createNodePackageInstallHostV1({...options,loadPlugin:createNodePackageInstallSessionLoaderV1(session)})}function positiveLimit(value,fallback,maximum,label){let result=value??fallback;if(!Number.isSafeInteger(result)||result<1||result>maximum)throw new Error(t("{label} must be a positive integer at most {maximum}",{label,maximum}));return result}function resolveNodePackageLimitsV1(limitsInput){return{maxArchiveBytes:positiveLimit(limitsInput.maxArchiveBytes,DEFAULT_MAX_ARCHIVE_BYTES_V1,MAX_ARCHIVE_BYTES_V1,"maxArchiveBytes"),maxExtractedBytes:positiveLimit(limitsInput.maxExtractedBytes,DEFAULT_MAX_EXTRACTED_BYTES_V1,MAX_EXTRACTED_BYTES_V1,"maxExtractedBytes"),maxEntryBytes:positiveLimit(limitsInput.maxEntryBytes,DEFAULT_MAX_ENTRY_BYTES_V1,MAX_ENTRY_BYTES_V1,"maxEntryBytes"),maxEntries:positiveLimit(limitsInput.maxEntries,DEFAULT_MAX_ENTRIES_V1,MAX_ENTRIES_V1,"maxEntries")}}function readU16(bytes,offset){if(offset<0||offset+2>bytes.byteLength)throw new NodePackageInstallErrorV1("archive_invalid");return bytes[offset]|bytes[offset+1]<<8}function readU32(bytes,offset){if(offset<0||offset+4>bytes.byteLength)throw new NodePackageInstallErrorV1("archive_invalid");return(bytes[offset]|bytes[offset+1]<<8|bytes[offset+2]<<16|bytes[offset+3]<<24)>>>0}function decodeName(bytes,utf8){try{let value=new TextDecoder("utf-8",{fatal:!0}).decode(bytes);if(!utf8&&/[^\x00-\x7f]/u.test(value))throw new Error(t("non-ascii zip name"));return value}catch{throw new NodePackageInstallErrorV1("archive_invalid")}}function normalizedEntryName(value){if(value.length===0||value.includes("\\")||/[\u0000-\u001f\u007f]/u.test(value))throw new NodePackageInstallErrorV1("archive_invalid");let directory=value.endsWith("/");if(value.startsWith("/")||/^[a-z]:/iu.test(value))throw new NodePackageInstallErrorV1("archive_invalid");let parts=value.split("/");if(directory&&parts.pop(),parts.length===0||parts.some(part=>part===""||part==="."||part===".."||part.includes(":")||/[ .]$/u.test(part)||/^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\..*)?$/iu.test(part)))throw new NodePackageInstallErrorV1("archive_invalid");return{name:parts.join("/"),directory}}function crcTable(){let table=new Uint32Array(256);for(let index=0;index<table.length;index+=1){let value=index;for(let bit=0;bit<8;bit+=1)value=(value&1)===0?value>>>1:value>>>1^3988292384;table[index]=value>>>0}return table}var CRC_TABLE_V1=crcTable();function crc32(bytes){let value=4294967295;for(let byte of bytes)value=value>>>8^CRC_TABLE_V1[(value^byte)&255];return(value^4294967295)>>>0}function findEndOfCentralDirectory(bytes){let minimum=Math.max(0,bytes.byteLength-65535-22);for(let offset=bytes.byteLength-22;offset>=minimum;offset-=1){if(readU32(bytes,offset)!==END_OF_CENTRAL_DIRECTORY_V1)continue;let disk=readU16(bytes,offset+4),centralDisk=readU16(bytes,offset+6),entries=readU16(bytes,offset+10),centralEntries=readU16(bytes,offset+8),size=readU32(bytes,offset+12),start=readU32(bytes,offset+16),commentLength=readU16(bytes,offset+20);if(disk!==0||centralDisk!==0||entries!==centralEntries||offset+22+commentLength!==bytes.byteLength)throw new NodePackageInstallErrorV1("archive_invalid");if(entries===65535||size===4294967295||start===4294967295)throw new NodePackageInstallErrorV1("archive_invalid");if(start+size>offset)throw new NodePackageInstallErrorV1("archive_invalid");return{offset,entries,size,start}}for(let offset=Math.max(0,bytes.byteLength-64);offset<bytes.byteLength-3;offset+=1){let signature=readU32(bytes,offset);if(signature===ZIP64_END_OF_CENTRAL_DIRECTORY_V1||signature===ZIP64_END_OF_CENTRAL_DIRECTORY_LOCATOR_V1)throw new NodePackageInstallErrorV1("archive_invalid")}throw new NodePackageInstallErrorV1("archive_invalid")}function parseCentralDirectory(bytes,limits){let end=findEndOfCentralDirectory(bytes);if(end.entries>limits.maxEntries||end.size>bytes.byteLength||end.start+end.size>end.offset)throw new NodePackageInstallErrorV1("archive_budget_exceeded");let entries=[],names=new Set,offset=end.start;for(let index=0;index<end.entries;index+=1){if(readU32(bytes,offset)!==CENTRAL_FILE_HEADER_V1)throw new NodePackageInstallErrorV1("archive_invalid");let madeBy=readU16(bytes,offset+4)>>>8,flags=readU16(bytes,offset+8),method=readU16(bytes,offset+10),crc=readU32(bytes,offset+16),compressedSize=readU32(bytes,offset+20),uncompressedSize=readU32(bytes,offset+24),nameLength=readU16(bytes,offset+28),extraLength=readU16(bytes,offset+30),commentLength=readU16(bytes,offset+32),disk=readU16(bytes,offset+34),externalAttributes=readU32(bytes,offset+38),localOffset=readU32(bytes,offset+42),nameStart=offset+46,recordEnd=nameStart+nameLength+extraLength+commentLength;if(recordEnd>end.start+end.size||disk!==0||(flags&-2057)!==0||(flags&1)!==0||(flags&64)!==0)throw new NodePackageInstallErrorV1("archive_invalid");if(method!==0&&method!==8)throw new NodePackageInstallErrorV1("archive_invalid");if(uncompressedSize>limits.maxEntryBytes||compressedSize>limits.maxArchiveBytes)throw new NodePackageInstallErrorV1("archive_budget_exceeded");let name=normalizedEntryName(decodeName(bytes.subarray(nameStart,nameStart+nameLength),(flags&2048)!==0));if(names.has(name.name))throw new NodePackageInstallErrorV1("archive_invalid");if(names.add(name.name),((madeBy===3?externalAttributes>>>16&65535:0)&61440)===40960)throw new NodePackageInstallErrorV1("archive_invalid");entries.push({name:name.name,directory:name.directory,flags,method,compressedSize,uncompressedSize,crc32:crc,localOffset}),offset=recordEnd}if(offset!==end.start+end.size)throw new NodePackageInstallErrorV1("archive_invalid");let spans=[];for(let entry of entries){if(entry.localOffset<0||entry.localOffset+30>end.start)throw new NodePackageInstallErrorV1("archive_invalid");if(readU32(bytes,entry.localOffset)!==LOCAL_FILE_HEADER_V1)throw new NodePackageInstallErrorV1("archive_invalid");let localNameLength=readU16(bytes,entry.localOffset+26),localExtraLength=readU16(bytes,entry.localOffset+28),dataStart=entry.localOffset+30+localNameLength+localExtraLength,dataEnd=dataStart+entry.compressedSize;if(dataStart<entry.localOffset+30||dataEnd<dataStart||dataEnd>end.start)throw new NodePackageInstallErrorV1("archive_invalid");spans.push({start:entry.localOffset,end:dataEnd})}spans.sort((left,right)=>left.start-right.start||left.end-right.end);for(let index=1;index<spans.length;index+=1)if(spans[index-1].end>spans[index].start)throw new NodePackageInstallErrorV1("archive_invalid");return entries}function extractEntry(bytes,entry,maxEntryBytes){if(entry.directory){if(entry.compressedSize!==0||entry.uncompressedSize!==0)throw new NodePackageInstallErrorV1("archive_invalid");return new Uint8Array}if(entry.localOffset+30>bytes.byteLength)throw new NodePackageInstallErrorV1("archive_invalid");if(readU32(bytes,entry.localOffset)!==LOCAL_FILE_HEADER_V1)throw new NodePackageInstallErrorV1("archive_invalid");let localFlags=readU16(bytes,entry.localOffset+6),localMethod=readU16(bytes,entry.localOffset+8),nameLength=readU16(bytes,entry.localOffset+26),extraLength=readU16(bytes,entry.localOffset+28),localName=decodeName(bytes.subarray(entry.localOffset+30,entry.localOffset+30+nameLength),(entry.flags&2048)!==0);if(normalizedEntryName(localName).name!==entry.name||localFlags!==entry.flags||localMethod!==entry.method)throw new NodePackageInstallErrorV1("archive_invalid");let localCompressedSize=readU32(bytes,entry.localOffset+18),localUncompressedSize=readU32(bytes,entry.localOffset+22);if((entry.flags&8)===0&&(localCompressedSize!==entry.compressedSize||localUncompressedSize!==entry.uncompressedSize))throw new NodePackageInstallErrorV1("archive_invalid");let dataStart=entry.localOffset+30+nameLength+extraLength,dataEnd=dataStart+entry.compressedSize;if(dataStart>bytes.byteLength||dataEnd>bytes.byteLength)throw new NodePackageInstallErrorV1("archive_invalid");let compressed=bytes.subarray(dataStart,dataEnd),output;try{output=entry.method===0?new Uint8Array(compressed):inflateRawSync(compressed,{maxOutputLength:maxEntryBytes})}catch{throw new NodePackageInstallErrorV1("archive_invalid")}if(output.byteLength!==entry.uncompressedSize||output.byteLength>maxEntryBytes||crc32(output)!==entry.crc32)throw new NodePackageInstallErrorV1("archive_invalid");return output}function parseNodeZipPackageV1(input,limitsInput={}){if(!(input instanceof Uint8Array))throw new NodePackageInstallErrorV1("archive_invalid");let limits=resolveNodePackageLimitsV1(limitsInput);if(input.byteLength>limits.maxArchiveBytes)throw new NodePackageInstallErrorV1("archive_budget_exceeded");let descriptors=parseCentralDirectory(input,limits),extractedBytes=0;return Object.freeze(descriptors.map(descriptor=>{let bytes=extractEntry(input,descriptor,limits.maxEntryBytes);if(extractedBytes+=bytes.byteLength,extractedBytes>limits.maxExtractedBytes)throw new NodePackageInstallErrorV1("archive_budget_exceeded");return Object.freeze({name:descriptor.name,directory:descriptor.directory,bytes})}))}function manifestKeys(value){let allowed=new Set(["packageFormatVersion","id","pluginVersion","apiVersion","minHostVersion","maxHostVersion","capabilityRefs","requires","platform","testOnly"]);return Object.keys(value).every(key=>allowed.has(key))}function packageManifest(value,record){if(value===null||typeof value!="object"||Array.isArray(value))throw new NodePackageInstallErrorV1("package_manifest_invalid");let manifest=value;if(!manifestKeys(manifest)||manifest.packageFormatVersion!==NODE_PACKAGE_FORMAT_VERSION_V12||manifest.id!==record.pluginId||manifest.pluginVersion!==record.pluginVersion)throw new NodePackageInstallErrorV1("package_manifest_mismatch");if(typeof manifest.apiVersion!="string"||manifest.apiVersion!==record.manifest.apiVersion)throw new NodePackageInstallErrorV1("package_manifest_mismatch");try{if(pluginManifestDigestV1(manifest)!==record.manifestDigest)throw new NodePackageInstallErrorV1("package_manifest_mismatch")}catch(error){throw error instanceof NodePackageInstallErrorV1?error:new NodePackageInstallErrorV1("package_manifest_invalid")}}function capabilityManifest(value,record,entries){let manifest;try{manifest=parseCapabilityPluginManifest(value,"<installed plugin.json>")}catch{throw new NodePackageInstallErrorV1("package_manifest_invalid")}if(manifest.id!==record.pluginId||manifest.version!==record.pluginVersion)throw new NodePackageInstallErrorV1("package_manifest_mismatch");let entryValue=manifest.entry.startsWith("./")?manifest.entry.slice(2):manifest.entry,entry=normalizedEntryName(entryValue);if(entry.directory||!entries.some(candidate=>candidate.name===entry.name&&!candidate.directory))throw new NodePackageInstallErrorV1("package_manifest_mismatch")}function opaqueScope(value){if(typeof value!="string"||value.trim()===""||value.length>2048||/\s|[\u0000-\u001f\u007f]/u.test(value))throw new NodePackageInstallErrorV1("installation_identity_mismatch");return value}function installationKey(scope,scopeRef,pluginId){return`${scope}\0${scopeRef}\0${pluginId}`}function identityMatches(record,input){return record.pluginId===input.pluginId&&record.pluginVersion===input.pluginVersion&&record.manifestDigest===input.manifestDigest&&record.scope===input.scope&&record.scopeRef===input.scopeRef}function artifactIdentityMatchesRecord(artifact,record){return artifact.version===1&&artifact.pluginId===record.pluginId&&artifact.pluginVersion===record.pluginVersion&&artifact.manifestDigest===record.manifestDigest}function expectedArtifactDigest(value){let prefixed=/^(sha256|sha512):([0-9a-f]+)$/iu.exec(value);if(prefixed!==null){let algorithm=prefixed[1].toLowerCase(),hex=prefixed[2].toLowerCase();if(algorithm==="sha256"&&hex.length===64||algorithm==="sha512"&&hex.length===128)return{algorithm,hex}}if(/^[0-9a-f]{64}$/iu.test(value))return{algorithm:"sha256",hex:value.toLowerCase()};if(/^[0-9a-f]{128}$/iu.test(value))return{algorithm:"sha512",hex:value.toLowerCase()};throw new NodePackageInstallErrorV1("invalid_artifact")}async function collectArtifact(openArtifact,artifact,maxBytes,signal){let chunks=[],total=0;for await(let chunk of openArtifact({artifact,signal})){if(signal.aborted)throw new NodePackageInstallErrorV1("cancelled");if(!(chunk instanceof Uint8Array))throw new NodePackageInstallErrorV1("invalid_artifact");if(chunk.byteLength>maxBytes-total)throw new NodePackageInstallErrorV1("archive_budget_exceeded");chunks.push(new Uint8Array(chunk)),total+=chunk.byteLength}let result=new Uint8Array(total),offset=0;for(let chunk of chunks)result.set(chunk,offset),offset+=chunk.byteLength;return result}function packagePath(root,key){return join11(root,createHash3("sha256").update(key).digest("hex"))}function isHostSuppliedDependencyV1(name){return HOST_SUPPLIED_DEPENDENCIES_V1.has(name)||HOST_SUPPLIED_DEPENDENCY_PREFIXES_V1.some(prefix=>name.startsWith(prefix))}async function installStagingRuntimeDependencies(staging,entries,signal){let packageEntry=entries.find(entry=>entry.name==="package.json"&&!entry.directory);if(packageEntry===void 0)return;let manifest;try{manifest=JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(packageEntry.bytes))}catch{return}if(typeof manifest!="object"||manifest===null||Array.isArray(manifest))return;let record=manifest,dependencies=record.dependencies;if(typeof dependencies!="object"||dependencies===null||Array.isArray(dependencies))return;let runtime=Object.fromEntries(Object.entries(dependencies).filter(([name])=>!isHostSuppliedDependencyV1(name)));if(Object.keys(runtime).length===0)return;await writeFile3(join11(staging,"package.json"),JSON.stringify({...record,dependencies:runtime,devDependencies:void 0}),{flag:"w",mode:384});let win32=process.platform==="win32";await new Promise((resolve22,reject2)=>{let child=spawn(win32?"npm.cmd":"npm",["install","--omit=dev","--ignore-scripts","--no-audit","--no-fund","--loglevel=error"],{cwd:staging,signal,shell:win32,stdio:"ignore"});child.once("error",reject2),child.once("close",code=>{if(code===0){resolve22();return}reject2(new NodePackageInstallErrorV1("dependency_install_failed"))})})}async function writeEntries(root,entries,signal){await mkdir4(root,{recursive:!0,mode:448});for(let entry of entries){if(signal.aborted)throw new NodePackageInstallErrorV1("cancelled");let target=join11(root,...entry.name.split("/"));if(entry.directory){await mkdir4(target,{recursive:!0,mode:448});continue}let parent=join11(root,...entry.name.split("/").slice(0,-1));await mkdir4(parent,{recursive:!0,mode:448}),await writeFile3(target,entry.bytes,{flag:"wx",mode:384})}}async function createNodePackageInstallHostV1(options){if(typeof options.openArtifact!="function")throw new Error(t("openArtifact is required"));let limits=resolveNodePackageLimitsV1(options),parent=options.installationDirectory??tmpdir2();if(!isAbsolute6(parent))throw new Error(t("installationDirectory must be absolute"));if(options.persistence!==void 0&&options.persistence!=="ephemeral"&&options.persistence!=="persistent")throw new Error(t("persistence mode is invalid"));let supportedScopes=options.supportedScopes??["global","project"];if(!Array.isArray(supportedScopes)||supportedScopes.length===0||new Set(supportedScopes).size!==supportedScopes.length||supportedScopes.some(scope=>scope!=="global"&&scope!=="project"))throw new Error(t("supportedScopes is invalid"));await mkdir4(parent,{recursive:!0,mode:448});let persistent=options.persistence==="persistent",instanceRoot=persistent?join11(parent,"agent-forge-plugin-install-store-v1"):await mkdtemp2(join11(parent,"agent-forge-plugin-install-")),persistence=persistent?await createNodePackageInstallPersistenceV1({rootDirectory:instanceRoot,lockTimeoutMs:options.persistenceLockTimeoutMs}):void 0,records=new Map,activeByKey=new Map;if(persistence!==void 0)for(let record of await persistence.load())records.set(record.installationRef,{...record});for(let record of records.values())record.state==="active"&&activeByKey.set(installationKey(record.scope,record.scopeRef,record.pluginId),record.installationRef);let closed=!1,activeOperations=new Set,runtimeHandles=new Map,activationChains=new Map,applyPersistentSnapshot=snapshot2=>{records.clear(),activeByKey.clear();for(let value of snapshot2)records.set(value.installationRef,{...value});for(let value of records.values())value.state==="active"&&activeByKey.set(installationKey(value.scope,value.scopeRef,value.pluginId),value.installationRef)},commitRecords=async update=>{if(persistence===void 0){await update(records);return}applyPersistentSnapshot(await persistence.mutate({update}))},drained,closePromise,begin=parentSignal=>{if(closed)throw new NodePackageInstallErrorV1("host_closed");let controller=new AbortController;return parentSignal?.aborted?controller.abort(parentSignal.reason):parentSignal?.addEventListener("abort",()=>controller.abort(parentSignal.reason),{once:!0}),activeOperations.add(controller),{controller,signal:controller.signal}},end=controller=>{activeOperations.delete(controller),activeOperations.size===0&&(drained?.(),drained=void 0)},waitDrained=async()=>{activeOperations.size!==0&&await new Promise(resolve22=>{drained=resolve22})},getRecord=(installation,record,scope,scopeRef)=>{let value=records.get(installation.installationRef);if(value===void 0||installation.pluginId!==record.pluginId||installation.pluginVersion!==record.pluginVersion||installation.manifestDigest!==record.manifestDigest||installation.scope!==scope||installation.scopeRef!==scopeRef||!identityMatches(value,{pluginId:record.pluginId,pluginVersion:record.pluginVersion,manifestDigest:record.manifestDigest,scope,scopeRef}))throw new NodePackageInstallErrorV1("installation_identity_mismatch");return value},disposeRuntime=async installationRef=>{let handle=runtimeHandles.get(installationRef);handle!==void 0&&(handle.dispose!==void 0&&await Promise.resolve(handle.dispose()),runtimeHandles.delete(installationRef))},registerRuntimeHandle=(installationRef,handle)=>{let existing=runtimeHandles.get(installationRef);if(existing===void 0){runtimeHandles.set(installationRef,handle);return}runtimeHandles.set(installationRef,{dispose:async()=>{try{await Promise.resolve(handle.dispose?.())}finally{await Promise.resolve(existing.dispose?.())}}})},loadRuntime=async(installation,record,directory,signal)=>{if(options.loadPlugin!==void 0)try{return await options.loadPlugin({installation,record,directory,manifestPath:join11(directory,CAPABILITY_MANIFEST_FILE_V12),signal})??void 0}catch(error){throw error instanceof NodePackageInstallErrorV1?error:new NodePackageInstallErrorV1("installation_io_failed")}},host={version:NODE_PACKAGE_INSTALL_HOST_VERSION_V1,supportedScopes:Object.freeze([...supportedScopes]),getInstallationDirectory(input){let record=records.get(input.installation.installationRef);if(record===void 0||record.pluginId!==input.installation.pluginId||record.pluginVersion!==input.installation.pluginVersion||record.manifestDigest!==input.installation.manifestDigest||record.scope!==input.installation.scope||record.scopeRef!==input.installation.scopeRef)throw new NodePackageInstallErrorV1("installation_unknown");return record.directory},async install(input){let operation=begin(input.signal),staging;try{if(input.artifact===void 0)throw new NodePackageInstallErrorV1("invalid_artifact");if(!artifactIdentityMatchesRecord(input.artifact,input.record))throw new NodePackageInstallErrorV1("invalid_artifact");let mediaType=input.artifact.mediaType.toLowerCase();if(mediaType!=="application/zip"&&mediaType!=="application/gzip")throw new NodePackageInstallErrorV1("unsupported_media_type");let scopeRef=opaqueScope(input.scopeRef),bytes=await collectArtifact(options.openArtifact,input.artifact,limits.maxArchiveBytes,operation.signal);if(input.artifact.sizeBytes!==bytes.byteLength)throw new NodePackageInstallErrorV1("invalid_artifact");let digest=expectedArtifactDigest(input.artifact.artifactDigest);if(createHash3(digest.algorithm).update(bytes).digest("hex")!==digest.hex)throw new NodePackageInstallErrorV1("invalid_artifact");let entries=mediaType==="application/gzip"?await parseNodeTarGzPackageV1(bytes,limits):parseNodeZipPackageV1(bytes,limits),manifestEntry=entries.find(entry=>entry.name===ECOSYSTEM_MANIFEST_FILE_V12&&!entry.directory);if(manifestEntry===void 0)throw new NodePackageInstallErrorV1("package_manifest_missing");if(manifestEntry.bytes.byteLength>MAX_PACKAGE_MANIFEST_BYTES_V1)throw new NodePackageInstallErrorV1("package_manifest_invalid");let manifest;try{manifest=JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(manifestEntry.bytes))}catch{throw new NodePackageInstallErrorV1("package_manifest_invalid")}packageManifest(manifest,input.record);let capabilityEntry=entries.find(entry=>entry.name===CAPABILITY_MANIFEST_FILE_V12&&!entry.directory);if(capabilityEntry===void 0)throw new NodePackageInstallErrorV1("package_manifest_missing");if(capabilityEntry.bytes.byteLength>MAX_PACKAGE_MANIFEST_BYTES_V1)throw new NodePackageInstallErrorV1("package_manifest_invalid");let capability;try{capability=JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(capabilityEntry.bytes))}catch{throw new NodePackageInstallErrorV1("package_manifest_invalid")}capabilityManifest(capability,input.record,entries);let key=installationKey(input.scope,scopeRef,input.record.pluginId);staging=join11(instanceRoot,`.staging-${randomUUID4()}`),await writeEntries(staging,entries,operation.signal),options.dependencyMaterialization!=="skip"&&await installStagingRuntimeDependencies(staging,entries,operation.signal);let installRef=`plugin-install://node-zip/${randomUUID4()}`,destination=packagePath(instanceRoot,`${key}\0${installRef}`);await rename4(staging,destination),staging=void 0;let installedRecord={installationRef:installRef,directory:destination,pluginId:input.record.pluginId,pluginVersion:input.record.pluginVersion,manifestDigest:input.record.manifestDigest,scope:input.scope,scopeRef,state:"installed"};try{await commitRecords(values=>{values.set(installRef,installedRecord)})}catch(error){throw await rm3(destination,{recursive:!0,force:!0}).catch(()=>{}),error}return{installationRef:installRef,scope:input.scope,scopeRef}}catch(error){throw operation.signal.aborted||input.signal?.aborted?new NodePackageInstallErrorV1("cancelled"):error instanceof NodePackageInstallErrorV1?error:new NodePackageInstallErrorV1("installation_io_failed")}finally{staging!==void 0&&await rm3(staging,{recursive:!0,force:!0}).catch(()=>{}),end(operation.controller)}},async activate(input){let key=installationKey(input.scope,opaqueScope(input.scopeRef),input.record.pluginId),activateBody=async()=>{let operation=begin(input.signal),candidate;try{let scopeRef=opaqueScope(input.scopeRef),record=getRecord(input.installation,input.record,input.scope,scopeRef);if(record.state!=="installed")throw new NodePackageInstallErrorV1("installation_identity_mismatch");candidate=await loadRuntime(input.installation,input.record,record.directory,operation.signal);let previousRef=activeByKey.get(key);await commitRecords(values=>{let candidateRecord=values.get(input.installation.installationRef);if(candidateRecord===void 0)throw new NodePackageInstallErrorV1("installation_identity_mismatch");if(previousRef!==void 0){let previousRecord=values.get(previousRef);previousRecord!==void 0&&values.set(previousRef,{...previousRecord,state:"retained"})}values.set(input.installation.installationRef,{...candidateRecord,state:"active"})}),activeByKey.set(key,input.installation.installationRef),candidate!==void 0&&registerRuntimeHandle(input.installation.installationRef,candidate),candidate=void 0,previousRef!==void 0&&records.get(previousRef)!==void 0&&await disposeRuntime(previousRef)}catch(error){throw candidate?.dispose!==void 0&&await Promise.resolve(candidate.dispose()).catch(()=>{}),error instanceof NodePackageInstallErrorV1?error:new NodePackageInstallErrorV1("installation_io_failed")}finally{end(operation.controller)}},run=(activationChains.get(key)??Promise.resolve()).catch(()=>{}).then(()=>activateBody());activationChains.set(key,run);try{await run}finally{activationChains.get(key)===run&&activationChains.delete(key)}},async rollback(input){let operation=begin(input.signal),candidate;try{let scopeRef=opaqueScope(input.scopeRef),failed=records.get(input.failed.installationRef);if(failed===void 0||!identityMatches(failed,{pluginId:input.failed.pluginId,pluginVersion:input.failed.pluginVersion,manifestDigest:input.failed.manifestDigest,scope:input.scope,scopeRef}))throw new NodePackageInstallErrorV1("installation_identity_mismatch");let previous=records.get(input.previous.installationRef);if(previous===void 0||!identityMatches(previous,{pluginId:input.previous.pluginId,pluginVersion:input.previous.pluginVersion,manifestDigest:input.previous.manifestDigest,scope:input.scope,scopeRef})||previous.state!=="active"&&previous.state!=="retained"||failed.pluginId!==previous.pluginId)throw new NodePackageInstallErrorV1("installation_identity_mismatch");let previousInstallation={version:1,pluginId:previous.pluginId,pluginVersion:previous.pluginVersion,manifestDigest:previous.manifestDigest,scope:previous.scope,scopeRef:previous.scopeRef,installationRef:input.previous.installationRef,state:"active"};candidate=await loadRuntime(previousInstallation,void 0,previous.directory,operation.signal),await disposeRuntime(input.failed.installationRef),await rm3(failed.directory,{recursive:!0,force:!0}),await commitRecords(values=>{values.delete(input.failed.installationRef);let previousRecord=values.get(input.previous.installationRef);previousRecord!==void 0&&values.set(input.previous.installationRef,{...previousRecord,state:"active"})}),activeByKey.set(installationKey(input.scope,scopeRef,failed.pluginId),input.previous.installationRef),candidate!==void 0&&registerRuntimeHandle(input.previous.installationRef,candidate),candidate=void 0}catch(error){throw candidate?.dispose!==void 0&&await Promise.resolve(candidate.dispose()).catch(()=>{}),error instanceof NodePackageInstallErrorV1?error:new NodePackageInstallErrorV1("installation_io_failed")}finally{end(operation.controller)}},async uninstall(input){let operation=begin(input.signal);try{let scopeRef=opaqueScope(input.scopeRef),record=records.get(input.installation.installationRef);if(record===void 0||!identityMatches(record,{pluginId:input.installation.pluginId,pluginVersion:input.installation.pluginVersion,manifestDigest:input.installation.manifestDigest,scope:input.scope,scopeRef}))throw new NodePackageInstallErrorV1("installation_unknown");await disposeRuntime(input.installation.installationRef),await rm3(record.directory,{recursive:!0,force:!1}).catch(error=>{if(error.code!=="ENOENT")throw error}),await commitRecords(values=>{values.delete(input.installation.installationRef)});let key=installationKey(input.scope,scopeRef,record.pluginId);activeByKey.get(key)===input.installation.installationRef&&activeByKey.delete(key)}finally{end(operation.controller)}},async close(){if(closePromise!==void 0)return await closePromise;closed=!0;for(let operation of activeOperations)operation.abort();return closePromise=(async()=>{await waitDrained();let disposeError=!1;for(let installationRef of runtimeHandles.keys())try{await disposeRuntime(installationRef)}catch{disposeError=!0}if(persistence===void 0?await rm3(instanceRoot,{recursive:!0,force:!0}):await persistence.close(),records.clear(),activeByKey.clear(),disposeError)throw new NodePackageInstallErrorV1("installation_io_failed")})(),await closePromise}};if(options.loadPlugin!==void 0)try{for(let record of records.values()){if(record.state!=="active")continue;let installation={version:1,pluginId:record.pluginId,pluginVersion:record.pluginVersion,manifestDigest:record.manifestDigest,scope:record.scope,scopeRef:record.scopeRef,installationRef:record.installationRef,state:"active"},runtime=await loadRuntime(installation,void 0,record.directory,new AbortController().signal);runtime!==void 0&&runtimeHandles.set(record.installationRef,runtime)}}catch(error){throw await host.close().catch(()=>{}),error instanceof NodePackageInstallErrorV1?error:new NodePackageInstallErrorV1("installation_io_failed")}return host}import{createHash as createHash5,randomUUID as randomUUID5}from"node:crypto";import{lstatSync as lstatSync2}from"node:fs";import{lstat,readdir,readFile as readFile5}from"node:fs/promises";import{join as join12}from"node:path";function isMissingError2(error){return typeof error!="object"||error===null?!1:"code"in error&&error.code==="ENOENT"}var ALWAYS_EXCLUDED_DIRECTORY_NAMES_V1=new Set(["node_modules",".git"]),GLOB_METACHARACTERS_V1=/[*?[]/;function globFilesEntryErrorV1(entry){let error=new NodePackageInstallErrorV1("archive_invalid");return error.message=`Local directory install: package.json "files" entry "${entry}" uses glob syntax, which is not supported when installing from a directory; pack a .tgz instead`,error}function packageJsonAccessErrorV1(action,error){let detail=error instanceof Error?error.message:String(error),installError=new NodePackageInstallErrorV1("archive_invalid");return installError.message=`Local directory install: failed to ${action} package.json: ${detail}`,installError.cause=error,installError}async function readPackageFilesWhitelistV1(rootDirectory){let raw;try{raw=await readFile5(join12(rootDirectory,"package.json"),"utf8")}catch(error){if(isMissingError2(error))return null;throw packageJsonAccessErrorV1("read",error)}let parsed;try{parsed=JSON.parse(raw)}catch(error){throw packageJsonAccessErrorV1("parse",error)}if(typeof parsed!="object"||parsed===null)return null;let files=parsed.files;if(!Array.isArray(files))return null;let patterns=[];for(let value of files){if(typeof value!="string"){let error=new NodePackageInstallErrorV1("archive_invalid");throw error.message='Local directory install: package.json "files" must contain only strings',error}let pattern=value.replace(/\/+$/,"");if(pattern.length!==0){if(GLOB_METACHARACTERS_V1.test(pattern))throw globFilesEntryErrorV1(value);patterns.push(pattern)}}return patterns}function isImplicitlyKeptPackageFileV1(relativePath){if(relativePath.includes("/"))return!1;let name=relativePath.toUpperCase();return name==="PACKAGE.JSON"||name.startsWith("README")||name.startsWith("LICENSE")||name.startsWith("LICENCE")}function isFilesWhitelistMatchV1(relativePath,isDirectory,patterns){return patterns.some(pattern=>relativePath===pattern||relativePath.startsWith(`${pattern}/`))?!0:isDirectory?patterns.some(pattern=>pattern.startsWith(`${relativePath}/`)):isImplicitlyKeptPackageFileV1(relativePath)}async function collectDirectory(root,relative11,limits,entries,budget,filesWhitelist,signal){if(signal?.aborted)throw new NodePackageInstallErrorV1("cancelled");let dirents=await readdir(relative11.length===0?root:join12(root,...relative11.split("/")),{withFileTypes:!0});dirents.sort((left,right)=>left.name<right.name?-1:left.name>right.name?1:0);for(let dirent of dirents){if(signal?.aborted)throw new NodePackageInstallErrorV1("cancelled");let childRelative=relative11.length===0?dirent.name:`${relative11}/${dirent.name}`,isDirectory=dirent.isDirectory();if(isDirectory&&ALWAYS_EXCLUDED_DIRECTORY_NAMES_V1.has(dirent.name)||filesWhitelist!==null&&!isFilesWhitelistMatchV1(childRelative,isDirectory,filesWhitelist))continue;if(normalizedEntryName(childRelative),dirent.isSymbolicLink())throw new NodePackageInstallErrorV1("archive_invalid");let childPath=join12(root,...childRelative.split("/")),stats=await lstat(childPath);if(stats.isSymbolicLink())throw new NodePackageInstallErrorV1("archive_invalid");if(stats.isDirectory()){await collectDirectory(root,childRelative,limits,entries,budget,filesWhitelist,signal);continue}if(!stats.isFile())throw new NodePackageInstallErrorV1("archive_invalid");if(entries.length+1>limits.maxEntries)throw new NodePackageInstallErrorV1("archive_budget_exceeded");let bytes=await readFile5(childPath);if(bytes.byteLength>limits.maxEntryBytes)throw new NodePackageInstallErrorV1("archive_budget_exceeded");if(budget.totalBytes+=bytes.byteLength,budget.totalBytes>limits.maxExtractedBytes)throw new NodePackageInstallErrorV1("archive_budget_exceeded");entries.push(Object.freeze({name:childRelative,directory:!1,bytes:new Uint8Array(bytes)}))}}async function collectLocalDirectoryPackageEntriesV1(rootDirectory,limitsInput={},signal){if(typeof rootDirectory!="string"||rootDirectory.trim().length===0)throw new NodePackageInstallErrorV1("archive_invalid");let stats=await lstat(rootDirectory).catch(error=>{throw isMissingError2(error)?new NodePackageInstallErrorV1("archive_invalid"):error});if(!stats.isDirectory()||stats.isSymbolicLink())throw new NodePackageInstallErrorV1("archive_invalid");let limits=resolveNodePackageLimitsV1(limitsInput),filesWhitelist=await readPackageFilesWhitelistV1(rootDirectory),entries=[];return await collectDirectory(rootDirectory,"",limits,entries,{totalBytes:0},filesWhitelist,signal),Object.freeze(entries)}async function readLocalPackageFileV1(path8,limitsInput={},signal){if(signal?.aborted)throw new NodePackageInstallErrorV1("cancelled");if(typeof path8!="string"||path8.trim().length===0)throw new NodePackageInstallErrorV1("archive_invalid");let stats=await lstat(path8).catch(error=>{throw isMissingError2(error)?new NodePackageInstallErrorV1("archive_invalid"):error});if(stats.isSymbolicLink()||!stats.isFile())throw new NodePackageInstallErrorV1("archive_invalid");let limits=resolveNodePackageLimitsV1(limitsInput);if(stats.size>limits.maxArchiveBytes)throw new NodePackageInstallErrorV1("archive_budget_exceeded");let bytes=await readFile5(path8);if(bytes.byteLength!==stats.size||bytes.byteLength>limits.maxArchiveBytes)throw new NodePackageInstallErrorV1("archive_budget_exceeded");return new Uint8Array(bytes)}var DEFAULT_NPM_REGISTRY_V1="https://registry.npmjs.org",DEFAULT_TIMEOUT_MS_V12=15e3,MAX_TIMEOUT_MS_V12=12e4,DEFAULT_MAX_RESPONSE_BYTES_V1=8*1024*1024,MAX_RESPONSE_BYTES_V1=16*1024*1024,DEFAULT_MAX_TARBALL_BYTES_V1=128*1024*1024,MAX_TARBALL_BYTES_V1=512*1024*1024,DEFAULT_REDIRECTS_V12=3,MAX_REDIRECTS_V12=5,REDIRECT_STATUS2=new Set([301,302,303,307,308]),NodeNpmRegistrySourceErrorV1=class extends Error{code;retryAfterSeconds;constructor(code,message,options){super(message,options?.cause===void 0?void 0:{cause:options.cause}),this.name="NodeNpmRegistrySourceErrorV1",this.code=code,options?.retryAfterSeconds!==void 0&&(this.retryAfterSeconds=options.retryAfterSeconds)}};function sriToIntegrityV1(sri){let match2=/^(sha512|sha256)-([A-Za-z0-9+/]+={0,2})$/u.exec(sri.trim());if(match2===null)throw new NodeNpmRegistrySourceErrorV1("integrity_unsupported",t("npm integrity algorithm is unsupported"));let algorithm=match2[1],raw;try{raw=Buffer.from(match2[2],"base64")}catch{throw new NodeNpmRegistrySourceErrorV1("integrity_unsupported",t("npm integrity encoding is invalid"))}if(algorithm==="sha256"&&raw.byteLength!==32||algorithm==="sha512"&&raw.byteLength!==64)throw new NodeNpmRegistrySourceErrorV1("integrity_unsupported",t("npm integrity length is invalid"));let hex=raw.toString("hex").toLowerCase();if(hex.length===0)throw new NodeNpmRegistrySourceErrorV1("integrity_unsupported",t("npm integrity is invalid"));return{algorithm,hex}}function parseVersionTriple(value){let match2=/^(\d+)\.(\d+)\.(\d+)/u.exec(value.replace(/^[vV]/u,""));if(match2===null)return;let major=Number.parseInt(match2[1],10),minor=Number.parseInt(match2[2],10),patch=Number.parseInt(match2[3],10);if(!(!Number.isSafeInteger(major)||!Number.isSafeInteger(minor)||!Number.isSafeInteger(patch)))return[major,minor,patch]}function plainVersion(value){return value.replace(/^[vV]/u,"")}function selectNpmPackageVersionV1(versions,range2){if(!Array.isArray(versions))return;let candidates=versions.filter(value=>typeof value=="string"&&parseVersionTriple(value)!==void 0);if(candidates.length===0)return;if(range2===void 0||range2==="latest")return candidates.reduce((left,right)=>comparePluginVersionsV1(right,left)>0?right:left);let exact=plainVersion(range2.replace(/^[=~^]/u,""));if(!range2.startsWith("^")&&!range2.startsWith("~"))return candidates.find(value=>plainVersion(value)===exact);let bound=parseVersionTriple(exact);if(bound===void 0)return;let[major,minor]=bound,upper=range2.startsWith("^")?`${major+1}.0.0`:`${major}.${minor+1}.0`;if(candidates=candidates.filter(value=>comparePluginVersionsV1(value,exact)>=0&&comparePluginVersionsV1(value,upper)<0),candidates.length!==0)return candidates.reduce((left,right)=>comparePluginVersionsV1(right,left)>0?right:left)}function boundedPositive2(value,fallback,maximum,label){let result=value??fallback;if(!Number.isSafeInteger(result)||result<=0||result>maximum)throw new NodeNpmRegistrySourceErrorV1("invalid_configuration",t("{label} must be a positive integer at most {maximum}",{label,maximum}));return result}function registryOrigin(value){let parsed;try{parsed=new URL(value)}catch{throw new NodeNpmRegistrySourceErrorV1("invalid_configuration",t("npm registry origin is invalid"))}if(parsed.protocol!=="http:"&&parsed.protocol!=="https:"||parsed.username!==""||parsed.password!=="")throw new NodeNpmRegistrySourceErrorV1("invalid_configuration",t("npm registry origin must be http(s) without credentials"));if(parsed.pathname!=="/"||parsed.search!==""||parsed.hash!=="")throw new NodeNpmRegistrySourceErrorV1("invalid_configuration",t("npm registry origin must not include a path, query, or fragment"));return parsed.origin}function packumentUrl(registryOriginValue,name){let scopeAt=name.indexOf("/");if(name.startsWith("@")&&scopeAt>0){let scope=name.slice(0,scopeAt),packageName=name.slice(scopeAt+1);return new URL(`${registryOriginValue}/${scope}%2F${encodeURIComponent(packageName)}`)}if(scopeAt>=0)throw new NodeNpmRegistrySourceErrorV1("invalid_configuration",t("npm package name is invalid"));return new URL(`${registryOriginValue}/${encodeURIComponent(name)}`)}function tarballUrl(value){let parsed;try{parsed=new URL(value)}catch{throw new NodeNpmRegistrySourceErrorV1("invalid_response",t("npm tarball URL is invalid"))}if(parsed.protocol!=="http:"&&parsed.protocol!=="https:"||parsed.username!==""||parsed.password!=="")throw new NodeNpmRegistrySourceErrorV1("invalid_response",t("npm tarball URL must use http(s) without credentials"));if(parsed.hash!=="")throw new NodeNpmRegistrySourceErrorV1("invalid_response",t("npm tarball URL must not include a fragment"));return parsed}function isAbortLike2(error){return error instanceof Error&&(error.name==="AbortError"||error.name==="AbortSignalError")}function requestSignal2(parent,timeoutMs){let controller=new AbortController,timedOut=!1,abort=()=>controller.abort(parent?.reason);parent?.aborted===!0?abort():parent?.addEventListener("abort",abort,{once:!0});let timeout=setTimeout(()=>{timedOut=!0,controller.abort()},timeoutMs);return{signal:controller.signal,timedOut:()=>timedOut,cleanup:()=>{clearTimeout(timeout),parent?.removeEventListener("abort",abort)}}}function isJsonResponse(response2){let contentType2=response2.headers.get("content-type");if(contentType2===null)return!1;let mediaType=contentType2.split(";",1)[0]?.trim().toLowerCase();return mediaType==="application/json"||mediaType==="application/vnd.npm.install-v1+json"}function rateLimitState(response2){if(!(response2.status===429||response2.status===403&&response2.headers.get("x-ratelimit-remaining")==="0"))return{limited:!1};let retryAfter=response2.headers.get("retry-after"),seconds=retryAfter===null?Number.NaN:Number.parseInt(retryAfter,10);return!Number.isSafeInteger(seconds)||seconds<0?{limited:!0}:{limited:!0,retryAfterSeconds:seconds}}function rateLimitError(limit){let message=limit.retryAfterSeconds===void 0?t("npm registry rate limit was exceeded"):`${t("npm registry rate limit was exceeded")} (retry after ${limit.retryAfterSeconds}s)`;return new NodeNpmRegistrySourceErrorV1("rate_limited",message,{...limit.retryAfterSeconds===void 0?{}:{retryAfterSeconds:limit.retryAfterSeconds}})}async function readBody(response2,maxBytes,request){if(response2.body===null)throw new NodeNpmRegistrySourceErrorV1("invalid_response",t("npm registry response has no body"));let reader=response2.body.getReader(),chunks=[],total=0,abortError2=()=>request.timedOut()?new NodeNpmRegistrySourceErrorV1("request_timed_out",t("npm registry request timed out")):new NodeNpmRegistrySourceErrorV1("cancelled",t("npm registry request was cancelled"));try{for(;;){if(request.signal.aborted)throw abortError2();let item;try{item=await reader.read()}catch(error){throw request.signal.aborted?abortError2():error}if(item.done)break;if(total+=item.value.byteLength,total>maxBytes)throw new NodeNpmRegistrySourceErrorV1("response_too_large",t("npm registry response exceeds the configured size limit"));chunks.push(item.value)}}finally{reader.releaseLock()}let bytes=new Uint8Array(total),offset=0;for(let chunk of chunks)bytes.set(chunk,offset),offset+=chunk.byteLength;return bytes}function parsePackument(bytes){let value;try{value=JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(bytes))}catch{throw new NodeNpmRegistrySourceErrorV1("invalid_response",t("npm registry response is not valid JSON"))}if(typeof value!="object"||value===null||Array.isArray(value))throw new NodeNpmRegistrySourceErrorV1("invalid_response",t("npm packument is invalid"));let packument=value;if(typeof packument.versions!="object"||packument.versions===null||Array.isArray(packument.versions))throw new NodeNpmRegistrySourceErrorV1("invalid_response",t("npm packument has no version table"));return packument.versions}function createNodeNpmRegistrySourceV1(options={}){let transport=options.fetch??globalThis.fetch;if(typeof transport!="function")throw new NodeNpmRegistrySourceErrorV1("invalid_configuration",t("Node fetch is unavailable"));let registry=registryOrigin(options.registry??DEFAULT_NPM_REGISTRY_V1);if(options.token!==void 0&&(options.token.length===0||options.token.length>4096||/[\r\n\s]/u.test(options.token)))throw new NodeNpmRegistrySourceErrorV1("invalid_configuration",t("npm registry token is invalid"));let token=options.token,timeoutMs=boundedPositive2(options.requestTimeoutMs,DEFAULT_TIMEOUT_MS_V12,MAX_TIMEOUT_MS_V12,"requestTimeoutMs"),maxResponseBytes=boundedPositive2(options.maxResponseBytes,DEFAULT_MAX_RESPONSE_BYTES_V1,MAX_RESPONSE_BYTES_V1,"maxResponseBytes"),maxTarballBytes=boundedPositive2(options.maxTarballBytes,DEFAULT_MAX_TARBALL_BYTES_V1,MAX_TARBALL_BYTES_V1,"maxTarballBytes"),maxRedirects=options.maxRedirects??DEFAULT_REDIRECTS_V12;if(!Number.isSafeInteger(maxRedirects)||maxRedirects<0||maxRedirects>MAX_REDIRECTS_V12)throw new NodeNpmRegistrySourceErrorV1("invalid_configuration",t("maxRedirects must be an integer between 0 and {max}",{max:MAX_REDIRECTS_V12}));let userAgent=options.userAgent??"agent-forge-plugin-npm/1";if(userAgent.length===0||userAgent.length>256||/[\r\n]/u.test(userAgent))throw new NodeNpmRegistrySourceErrorV1("invalid_configuration",t("userAgent is invalid"));let fetchFollowingRedirects=async(url,headers,parentSignal)=>{let current=url;for(let redirect=0;;redirect+=1){let request=requestSignal2(parentSignal,timeoutMs),response2;try{response2=await transport(current.toString(),{method:"GET",headers:{accept:"*/*","user-agent":userAgent,...headers},redirect:"manual",signal:request.signal})}catch(error){throw request.cleanup(),request.timedOut()?new NodeNpmRegistrySourceErrorV1("request_timed_out",t("npm registry request timed out")):isAbortLike2(error)?new NodeNpmRegistrySourceErrorV1("cancelled",t("npm registry request was cancelled")):new NodeNpmRegistrySourceErrorV1("request_failed",t("npm registry request failed"),{cause:error})}if(!REDIRECT_STATUS2.has(response2.status))return{response:response2,request};let location=response2.headers.get("location");if(await response2.body?.cancel().catch(()=>{}),request.cleanup(),location===null||redirect>=maxRedirects)throw new NodeNpmRegistrySourceErrorV1("request_failed",t("npm registry redirect limit exceeded"));current=tarballUrl(new URL(location,current).toString())}};return{version:1,registry,resolveNpmPackage:async input=>{if(input.signal?.aborted===!0)throw new NodeNpmRegistrySourceErrorV1("cancelled",t("npm registry request was cancelled"));let endpoint=packumentUrl(registry,input.name),authorization=token===void 0?{}:{authorization:`Bearer ${token}`},{response:response2,request}=await fetchFollowingRedirects(endpoint,authorization,input.signal);try{let limit=rateLimitState(response2);if(limit.limited)throw rateLimitError(limit);if(response2.status===404||response2.status===403)throw new NodeNpmRegistrySourceErrorV1("package_not_found",t("npm package was not found on the registry"));if(response2.status<200||response2.status>=300)throw new NodeNpmRegistrySourceErrorV1("request_failed",t("npm registry request did not succeed"));if(!isJsonResponse(response2))throw new NodeNpmRegistrySourceErrorV1("invalid_response",t("npm registry response must be JSON"));let versions=parsePackument(await readBody(response2,maxResponseBytes,request)),version=selectNpmPackageVersionV1(Object.keys(versions),input.range),dist=version===void 0?void 0:versions[version]?.dist;if(version===void 0||dist===void 0||typeof dist.tarball!="string"||dist.tarball.length===0)throw new NodeNpmRegistrySourceErrorV1("version_not_found",t("No npm package version matches the requested range"));let integrityValue=dist.integrity,integrity=typeof integrityValue=="string"&&integrityValue.length>0?sriToIntegrityV1(integrityValue):void 0;if(integrity===void 0)throw new NodeNpmRegistrySourceErrorV1("invalid_response",t("npm package version has no integrity field"));return{version,tarballUrl:tarballUrl(dist.tarball).toString(),integrity,distInfo:dist}}finally{await response2.body?.cancel().catch(()=>{}),request.cleanup()}},fetchTarball:async input=>{if(input.signal?.aborted===!0)throw new NodeNpmRegistrySourceErrorV1("cancelled",t("npm tarball download was cancelled"));let endpoint=tarballUrl(input.url),authorization=token===void 0?{}:{authorization:`Bearer ${token}`},{response:response2,request}=await fetchFollowingRedirects(endpoint,authorization,input.signal);try{let limit=rateLimitState(response2);if(limit.limited)throw rateLimitError(limit);if(response2.status<200||response2.status>=300)throw new NodeNpmRegistrySourceErrorV1("request_failed",t("npm tarball download did not succeed"));return await readBody(response2,maxTarballBytes,request)}finally{await response2.body?.cancel().catch(()=>{}),request.cleanup()}}}}function sniffMagic(bytes){if(bytes.byteLength>=4&&bytes[0]===80&&bytes[1]===75&&(bytes[2]===3||bytes[2]===5||bytes[2]===7))return"application/zip";if(bytes.byteLength>=2&&bytes[0]===31&&bytes[1]===139)return"application/gzip"}function extensionMediaType(fileName){let value=fileName.toLowerCase();if(value.endsWith(".zip"))return"application/zip";if(value.endsWith(".tgz")||value.endsWith(".tar.gz"))return"application/gzip"}function detectPluginPackageMediaTypeV1(bytes,fileName){if(!(bytes instanceof Uint8Array))throw new NodePackageInstallErrorV1("archive_invalid");let magic=sniffMagic(bytes),extension=fileName===void 0?void 0:extensionMediaType(fileName);if(magic===void 0)throw new NodePackageInstallErrorV1("unsupported_media_type");if(extension!==void 0&&extension!==magic)throw new NodePackageInstallErrorV1("unsupported_media_type");return magic}import{createHash as createHash4}from"node:crypto";var DEFAULT_TIMEOUT_MS_V13=3e4,MAX_TIMEOUT_MS_V13=12e4,DEFAULT_MAX_PACKAGE_BYTES_V1=128*1024*1024,MAX_PACKAGE_BYTES_V1=512*1024*1024,DEFAULT_REDIRECTS_V13=3,MAX_REDIRECTS_V13=5,REDIRECT_STATUS3=new Set([301,302,303,307,308]),NodeUrlPackageSourceErrorV1=class extends Error{code;constructor(code,message){super(message),this.name="NodeUrlPackageSourceErrorV1",this.code=code}};function boundedPositive3(value,fallback,maximum,label){let result=value??fallback;if(!Number.isSafeInteger(result)||result<=0||result>maximum)throw new NodeUrlPackageSourceErrorV1("invalid_configuration",t("{label} must be a positive integer at most {maximum}",{label,maximum}));return result}function packageUrl(value){let parsed;try{parsed=new URL(value)}catch{throw new NodeUrlPackageSourceErrorV1("invalid_url",t("plugin package URL is invalid"))}if(parsed.protocol!=="http:"&&parsed.protocol!=="https:"||parsed.username!==""||parsed.password!=="")throw new NodeUrlPackageSourceErrorV1("invalid_url",t("plugin package URL must use http(s) without credentials"));if(parsed.hash!=="")throw new NodeUrlPackageSourceErrorV1("invalid_url",t("plugin package URL must not include a fragment"));return parsed}function isAbortLike3(error){return error instanceof Error&&(error.name==="AbortError"||error.name==="AbortSignalError")}async function downloadNodeUrlPackageV1(options,input){let transport=options.fetch??globalThis.fetch;if(typeof transport!="function")throw new NodeUrlPackageSourceErrorV1("invalid_configuration",t("Node fetch is unavailable"));let timeoutMs=boundedPositive3(options.requestTimeoutMs,DEFAULT_TIMEOUT_MS_V13,MAX_TIMEOUT_MS_V13,"requestTimeoutMs"),maxPackageBytes=boundedPositive3(options.maxPackageBytes,DEFAULT_MAX_PACKAGE_BYTES_V1,MAX_PACKAGE_BYTES_V1,"maxPackageBytes"),maxRedirects=options.maxRedirects??DEFAULT_REDIRECTS_V13;if(!Number.isSafeInteger(maxRedirects)||maxRedirects<0||maxRedirects>MAX_REDIRECTS_V13)throw new NodeUrlPackageSourceErrorV1("invalid_configuration",t("maxRedirects must be an integer between 0 and {max}",{max:MAX_REDIRECTS_V13}));let userAgent=options.userAgent??"agent-forge-plugin-url/1";if(userAgent.length===0||userAgent.length>256||/[\r\n]/u.test(userAgent))throw new NodeUrlPackageSourceErrorV1("invalid_configuration",t("userAgent is invalid"));if(input.expectedDigestHex!==void 0&&!/^[0-9a-f]{64}$/u.test(input.expectedDigestHex))throw new NodeUrlPackageSourceErrorV1("invalid_url",t("expected sha256 digest is invalid"));let current=packageUrl(input.url),response2,controller=new AbortController,timedOut=!1,abort=()=>controller.abort(input.signal?.reason);input.signal?.aborted===!0?abort():input.signal?.addEventListener("abort",abort,{once:!0});let timeout=setTimeout(()=>{timedOut=!0,controller.abort()},timeoutMs);try{for(let redirect=0;;redirect+=1){if(controller.signal.aborted)throw new NodeUrlPackageSourceErrorV1("cancelled",t("plugin package download was cancelled"));let hop;try{hop=await transport(current.toString(),{method:"GET",headers:{accept:"*/*","user-agent":userAgent},redirect:"manual",signal:controller.signal})}catch(error){throw timedOut?new NodeUrlPackageSourceErrorV1("request_timed_out",t("plugin package download timed out")):isAbortLike3(error)||input.signal?.aborted===!0?new NodeUrlPackageSourceErrorV1("cancelled",t("plugin package download was cancelled")):new NodeUrlPackageSourceErrorV1("request_failed",t("plugin package download failed"))}if(!REDIRECT_STATUS3.has(hop.status)){response2=hop;break}let location=hop.headers.get("location");if(await hop.body?.cancel().catch(()=>{}),location===null||redirect>=maxRedirects)throw new NodeUrlPackageSourceErrorV1("request_failed",t("plugin package redirect limit exceeded"));current=packageUrl(new URL(location,current).toString())}if(response2===void 0)throw new NodeUrlPackageSourceErrorV1("request_failed",t("plugin package download failed"));if(response2.status<200||response2.status>=300)throw new NodeUrlPackageSourceErrorV1("request_failed",t("plugin package download did not succeed"));if(response2.body===null)throw new NodeUrlPackageSourceErrorV1("request_failed",t("plugin package response has no body"));let reader=response2.body.getReader(),chunks=[],hash=createHash4("sha256"),total=0;try{for(;;){if(controller.signal.aborted)throw new NodeUrlPackageSourceErrorV1("cancelled",t("plugin package download was cancelled"));let item=await reader.read();if(item.done)break;if(total+=item.value.byteLength,total>maxPackageBytes)throw new NodeUrlPackageSourceErrorV1("response_too_large",t("plugin package exceeds the configured size limit"));hash.update(item.value),chunks.push(item.value)}}finally{reader.releaseLock()}if(controller.signal.aborted)throw new NodeUrlPackageSourceErrorV1("cancelled",t("plugin package download was cancelled"));let bytes=new Uint8Array(total),offset=0;for(let chunk of chunks)bytes.set(chunk,offset),offset+=chunk.byteLength;let digestHex=hash.digest("hex");if(input.expectedDigestHex!==void 0&&digestHex!==input.expectedDigestHex)throw new NodeUrlPackageSourceErrorV1("digest_mismatch",t("plugin package bytes do not match the expected sha256 digest"));let fileName=current.pathname.split("/").pop(),mediaType=detectPluginPackageMediaTypeV1(bytes,fileName===void 0||fileName.length===0?void 0:fileName);return{bytes,mediaType,digestHex}}finally{clearTimeout(timeout),input.signal?.removeEventListener("abort",abort),await response2?.body?.cancel().catch(()=>{})}}var DEFAULT_GITHUB_API_ORIGIN_V1="https://api.github.com",DEFAULT_GITEE_API_ORIGIN_V1="https://gitee.com/api/v5",DEFAULT_TIMEOUT_MS_V14=15e3,MAX_TIMEOUT_MS_V14=12e4,DEFAULT_MAX_RESPONSE_BYTES_V12=8*1024*1024,MAX_RESPONSE_BYTES_V12=16*1024*1024,DEFAULT_MAX_ASSET_BYTES_V1=128*1024*1024,MAX_ASSET_BYTES_V1=512*1024*1024,DEFAULT_REDIRECTS_V14=3,MAX_REDIRECTS_V14=5,REDIRECT_STATUS4=new Set([301,302,303,307,308]),NodeReleasePackageSourceErrorV1=class extends Error{code;resetEpochSeconds;constructor(code,message,options){super(message),this.name="NodeReleasePackageSourceErrorV1",this.code=code,options?.resetEpochSeconds!==void 0&&(this.resetEpochSeconds=options.resetEpochSeconds)}};function boundedPositive4(value,fallback,maximum,label){let result=value??fallback;if(!Number.isSafeInteger(result)||result<=0||result>maximum)throw new NodeReleasePackageSourceErrorV1("invalid_configuration",t("{label} must be a positive integer at most {maximum}",{label,maximum}));return result}function boundedToken(value,label){if(value!==void 0){if(value.length===0||value.length>4096||/[\r\n\s]/u.test(value))throw new NodeReleasePackageSourceErrorV1("invalid_configuration",t("{label} is invalid",{label}));return value}}function apiOrigin(value,label){let parsed;try{parsed=new URL(value)}catch{throw new NodeReleasePackageSourceErrorV1("invalid_configuration",t("{label} is invalid",{label}))}if(parsed.protocol!=="http:"&&parsed.protocol!=="https:"||parsed.username!==""||parsed.password!=="")throw new NodeReleasePackageSourceErrorV1("invalid_configuration",t("{label} must be http(s) without credentials",{label}));if(parsed.search!==""||parsed.hash!=="")throw new NodeReleasePackageSourceErrorV1("invalid_configuration",t("{label} must not include a query or fragment",{label}));let trimmed=parsed.pathname.replace(/\/+$/u,"");return{origin:parsed.origin,pathPrefix:trimmed===""||trimmed==="/"?"":trimmed.replace(/^\//u,"")}}function jsonBytes(value){try{return JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(value))}catch{throw new NodeReleasePackageSourceErrorV1("invalid_response",t("release API response is not valid JSON"))}}function parseReleaseList(bytes){let value=jsonBytes(bytes);if(!Array.isArray(value))throw new NodeReleasePackageSourceErrorV1("invalid_response",t("release API response is not a release list"));return value}function parseReleaseObject(bytes){let value=jsonBytes(bytes);if(typeof value!="object"||value===null||Array.isArray(value))throw new NodeReleasePackageSourceErrorV1("invalid_response",t("release API response is not a release object"));return value}function firstPublishedRelease(releases){let published=releases.find(release=>release.draft!==!0);if(published===void 0)throw new NodeReleasePackageSourceErrorV1("release_not_found",t("repo has no published release"));return published}function namedAssets(release){if(release.assets===void 0)return[];if(!Array.isArray(release.assets))throw new NodeReleasePackageSourceErrorV1("invalid_response",t("release assets are invalid"));let entries=[];for(let asset of release.assets){if(typeof asset!="object"||asset===null)continue;let shape=asset;typeof shape.name!="string"||shape.name.length===0||entries.push({name:shape.name,url:shape.browser_download_url})}return entries}function isPackageAssetName(name){let value=name.toLowerCase();return value.endsWith(".zip")||value.endsWith(".tgz")}function selectPackageAssetUrl(release){let assets=namedAssets(release),candidates=assets.filter(asset=>isPackageAssetName(asset.name)),assetNames=assets.map(asset=>asset.name).join(", ");if(candidates.length===0)throw new NodeReleasePackageSourceErrorV1("release_asset_not_found",assetNames.length===0?t("release has no assets"):t("assets: {names}",{names:assetNames}));if(candidates.length>1)throw new NodeReleasePackageSourceErrorV1("release_asset_ambiguous",t("candidates: {names}",{names:candidates.map(asset=>asset.name).join(", ")}));let chosen=candidates[0];if(typeof chosen.url!="string"||chosen.url.length===0)throw new NodeReleasePackageSourceErrorV1("invalid_response",t("release asset has no download URL"));return chosen.url}function isAbortLike4(error){return error instanceof Error&&(error.name==="AbortError"||error.name==="AbortSignalError")}function requestSignal3(parent,timeoutMs){let controller=new AbortController,timedOut=!1,abort=()=>controller.abort(parent?.reason);parent?.aborted===!0?abort():parent?.addEventListener("abort",abort,{once:!0});let timeout=setTimeout(()=>{timedOut=!0,controller.abort()},timeoutMs);return{signal:controller.signal,timedOut:()=>timedOut,cleanup:()=>{clearTimeout(timeout),parent?.removeEventListener("abort",abort)}}}function isJsonResponse2(response2){let contentType2=response2.headers.get("content-type");if(contentType2===null)return!1;let mediaType=contentType2.split(";",1)[0]?.trim().toLowerCase();return mediaType==="application/json"||mediaType==="application/vnd.github+json"}function rateLimitState2(response2){if(!(response2.status===429||response2.status===403&&response2.headers.get("x-ratelimit-remaining")==="0"))return{limited:!1};let reset=response2.headers.get("x-ratelimit-reset"),resetValue=reset===null?Number.NaN:Number.parseInt(reset,10);return!Number.isSafeInteger(resetValue)||resetValue<0?{limited:!0}:{limited:!0,resetEpochSeconds:resetValue}}async function readBody2(response2,maxBytes,signal){if(response2.body===null)throw new NodeReleasePackageSourceErrorV1("invalid_response",t("release API response has no body"));let reader=response2.body.getReader(),chunks=[],total=0;try{for(;;){if(signal.aborted)throw new DOMException(t("aborted"),"AbortError");let item=await reader.read();if(item.done)break;if(total+=item.value.byteLength,total>maxBytes)throw new NodeReleasePackageSourceErrorV1("response_too_large",t("release API response exceeds the configured size limit"));chunks.push(item.value)}}finally{reader.releaseLock()}let bytes=new Uint8Array(total),offset=0;for(let chunk of chunks)bytes.set(chunk,offset),offset+=chunk.byteLength;return bytes}function createNodeReleasePackageSourceV1(options={}){let transport=options.fetch??globalThis.fetch;if(typeof transport!="function")throw new NodeReleasePackageSourceErrorV1("invalid_configuration",t("Node fetch is unavailable"));let githubOrigin=apiOrigin(options.githubApiOrigin??DEFAULT_GITHUB_API_ORIGIN_V1,"githubApiOrigin"),giteeOrigin=apiOrigin(options.giteeApiOrigin??DEFAULT_GITEE_API_ORIGIN_V1,"giteeApiOrigin"),githubToken=boundedToken(options.githubToken,"githubToken"),giteeToken=boundedToken(options.giteeToken,"giteeToken"),timeoutMs=boundedPositive4(options.requestTimeoutMs,DEFAULT_TIMEOUT_MS_V14,MAX_TIMEOUT_MS_V14,"requestTimeoutMs"),maxResponseBytes=boundedPositive4(options.maxResponseBytes,DEFAULT_MAX_RESPONSE_BYTES_V12,MAX_RESPONSE_BYTES_V12,"maxResponseBytes"),maxAssetBytes=boundedPositive4(options.maxAssetBytes,DEFAULT_MAX_ASSET_BYTES_V1,MAX_ASSET_BYTES_V1,"maxAssetBytes"),maxRedirects=options.maxRedirects??DEFAULT_REDIRECTS_V14;if(!Number.isSafeInteger(maxRedirects)||maxRedirects<0||maxRedirects>MAX_REDIRECTS_V14)throw new NodeReleasePackageSourceErrorV1("invalid_configuration",t("maxRedirects must be an integer between 0 and {max}",{max:MAX_REDIRECTS_V14}));let userAgent=options.userAgent??"agent-forge-plugin-release/1";if(userAgent.length===0||userAgent.length>256||/[\r\n]/u.test(userAgent))throw new NodeReleasePackageSourceErrorV1("invalid_configuration",t("userAgent is invalid"));let fetchReleaseJson=async(url,headers,parentSignal)=>{let current=url;for(let redirect=0;;redirect+=1){let request=requestSignal3(parentSignal,timeoutMs),response2;try{response2=await transport(current.toString(),{method:"GET",headers:{accept:"application/json","user-agent":userAgent,...headers},redirect:"manual",signal:request.signal})}catch(error){throw request.cleanup(),request.timedOut()?new NodeReleasePackageSourceErrorV1("request_timed_out",t("release API request timed out")):isAbortLike4(error)?new NodeReleasePackageSourceErrorV1("cancelled",t("release API request was cancelled")):new NodeReleasePackageSourceErrorV1("request_failed",t("release API request failed"))}if(!REDIRECT_STATUS4.has(response2.status))try{if(response2.status===404)throw new NodeReleasePackageSourceErrorV1("release_not_found",t("repo or release was not found"));let limit=rateLimitState2(response2);if(limit.limited){let message=limit.resetEpochSeconds===void 0?"rate limit was exceeded":`rate limit resets at ${new Date(limit.resetEpochSeconds*1e3).toISOString()}`;throw new NodeReleasePackageSourceErrorV1("rate_limited",message,{...limit.resetEpochSeconds===void 0?{}:{resetEpochSeconds:limit.resetEpochSeconds}})}if(response2.status<200||response2.status>=300)throw new NodeReleasePackageSourceErrorV1("request_failed",t("release API request did not succeed"));if(!isJsonResponse2(response2))throw new NodeReleasePackageSourceErrorV1("invalid_response",t("release API response must be JSON"));return await readBody2(response2,maxResponseBytes,request.signal)}finally{await response2.body?.cancel().catch(()=>{}),request.cleanup()}let location=response2.headers.get("location");if(await response2.body?.cancel().catch(()=>{}),request.cleanup(),location===null||redirect>=maxRedirects)throw new NodeReleasePackageSourceErrorV1("request_failed",t("release API redirect limit exceeded"));let next;try{next=new URL(location,current)}catch{throw new NodeReleasePackageSourceErrorV1("invalid_response",t("release API redirect target is invalid"))}if(next.protocol!=="http:"&&next.protocol!=="https:"||next.username!==""||next.password!=="")throw new NodeReleasePackageSourceErrorV1("invalid_response",t("release API redirect must stay http(s)"));current=next}};return{version:1,downloadReleaseAsset:async input=>{if(input.signal?.aborted===!0)throw new NodeReleasePackageSourceErrorV1("cancelled",t("release asset download was cancelled"));let sourceLabel=`${input.kind}:${input.owner}/${input.repo}@${input.tag??"latest"}`,base=input.kind==="github"?githubOrigin:giteeOrigin,segments=[base.pathPrefix===""?void 0:base.pathPrefix,"repos",encodeURIComponent(input.owner),encodeURIComponent(input.repo),"releases",...input.tag===void 0?[]:["tags",encodeURIComponent(input.tag)]].filter(segment=>segment!==void 0),endpoint=new URL(`${base.origin}/${segments.join("/")}`),headers=input.kind==="github"?{"x-github-api-version":"2022-11-28",...githubToken===void 0?{}:{authorization:`Bearer ${githubToken}`}}:{};input.kind==="gitee"&&giteeToken!==void 0&&endpoint.searchParams.set("access_token",giteeToken);let payload2=await fetchReleaseJson(endpoint,headers,input.signal),release=input.tag===void 0?firstPublishedRelease(parseReleaseList(payload2)):parseReleaseObject(payload2),assetUrl=selectPackageAssetUrl(release),download=await downloadNodeUrlPackageV1({...options.fetch===void 0?{}:{fetch:options.fetch},requestTimeoutMs:timeoutMs,maxPackageBytes:maxAssetBytes,userAgent},{url:assetUrl,...input.expectedDigestHex===void 0?{}:{expectedDigestHex:input.expectedDigestHex},signal:input.signal});return{bytes:download.bytes,mediaType:download.mediaType,sha256Hex:download.digestHex,sourceLabel}}}}import{gzipSync}from"node:zlib";var TAR_BLOCK_BYTES_V12=512,TAR_NAME_LENGTH_V12=100,TAR_MODE_LENGTH_V1=8,TAR_SIZE_LENGTH_V12=12,TAR_CHECKSUM_LENGTH_V12=8,TAR_PREFIX_LENGTH_V12=155,NodeTarWriterErrorV1=class extends Error{code;constructor(code,message){super(message),this.name="NodeTarWriterErrorV1",this.code=code}};function octalField(value,length){let digits=length-1,octal=value.toString(8);if(octal.length>digits)throw new NodeTarWriterErrorV1("invalid_entry",t("tar header field overflows"));return`${octal.padStart(digits,"0")}\0`}function writeHeader(header,entry,nameField,prefixField){header.fill(0);let encode=(value,offset,length)=>{let bytes=new TextEncoder().encode(value);if(bytes.byteLength>length)throw new NodeTarWriterErrorV1("entry_name_too_long",t("tar header name field overflows"));header.set(bytes,offset)};encode(nameField,0,TAR_NAME_LENGTH_V12-1);let contentBytes=entry.directory?0:entry.bytes?.byteLength??0,mode=octalField(entry.directory?493:420,TAR_MODE_LENGTH_V1),encodedMode=new TextEncoder().encode(mode);header.set(encodedMode,100),header.set(new TextEncoder().encode(octalField(0,TAR_MODE_LENGTH_V1)),108),header.set(new TextEncoder().encode(octalField(0,TAR_MODE_LENGTH_V1)),116),header.set(new TextEncoder().encode(octalField(contentBytes,TAR_SIZE_LENGTH_V12)),124),header.set(new TextEncoder().encode(octalField(0,TAR_SIZE_LENGTH_V12)),136),header[156]=entry.directory?53:48;let magic=new TextEncoder().encode("ustar\0");header.set(magic,257),header.set(new TextEncoder().encode("00"),263),prefixField.length>0&&encode(prefixField,345,TAR_PREFIX_LENGTH_V12-1);let checksum=0;for(let index=148;index<148+TAR_CHECKSUM_LENGTH_V12;index+=1)header[index]=32;for(let byte of header)checksum+=byte;let checksumText=`${checksum.toString(8).padStart(6,"0")}\0 `;header.set(new TextEncoder().encode(checksumText),148)}function entryFields(name){let bytes=new TextEncoder().encode(name);if(bytes.byteLength<=TAR_NAME_LENGTH_V12-1)return{name,prefix:""};let split=-1;for(let index=Math.min(bytes.byteLength,TAR_PREFIX_LENGTH_V12)-1;index>=0;index-=1)if(bytes[index]===47){split=index;break}if(split<=0)throw new NodeTarWriterErrorV1("entry_name_too_long",t("tar entry name cannot be split into ustar fields"));let prefix=name.slice(0,split),rest=name.slice(split+1);if(new TextEncoder().encode(rest).byteLength>TAR_NAME_LENGTH_V12-1||new TextEncoder().encode(prefix).byteLength>TAR_PREFIX_LENGTH_V12-1)throw new NodeTarWriterErrorV1("entry_name_too_long",t("tar entry name cannot be split into ustar fields"));return{name:rest,prefix}}function headerBlock(entry){if(typeof entry.name!="string"||entry.name.length===0)throw new NodeTarWriterErrorV1("invalid_entry",t("tar entry name is invalid"));if(normalizedEntryName(entry.directory?`${entry.name}/`:entry.name).name!==entry.name)throw new NodeTarWriterErrorV1("invalid_entry",t("tar entry name is not normalized"));if(entry.directory&&entry.bytes!==void 0&&entry.bytes.byteLength>0)throw new NodeTarWriterErrorV1("invalid_entry",t("tar directory entry must be empty"));if(!entry.directory&&!(entry.bytes instanceof Uint8Array))throw new NodeTarWriterErrorV1("invalid_entry",t("tar file entry requires bytes"));let header=new Uint8Array(TAR_BLOCK_BYTES_V12),fields=entryFields(entry.name);return writeHeader(header,entry,fields.name,fields.prefix),header}function buildNodeTarBytesV1(entries){if(!Array.isArray(entries))throw new NodeTarWriterErrorV1("invalid_entry",t("tar entries must be an array"));let names=new Set,blocks=[];for(let entry of entries){if(names.has(entry.name))throw new NodeTarWriterErrorV1("invalid_entry",t("duplicate tar entry name: {name}",{name:entry.name}));if(names.add(entry.name),blocks.push(headerBlock(entry)),!entry.directory){let bytes=entry.bytes??new Uint8Array,padding=(TAR_BLOCK_BYTES_V12-bytes.byteLength%TAR_BLOCK_BYTES_V12)%TAR_BLOCK_BYTES_V12;blocks.push(bytes,new Uint8Array(padding))}}blocks.push(new Uint8Array(TAR_BLOCK_BYTES_V12),new Uint8Array(TAR_BLOCK_BYTES_V12));let total=0;for(let block of blocks)total+=block.byteLength;let output=new Uint8Array(total),offset=0;for(let block of blocks)output.set(block,offset),offset+=block.byteLength;return output}function buildNodeTarGzBytesV1(entries){return gzipSync(buildNodeTarBytesV1(entries))}var NODE_PLUGIN_ACQUISITION_HOST_VERSION_V1=1,MAX_PACKAGE_MANIFEST_BYTES_V12=64*1024,ECOSYSTEM_MANIFEST_FILE_V13="agent-forge.json",ACQUISITION_ARTIFACT_EXPIRES_AT_V1="2099-01-01T00:00:00.000Z",ARTIFACT_CHUNK_BYTES_V1=64*1024,AGENT_FORGE_NPM_REGISTRY_ENV_V1="AGENT_FORGE_NPM_REGISTRY",AGENT_FORGE_NPM_TOKEN_ENV_V1="AGENT_FORGE_NPM_TOKEN",AGENT_FORGE_GITHUB_API_ENV_V1="AGENT_FORGE_GITHUB_API",AGENT_FORGE_GITEE_API_ENV_V1="AGENT_FORGE_GITEE_API",GITHUB_TOKEN_ENV_V1="GITHUB_TOKEN",GITEE_TOKEN_ENV_V1="GITEE_TOKEN",LOCAL_PROBE_V1={statLocalRef:path8=>{let stats=lstatSync2(path8,{throwIfNoEntry:!1});return stats===void 0?"missing":stats.isSymbolicLink()?"other":stats.isDirectory()?"directory":stats.isFile()?"file":"other"}};function mapInstallError(error){return error instanceof PluginAcquisitionErrorV1?error:error instanceof NodePackageInstallErrorV1?error.code==="cancelled"?new PluginAcquisitionErrorV1("cancelled"):error.code==="archive_budget_exceeded"?new PluginAcquisitionErrorV1("budget_exceeded"):error.code==="unsupported_media_type"?new PluginAcquisitionErrorV1("unsupported_media_type"):new PluginAcquisitionErrorV1("package_invalid"):new PluginAcquisitionErrorV1("download_failed")}function mapNpmError(error){return error instanceof PluginAcquisitionErrorV1?error:error instanceof NodeNpmRegistrySourceErrorV1?error.code==="package_not_found"?new PluginAcquisitionErrorV1("package_not_found"):error.code==="version_not_found"?new PluginAcquisitionErrorV1("version_not_found"):error.code==="cancelled"?new PluginAcquisitionErrorV1("cancelled"):error.code==="rate_limited"?new PluginAcquisitionErrorV1("rate_limited",error.retryAfterSeconds===void 0?void 0:`retry after ${error.retryAfterSeconds}s`):error.code==="response_too_large"?new PluginAcquisitionErrorV1("budget_exceeded"):error.code==="request_timed_out"?new PluginAcquisitionErrorV1("download_failed","request timed out"):error.code==="invalid_response"||error.code==="integrity_unsupported"?new PluginAcquisitionErrorV1("package_invalid"):new PluginAcquisitionErrorV1("download_failed"):mapInstallError(error)}function mapUrlError(error){return error instanceof PluginAcquisitionErrorV1?error:error instanceof NodeUrlPackageSourceErrorV1?error.code==="digest_mismatch"?new PluginAcquisitionErrorV1("digest_mismatch"):error.code==="cancelled"?new PluginAcquisitionErrorV1("cancelled"):error.code==="invalid_url"||error.code==="invalid_configuration"?new PluginAcquisitionErrorV1("invalid_ref"):error.code==="response_too_large"?new PluginAcquisitionErrorV1("budget_exceeded"):new PluginAcquisitionErrorV1("download_failed"):mapInstallError(error)}function mapReleaseError(error){return error instanceof PluginAcquisitionErrorV1?error:error instanceof NodeReleasePackageSourceErrorV1?error.code==="cancelled"?new PluginAcquisitionErrorV1("cancelled"):error.code==="invalid_configuration"?new PluginAcquisitionErrorV1("invalid_ref"):error.code==="response_too_large"?new PluginAcquisitionErrorV1("budget_exceeded"):error.code==="invalid_response"?new PluginAcquisitionErrorV1("package_invalid"):error.code==="rate_limited"?new PluginAcquisitionErrorV1("rate_limited",error.resetEpochSeconds===void 0?void 0:`rate limit resets at ${new Date(error.resetEpochSeconds*1e3).toISOString()}`):error.code==="release_not_found"||error.code==="release_asset_not_found"||error.code==="release_asset_ambiguous"?new PluginAcquisitionErrorV1(error.code,error.message):new PluginAcquisitionErrorV1("download_failed"):mapUrlError(error)}function shaHex(algorithm,bytes){return createHash5(algorithm).update(bytes).digest("hex")}function signalAborted(signal){return signal?.aborted===!0}function pluginAcquisitionManifestFromEntriesV1(entries){let manifestEntry=entries.find(entry=>entry.name===ECOSYSTEM_MANIFEST_FILE_V13&&!entry.directory);if(manifestEntry===void 0||manifestEntry.bytes.byteLength>MAX_PACKAGE_MANIFEST_BYTES_V12)throw new PluginAcquisitionErrorV1("package_invalid");let value;try{value=JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(manifestEntry.bytes))}catch{throw new PluginAcquisitionErrorV1("package_invalid")}if(typeof value!="object"||value===null||Array.isArray(value))throw new PluginAcquisitionErrorV1("package_invalid");let record=value,manifestKeys2=new Set(["id","pluginVersion","apiVersion","minHostVersion","maxHostVersion","capabilityRefs","requires","platform","testOnly"]);if(record.packageFormatVersion!==1||Object.keys(record).some(key=>key!=="packageFormatVersion"&&!manifestKeys2.has(key)))throw new PluginAcquisitionErrorV1("package_invalid");let id=record.id,pluginVersion=record.pluginVersion,apiVersion=record.apiVersion;if(typeof id!="string"||id.trim().length===0||id.length>256||typeof pluginVersion!="string"||pluginVersion.trim().length===0||pluginVersion.length>256||typeof apiVersion!="string"||apiVersion.trim().length===0||apiVersion.length>256)throw new PluginAcquisitionErrorV1("package_invalid");if(record.minHostVersion===void 0&&record.maxHostVersion===void 0)throw new PluginAcquisitionErrorV1("package_invalid");let manifest=Object.freeze({id,pluginVersion,apiVersion,...record.minHostVersion===void 0?{}:{minHostVersion:record.minHostVersion},...record.maxHostVersion===void 0?{}:{maxHostVersion:record.maxHostVersion},...record.capabilityRefs===void 0?{}:{capabilityRefs:record.capabilityRefs},...record.requires===void 0?{}:{requires:record.requires},...record.platform===void 0?{}:{platform:record.platform},...record.testOnly===void 0?{}:{testOnly:record.testOnly}});return{manifest,manifestDigest:pluginManifestDigestV1(manifest)}}function createNodePluginAcquisitionHostV1(options={}){let limits=options.limits??{},npmRegistryOption=options.npmRegistry??process.env[AGENT_FORGE_NPM_REGISTRY_ENV_V1]?.trim(),npmTokenOption=options.npmToken??process.env[AGENT_FORGE_NPM_TOKEN_ENV_V1]?.trim(),githubApiOriginOption=options.githubApiOrigin??process.env[AGENT_FORGE_GITHUB_API_ENV_V1]?.trim(),giteeApiOriginOption=options.giteeApiOrigin??process.env[AGENT_FORGE_GITEE_API_ENV_V1]?.trim(),githubTokenOption=options.githubToken??process.env[GITHUB_TOKEN_ENV_V1]?.trim(),giteeTokenOption=options.giteeToken??process.env[GITEE_TOKEN_ENV_V1]?.trim(),npmSource=createNodeNpmRegistrySourceV1({...npmRegistryOption===void 0||npmRegistryOption===""?{}:{registry:npmRegistryOption},...npmTokenOption===void 0||npmTokenOption===""?{}:{token:npmTokenOption},...options.fetch===void 0?{}:{fetch:options.fetch},...options.requestTimeoutMs===void 0?{}:{requestTimeoutMs:options.requestTimeoutMs},...options.maxResponseBytes===void 0?{}:{maxResponseBytes:options.maxResponseBytes},...options.maxTarballBytes===void 0?{}:{maxTarballBytes:options.maxTarballBytes},...options.userAgent===void 0?{}:{userAgent:options.userAgent}}),releaseSource=createNodeReleasePackageSourceV1({...githubApiOriginOption===void 0||githubApiOriginOption===""?{}:{githubApiOrigin:githubApiOriginOption},...giteeApiOriginOption===void 0||giteeApiOriginOption===""?{}:{giteeApiOrigin:giteeApiOriginOption},...githubTokenOption===void 0||githubTokenOption===""?{}:{githubToken:githubTokenOption},...giteeTokenOption===void 0||giteeTokenOption===""?{}:{giteeToken:giteeTokenOption},...options.fetch===void 0?{}:{fetch:options.fetch},...options.requestTimeoutMs===void 0?{}:{requestTimeoutMs:options.requestTimeoutMs},...options.maxResponseBytes===void 0?{}:{maxResponseBytes:options.maxResponseBytes},...options.maxTarballBytes===void 0?{}:{maxAssetBytes:options.maxTarballBytes},...options.userAgent===void 0?{}:{userAgent:options.userAgent}}),artifacts=new Map,closed=!1,acquireBytes=async(ref,signal)=>{if(ref.kind==="github"||ref.kind==="gitee")try{let download=await releaseSource.downloadReleaseAsset({kind:ref.kind,owner:ref.owner,repo:ref.repo,...ref.tag===void 0?{}:{tag:ref.tag},...ref.expectedDigestHex===void 0?{}:{expectedDigestHex:ref.expectedDigestHex},signal});return{bytes:download.bytes,mediaType:download.mediaType,digest:{algorithm:"sha256",hex:download.sha256Hex},source:download.sourceLabel}}catch(error){throw mapReleaseError(error)}if(ref.kind==="npm")try{let resolved=await npmSource.resolveNpmPackage({name:ref.name,...ref.range===void 0?{}:{range:ref.range},signal}),bytes=await npmSource.fetchTarball({url:resolved.tarballUrl,signal});if(shaHex(resolved.integrity.algorithm,bytes)!==resolved.integrity.hex)throw new PluginAcquisitionErrorV1("digest_mismatch");return{bytes,mediaType:"application/gzip",digest:resolved.integrity,source:`npm:${new URL(resolved.tarballUrl).host}`}}catch(error){throw mapNpmError(error)}if(ref.kind==="url")try{let download=await downloadNodeUrlPackageV1({...options.fetch===void 0?{}:{fetch:options.fetch},...options.requestTimeoutMs===void 0?{}:{requestTimeoutMs:options.requestTimeoutMs},...options.maxTarballBytes===void 0?{}:{maxPackageBytes:options.maxTarballBytes},...options.userAgent===void 0?{}:{userAgent:options.userAgent}},{url:ref.url,...ref.expectedDigestHex===void 0?{}:{expectedDigestHex:ref.expectedDigestHex},signal});return{bytes:download.bytes,mediaType:download.mediaType,digest:{algorithm:"sha256",hex:download.digestHex},source:`url:${new URL(ref.url).host}`}}catch(error){throw mapUrlError(error)}if(ref.kind==="local-file")try{let bytes=await readLocalPackageFileV1(ref.path,limits,signal),fileName=ref.path.split(/[\\/]/u).pop(),mediaType=detectPluginPackageMediaTypeV1(bytes,fileName===void 0||fileName.length===0?void 0:fileName);return{bytes,mediaType,digest:{algorithm:"sha256",hex:shaHex("sha256",bytes)},source:"local:file"}}catch(error){throw mapInstallError(error)}if(ref.kind==="local-path")try{let entries=await collectLocalDirectoryPackageEntriesV1(ref.path,limits,signal),bytes=buildNodeTarGzBytesV1(entries.map(entry=>({name:entry.name,directory:entry.directory,bytes:entry.bytes})));return{bytes,mediaType:"application/gzip",digest:{algorithm:"sha256",hex:shaHex("sha256",bytes)},source:"local:dir"}}catch(error){throw mapInstallError(error)}throw new PluginAcquisitionErrorV1("invalid_ref")},releaseArtifact=async input=>{if(!artifacts.delete(input.artifact.artifactRef))throw new NodePackageInstallErrorV1("invalid_artifact")};return{version:NODE_PLUGIN_ACQUISITION_HOST_VERSION_V1,resolvePackage:async input=>{if(closed||signalAborted(input.signal))throw new PluginAcquisitionErrorV1("cancelled");let ref;try{ref=parsePluginAcquisitionRefV1(input.ref,LOCAL_PROBE_V1)}catch(error){throw error instanceof PluginAcquisitionErrorV1?error:new PluginAcquisitionErrorV1("invalid_ref")}let acquired=await acquireBytes(ref,input.signal);if(signalAborted(input.signal))throw new PluginAcquisitionErrorV1("cancelled");let entries;try{entries=acquired.mediaType==="application/gzip"?await parseNodeTarGzPackageV1(acquired.bytes,limits):parseNodeZipPackageV1(acquired.bytes,limits)}catch(error){throw mapInstallError(error)}let identity=pluginAcquisitionManifestFromEntriesV1(entries);if(closed)throw new PluginAcquisitionErrorV1("cancelled");let artifactRef=`plugin-acquisition://node/${randomUUID5()}`,artifact=Object.freeze({version:1,source:acquired.source,pluginId:identity.manifest.id,pluginVersion:identity.manifest.pluginVersion,manifestDigest:identity.manifestDigest,artifactDigest:acquired.digest.algorithm==="sha512"?`sha512:${acquired.digest.hex}`:`sha256:${acquired.digest.hex}`,expiresAt:ACQUISITION_ARTIFACT_EXPIRES_AT_V1,sizeBytes:acquired.bytes.byteLength,mediaType:acquired.mediaType,artifactRef});return artifacts.set(artifactRef,{bytes:acquired.bytes,artifact}),Object.freeze({manifest:identity.manifest,manifestDigest:identity.manifestDigest,source:acquired.source,artifact,release:async()=>{try{return await releaseArtifact({artifact:{artifactRef}}),!0}catch{return!1}}})},openArtifact(input){return(async function*(){let record=artifacts.get(input.artifact.artifactRef);if(record===void 0)throw new NodePackageInstallErrorV1("invalid_artifact");if(record.artifact.pluginId!==input.artifact.pluginId||record.artifact.pluginVersion!==input.artifact.pluginVersion||record.artifact.manifestDigest!==input.artifact.manifestDigest||record.artifact.artifactDigest!==input.artifact.artifactDigest||record.artifact.sizeBytes!==input.artifact.sizeBytes)throw new NodePackageInstallErrorV1("invalid_artifact");for(let offset=0;offset<record.bytes.byteLength;offset+=ARTIFACT_CHUNK_BYTES_V1){if(input.signal?.aborted===!0)throw new NodePackageInstallErrorV1("cancelled");yield new Uint8Array(record.bytes.subarray(offset,Math.min(offset+ARTIFACT_CHUNK_BYTES_V1,record.bytes.byteLength)))}})()},releaseArtifact,ownsArtifact:input=>artifacts.has(input.artifactRef),async close(){closed=!0,artifacts.clear()}}}var NODE_HTTP_PLUGIN_REGISTRY_SOURCE_VERSION_V1=1,DEFAULT_TIMEOUT_MS_V15=15e3,MAX_TIMEOUT_MS_V15=12e4,DEFAULT_MAX_RESPONSE_BYTES_V13=4*1024*1024,MAX_RESPONSE_BYTES_V13=8*1024*1024,NodeHttpPluginRegistrySourceErrorV1=class extends Error{code;constructor(code,message){super(message),this.name="NodeHttpPluginRegistrySourceErrorV1",this.code=code}};function boundedPositive5(value,fallback,maximum,label){let result=value??fallback;if(!Number.isSafeInteger(result)||result<=0||result>maximum)throw new NodeHttpPluginRegistrySourceErrorV1("invalid_configuration",t("{label} must be a positive integer at most {maximum}",{label,maximum}));return result}function allowedOrigin2(value){let parsed;try{parsed=new URL(value)}catch{throw new NodeHttpPluginRegistrySourceErrorV1("invalid_configuration",t("Allowed registry origin is invalid"))}if(parsed.protocol!=="http:"&&parsed.protocol!=="https:"||parsed.username||parsed.password)throw new NodeHttpPluginRegistrySourceErrorV1("invalid_configuration",t("Allowed registry origin must be an http(s) origin without credentials"));if(parsed.pathname!=="/"||parsed.search!==""||parsed.hash!=="")throw new NodeHttpPluginRegistrySourceErrorV1("invalid_configuration",t("Allowed registry origin must not include a path, query, or fragment"));return parsed.origin}function endpointUrl(value,origins){let parsed;try{parsed=new URL(value)}catch{throw new NodeHttpPluginRegistrySourceErrorV1("invalid_configuration",t("Plugin registry URL is invalid"))}if(parsed.protocol!=="http:"&&parsed.protocol!=="https:"||parsed.username||parsed.password)throw new NodeHttpPluginRegistrySourceErrorV1("invalid_configuration",t("Plugin registry URL must use http(s) without credentials"));if(parsed.search!==""||parsed.hash!=="")throw new NodeHttpPluginRegistrySourceErrorV1("invalid_configuration",t("Plugin registry URL must not include a query or fragment"));if(!origins.has(parsed.origin))throw new NodeHttpPluginRegistrySourceErrorV1("invalid_configuration",t("Plugin registry origin is not allowed"));return parsed}function responseLength(response2){let raw=response2.headers.get("content-length");if(raw===null)return;if(!/^\d+$/u.test(raw))throw new NodeHttpPluginRegistrySourceErrorV1("invalid_response",t("Plugin registry response length is invalid"));let value=Number(raw);if(!Number.isSafeInteger(value))throw new NodeHttpPluginRegistrySourceErrorV1("invalid_response",t("Plugin registry response length is invalid"));return value}function isJsonResponse3(response2){let contentType2=response2.headers.get("content-type");if(contentType2===null)return!1;let mediaType=contentType2.split(";",1)[0]?.trim().toLowerCase();return mediaType==="application/json"||mediaType==="application/vnd.agent-forge.plugin-registry+json"}function requestController(parent,timeoutMs){let controller=new AbortController,timedOut=!1,abort=()=>controller.abort(parent?.reason);parent?.aborted===!0?abort():parent?.addEventListener("abort",abort,{once:!0});let timeout=setTimeout(()=>{timedOut=!0,controller.abort()},timeoutMs);return{signal:controller.signal,timedOut:()=>timedOut,cleanup:()=>{clearTimeout(timeout),parent?.removeEventListener("abort",abort)}}}function abortPromise(signal){let rejectAbort;return{promise:new Promise((_resolve,reject2)=>{rejectAbort=()=>reject2(new DOMException("aborted","AbortError")),signal.aborted?rejectAbort():signal.addEventListener("abort",rejectAbort,{once:!0})}),cleanup:()=>{rejectAbort!==void 0&&signal.removeEventListener("abort",rejectAbort)}}}async function awaitBeforeAbort(operation,signal){let abort=abortPromise(signal);try{return await Promise.race([operation,abort.promise])}finally{abort.cleanup()}}function discardResponseBody(response2){let responseBody=response2?.body;responseBody?.cancel().catch(()=>{})}async function readBody3(response2,maxBytes,signal){if(response2.body===null)throw new NodeHttpPluginRegistrySourceErrorV1("invalid_response",t("Plugin registry response has no body"));let reader=response2.body.getReader(),chunks=[],total=0;try{for(;;){if(signal.aborted)throw new DOMException(t("aborted"),"AbortError");let item=await awaitBeforeAbort(reader.read(),signal);if(item.done)break;if(total+=item.value.byteLength,total>maxBytes)throw new NodeHttpPluginRegistrySourceErrorV1("response_too_large",t("Plugin registry response exceeds the configured size limit"));chunks.push(item.value)}}finally{reader.releaseLock()}let bytes=new Uint8Array(total),offset=0;for(let chunk of chunks)bytes.set(chunk,offset),offset+=chunk.byteLength;return bytes}function parseDocument(bytes){let value;try{value=JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(bytes))}catch{throw new NodeHttpPluginRegistrySourceErrorV1("invalid_response",t("Plugin registry response is not valid JSON"))}if(typeof value!="object"||value===null||Array.isArray(value))throw new NodeHttpPluginRegistrySourceErrorV1("invalid_response",t("Plugin registry document is invalid"));let document=value;if(Object.keys(document).some(key=>key!=="version"&&key!=="entries")||document.version!==1||!Array.isArray(document.entries))throw new NodeHttpPluginRegistrySourceErrorV1("invalid_response",t("Plugin registry document is invalid"));return document.entries}function isAbortLike5(error){return error instanceof DOMException&&error.name==="AbortError"}function isCallerCancelled(signal){return signal?.aborted===!0}function sanitizedSourceError(error){let code=error.code;return code!=="cancelled"&&code!=="invalid_configuration"&&code!=="request_failed"&&code!=="request_timed_out"&&code!=="invalid_response"&&code!=="response_too_large"?new NodeHttpPluginRegistrySourceErrorV1("request_failed",t("Plugin registry request failed")):new NodeHttpPluginRegistrySourceErrorV1(code,t("Plugin registry request failed"))}function createNodeHttpPluginRegistrySourceV1(options){let transport=options.fetch??globalThis.fetch;if(typeof transport!="function")throw new NodeHttpPluginRegistrySourceErrorV1("invalid_configuration",t("Node fetch is unavailable"));if(!Array.isArray(options.allowedOrigins)||options.allowedOrigins.length===0)throw new NodeHttpPluginRegistrySourceErrorV1("invalid_configuration",t("At least one allowed registry origin is required"));let origins=new Set(options.allowedOrigins.map(allowedOrigin2)),endpoint=endpointUrl(options.url,origins),timeoutMs=boundedPositive5(options.requestTimeoutMs,DEFAULT_TIMEOUT_MS_V15,MAX_TIMEOUT_MS_V15,"requestTimeoutMs"),maxResponseBytes=boundedPositive5(options.maxResponseBytes,DEFAULT_MAX_RESPONSE_BYTES_V13,MAX_RESPONSE_BYTES_V13,"maxResponseBytes"),userAgent=options.userAgent??"agent-forge-plugin-registry/1";if(userAgent.length===0||userAgent.length>256||/[\r\n]/u.test(userAgent))throw new NodeHttpPluginRegistrySourceErrorV1("invalid_configuration",t("userAgent is invalid"));let source=endpoint.origin+endpoint.pathname;return{version:NODE_HTTP_PLUGIN_REGISTRY_SOURCE_VERSION_V1,source,list:async({signal}={})=>{if(isCallerCancelled(signal))throw new NodeHttpPluginRegistrySourceErrorV1("cancelled",t("Plugin registry request was cancelled"));let request=requestController(signal,timeoutMs),response2;try{let transportResponse=Promise.resolve().then(()=>{if(request.signal.aborted)throw new DOMException(t("aborted"),"AbortError");return transport(endpoint.toString(),{method:"GET",headers:{accept:"application/vnd.agent-forge.plugin-registry+json, application/json","user-agent":userAgent},redirect:"error",signal:request.signal})});transportResponse.then(lateResponse=>{request.signal.aborted&&discardResponseBody(lateResponse)},()=>{});let receivedResponse=await awaitBeforeAbort(transportResponse,request.signal);if(response2=receivedResponse,receivedResponse.status<200||receivedResponse.status>=300)throw new NodeHttpPluginRegistrySourceErrorV1("request_failed",t("Plugin registry request did not succeed"));if(!isJsonResponse3(receivedResponse))throw new NodeHttpPluginRegistrySourceErrorV1("invalid_response",t("Plugin registry response must be JSON"));let length=responseLength(receivedResponse);if(length!==void 0&&length>maxResponseBytes)throw new NodeHttpPluginRegistrySourceErrorV1("response_too_large",t("Plugin registry response exceeds the configured size limit"));return parseDocument(await readBody3(receivedResponse,maxResponseBytes,request.signal))}catch(error){throw isCallerCancelled(signal)?new NodeHttpPluginRegistrySourceErrorV1("cancelled",t("Plugin registry request was cancelled")):request.timedOut()?new NodeHttpPluginRegistrySourceErrorV1("request_timed_out",t("Plugin registry request timed out")):error instanceof NodeHttpPluginRegistrySourceErrorV1?sanitizedSourceError(error):isAbortLike5(error)?new NodeHttpPluginRegistrySourceErrorV1("cancelled",t("Plugin registry request was cancelled")):new NodeHttpPluginRegistrySourceErrorV1("request_failed",t("Plugin registry request failed"))}finally{request.cleanup(),discardResponseBody(response2)}}}}function createPluginEcosystemRegistryAdapterV1(registry){if(registry.resolve===void 0)throw new PluginRegistryErrorV1("invalid_source",t("Registry does not expose a host-side package resolver"));let resolve22=registry.resolve,list=registry.listManifests;return{...list===void 0?{}:{list},resolve:resolve22}}var DEFAULT_PLUGIN_REGISTRY_ORIGIN_ENV_V1="AGENT_FORGE_PLUGIN_REGISTRY_ORIGIN",DEFAULT_PLUGIN_TRUST_KEYS_ENV_V1="AGENT_FORGE_PLUGIN_TRUST_KEYS",DEFAULT_PLUGIN_REGISTRY_PATH_V1="/v1/plugin-registry.json";async function createDefaultPluginMarketWiringV1(options){let origin=(options.registryOrigin??process.env[DEFAULT_PLUGIN_REGISTRY_ORIGIN_ENV_V1])?.trim(),effectiveOrigin=origin===""?void 0:origin,storeParent=defaultPluginInstallStoreDirectoryV1(options.agentDir),instanceRoot=defaultPluginInstallStoreInstanceRootV1(options.agentDir),diskSource=createNodeDiskPluginRegistrySourceV1({rootDirectory:instanceRoot}),httpSource=effectiveOrigin===void 0?void 0:createNodeHttpPluginRegistrySourceV1({url:new URL(effectiveOrigin+DEFAULT_PLUGIN_REGISTRY_PATH_V1),allowedOrigins:[effectiveOrigin],...options.fetch===void 0?{}:{fetch:options.fetch}}),source={...httpSource===void 0?{}:{source:httpSource.source},list:async({signal}={})=>{let disk=await diskSource.list({signal});if(httpSource===void 0)return disk;let remote=await httpSource.list({signal});return Object.freeze([...remote,...disk])}},distributionHost=effectiveOrigin===void 0?void 0:await createNodeHttpPluginDistributionHostV1({allowedOrigins:[effectiveOrigin],artifactDirectory:join13(storeParent,"distribution-cache-v1"),...options.fetch===void 0?{}:{fetch:options.fetch}}),trustKeys=options.trustKeys;if(trustKeys===void 0&&effectiveOrigin!==void 0){let raw=process.env[DEFAULT_PLUGIN_TRUST_KEYS_ENV_V1];if(raw!==void 0&&raw.trim()!==""){let parsed;try{parsed=JSON.parse(raw)}catch{throw new Error(t("{env} must be a JSON array of {keyId, publicKeyPem}",{env:DEFAULT_PLUGIN_TRUST_KEYS_ENV_V1}))}if(!Array.isArray(parsed))throw new Error(t("{env} must be a JSON array",{env:DEFAULT_PLUGIN_TRUST_KEYS_ENV_V1}));trustKeys=parsed}}let trustRoot=trustKeys===void 0||distributionHost===void 0?void 0:createNodePluginTrustRootV1({keys:trustKeys}),acquisitionHost=options.acquisition??createNodePluginAcquisitionHostV1({...options.limits===void 0?{}:{limits:options.limits},...options.fetch===void 0?{}:{fetch:options.fetch}}),installHost=await createNodePackageInstallHostV1({openArtifact:input=>{if(acquisitionHost.ownsArtifact(input.artifact))return acquisitionHost.openArtifact(input);let reader=distributionHost?.openArtifact;if(reader===void 0)throw new NodePackageInstallErrorV1("invalid_artifact");return reader(input)},installationDirectory:storeParent,persistence:"persistent",supportedScopes:["global","project"],...options.limits===void 0?{}:{...options.limits}}),registry=createPluginRegistryV1({source,host:defaultPluginHostFactsV1(),verify:{verify:({manifestDigest,expectedDigest:expectedDigest2})=>expectedDigest2===void 0||expectedDigest2===manifestDigest?{status:"accepted"}:{status:"rejected",reason:"Manifest digest does not match the expected digest"}},sourceVerifier:()=>({status:"accepted"})});return{registry,cliRegistry:createPluginEcosystemRegistryAdapterV1(registry),acquisition:acquisitionHost,installer:createPluginInstallerV1({host:installHost}),...distributionHost===void 0||trustRoot===void 0?{}:{distribution:createPluginDistributionV1({host:distributionHost.host,verifySignature:trustRoot})},stateStore:createPluginStateStoreV1({filePath:join13(options.agentDir,DEFAULT_PLUGIN_STATE_FILE_V1)}),projectStateStore:createPluginStateStoreV1({filePath:join13(options.cwd,CONFIG_DIR_NAME,DEFAULT_PLUGIN_STATE_FILE_V1)}),close:async()=>{await installHost.close(),await acquisitionHost.close(),await distributionHost?.close()}}}async function createNodePluginPackageInstallStackV1(options){let distributionHost=await createNodeHttpPluginDistributionStackV1(options.distribution);try{let packageOptions={...options.packageHost,openArtifact:distributionHost.openArtifact},packageHost=options.session===void 0?await createNodePackageInstallHostV1(packageOptions):await createNodePackageInstallHostForSessionV1(packageOptions,options.session);try{let installer=createPluginInstallerV1({host:packageHost,...options.verifier===void 0?{}:{verifier:options.verifier}}),closePromise,close=()=>(closePromise!==void 0||(closePromise=(async()=>{let failure2;try{await packageHost.close()}catch(error){failure2=error}try{await distributionHost.close()}catch(error){failure2===void 0&&(failure2=error)}if(failure2!==void 0)throw failure2})()),closePromise);return Object.freeze({distributionHost,distribution:distributionHost.distribution,packageHost,installer,close})}catch(error){throw await packageHost.close().catch(()=>{}),error}}catch(error){throw await distributionHost.close().catch(()=>{}),error}}import{randomUUID as randomUUID6}from"node:crypto";import{mkdir as mkdir5,readFile as readFile6,rename as rename5,unlink as unlink2,writeFile as writeFile4}from"node:fs/promises";import{basename as basename3,dirname as dirname6,isAbsolute as isAbsolute7,join as join14,resolve as resolve4}from"node:path";var PLUGIN_SELECTION_STORE_VERSION_V1=1,MAX_PLUGIN_SELECTION_PROFILES_V1=256,MAX_PLUGIN_SELECTION_STORE_PATH_CHARS_V1=4096,EMPTY_SNAPSHOT2=Object.freeze({version:PLUGIN_SELECTION_STORE_VERSION_V1,selections:Object.freeze([])});function diagnostic4(code,message,profileId){return Object.freeze(profileId===void 0?{code,message}:{code,message,profileId})}function isAbortError2(error){return error instanceof Error&&(error.name==="AbortError"||error.name==="AbortSignalError")}function isMissingError3(error){return typeof error=="object"&&error!==null&&"code"in error&&error.code==="ENOENT"}function validateFilePath2(value){if(typeof value!="string"||value.trim()===""||value.length>MAX_PLUGIN_SELECTION_STORE_PATH_CHARS_V1)throw new Error(t("invalid plugin selection file path"));if(value.includes("\0")||/[\u0000-\u001f]/u.test(value))throw new Error(t("invalid plugin selection file path"));if(/^file:/iu.test(value)||/^[a-z][a-z\d+.-]*:/iu.test(value)&&!/^[a-z]:[\\/]/iu.test(value))throw new Error(t("invalid plugin selection file path"));let normalized=isAbsolute7(value)?value:resolve4(value);if(basename3(normalized).length===0||basename3(normalized)==="."||basename3(normalized)==="..")throw new Error(t("invalid plugin selection file path"));return normalized}function isObject2(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function hasExactKeys3(value,keys){let expected=new Set(keys);return Object.keys(value).length===expected.size&&Object.keys(value).every(key=>expected.has(key))}function validateProfile(value){if(!isObject2(value)||!hasExactKeys3(value,["profileId","selectedPluginIds","disabledPluginIds"]))throw new Error(t("selection schema is invalid"));if(!Array.isArray(value.selectedPluginIds)||!Array.isArray(value.disabledPluginIds))throw new Error(t("selection IDs must be arrays"));if(value.selectedPluginIds.length>MAX_PLUGIN_SELECTION_IDS_V1||value.disabledPluginIds.length>MAX_PLUGIN_SELECTION_IDS_V1)throw new Error(t("too many plugin IDs"));return createPluginSelectionV1({profileId:value.profileId,selectedPluginIds:value.selectedPluginIds,disabledPluginIds:value.disabledPluginIds})}function validateSnapshot2(value){if(!isObject2(value)||!hasExactKeys3(value,["version","selections"]))throw new Error(t("snapshot schema is invalid"));if(value.version!==PLUGIN_SELECTION_STORE_VERSION_V1)throw new Error(t("snapshot version is unsupported"));if(!Array.isArray(value.selections))throw new Error(t("selections must be an array"));if(value.selections.length>MAX_PLUGIN_SELECTION_PROFILES_V1)throw new Error("too many selection profiles");let selections=value.selections.map(validateProfile),profiles2=new Set;for(let selection of selections){if(profiles2.has(selection.profileId))throw new Error(`duplicate profile: ${selection.profileId}`);profiles2.add(selection.profileId)}return selections.sort((left,right)=>left.profileId.localeCompare(right.profileId)),Object.freeze({version:PLUGIN_SELECTION_STORE_VERSION_V1,selections:Object.freeze(selections)})}function invalidFromError2(error){let message=error instanceof Error?error.message:"plugin selection schema is invalid";if(message==="too many selection profiles")return diagnostic4("too_many_profiles",message);let duplicatePrefix="duplicate profile: ";if(message.startsWith(duplicatePrefix)){let profileId=message.slice(duplicatePrefix.length);return diagnostic4("duplicate_profile",message,profileId)}return diagnostic4("invalid_schema",message)}function defaultFileSystem2(){return{readFile:async path8=>await readFile6(path8,"utf8"),mkdir:async path8=>{await mkdir5(path8,{recursive:!0})},writeFile:async(path8,data)=>{await writeFile4(path8,data,"utf8")},rename:rename5,unlink:unlink2}}function cancelledResult2(){return Object.freeze({status:"cancelled",diagnostics:Object.freeze([diagnostic4("cancelled","Plugin selection operation was cancelled")])})}function sortSelections(selections){return Object.freeze([...selections].sort((left,right)=>left.profileId.localeCompare(right.profileId)))}function persistedSelection(selection){return Object.freeze({profileId:selection.profileId,selectedPluginIds:selection.selectedPluginIds,disabledPluginIds:selection.disabledPluginIds})}function createPluginSelectionStoreV1(options){let filePath=validateFilePath2(options.filePath),fileSystem=options.fileSystem??defaultFileSystem2();async function read(signal){if(signal?.aborted)return cancelledResult2();let content;try{content=await fileSystem.readFile(filePath)}catch(error){if(isMissingError3(error))return Object.freeze({status:"missing",snapshot:EMPTY_SNAPSHOT2});if(isAbortError2(error)||signal?.aborted)return cancelledResult2();throw error}if(signal?.aborted)return cancelledResult2();let parsed;try{parsed=JSON.parse(content)}catch{return Object.freeze({status:"invalid",diagnostics:Object.freeze([diagnostic4("invalid_json","plugin selection JSON is invalid")])})}try{return Object.freeze({status:"ok",snapshot:validateSnapshot2(parsed)})}catch(error){return Object.freeze({status:"invalid",diagnostics:Object.freeze([invalidFromError2(error)])})}}async function write(snapshot2,signal){if(signal?.aborted)return cancelledResult2();let temporaryPath=join14(dirname6(filePath),`.${basename3(filePath)}.${randomUUID6()}.tmp`);try{return await fileSystem.mkdir(dirname6(filePath)),signal?.aborted||(await fileSystem.writeFile(temporaryPath,`${JSON.stringify({version:snapshot2.version,selections:snapshot2.selections.map(persistedSelection)})}
218
218
  `),signal?.aborted)?cancelledResult2():(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),set:input=>enqueueMutation(async()=>{let selection;try{selection=createPluginSelectionV1(input.selection)}catch(error){return Object.freeze({status:"invalid",diagnostics:Object.freeze([invalidFromError2(error)])})}let current=await read(input.signal);if(current.status!=="ok"&&current.status!=="missing")return current;if(input.signal?.aborted)return cancelledResult2();let existing=current.snapshot.selections.find(item=>item.profileId===selection.profileId);if(existing!==void 0&&JSON.stringify(existing)===JSON.stringify(selection))return Object.freeze({status:"ok",snapshot:current.snapshot,changed:!1});if(current.snapshot.selections.length>=MAX_PLUGIN_SELECTION_PROFILES_V1&&existing===void 0)return Object.freeze({status:"invalid",diagnostics:Object.freeze([diagnostic4("too_many_profiles","too many selection profiles")])});let snapshot2=Object.freeze({version:PLUGIN_SELECTION_STORE_VERSION_V1,selections:sortSelections([...current.snapshot.selections.filter(item=>item.profileId!==selection.profileId),selection])});return await write(snapshot2,input.signal)}),clear:input=>enqueueMutation(async()=>{let selection;try{selection=createPluginSelectionV1({profileId:input.profileId,selectedPluginIds:[],disabledPluginIds:[]})}catch(error){return Object.freeze({status:"invalid",diagnostics:Object.freeze([invalidFromError2(error)])})}let current=await read(input.signal);if(current.status!=="ok"&&current.status!=="missing")return current;if(input.signal?.aborted)return cancelledResult2();let selections=current.snapshot.selections.filter(item=>item.profileId!==selection.profileId);return selections.length===current.snapshot.selections.length?Object.freeze({status:"ok",snapshot:current.snapshot,changed:!1}):await write(Object.freeze({version:PLUGIN_SELECTION_STORE_VERSION_V1,selections:sortSelections(selections)}),input.signal)})}}function freezeAssembly(assembly){return Object.freeze({...assembly,plugins:Object.freeze(assembly.plugins.map(plugin=>Object.freeze({...plugin,capabilityRefs:Object.freeze(plugin.capabilityRefs.map(ref=>Object.freeze({...ref}))),...plugin.selectedAdapter===void 0?{}:{selectedAdapter:Object.freeze({...plugin.selectedAdapter})}})))})}function assembleIdentity(input){let identity=buildProfileIdentityV1({profileId:input.profileId,profileVersion:input.profileVersion,resolvedPlugins:input.plugins,capabilityVersions:[...new Set(input.plugins.flatMap(plugin=>plugin.capabilityRefs))].sort((a,b)=>a.id.localeCompare(b.id)||a.version-b.version)});return freezeAssembly({profileId:input.profileId,profileVersion:input.profileVersion,identity,plugins:[...input.plugins]})}function assembleProfile(input){let verified=new Map(input.verifiedPlugins.map(entry=>[`${entry.pluginId}@${entry.version}`,!0])),unverified=input.resolvedPlugins.filter(plugin=>!verified.has(`${plugin.pluginId}@${plugin.pluginVersion}`)).map(plugin=>({pluginId:plugin.pluginId,pluginVersion:plugin.pluginVersion}));return unverified.length>0?{status:"unverified",unverified}:{status:"assembled",assembly:assembleIdentity({profileId:input.profileId,profileVersion:input.profileVersion,plugins:input.resolvedPlugins})}}function replaceProfilePlugin(assembly,input){let fromPlugin=assembly.plugins.find(plugin=>plugin.pluginId===input.fromPluginId);if(!fromPlugin)return{status:"absent",pluginId:input.fromPluginId};if(!new Map(input.verifiedPlugins.map(entry=>[`${entry.pluginId}@${entry.version}`,!0])).has(`${input.replacement.pluginId}@${input.replacement.pluginVersion}`))return{status:"unverified",unverified:[{pluginId:input.replacement.pluginId,pluginVersion:input.replacement.pluginVersion}]};let nextPlugins=assembly.plugins.filter(plugin=>plugin.pluginId!==input.fromPluginId).concat([input.replacement]);return{status:"replaced",assembly:assembleIdentity({profileId:assembly.profileId,profileVersion:assembly.profileVersion,plugins:nextPlugins}),replacement:{from:{pluginId:fromPlugin.pluginId,pluginVersion:fromPlugin.pluginVersion},to:{pluginId:input.replacement.pluginId,pluginVersion:input.replacement.pluginVersion},reason:input.reason}}}var manifests=Object.freeze({}),profiles=Object.freeze([{id:"coding-core",version:"1",pluginIds:[]},{id:"desktop-qa",version:"1",pluginIds:["agent-forge.plugin.desktop-windows-observe","agent-forge.plugin.desktop-windows-input"]},{id:"desktop-observe",version:"1",pluginIds:["agent-forge.plugin.desktop-windows-observe"]},{id:"desktop-control",version:"1",pluginIds:["agent-forge.plugin.desktop-windows-observe","agent-forge.plugin.desktop-windows-input"]},{id:"lsp-diagnostics",version:"1",pluginIds:["agent-forge.plugin.lsp-diagnostics"]},{id:"image-generation",version:"1",pluginIds:["agent-forge.plugin.image-generation"]},{id:"process-exec",version:"1",pluginIds:["agent-forge.plugin.process-exec"]},{id:"test-runner",version:"1",pluginIds:["agent-forge.plugin.test-runner"]},{id:"workspace-files",version:"1",pluginIds:["agent-forge.plugin.workspace-files"]},{id:"workspace-files-write",version:"1",pluginIds:["agent-forge.plugin.workspace-files-write"]},{id:"formatter-linter",version:"1",pluginIds:["agent-forge.plugin.formatter-linter"]},{id:"git-repository",version:"1",pluginIds:["agent-forge.plugin.git-repository"]},{id:"desktop-observe-macos",version:"1",pluginIds:["agent-forge.plugin.desktop-macos-observe"]},{id:"desktop-control-macos",version:"1",pluginIds:["agent-forge.plugin.desktop-macos-observe","agent-forge.plugin.desktop-macos-input"]},{id:"desktop-qa-macos",version:"1",pluginIds:["agent-forge.plugin.desktop-macos-observe","agent-forge.plugin.desktop-macos-input"]}]);function listBuiltinPluginProfilesV1(){return profiles}function isBuiltinPluginProfileIdV1(value){return profiles.some(profile=>profile.id===value)}function listBuiltinPluginManifestsV1(){return Object.freeze(Object.values(manifests).sort((left,right)=>{let idOrder=`${left.id}@${left.pluginVersion}`.localeCompare(`${right.id}@${right.pluginVersion}`);return idOrder===0?comparePluginVersionsV1(left.pluginVersion,right.pluginVersion):idOrder}))}function defaultBuiltinVerifiedPluginsV1(profileId){let profile=profiles.find(candidate=>candidate.id===profileId);return profile===void 0?[]:profile.pluginIds.flatMap(pluginId=>{let manifest=manifests[pluginId];return manifest===void 0?[]:[{pluginId:manifest.id,version:manifest.pluginVersion}]})}function resolveBuiltinPluginProfileV1(input){let profile=profiles.find(candidate=>candidate.id===input.profileId);if(profile===void 0)return{status:"not_found",profileId:input.profileId};let requestedPluginIds=input.selectedPluginIds,requestedDisabledPluginIds=input.disabledPluginIds;if(requestedPluginIds!==void 0||requestedDisabledPluginIds!==void 0){let availablePluginIds=new Set(profile.pluginIds),duplicatePluginIds=[],unknownPluginIds=[];for(let requestedIds of[requestedPluginIds??[],requestedDisabledPluginIds??[]]){let seen=new Set;for(let pluginId of requestedIds)!availablePluginIds.has(pluginId)&&!unknownPluginIds.includes(pluginId)&&unknownPluginIds.push(pluginId),seen.has(pluginId)&&!duplicatePluginIds.includes(pluginId)&&duplicatePluginIds.push(pluginId),seen.add(pluginId)}if(unknownPluginIds.length>0||duplicatePluginIds.length>0)return{status:"invalid_selection",profileId:input.profileId,unknownPluginIds:Object.freeze([...new Set(unknownPluginIds)]),duplicatePluginIds:Object.freeze(duplicatePluginIds)}}let selected=requestedPluginIds===void 0?profile.pluginIds:profile.pluginIds.filter(pluginId=>requestedPluginIds.includes(pluginId)),selectedProfile=requestedPluginIds===void 0?profile:Object.freeze({...profile,pluginIds:Object.freeze([...selected])}),disabled=new Set(input.disabledPluginIds??[]),manifestByPluginId=new Map(selectedProfile.pluginIds.map(pluginId=>[pluginId,manifestFor(pluginId,input.manifestOverrides)])),missingPluginIds=selectedProfile.pluginIds.filter(pluginId=>manifestByPluginId.get(pluginId)===void 0),resolution=resolvePluginProfileV1({profileId:selectedProfile.id,profileVersion:selectedProfile.version,plugins:selectedProfile.pluginIds.flatMap(pluginId=>{let manifest=manifestByPluginId.get(pluginId);return manifest===void 0?[]:[{manifest,required:!disabled.has(pluginId),disabled:disabled.has(pluginId)}]}),host:input.host,hostVersion:VERSION}),merged=mergeMissingPluginResolutionsV1(resolution,missingPluginIds,disabled);if(merged.status!=="ready")return{status:"resolved",profile:selectedProfile,resolution:merged};let resolvedPlugins=merged.resolvedManifest.plugins.map(plugin=>({pluginId:plugin.pluginId,pluginVersion:plugin.pluginVersion,capabilityRefs:plugin.capabilityRefs,...plugin.selectedAdapter===void 0?{}:{selectedAdapter:plugin.selectedAdapter}})),verifiedPlugins=input.verifiedPlugins??[],assembly=assembleProfile({profileId:selectedProfile.id,profileVersion:selectedProfile.version,resolvedPlugins,verifiedPlugins});return{status:"resolved",profile:selectedProfile,resolution:merged,assembly}}function manifestFor(pluginId,overrides){let manifest=overrides?.[pluginId]??manifests[pluginId];if(manifest!==void 0&&manifest.id!==pluginId)throw new Error(t("builtin manifest override does not match plugin {pluginId}",{pluginId}));return manifest}function mergeMissingPluginResolutionsV1(resolution,missingPluginIds,disabled){if(missingPluginIds.length===0)return resolution;let missing=missingPluginIds.map(pluginId=>({pluginId,pluginVersion:"",required:!disabled.has(pluginId),status:"manifest-missing",diagnostics:[{code:"manifest_missing",message:`Plugin ${pluginId} has no builtin manifest and no installed active override; the plugin is omitted from this profile (install it with agent-forge plugin install)`}]})),plugins=[...resolution.plugins,...missing].sort((left,right)=>left.pluginId.localeCompare(right.pluginId));return Object.freeze({...resolution,plugins:Object.freeze(plugins),diagnostics:Object.freeze(plugins.flatMap(plugin=>plugin.diagnostics))})}var plugin_manager_controller_exports={};__export(plugin_manager_controller_exports,{createPluginManagerControllerV1:()=>createPluginManagerControllerV1});var MAX_MANAGER_ENTRIES_V1=128,MAX_MANAGER_DIAGNOSTICS_V1=8,MAX_MANAGER_ID_CHARS_V1=256;function boundedId(value,label){if(typeof value!="string"||value.trim()===""||value.length>MAX_MANAGER_ID_CHARS_V1||/[\u0000-\u001f\s]/u.test(value))throw new Error(t("{label} is invalid",{label}));return value}function signalAborted2(signal){return signal?.aborted===!0}function rejectionCodes(registry,pluginId,pluginVersion){return Object.freeze(registry.rejected.filter(entry=>entry.pluginId===pluginId&&entry.pluginVersion===pluginVersion).slice(0,MAX_MANAGER_DIAGNOSTICS_V1).map(entry=>entry.code))}function activeRecord(state,pluginId){return state.records.filter(record=>record.pluginId===pluginId&&record.state.lifecycle==="active").sort((left,right)=>comparePluginVersionsV1(right.pluginVersion,left.pluginVersion))[0]}function makeSnapshot(registry,stateStatus,state){let identities=new Map;for(let entry of registry.entries)identities.set(`${entry.pluginId}@${entry.pluginVersion}`,entry);for(let rejection of registry.rejected){let identity=`${rejection.pluginId}@${rejection.pluginVersion}`;identities.has(identity)||identities.set(identity,{pluginId:rejection.pluginId,pluginVersion:rejection.pluginVersion,signed:!1})}let entries=[...identities.values()].map(entry=>{let installed=activeRecord(state,entry.pluginId),diagnostics=rejectionCodes(registry,entry.pluginId,entry.pluginVersion),unavailable2=diagnostics.length>0||!registry.verified.some(candidate=>candidate.pluginId===entry.pluginId&&candidate.pluginVersion===entry.pluginVersion),isInstalled=installed?.pluginVersion===entry.pluginVersion;return Object.freeze({pluginId:entry.pluginId,pluginVersion:entry.pluginVersion,status:unavailable2?"unavailable":isInstalled?"installed":installed===void 0?"available":"update-available",signed:entry.signed,...installed===void 0?{}:{installedVersion:installed.pluginVersion,lifecycle:installed.state.lifecycle},diagnosticCodes:diagnostics})}).sort((left,right)=>{let idOrder=left.pluginId.localeCompare(right.pluginId);return idOrder===0?comparePluginVersionsV1(right.pluginVersion,left.pluginVersion):idOrder}),boundedEntries=Object.freeze(entries.slice(0,MAX_MANAGER_ENTRIES_V1));return Object.freeze({version:1,registrySource:registry.source,stateStatus,entries:boundedEntries,truncated:entries.length>boundedEntries.length})}function stateResult(result){if(result.status==="ok"||result.status==="missing")return{status:result.status,snapshot:result.snapshot}}function responseCode(response2){return response2.status==="unsupported"?"manager-operation-unsupported":response2.status==="cancelled"?"manager-operation-cancelled":"manager-operation-failed"}function createPluginManagerControllerV1(options){let getSnapshot=async(input={})=>{if(signalAborted2(input.signal))return{status:"error",code:"cancelled"};let registry;try{registry=await options.registry.list({signal:input.signal})}catch{return signalAborted2(input.signal)?{status:"error",code:"cancelled"}:{status:"error",code:"registry-unavailable"}}if(signalAborted2(input.signal))return{status:"error",code:"cancelled"};let state;try{state=await options.stateStore.read({signal:input.signal})}catch{return signalAborted2(input.signal)?{status:"error",code:"cancelled"}:{status:"error",code:"state-unavailable"}}if(signalAborted2(input.signal))return{status:"error",code:"cancelled"};let checkedState=stateResult(state);return checkedState===void 0?{status:"error",code:state.status==="cancelled"?"cancelled":"state-invalid"}:{status:"ok",snapshot:makeSnapshot(registry,checkedState.status,checkedState.snapshot)}},run=async input=>{try{boundedId(input.pluginId,"plugin ID"),input.pluginVersion!==void 0&&boundedId(input.pluginVersion,"plugin version")}catch{return{status:"failed",code:"manager-operation-failed"}}if(!input.confirmed)return{status:"needs_confirmation",code:"confirmation-required"};if(signalAborted2(input.signal))return{status:"cancelled",code:"cancelled"};let response2;try{let identity=input.pluginVersion===void 0?input.pluginId:`${input.pluginId}@${input.pluginVersion}`;response2=await options.cli.execute({argv:[input.command,identity,"--json"],signal:input.signal})}catch{return{status:"failed",code:"manager-operation-failed"}}if(response2.status!=="succeeded")return{status:response2.status==="unsupported"?"unsupported":response2.status==="cancelled"?"cancelled":"failed",code:responseCode(response2)};let refreshed=await getSnapshot({signal:input.signal});return refreshed.status==="ok"?{status:"succeeded",snapshot:refreshed.snapshot}:{status:"succeeded"}};return Object.freeze({getSnapshot,install:input=>run({...input,command:"install"}),update:input=>run({...input,command:"update"}),remove:input=>run({...input,command:"remove"})})}import{closeSync,fsyncSync,mkdirSync as mkdirSync2,openSync,readFileSync as readFileSync2,statSync as statSync2,unlinkSync,writeFileSync as writeFileSync2,writeSync}from"node:fs";import{dirname as dirname7,join as join15}from"node:path";var DurableServiceErrorV1=class extends Error{code;constructor(code,message){super(message),this.name="DurableServiceErrorV1",this.code=code}};function durableLogPath(agentDir,sessionId){return join15(agentDir,"durable",`${sessionId}.jsonl`)}function assertNonEmptyString2(value,label){if(typeof value!="string"||value.trim().length===0)throw new Error(t("{label} must be a non-empty string",{label}))}var writeAllSync=(fd,data)=>{let buffer=Buffer.from(data,"utf8"),written=0;for(;written<buffer.length;)written+=writeSync(fd,buffer,written,buffer.length-written)},LOCK_FILE_SUFFIX=".lock",LEASE_FILE_SUFFIX=".lease",LOCK_POLL_INTERVAL_MS=25,DEFAULT_LOCK_TIMEOUT_MS=5e3,DEFAULT_STALE_LOCK_MS=6e4,DEFAULT_LEASE_TTL_MS=3e4;function acquirePersistLock(lockPath,lockTimeoutMs,staleLockMs){let deadline=Date.now()+lockTimeoutMs;for(;;){mkdirSync2(dirname7(lockPath),{recursive:!0});let token=`${process.pid}:${Date.now()}`;try{let fd=openSync(lockPath,"wx");try{writeFileSync2(fd,token)}finally{closeSync(fd)}return token}catch(error){let code=error.code;if(code==="EPERM"){let vanished=!1;try{statSync2(lockPath)}catch(statError){if(statError.code!=="ENOENT")throw error;vanished=!0}if(vanished){if(Date.now()>=deadline)throw error;sleepSync(LOCK_POLL_INTERVAL_MS);continue}}else if(code!=="EEXIST")throw error;let stale=!1;try{stale=Date.now()-statSync2(lockPath).mtimeMs>staleLockMs}catch{}if(stale){try{unlinkSync(lockPath)}catch{}continue}if(Date.now()>=deadline)throw new Error(t("durable store persist lock timeout after {timeoutMs} ms: {lockPath} is held by another writer",{timeoutMs:lockTimeoutMs,lockPath}));sleepSync(LOCK_POLL_INTERVAL_MS)}}}function releasePersistLock(lockPath,token){try{readFileSync2(lockPath,"utf8")===token&&unlinkSync(lockPath)}catch{}}function createFileDurableStoreBackend(options){if(assertNonEmptyString2(options.path,"Durable store path"),options.lockTimeoutMs!==void 0&&(!Number.isFinite(options.lockTimeoutMs)||options.lockTimeoutMs<=0))throw new Error(t("Durable store lockTimeoutMs must be a positive number"));if(options.staleLockMs!==void 0&&(!Number.isFinite(options.staleLockMs)||options.staleLockMs<=0))throw new Error(t("Durable store staleLockMs must be a positive number"));if(options.leaseTtlMs!==void 0&&(!Number.isFinite(options.leaseTtlMs)||options.leaseTtlMs<=0))throw new Error(t("Durable store leaseTtlMs must be a positive number"));let path8=options.path,lockTimeoutMs=options.lockTimeoutMs??DEFAULT_LOCK_TIMEOUT_MS,staleLockMs=options.staleLockMs??DEFAULT_STALE_LOCK_MS,leaseTtlMs=options.leaseTtlMs??DEFAULT_LEASE_TTL_MS,lockPath=`${path8}${LOCK_FILE_SUFFIX}`,leasePath=`${path8}${LEASE_FILE_SUFFIX}`,readLease=()=>{try{let value=JSON.parse(readFileSync2(leasePath,"utf8"));if(typeof value!="object"||value===null||Array.isArray(value))return;let writerId=value.writerId,expiresAt=value.expiresAt;return typeof writerId!="string"||writerId.length===0||typeof expiresAt!="number"||!Number.isFinite(expiresAt)?void 0:{writerId,expiresAt}}catch{return}},writeLease=(writerId,expiresAt)=>{let fd=openSync(leasePath,"w");try{writeAllSync(fd,JSON.stringify({writerId,expiresAt}))}finally{closeSync(fd)}},liveForeign=(current,writerId)=>current.writerId!==writerId&&Date.now()<=current.expiresAt;return{persist(operations){if(operations.length===0)return;let lines=operations.map(operation=>`${JSON.stringify(storeOperationEnvelope(operation))}