@ai-agent-forge/agent-forge 0.85.0 → 0.85.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,18 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.85.2] - 2026-09-28
6
+
7
+ ### Fixed
8
+
9
+ - Plugin package manifests now carry the package version: plugin.json version / agent-forge.json pluginVersion were hardcoded at 0.84.4 and survived every lockstep bump, so the published 0.85.x plugin packages installed into the store as version 0.84.4 — permanently unsatisfying the bootstrap factory range (^0.85.x), spamming range_not_satisfied diagnostics on every startup after the first and corrupting future update flows. scripts/sync-versions.js now scans the plugins root (it previously missed it for internal ranges too) and stamps the manifest version fields; a repo-wide consistency test pins every first-party plugin. Found by the real-user npm verification round.
10
+
11
+ ## [0.85.1] - 2026-09-28
12
+
13
+ ### Fixed
14
+
15
+ - Fresh installs bootstrap their first-party plugin packages from npm again: the frozen factory manifest hardcoded the range ^0.84.4, which the lockstep bump to 0.85.0 silently outlived (caret-on-0.x excludes 0.85.0 and the registry only holds 0.85.0), so every real fresh user first startup failed all seven plugin installs with a version-resolution error. Ranges are now derived from the framework VERSION at module init (staying correct through the publish channel rename/version rewrite), pinned by a lockstep consistency test in plugin-bootstrap.test.ts. Discovered in the post-publish real-user verification round.
16
+
5
17
  ## [0.85.0] - 2026-09-28
6
18
 
7
19
  ### Breaking Changes
@@ -1,5 +1,5 @@
1
1
  {
2
- "generatedAt": "2026-09-28T16:20:14.337Z",
2
+ "generatedAt": "2026-09-28T21:16:33.507Z",
3
3
  "inputCount": 3560,
4
4
  "inputs": {
5
5
  "node_modules/@anthropic-ai/sdk/_vendor/partial-json-parser/parser.mjs": "717f9403f2d3ee0f2077aeb7f0ca7eaff7cc9bcdbb054ac23c6c0361fa03cd1f",
@@ -2301,7 +2301,7 @@
2301
2301
  "packages/agent-forge/dist/modes/rpc/rpc-mode.js": "89c588f82e2e6082d6cea1b85590e50a48384d19cde1a6053d6eb7e4f9964b5f",
2302
2302
  "packages/agent-forge/dist/package-manager-cli.js": "9999d12162ae24c3f3521963a102d8e1720c07eb26a87d01c9f34a3f1c0b4de7",
2303
2303
  "packages/agent-forge/dist/plugins/ecosystem/active-bindings.js": "0406ca20ad11165a80bbdbe976ce322e6427cfc614760ba0ec080a685d461cc6",
2304
- "packages/agent-forge/dist/plugins/ecosystem/bootstrap-factory-manifest.js": "9c562713db66a981ba7c92110a7e754dcfd6b7762c4b5dae50cfe418b1977792",
2304
+ "packages/agent-forge/dist/plugins/ecosystem/bootstrap-factory-manifest.js": "18a0563089e28cc03e4188f550c54ac4dfdc387bc9bdc3167e8965fc8924e92b",
2305
2305
  "packages/agent-forge/dist/plugins/ecosystem/catalog.js": "f6e279fd8eb4f2bab525e8772ef717f24b6e99b3bf196e2546f82d5351d9c9ac",
2306
2306
  "packages/agent-forge/dist/plugins/ecosystem/cli.js": "443f1bee30c7951c840446dbd62aaffb57df34264db93651eb7d7bcb95586fc2",
2307
2307
  "packages/agent-forge/dist/plugins/ecosystem/default-active-bindings.js": "015e3f4255664f18a276f44e7d0b49a394f98a9f58c84151449cb176740cce63",
@@ -2663,7 +2663,7 @@
2663
2663
  "packages/agent-forge/src/modes/rpc/rpc-types.ts": "835fb1276e5f68002918be7a6b0e5f6ad18ccdb30107c47155da298c05e1f51d",
2664
2664
  "packages/agent-forge/src/package-manager-cli.ts": "25a411835b3f40933382c88c4e377d638bb244d9838605f540d194d58c2bee8e",
2665
2665
  "packages/agent-forge/src/plugins/ecosystem/active-bindings.ts": "11b9db7dcf14f6a23ccddcd00e295dd1cbd86feb8e289b0bef0396e106b3ebaf",
2666
- "packages/agent-forge/src/plugins/ecosystem/bootstrap-factory-manifest.ts": "7d2b34e3b0fa74d690835e58e92075eb99c8ecf9092cc3f30a5151bec0b9b4d1",
2666
+ "packages/agent-forge/src/plugins/ecosystem/bootstrap-factory-manifest.ts": "9dfe13d98ca4125533a843e60cad00e84235271d7ce677ae204a203c61d7eeb6",
2667
2667
  "packages/agent-forge/src/plugins/ecosystem/catalog.ts": "07c15b8de82104b89818812bb9d409f258057e4bdd9f916863aecbea2d141ef3",
2668
2668
  "packages/agent-forge/src/plugins/ecosystem/cli.ts": "b5a45aab8957abda490ab148557af29dbd374e1a42813d4f983712e69008c8fa",
2669
2669
  "packages/agent-forge/src/plugins/ecosystem/default-active-bindings.ts": "89c8ec90ce771432c8a510de9f21d12e3394f6ab8125629d083a15f6700fa88a",
@@ -1503,7 +1503,7 @@ changes anytime in settings.json.`),1,0)),this.addChild(new Spacer(1)),this.addO
1503
1503
  ${value.stack}`}
1504
1504
  `}return`${JSON.stringify(toSafeJson(value))}
1505
1505
  `}function createHostLogger(options){if(options.level!==void 0&&!HOST_LOG_LEVELS.includes(options.level))throw new Error(`Host logger level must be one of ${HOST_LOG_LEVELS.map(level=>`"${level}"`).join(" | ")}; got ${JSON.stringify(options.level)}`);let minRank=LEVEL_RANK[options.level??"info"],now=options.now??Date.now,maxAgeDays=options.maxAgeDays??DEFAULT_MAX_AGE_DAYS,processHost=options.processHost??NODE_PROCESS_HOST,closed=!1,dirReady=!1,written=0,failed=0,write=(level,src,msg,context)=>{if(closed||LEVEL_RANK[level]<minRank)return;let entry={v:1,t:now(),level,src,msg,sessionId:context?.sessionId,traceId:context?.traceId,fields:context?.fields===void 0?void 0:toSafeJson(context.fields),cause:context?.cause===void 0?void 0:boundCause(context.cause)};try{dirReady||(mkdirSync19(options.dir,{recursive:!0}),dirReady=!0),appendFileSync4(join61(options.dir,logFileName(entry.t)),`${JSON.stringify(entry)}
1506
- `),written+=1}catch{failed+=1,dirReady=!1}};(()=>{if(maxAgeDays<=0)return;let cutoff=now()-maxAgeDays*DAY_MS,currentName=logFileName(now()),names2;try{names2=readdirSync16(options.dir)}catch(error2){if(error2.code==="ENOENT")return;write("warn","logger","log sweep failed: cannot read log directory",{cause:error2});return}let removed=0,errors=0;for(let name of names2){if(!name.endsWith(".log")||name===currentName)continue;let fullPath=join61(options.dir,name);try{let stats=statSync18(fullPath);if(!stats.isFile()||stats.mtimeMs>=cutoff)continue;unlinkSync4(fullPath),removed+=1}catch{errors+=1}}errors>0&&write("warn","logger","log sweep finished with failures",{fields:{removed,errors}})})();let exit=processHost.exit??NODE_PROCESS_CRASH_HOST.exit,writeStderr=processHost.writeStderr??NODE_PROCESS_CRASH_HOST.writeStderr,deferThrow=processHost.deferThrow??NODE_PROCESS_CRASH_HOST.deferThrow,loggedFatalValues=new WeakSet,isFatalValueLogged=value=>value!==null&&(typeof value=="object"||typeof value=="function")&&loggedFatalValues.has(value),markFatalValueLogged=value=>{value!==null&&(typeof value=="object"||typeof value=="function")&&loggedFatalValues.add(value)};return processHost.onUncaughtException&&processHost.onUncaughtException(error2=>{isFatalValueLogged(error2)||(markFatalValueLogged(error2),write("error","process","uncaughtException",{cause:error2})),writeStderr(fatalStderrText(error2)),exit(1)}),processHost.onUnhandledRejection&&processHost.onUnhandledRejection(reason=>{markFatalValueLogged(reason),write("error","process","unhandledRejection",{cause:reason}),deferThrow(()=>{throw reason})}),{debug:(src,msg,context)=>write("debug",src,msg,context),info:(src,msg,context)=>write("info",src,msg,context),warn:(src,msg,context)=>write("warn",src,msg,context),error:(src,msg,context)=>write("error",src,msg,context),close:()=>(closed=!0,{written,failed})}}function collectSettingsDiagnostics(settingsManager){return settingsManager.drainErrors().map(({scope,path:path15,error:error2})=>({type:"warning",message:path15?`Invalid settings file ${path15}: ${error2.message}`:`Invalid ${scope} settings: ${error2.message}`}))}function deduplicateDiagnostics(diagnostics){let seen=new Set;return diagnostics.filter(diagnostic5=>{let key=`${diagnostic5.type}\0${diagnostic5.message}`;return seen.has(key)?!1:(seen.add(key),!0)})}import{readdirSync as readdirSync17,statSync as statSync19,unlinkSync as unlinkSync5}from"node:fs";import{join as join62}from"node:path";var DAY_MS2=1440*60*1e3,TRACE_FILE_SUFFIX=".trace.jsonl";function sweepTraceFiles(sessionsRoot,options){if(options.maxAgeDays<=0)return{scanned:0,deleted:0,failed:0};let now=options.now??Date.now,unlink4=options.unlink??(path15=>unlinkSync5(path15)),cutoff=now()-options.maxAgeDays*DAY_MS2,scanned=0,deleted=0,failed=0,readEntries=dir=>{try{return readdirSync17(dir,{withFileTypes:!0})}catch{return}},sweepFilesIn=(dir,entries)=>{for(let entry of entries){if(!entry.name.endsWith(TRACE_FILE_SUFFIX))continue;let fullPath=join62(dir,entry.name),isFile=!1,isExpired=!1;try{let stats=statSync19(fullPath);isFile=stats.isFile(),isExpired=isFile&&stats.mtimeMs<cutoff}catch{continue}if(isFile&&(scanned+=1,!!isExpired))try{unlink4(fullPath),deleted+=1}catch{failed+=1}}},rootEntries=readEntries(sessionsRoot);if(rootEntries===void 0)return{scanned:0,deleted:0,failed:0};sweepFilesIn(sessionsRoot,rootEntries);for(let entry of rootEntries){if(!entry.isDirectory())continue;let subdirectory=join62(sessionsRoot,entry.name),subEntries=readEntries(subdirectory);subEntries!==void 0&&sweepFilesIn(subdirectory,subEntries)}return{scanned,deleted,failed}}import{join as join63}from"node:path";var BOOTSTRAP_FACTORY_PLUGIN_MANIFEST_V1=Object.freeze([{pluginId:"agent-forge.plugin.goal",npmName:"@ai-agent-forge/plugin-goal",range:"^0.84.4"},{pluginId:"agent-forge.plugin.plan",npmName:"@ai-agent-forge/plugin-plan",range:"^0.84.4"},{pluginId:"agent-forge.plugin.todo-set",npmName:"@ai-agent-forge/plugin-todo-set",range:"^0.84.4"},{pluginId:"agent-forge.plugin.session-share",npmName:"@ai-agent-forge/plugin-session-share",range:"^0.84.4"},{pluginId:"agent-forge.plugin.observability",npmName:"@ai-agent-forge/plugin-observability",range:"^0.84.4"},{pluginId:"agent-forge.plugin.subagent-delegate",npmName:"@ai-agent-forge/plugin-subagent-delegate",range:"^0.84.4"},{pluginId:"agent-forge.plugin.memory",npmName:"@ai-agent-forge/plugin-memory",range:"^0.84.4"}]);var PLUGIN_BOOTSTRAP_VERSION_V1=1;function satisfiesRangeV1(version,range2){return selectNpmPackageVersionV1([version],range2)===version}function pluginBootstrapInstallCommandV1(entry){return`agent-forge plugin install ${entry.npmName}@${entry.range??"latest"}`}function errorMessage(error2){return error2 instanceof Error?error2.message:String(error2)}function acquireErrorCode(error2){return error2 instanceof PluginAcquisitionErrorV1?error2.code:"install_failed"}function actionOf(entry,status2,reason){return Object.freeze({pluginId:entry.pluginId,status:status2,reason,npmName:entry.npmName,...entry.range===void 0?{}:{range:entry.range}})}async function runPluginBootstrapV1(input){let now=input.deps.now??Date.now,startedAt=now(),finish=(status3,actions2,diagnostics2)=>Object.freeze({version:PLUGIN_BOOTSTRAP_VERSION_V1,status:status3,actions:Object.freeze([...actions2]),diagnostics:Object.freeze([...diagnostics2]),durationMs:Math.max(0,now()-startedAt)});if(input.manifest.length===0)return finish("succeeded",[],[]);let signal=input.deps.signal,active;try{active=await input.deps.listActive({...signal===void 0?{}:{signal}})}catch(error2){return finish("failed",[],[{code:"list_active_failed",message:`Active plugin state could not be read; bootstrap installed nothing: ${errorMessage(error2)}`}])}let actions=[],diagnostics=[];for(let entry of input.manifest){if(signal?.aborted===!0){diagnostics.push({code:"cancelled",message:"Plugin bootstrap was cancelled before all factory entries were processed"});break}let activeVersion=active.get(entry.pluginId);if(activeVersion!==void 0){if(satisfiesRangeV1(activeVersion,entry.range)){actions.push(Object.freeze({...actionOf(entry,"skipped","satisfies_range"),activeVersion}));continue}actions.push(Object.freeze({...actionOf(entry,"diagnosed","range_not_satisfied"),activeVersion})),diagnostics.push({code:"range_not_satisfied",pluginId:entry.pluginId,message:`Active version ${activeVersion} of ${entry.pluginId} does not satisfy the factory range ${entry.range??"latest"}; bootstrap never replaces active installations. Run \`${pluginBootstrapInstallCommandV1(entry)}\` to install a matching version.`});continue}try{let installed=await input.deps.installFromNpm({npmName:entry.npmName,...entry.range===void 0?{}:{range:entry.range},...signal===void 0?{}:{signal}});actions.push(Object.freeze({...actionOf(entry,"installed","installed"),installedVersion:installed.pluginVersion,source:installed.source}))}catch(error2){let errorCode2=acquireErrorCode(error2);actions.push(Object.freeze({...actionOf(entry,"failed","install_failed"),errorCode:errorCode2})),diagnostics.push({code:"install_failed",pluginId:entry.pluginId,message:`Bootstrap could not install ${entry.pluginId} from npm (${errorCode2}: ${errorMessage(error2)}). Startup continues without it; its capabilities stay unavailable until installed. Run \`${pluginBootstrapInstallCommandV1(entry)}\` to install it manually.`})}}let status2=actions.some(action=>action.status==="failed")?"failed":actions.some(action=>action.status==="diagnosed")?"degraded":"succeeded";return finish(status2,actions,diagnostics)}var AGENT_FORGE_PLUGIN_BOOTSTRAP_ENV_V1="AGENT_FORGE_PLUGIN_BOOTSTRAP",PLUGIN_BOOTSTRAP_DISABLED_VALUE_V1="off";function readActiveVersions(store,scope,scopeRef,signal){return(async()=>{let result=await store.read({...signal===void 0?{}:{signal}});if(result.status!=="ok"&&result.status!=="missing")throw new Error(`plugin state read failed (${result.diagnostics[0]?.code??result.status}) for the ${scope} scope`);let versions=new Map;for(let record of result.snapshot.records)record.state.scope!==scope||record.state.scopeRef!==scopeRef||record.state.lifecycle==="active"&&versions.set(record.pluginId,record.pluginVersion);return versions})()}async function runNodePluginBootstrapV1(options){if(process.env[AGENT_FORGE_PLUGIN_BOOTSTRAP_ENV_V1]?.trim()===PLUGIN_BOOTSTRAP_DISABLED_VALUE_V1)return Object.freeze({version:1,status:"succeeded",actions:Object.freeze([]),diagnostics:Object.freeze([]),durationMs:0,skipped:"disabled"});if(options.deps!==void 0)return await runPluginBootstrapV1({manifest:options.manifest??BOOTSTRAP_FACTORY_PLUGIN_MANIFEST_V1,deps:options.deps});let session,ensureSession=async()=>{if(session!==void 0)return session;let acquisition=createNodePluginAcquisitionHostV1({...options.npmRegistry===void 0?{}:{npmRegistry:options.npmRegistry},...options.npmToken===void 0?{}:{npmToken:options.npmToken},...options.fetch===void 0?{}:{fetch:options.fetch},...options.limits===void 0?{}:{limits:options.limits}}),installHost=await createNodePackageInstallHostV1({openArtifact:input=>acquisition.openArtifact(input),installationDirectory:defaultPluginInstallStoreDirectoryV1(options.agentDir),persistence:"persistent",supportedScopes:["global","project"],...options.limits===void 0?{}:{...options.limits}});return session={acquisition,installHost,installer:createPluginInstallerV1({host:installHost}),stateStore:createPluginStateStoreV1({filePath:join63(options.agentDir,DEFAULT_PLUGIN_STATE_FILE_V1)})},session},deps={listActive:async({signal})=>{let globalVersions=readActiveVersions(createPluginStateStoreV1({filePath:join63(options.agentDir,DEFAULT_PLUGIN_STATE_FILE_V1)}),"global",DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1,signal),projectVersions=readActiveVersions(createPluginStateStoreV1({filePath:join63(options.cwd,CONFIG_DIR_NAME,DEFAULT_PLUGIN_STATE_FILE_V1)}),"project",projectPluginScopeRefV1(options.cwd),signal),[globalResult,projectResult]=await Promise.all([globalVersions,projectVersions]);return new Map([...globalResult,...projectResult])},installFromNpm:async({npmName,range:range2,signal})=>{let active=await ensureSession(),ref=range2===void 0?npmName:`${npmName}@${range2}`,acquired=await active.acquisition.resolvePackage({ref,...signal===void 0?{}:{signal}}),released=!1,release=async()=>{released||(released=!0,await acquired.release())};try{let verified=active.installer.prepare({manifest:acquired.manifest,source:acquired.source,host:defaultPluginHostFactsV1()});if(verified.status!=="verified")throw new Error(`installer prepare rejected ${acquired.manifest.id}: ${verified.reason}`);let installed=await active.installer.install({record:verified.record,scope:"global",scopeRef:DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1,artifact:acquired.artifact,...signal===void 0?{}:{signal}});if(installed.status!=="succeeded")throw new Error(`plugin install failed (${installed.error.code}) for ${acquired.manifest.id}`);let activated=await active.installer.activate({installation:installed.installation,record:verified.record,scope:"global",scopeRef:DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1,...signal===void 0?{}:{signal}});if(activated.status!=="succeeded")throw await active.installer.remove({installation:installed.installation,scope:"global",scopeRef:DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1}).catch(()=>{}),new Error(`plugin activation failed (${activated.error.code}) for ${acquired.manifest.id}`);let persisted=await active.stateStore.upsert({installation:activated.installation,scope:"global",enabled:!0,source:acquired.source,...signal===void 0?{}:{signal}});if(persisted.status!=="ok")throw await active.installer.remove({installation:activated.installation,scope:"global",scopeRef:DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1}).catch(()=>{}),new Error(`plugin state persist failed (${persisted.status}) for ${acquired.manifest.id}`);return{pluginVersion:activated.installation.pluginVersion,source:acquired.source}}finally{await release()}},...options.signal===void 0?{}:{signal:options.signal}};try{return await runPluginBootstrapV1({manifest:options.manifest??BOOTSTRAP_FACTORY_PLUGIN_MANIFEST_V1,deps})}finally{let active=session;session=void 0,active!==void 0&&(await active.installHost.close().catch(()=>{}),await active.acquisition.close().catch(()=>{}))}}import{existsSync as existsSync31,mkdirSync as mkdirSync20,readdirSync as readdirSync18,readFileSync as readFileSync27,renameSync as renameSync4,rmSync as rmSync6,writeFileSync as writeFileSync17}from"fs";import{dirname as dirname30,join as join64}from"path";var MIGRATION_GUIDE_URL="https://github.com/agent-forge/agent-forge/blob/main/packages/agent-forge/CHANGELOG.md#extensions-migration",EXTENSIONS_DOC_URL="https://github.com/agent-forge/agent-forge/blob/main/packages/agent-forge/docs/extensions.md";function migrateAuthToAuthJson(){let agentDir=getAgentDir(),authPath=join64(agentDir,"auth.json"),oauthPath=join64(agentDir,"oauth.json"),settingsPath=join64(agentDir,"settings.json");if(existsSync31(authPath))return[];let migrated={},providers=[];if(existsSync31(oauthPath))try{let oauth=JSON.parse(stripBom(readFileSync27(oauthPath,"utf-8")));for(let[provider,cred]of Object.entries(oauth))migrated[provider]={type:"oauth",...cred},providers.push(provider);renameSync4(oauthPath,`${oauthPath}.migrated`)}catch{}if(existsSync31(settingsPath))try{let content=readFileSync27(settingsPath,"utf-8"),settings2=JSON.parse(stripBom(content));if(settings2.apiKeys&&typeof settings2.apiKeys=="object"){for(let[provider,key]of Object.entries(settings2.apiKeys))!migrated[provider]&&typeof key=="string"&&(migrated[provider]={type:"api_key",key},providers.push(provider));delete settings2.apiKeys,writeFileSync17(settingsPath,JSON.stringify(settings2,null,2))}}catch{}return Object.keys(migrated).length>0&&(mkdirSync20(dirname30(authPath),{recursive:!0}),writeFileSync17(authPath,JSON.stringify(migrated,null,2),{mode:384})),providers}function migrateSessionsFromAgentRoot(){let agentDir=getAgentDir(),files;try{files=readdirSync18(agentDir).filter(f=>f.endsWith(".jsonl")).map(f=>join64(agentDir,f))}catch{return}if(files.length!==0)for(let file of files)try{let firstLine=readFileSync27(file,"utf8").split(`
1506
+ `),written+=1}catch{failed+=1,dirReady=!1}};(()=>{if(maxAgeDays<=0)return;let cutoff=now()-maxAgeDays*DAY_MS,currentName=logFileName(now()),names2;try{names2=readdirSync16(options.dir)}catch(error2){if(error2.code==="ENOENT")return;write("warn","logger","log sweep failed: cannot read log directory",{cause:error2});return}let removed=0,errors=0;for(let name of names2){if(!name.endsWith(".log")||name===currentName)continue;let fullPath=join61(options.dir,name);try{let stats=statSync18(fullPath);if(!stats.isFile()||stats.mtimeMs>=cutoff)continue;unlinkSync4(fullPath),removed+=1}catch{errors+=1}}errors>0&&write("warn","logger","log sweep finished with failures",{fields:{removed,errors}})})();let exit=processHost.exit??NODE_PROCESS_CRASH_HOST.exit,writeStderr=processHost.writeStderr??NODE_PROCESS_CRASH_HOST.writeStderr,deferThrow=processHost.deferThrow??NODE_PROCESS_CRASH_HOST.deferThrow,loggedFatalValues=new WeakSet,isFatalValueLogged=value=>value!==null&&(typeof value=="object"||typeof value=="function")&&loggedFatalValues.has(value),markFatalValueLogged=value=>{value!==null&&(typeof value=="object"||typeof value=="function")&&loggedFatalValues.add(value)};return processHost.onUncaughtException&&processHost.onUncaughtException(error2=>{isFatalValueLogged(error2)||(markFatalValueLogged(error2),write("error","process","uncaughtException",{cause:error2})),writeStderr(fatalStderrText(error2)),exit(1)}),processHost.onUnhandledRejection&&processHost.onUnhandledRejection(reason=>{markFatalValueLogged(reason),write("error","process","unhandledRejection",{cause:reason}),deferThrow(()=>{throw reason})}),{debug:(src,msg,context)=>write("debug",src,msg,context),info:(src,msg,context)=>write("info",src,msg,context),warn:(src,msg,context)=>write("warn",src,msg,context),error:(src,msg,context)=>write("error",src,msg,context),close:()=>(closed=!0,{written,failed})}}function collectSettingsDiagnostics(settingsManager){return settingsManager.drainErrors().map(({scope,path:path15,error:error2})=>({type:"warning",message:path15?`Invalid settings file ${path15}: ${error2.message}`:`Invalid ${scope} settings: ${error2.message}`}))}function deduplicateDiagnostics(diagnostics){let seen=new Set;return diagnostics.filter(diagnostic5=>{let key=`${diagnostic5.type}\0${diagnostic5.message}`;return seen.has(key)?!1:(seen.add(key),!0)})}import{readdirSync as readdirSync17,statSync as statSync19,unlinkSync as unlinkSync5}from"node:fs";import{join as join62}from"node:path";var DAY_MS2=1440*60*1e3,TRACE_FILE_SUFFIX=".trace.jsonl";function sweepTraceFiles(sessionsRoot,options){if(options.maxAgeDays<=0)return{scanned:0,deleted:0,failed:0};let now=options.now??Date.now,unlink4=options.unlink??(path15=>unlinkSync5(path15)),cutoff=now()-options.maxAgeDays*DAY_MS2,scanned=0,deleted=0,failed=0,readEntries=dir=>{try{return readdirSync17(dir,{withFileTypes:!0})}catch{return}},sweepFilesIn=(dir,entries)=>{for(let entry of entries){if(!entry.name.endsWith(TRACE_FILE_SUFFIX))continue;let fullPath=join62(dir,entry.name),isFile=!1,isExpired=!1;try{let stats=statSync19(fullPath);isFile=stats.isFile(),isExpired=isFile&&stats.mtimeMs<cutoff}catch{continue}if(isFile&&(scanned+=1,!!isExpired))try{unlink4(fullPath),deleted+=1}catch{failed+=1}}},rootEntries=readEntries(sessionsRoot);if(rootEntries===void 0)return{scanned:0,deleted:0,failed:0};sweepFilesIn(sessionsRoot,rootEntries);for(let entry of rootEntries){if(!entry.isDirectory())continue;let subdirectory=join62(sessionsRoot,entry.name),subEntries=readEntries(subdirectory);subEntries!==void 0&&sweepFilesIn(subdirectory,subEntries)}return{scanned,deleted,failed}}import{join as join63}from"node:path";var FACTORY_PLUGIN_RANGE=`^${VERSION}`,BOOTSTRAP_FACTORY_PLUGIN_MANIFEST_V1=Object.freeze([{pluginId:"agent-forge.plugin.goal",npmName:"@ai-agent-forge/plugin-goal",range:FACTORY_PLUGIN_RANGE},{pluginId:"agent-forge.plugin.plan",npmName:"@ai-agent-forge/plugin-plan",range:FACTORY_PLUGIN_RANGE},{pluginId:"agent-forge.plugin.todo-set",npmName:"@ai-agent-forge/plugin-todo-set",range:FACTORY_PLUGIN_RANGE},{pluginId:"agent-forge.plugin.session-share",npmName:"@ai-agent-forge/plugin-session-share",range:FACTORY_PLUGIN_RANGE},{pluginId:"agent-forge.plugin.observability",npmName:"@ai-agent-forge/plugin-observability",range:FACTORY_PLUGIN_RANGE},{pluginId:"agent-forge.plugin.subagent-delegate",npmName:"@ai-agent-forge/plugin-subagent-delegate",range:FACTORY_PLUGIN_RANGE},{pluginId:"agent-forge.plugin.memory",npmName:"@ai-agent-forge/plugin-memory",range:FACTORY_PLUGIN_RANGE}]);var PLUGIN_BOOTSTRAP_VERSION_V1=1;function satisfiesRangeV1(version,range2){return selectNpmPackageVersionV1([version],range2)===version}function pluginBootstrapInstallCommandV1(entry){return`agent-forge plugin install ${entry.npmName}@${entry.range??"latest"}`}function errorMessage(error2){return error2 instanceof Error?error2.message:String(error2)}function acquireErrorCode(error2){return error2 instanceof PluginAcquisitionErrorV1?error2.code:"install_failed"}function actionOf(entry,status2,reason){return Object.freeze({pluginId:entry.pluginId,status:status2,reason,npmName:entry.npmName,...entry.range===void 0?{}:{range:entry.range}})}async function runPluginBootstrapV1(input){let now=input.deps.now??Date.now,startedAt=now(),finish=(status3,actions2,diagnostics2)=>Object.freeze({version:PLUGIN_BOOTSTRAP_VERSION_V1,status:status3,actions:Object.freeze([...actions2]),diagnostics:Object.freeze([...diagnostics2]),durationMs:Math.max(0,now()-startedAt)});if(input.manifest.length===0)return finish("succeeded",[],[]);let signal=input.deps.signal,active;try{active=await input.deps.listActive({...signal===void 0?{}:{signal}})}catch(error2){return finish("failed",[],[{code:"list_active_failed",message:`Active plugin state could not be read; bootstrap installed nothing: ${errorMessage(error2)}`}])}let actions=[],diagnostics=[];for(let entry of input.manifest){if(signal?.aborted===!0){diagnostics.push({code:"cancelled",message:"Plugin bootstrap was cancelled before all factory entries were processed"});break}let activeVersion=active.get(entry.pluginId);if(activeVersion!==void 0){if(satisfiesRangeV1(activeVersion,entry.range)){actions.push(Object.freeze({...actionOf(entry,"skipped","satisfies_range"),activeVersion}));continue}actions.push(Object.freeze({...actionOf(entry,"diagnosed","range_not_satisfied"),activeVersion})),diagnostics.push({code:"range_not_satisfied",pluginId:entry.pluginId,message:`Active version ${activeVersion} of ${entry.pluginId} does not satisfy the factory range ${entry.range??"latest"}; bootstrap never replaces active installations. Run \`${pluginBootstrapInstallCommandV1(entry)}\` to install a matching version.`});continue}try{let installed=await input.deps.installFromNpm({npmName:entry.npmName,...entry.range===void 0?{}:{range:entry.range},...signal===void 0?{}:{signal}});actions.push(Object.freeze({...actionOf(entry,"installed","installed"),installedVersion:installed.pluginVersion,source:installed.source}))}catch(error2){let errorCode2=acquireErrorCode(error2);actions.push(Object.freeze({...actionOf(entry,"failed","install_failed"),errorCode:errorCode2})),diagnostics.push({code:"install_failed",pluginId:entry.pluginId,message:`Bootstrap could not install ${entry.pluginId} from npm (${errorCode2}: ${errorMessage(error2)}). Startup continues without it; its capabilities stay unavailable until installed. Run \`${pluginBootstrapInstallCommandV1(entry)}\` to install it manually.`})}}let status2=actions.some(action=>action.status==="failed")?"failed":actions.some(action=>action.status==="diagnosed")?"degraded":"succeeded";return finish(status2,actions,diagnostics)}var AGENT_FORGE_PLUGIN_BOOTSTRAP_ENV_V1="AGENT_FORGE_PLUGIN_BOOTSTRAP",PLUGIN_BOOTSTRAP_DISABLED_VALUE_V1="off";function readActiveVersions(store,scope,scopeRef,signal){return(async()=>{let result=await store.read({...signal===void 0?{}:{signal}});if(result.status!=="ok"&&result.status!=="missing")throw new Error(`plugin state read failed (${result.diagnostics[0]?.code??result.status}) for the ${scope} scope`);let versions=new Map;for(let record of result.snapshot.records)record.state.scope!==scope||record.state.scopeRef!==scopeRef||record.state.lifecycle==="active"&&versions.set(record.pluginId,record.pluginVersion);return versions})()}async function runNodePluginBootstrapV1(options){if(process.env[AGENT_FORGE_PLUGIN_BOOTSTRAP_ENV_V1]?.trim()===PLUGIN_BOOTSTRAP_DISABLED_VALUE_V1)return Object.freeze({version:1,status:"succeeded",actions:Object.freeze([]),diagnostics:Object.freeze([]),durationMs:0,skipped:"disabled"});if(options.deps!==void 0)return await runPluginBootstrapV1({manifest:options.manifest??BOOTSTRAP_FACTORY_PLUGIN_MANIFEST_V1,deps:options.deps});let session,ensureSession=async()=>{if(session!==void 0)return session;let acquisition=createNodePluginAcquisitionHostV1({...options.npmRegistry===void 0?{}:{npmRegistry:options.npmRegistry},...options.npmToken===void 0?{}:{npmToken:options.npmToken},...options.fetch===void 0?{}:{fetch:options.fetch},...options.limits===void 0?{}:{limits:options.limits}}),installHost=await createNodePackageInstallHostV1({openArtifact:input=>acquisition.openArtifact(input),installationDirectory:defaultPluginInstallStoreDirectoryV1(options.agentDir),persistence:"persistent",supportedScopes:["global","project"],...options.limits===void 0?{}:{...options.limits}});return session={acquisition,installHost,installer:createPluginInstallerV1({host:installHost}),stateStore:createPluginStateStoreV1({filePath:join63(options.agentDir,DEFAULT_PLUGIN_STATE_FILE_V1)})},session},deps={listActive:async({signal})=>{let globalVersions=readActiveVersions(createPluginStateStoreV1({filePath:join63(options.agentDir,DEFAULT_PLUGIN_STATE_FILE_V1)}),"global",DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1,signal),projectVersions=readActiveVersions(createPluginStateStoreV1({filePath:join63(options.cwd,CONFIG_DIR_NAME,DEFAULT_PLUGIN_STATE_FILE_V1)}),"project",projectPluginScopeRefV1(options.cwd),signal),[globalResult,projectResult]=await Promise.all([globalVersions,projectVersions]);return new Map([...globalResult,...projectResult])},installFromNpm:async({npmName,range:range2,signal})=>{let active=await ensureSession(),ref=range2===void 0?npmName:`${npmName}@${range2}`,acquired=await active.acquisition.resolvePackage({ref,...signal===void 0?{}:{signal}}),released=!1,release=async()=>{released||(released=!0,await acquired.release())};try{let verified=active.installer.prepare({manifest:acquired.manifest,source:acquired.source,host:defaultPluginHostFactsV1()});if(verified.status!=="verified")throw new Error(`installer prepare rejected ${acquired.manifest.id}: ${verified.reason}`);let installed=await active.installer.install({record:verified.record,scope:"global",scopeRef:DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1,artifact:acquired.artifact,...signal===void 0?{}:{signal}});if(installed.status!=="succeeded")throw new Error(`plugin install failed (${installed.error.code}) for ${acquired.manifest.id}`);let activated=await active.installer.activate({installation:installed.installation,record:verified.record,scope:"global",scopeRef:DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1,...signal===void 0?{}:{signal}});if(activated.status!=="succeeded")throw await active.installer.remove({installation:installed.installation,scope:"global",scopeRef:DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1}).catch(()=>{}),new Error(`plugin activation failed (${activated.error.code}) for ${acquired.manifest.id}`);let persisted=await active.stateStore.upsert({installation:activated.installation,scope:"global",enabled:!0,source:acquired.source,...signal===void 0?{}:{signal}});if(persisted.status!=="ok")throw await active.installer.remove({installation:activated.installation,scope:"global",scopeRef:DEFAULT_GLOBAL_PLUGIN_SCOPE_REF_V1}).catch(()=>{}),new Error(`plugin state persist failed (${persisted.status}) for ${acquired.manifest.id}`);return{pluginVersion:activated.installation.pluginVersion,source:acquired.source}}finally{await release()}},...options.signal===void 0?{}:{signal:options.signal}};try{return await runPluginBootstrapV1({manifest:options.manifest??BOOTSTRAP_FACTORY_PLUGIN_MANIFEST_V1,deps})}finally{let active=session;session=void 0,active!==void 0&&(await active.installHost.close().catch(()=>{}),await active.acquisition.close().catch(()=>{}))}}import{existsSync as existsSync31,mkdirSync as mkdirSync20,readdirSync as readdirSync18,readFileSync as readFileSync27,renameSync as renameSync4,rmSync as rmSync6,writeFileSync as writeFileSync17}from"fs";import{dirname as dirname30,join as join64}from"path";var MIGRATION_GUIDE_URL="https://github.com/agent-forge/agent-forge/blob/main/packages/agent-forge/CHANGELOG.md#extensions-migration",EXTENSIONS_DOC_URL="https://github.com/agent-forge/agent-forge/blob/main/packages/agent-forge/docs/extensions.md";function migrateAuthToAuthJson(){let agentDir=getAgentDir(),authPath=join64(agentDir,"auth.json"),oauthPath=join64(agentDir,"oauth.json"),settingsPath=join64(agentDir,"settings.json");if(existsSync31(authPath))return[];let migrated={},providers=[];if(existsSync31(oauthPath))try{let oauth=JSON.parse(stripBom(readFileSync27(oauthPath,"utf-8")));for(let[provider,cred]of Object.entries(oauth))migrated[provider]={type:"oauth",...cred},providers.push(provider);renameSync4(oauthPath,`${oauthPath}.migrated`)}catch{}if(existsSync31(settingsPath))try{let content=readFileSync27(settingsPath,"utf-8"),settings2=JSON.parse(stripBom(content));if(settings2.apiKeys&&typeof settings2.apiKeys=="object"){for(let[provider,key]of Object.entries(settings2.apiKeys))!migrated[provider]&&typeof key=="string"&&(migrated[provider]={type:"api_key",key},providers.push(provider));delete settings2.apiKeys,writeFileSync17(settingsPath,JSON.stringify(settings2,null,2))}}catch{}return Object.keys(migrated).length>0&&(mkdirSync20(dirname30(authPath),{recursive:!0}),writeFileSync17(authPath,JSON.stringify(migrated,null,2),{mode:384})),providers}function migrateSessionsFromAgentRoot(){let agentDir=getAgentDir(),files;try{files=readdirSync18(agentDir).filter(f=>f.endsWith(".jsonl")).map(f=>join64(agentDir,f))}catch{return}if(files.length!==0)for(let file of files)try{let firstLine=readFileSync27(file,"utf8").split(`
1507
1507
  `)[0];if(!firstLine?.trim())continue;let header=JSON.parse(firstLine);if(header.type!=="session"||!header.cwd)continue;let safePath=`--${header.cwd.replace(/^[/\\]/,"").replace(/[/\\:]/g,"-")}--`,correctDir=join64(agentDir,"sessions",safePath);existsSync31(correctDir)||mkdirSync20(correctDir,{recursive:!0});let fileName=file.split("/").pop()||file.split("\\").pop(),newPath=join64(correctDir,fileName);if(existsSync31(newPath))continue;renameSync4(file,newPath)}catch{}}function migrateCommandsToPrompts(baseDir,label){let commandsDir=join64(baseDir,"commands"),promptsDir=join64(baseDir,"prompts");if(existsSync31(commandsDir)&&!existsSync31(promptsDir))try{return renameSync4(commandsDir,promptsDir),console.log(source_default.green(`Migrated ${label} commands/ \u2192 prompts/`)),!0}catch(err2){console.log(source_default.yellow(`Warning: Could not migrate ${label} commands/ to prompts/: ${err2 instanceof Error?err2.message:err2}`))}return!1}function migrateKeybindingsConfigFile(){let configPath=join64(getAgentDir(),"keybindings.json");if(existsSync31(configPath))try{let parsed=JSON.parse(stripBom(readFileSync27(configPath,"utf-8")));if(typeof parsed!="object"||parsed===null||Array.isArray(parsed))return;let{config,migrated}=migrateKeybindingsConfig(parsed);if(!migrated)return;writeFileSync17(configPath,`${JSON.stringify(config,null,2)}
1508
1508
  `,"utf-8")}catch{}}function migrateToolsToBin(){let agentDir=getAgentDir(),toolsDir=join64(agentDir,"tools"),binDir=getBinDir();if(!existsSync31(toolsDir))return;let binaries=["fd","rg","fd.exe","rg.exe"],movedAny=!1;for(let bin of binaries){let oldPath=join64(toolsDir,bin),newPath=join64(binDir,bin);if(existsSync31(oldPath))if(existsSync31(binDir)||mkdirSync20(binDir,{recursive:!0}),existsSync31(newPath))try{rmSync6?.(oldPath,{force:!0})}catch{}else try{renameSync4(oldPath,newPath),movedAny=!0}catch{}}movedAny&&console.log(source_default.green("Migrated managed binaries tools/ \u2192 bin/"))}function checkDeprecatedExtensionDirs(baseDir,label){let hooksDir=join64(baseDir,"hooks"),toolsDir=join64(baseDir,"tools"),warnings=[];if(existsSync31(hooksDir)&&warnings.push(`${label} hooks/ directory found. Hooks have been renamed to extensions.`),existsSync31(toolsDir))try{readdirSync18(toolsDir).filter(e=>{let lower=e.toLowerCase();return lower!=="fd"&&lower!=="rg"&&lower!=="fd.exe"&&lower!=="rg.exe"&&!e.startsWith(".")}).length>0&&warnings.push(`${label} tools/ directory contains custom tools. Custom tools have been merged into extensions.`)}catch{}return warnings}function migrateExtensionSystem(cwd){let agentDir=getAgentDir(),projectDir=join64(cwd,CONFIG_DIR_NAME);return migrateCommandsToPrompts(agentDir,"Global"),migrateCommandsToPrompts(projectDir,"Project"),[...checkDeprecatedExtensionDirs(agentDir,"Global"),...checkDeprecatedExtensionDirs(projectDir,"Project")]}async function showDeprecationWarnings(warnings){if(warnings.length!==0){for(let warning of warnings)console.log(source_default.yellow(`Warning: ${warning}`));console.log(source_default.yellow(`
1509
1509
  Move your extensions to the extensions/ directory.`)),console.log(source_default.yellow(`Migration guide: ${MIGRATION_GUIDE_URL}`)),console.log(source_default.yellow(`Documentation: ${EXTENSIONS_DOC_URL}`)),console.log()}}function runMigrations(cwd){let migratedAuthProviders=migrateAuthToAuthJson();migrateSessionsFromAgentRoot(),migrateToolsToBin(),migrateKeybindingsConfigFile();let deprecationWarnings=migrateExtensionSystem(cwd);return{migratedAuthProviders,deprecationWarnings}}import{existsSync as existsSync33,mkdirSync as mkdirSync22,mkdtempSync as mkdtempSync2,readdirSync as readdirSync19,readFileSync as readFileSync28,renameSync as renameSync6,rmSync as rmSync8,writeFileSync as writeFileSync18}from"node:fs";import{join as join67,resolve as resolve24}from"node:path";var import_proper_lockfile3=__toESM(require_proper_lockfile(),1);import{homedir as homedir10}from"node:os";import{basename as basename16,dirname as dirname31,join as join65,relative as relative12}from"node:path";var MAX_PROFILE_ID_CHARS=128,MAX_SELECTION_IDS=128,MAX_CATALOG_ENTRIES=256,MAX_DIAGNOSTIC_CODES2=16;function boundedCount(value,maximum){return value===void 0?{count:0,truncated:!1}:{count:Math.min(value.length,maximum),truncated:value.length>maximum}}function summarizePluginSelectionV1(selection){if(selection===void 0)return Object.freeze({present:!1,selectedCount:0,disabledCount:0,truncated:!1});let selected=boundedCount(selection.selectedPluginIds,MAX_SELECTION_IDS),disabled=boundedCount(selection.disabledPluginIds,MAX_SELECTION_IDS);return Object.freeze({present:!0,selectedCount:selected.count,disabledCount:disabled.count,truncated:selected.truncated||disabled.truncated})}function summarizePluginCatalogV1(catalog){if(catalog===void 0)return Object.freeze({present:!1,entryCount:0,readyCount:0,unavailableCount:0,truncated:!1});let entries=catalog.entries.slice(0,MAX_CATALOG_ENTRIES),readyCount=entries.filter(entry=>entry.resolution.status==="installed-ready").length;return Object.freeze({present:!0,entryCount:entries.length,readyCount,unavailableCount:entries.length-readyCount,truncated:catalog.truncated||catalog.entries.length>MAX_CATALOG_ENTRIES})}function validateProfileId(profileId){if(typeof profileId!="string"||profileId.trim().length===0||profileId.length>MAX_PROFILE_ID_CHARS||/[\u0000-\u001f]/u.test(profileId))throw new Error("invalid plugin selection profile ID");return profileId}function emptySelectionSummary(){return Object.freeze({present:!1,selectedCount:0,disabledCount:0,truncated:!1})}function diagnosticCodes2(result){return result.status==="ok"||result.status==="missing"?Object.freeze([]):Object.freeze(result.diagnostics.slice(0,MAX_DIAGNOSTIC_CODES2).map(item=>item.code))}function selectionForProfile2(result,profileId){return result.snapshot.selections.find(selection=>selection.profileId===profileId)}var PluginSelectionEntryComponent=class{profileId;store;controller;onOpen;onClose;requestRender;selection;catalog;uiProfile;uiPluginIndex=0;_focused=!1;get focused(){return this._focused}set focused(value){this._focused=value}constructor(options){if(this.profileId=validateProfileId(options.profileId),options.selection!==void 0&&options.selection.profileId!==this.profileId)throw new Error("plugin selection profile does not match the entry profile");this.store=options.store,this.controller=options.controller,this.onOpen=options.onOpen,this.onClose=options.onClose,this.requestRender=options.requestRender,this.selection=summarizePluginSelectionV1(options.selection),this.catalog=summarizePluginCatalogV1(options.catalog),this.uiProfile=options.snapshot?.profiles.find(profile=>profile.profileId===this.profileId)}hasHostEntry(){return this.store!==void 0||this.controller!==void 0||this.onOpen!==void 0}render(width){if(!this.hasHostEntry())return[truncateToWidth(theme.fg("dim"," Plugins: unsupported (host selection entry not injected)"),width,"...")];if(this._focused&&this.uiProfile!==void 0){let lines=[truncateToWidth(theme.bold(` Plugins \xB7 ${this.uiProfile.profileId}`),width,"...")];for(let[index3,plugin]of this.uiProfile.plugins.entries()){let cursor=index3===this.uiPluginIndex?">":" ",state2=plugin.state==="selected"?"on":plugin.state==="disabled"?"off":"available",availability=plugin.availability==="ready"?"ready":"unavailable";lines.push(truncateToWidth(` ${cursor} [${state2}] ${plugin.pluginId} (${availability})`,width,"..."))}return lines.push(truncateToWidth(theme.fg("dim"," Enter/Space toggle \xB7 Esc close"),width,"...")),lines}let selectionText=this.selection.present?`selected ${this.selection.selectedCount}, disabled ${this.selection.disabledCount}${this.selection.truncated?", bounded":""}`:this.store===void 0?"selection pending":"selection not loaded",catalogText=this.catalog.present?`catalog ${this.catalog.entryCount} (${this.catalog.readyCount} ready, ${this.catalog.unavailableCount} unavailable${this.catalog.truncated?", bounded":""})`:"catalog unavailable",suffix=this.onOpen===void 0?"host store":"open via host callback";return[truncateToWidth(theme.fg("muted",` Plugins: profile ${this.profileId} \xB7 ${selectionText} \xB7 ${catalogText} \xB7 ${suffix}`),width,"...")]}setUiSnapshot(result){result.status==="ok"&&(this.uiProfile=result.snapshot.profiles.find(profile=>profile.profileId===this.profileId),this.uiProfile!==void 0&&(this.uiPluginIndex=Math.min(this.uiPluginIndex,Math.max(0,this.uiProfile.plugins.length-1))))}currentUiPlugin(){return this.uiProfile?.plugins[this.uiPluginIndex]}handleInput(data){if(!this._focused||this.uiProfile===void 0)return;let keybindings=getKeybindings();if(keybindings.matches(data,"tui.select.up")){this.uiPluginIndex=Math.max(0,this.uiPluginIndex-1),this.requestRender?.();return}if(keybindings.matches(data,"tui.select.down")){this.uiPluginIndex=Math.min(this.uiProfile.plugins.length-1,this.uiPluginIndex+1),this.requestRender?.();return}if(keybindings.matches(data,"tui.select.cancel")){this._focused=!1,this.onClose?.(),this.requestRender?.();return}if(!keybindings.matches(data,"tui.select.confirm")&&data!==" ")return;let plugin=this.currentUiPlugin();plugin===void 0||this.controller===void 0||plugin.state==="disabled"&&plugin.availability!=="ready"||this.controller.toggle({profileId:this.profileId,pluginId:plugin.pluginId}).then(result=>{this.setUiSnapshot(result),this.requestRender?.()}).catch(()=>this.requestRender?.())}async openPluginSelection(){let controllerResult;this.controller!==void 0&&(controllerResult=await this.controller.getSnapshot(),this.setUiSnapshot(controllerResult));let status2=this.hasHostEntry()?"ready":"unsupported",selection=this.selection,codes=Object.freeze([]);if(controllerResult?.status==="error"&&(status2=controllerResult.code==="store-cancelled"?"cancelled":"invalid"),this.store!==void 0){let result=await this.store.read();if(codes=diagnosticCodes2(result),result.status==="ok"||result.status==="missing"){let storedSelection=selectionForProfile2(result,this.profileId);selection=summarizePluginSelectionV1(storedSelection),status2=result.status==="ok"?"ready":"missing"}else selection=emptySelectionSummary(),status2=result.status;this.selection=selection}let context=Object.freeze({profileId:this.profileId,status:status2,selection,catalog:this.catalog,diagnosticCodes:codes});return this.onOpen!==void 0&&await this.onOpen(context),context}invalidate(){}getSelectionSummary(){return this.selection}getCatalogSummary(){return this.catalog}};var RESOURCE_TYPES2=["skills","prompts","themes"],RESOURCE_TYPE_LABELS={skills:"Skills",prompts:"Prompts",themes:"Themes"};function formatBaseDir(baseDir){let homeDir=homedir10(),displayPath;return baseDir===homeDir?displayPath="~":baseDir.startsWith(homeDir)?displayPath=`~${baseDir.slice(homeDir.length).replace(/\\/g,"/")}`:displayPath=baseDir.replace(/\\/g,"/"),displayPath.endsWith("/")?displayPath:`${displayPath}/`}function getGroupLabel(metadata,agentDir){return metadata.origin==="package"?`${metadata.source} (${metadata.scope})`:metadata.source==="auto"?metadata.baseDir?metadata.scope==="user"?`User (${formatBaseDir(metadata.baseDir)})`:`Project (${formatBaseDir(metadata.baseDir)})`:metadata.scope==="user"?`User (${formatBaseDir(agentDir)})`:`Project (${CONFIG_DIR_NAME}/)`:metadata.scope==="user"?"User settings":"Project settings"}function buildGroups(resolved,agentDir){let groupMap=new Map,addToGroup=(resources,resourceType)=>{for(let res of resources){let{path:path15,enabled,metadata}=res,groupKey2=`${metadata.origin}:${metadata.scope}:${metadata.source}:${metadata.baseDir??""}`;groupMap.has(groupKey2)||groupMap.set(groupKey2,{key:groupKey2,label:getGroupLabel(metadata,agentDir),scope:metadata.scope,origin:metadata.origin,source:metadata.source,subgroups:[]});let group=groupMap.get(groupKey2),subgroupKey=`${groupKey2}:${resourceType}`,subgroup=group.subgroups.find(sg=>sg.type===resourceType);subgroup||(subgroup={type:resourceType,label:RESOURCE_TYPE_LABELS[resourceType],items:[]},group.subgroups.push(subgroup));let fileName=basename16(path15),parentFolder=basename16(dirname31(path15)),displayName;resourceType==="skills"&&fileName==="SKILL.md"?displayName=parentFolder:displayName=fileName,subgroup.items.push({path:path15,enabled,metadata,resourceType,displayName,groupKey:groupKey2,subgroupKey})}};addToGroup(resolved.skills,"skills"),addToGroup(resolved.prompts,"prompts"),addToGroup(resolved.themes,"themes");let groups=Array.from(groupMap.values());groups.sort((a,b2)=>a.origin!==b2.origin?a.origin==="package"?-1:1:a.scope!==b2.scope?a.scope==="user"?-1:1:a.source.localeCompare(b2.source));let typeOrder={skills:0,prompts:1,themes:2};for(let group of groups){group.subgroups.sort((a,b2)=>typeOrder[a.type]-typeOrder[b2.type]);for(let subgroup of group.subgroups)subgroup.items.sort((a,b2)=>a.displayName.localeCompare(b2.displayName))}return groups}var ConfigSelectorHeader=class{writeScope;projectModeAvailable;constructor(writeScope,projectModeAvailable){this.writeScope=writeScope,this.projectModeAvailable=projectModeAvailable}setWriteScope(writeScope){this.writeScope=writeScope}invalidate(){}render(width){let title=theme.bold(this.writeScope==="project"?"Project Local Resources":"Global Resources"),sep15=theme.fg("muted"," \xB7 "),switchHint=this.projectModeAvailable?keyHint("tui.input.tab","switch mode")+sep15:"",actionHint=this.writeScope==="project"?rawKeyHint("space","cycle inherit/+/-"):rawKeyHint("space","toggle"),hint=switchHint+actionHint+sep15+rawKeyHint("esc","close"),spacing=Math.max(1,width-visibleWidth(title)-visibleWidth(hint)),scopeHint=this.writeScope==="project"?theme.fg("muted",`${CONFIG_DIR_NAME}/settings.json \xB7 inherited global resources are dimmed`):theme.fg("muted",`~/${CONFIG_DIR_NAME}/agent/settings.json`);return[truncateToWidth(`${title}${" ".repeat(spacing)}${hint}`,width,""),truncateToWidth(scopeHint,width,"")]}},ResourceList=class{groupsByScope;flatItems=[];filteredItems=[];selectedIndex=0;searchInput;maxVisible;settingsManager;cwd;agentDir;writeScope;inheritedEnabledByKey;pluginSelectionEntry;pluginManagerEntry;pluginManagerScope;onCancel;onExit;onToggle;onSwitchMode;_focused=!1;get focused(){return this._focused}set focused(value){this._focused=value,this.searchInput.focused=value}constructor(groupsByScope,settingsManager,cwd,agentDir,terminalHeight,writeScope="global",pluginSelectionEntry,pluginManagerEntry,pluginManagerScope="global"){this.groupsByScope=groupsByScope,this.settingsManager=settingsManager,this.cwd=cwd,this.agentDir=agentDir,this.writeScope=writeScope,this.pluginSelectionEntry=pluginSelectionEntry,this.pluginManagerEntry=pluginManagerEntry,this.pluginManagerScope=pluginManagerScope,this.inheritedEnabledByKey=this.buildInheritedEnabledMap(groupsByScope.global),this.searchInput=new Input;let chrome=8;this.maxVisible=Math.max(5,(terminalHeight??24)-chrome),this.buildFlatList(),this.filteredItems=[...this.flatItems]}setWriteScope(writeScope){this.writeScope=writeScope,this.buildFlatList(),this.filterItems(this.searchInput.getValue())}get groups(){return this.groupsByScope[this.writeScope]}buildInheritedEnabledMap(groups){let result=new Map;for(let group of groups)for(let subgroup of group.subgroups)for(let item of subgroup.items)result.set(this.getResourceItemKey(item),item.enabled);return result}buildFlatList(){this.flatItems=[];for(let group of this.groups){this.flatItems.push({type:"group",group});for(let subgroup of group.subgroups){this.flatItems.push({type:"subgroup",subgroup,group});for(let item of subgroup.items)this.flatItems.push({type:"item",item})}}this.pluginSelectionEntry!==void 0&&this.flatItems.push({type:"plugin",entry:this.pluginSelectionEntry}),this.pluginManagerEntry!==void 0&&this.writeScope===this.pluginManagerScope&&this.flatItems.push({type:"plugin-manager",entry:this.pluginManagerEntry}),this.selectedIndex=this.flatItems.findIndex(e=>e.type==="item"||e.type==="plugin"||e.type==="plugin-manager"),this.selectedIndex<0&&(this.selectedIndex=0)}findNextItem(fromIndex,direction){let idx=fromIndex+direction;for(;idx>=0&&idx<this.filteredItems.length;){if(this.filteredItems[idx].type==="item"||this.filteredItems[idx].type==="plugin"||this.filteredItems[idx].type==="plugin-manager")return idx;idx+=direction}return fromIndex}filterItems(query){if(!query.trim()){this.filteredItems=[...this.flatItems],this.selectFirstItem();return}let lowerQuery=query.toLowerCase(),matchingItems=new Set,matchingSubgroups=new Set,matchingGroups=new Set;for(let entry of this.flatItems)if(entry.type==="item"){let item=entry.item;(item.displayName.toLowerCase().includes(lowerQuery)||item.resourceType.toLowerCase().includes(lowerQuery)||item.path.toLowerCase().includes(lowerQuery))&&matchingItems.add(item)}for(let group of this.groups)for(let subgroup of group.subgroups)for(let item of subgroup.items)matchingItems.has(item)&&(matchingSubgroups.add(subgroup),matchingGroups.add(group));this.filteredItems=[];for(let entry of this.flatItems)entry.type==="group"&&matchingGroups.has(entry.group)?this.filteredItems.push(entry):entry.type==="subgroup"&&matchingSubgroups.has(entry.subgroup)?this.filteredItems.push(entry):entry.type==="item"&&matchingItems.has(entry.item)&&this.filteredItems.push(entry);this.selectFirstItem()}selectFirstItem(){let firstItemIndex=this.filteredItems.findIndex(e=>e.type==="item"||e.type==="plugin"||e.type==="plugin-manager");this.selectedIndex=firstItemIndex>=0?firstItemIndex:0}updateItem(item,enabled){item.enabled=enabled;for(let group of this.groups)for(let subgroup of group.subgroups){let found=subgroup.items.find(i=>i.path===item.path&&i.resourceType===item.resourceType);if(found){found.enabled=enabled;return}}}invalidate(){}render(width){let lines=[];if(lines.push(...this.searchInput.render(width)),lines.push(""),this.filteredItems.length===0)return lines.push(theme.fg("muted"," No resources found")),lines;let startIndex=Math.max(0,Math.min(this.selectedIndex-Math.floor(this.maxVisible/2),this.filteredItems.length-this.maxVisible)),endIndex=Math.min(startIndex+this.maxVisible,this.filteredItems.length);for(let i=startIndex;i<endIndex;i++){let entry=this.filteredItems[i],isSelected=i===this.selectedIndex;if(entry.type==="group"){let inherited=this.writeScope==="project"&&entry.group.scope==="user",label=theme.bold(`${entry.group.label}${inherited?" \xB7 inherited global":""}`),groupLine=theme.fg(inherited?"dim":"accent",label);lines.push(truncateToWidth(` ${groupLine}`,width,""))}else if(entry.type==="subgroup"){let color=this.writeScope==="project"&&entry.group.scope==="user"?"dim":"muted",subgroupLine=theme.fg(color,entry.subgroup.label);lines.push(truncateToWidth(` ${subgroupLine}`,width,""))}else if(entry.type==="plugin"){let prefix=isSelected?"> ":" ";for(let line of entry.entry.render(width))lines.push(truncateToWidth(`${prefix}${line.trimStart()}`,width,"..."))}else if(entry.type==="plugin-manager"){let prefix=isSelected?"> ":" ";for(let line of entry.entry.render(width))lines.push(truncateToWidth(`${prefix}${line.trimStart()}`,width,"..."))}else{let item=entry.item,cursor=isSelected?"> ":" ",dimmed=this.isDimmedItem(item),nameText=isSelected&&!dimmed?theme.bold(item.displayName):item.displayName,name=dimmed?theme.fg("dim",nameText):nameText;lines.push(truncateToWidth(`${cursor} ${this.renderCheckbox(item)} ${name}${this.getItemSuffix(item)}`,width,"..."))}}if(startIndex>0||endIndex<this.filteredItems.length){let itemCount=this.filteredItems.filter(e=>e.type==="item"||e.type==="plugin"||e.type==="plugin-manager").length,currentItemIndex=this.filteredItems.slice(0,this.selectedIndex).filter(e=>e.type==="item"||e.type==="plugin"||e.type==="plugin-manager").length+1;lines.push(theme.fg("dim",` (${currentItemIndex}/${itemCount})`))}return lines}handleInput(data){let kb=getKeybindings();if(this.pluginSelectionEntry?.focused===!0){this.pluginSelectionEntry.handleInput(data);return}if(this.pluginManagerEntry?.focused===!0){this.pluginManagerEntry.handleInput(data);return}if(kb.matches(data,"tui.select.up")){this.selectedIndex=this.findNextItem(this.selectedIndex,-1);return}if(kb.matches(data,"tui.select.down")){this.selectedIndex=this.findNextItem(this.selectedIndex,1);return}if(kb.matches(data,"tui.select.pageUp")){let target=Math.max(0,this.selectedIndex-this.maxVisible);for(;target<this.filteredItems.length&&this.filteredItems[target].type!=="item"&&this.filteredItems[target].type!=="plugin"&&this.filteredItems[target].type!=="plugin-manager";)target++;target<this.filteredItems.length&&(this.selectedIndex=target);return}if(kb.matches(data,"tui.select.pageDown")){let target=Math.min(this.filteredItems.length-1,this.selectedIndex+this.maxVisible);for(;target>=0&&this.filteredItems[target].type!=="item"&&this.filteredItems[target].type!=="plugin"&&this.filteredItems[target].type!=="plugin-manager";)target--;target>=0&&(this.selectedIndex=target);return}if(kb.matches(data,"tui.select.cancel")){this.onCancel?.();return}if(kb.matches(data,"app.config.exit")){this.onExit?.();return}if(kb.matches(data,"tui.input.tab")){this.onSwitchMode?.();return}if(data===" "||kb.matches(data,"tui.select.confirm")){let entry=this.filteredItems[this.selectedIndex];if(entry?.type==="plugin"&&this.writeScope==="global"){entry.entry.focused=!0,entry.entry.openPluginSelection();return}if(entry?.type==="plugin-manager"&&this.writeScope===this.pluginManagerScope){entry.entry.focused=!0,entry.entry.openPluginManager();return}if(entry?.type==="item"&&(this.writeScope==="project"||this.getItemScope(entry.item)==="user")){let newEnabled=this.toggleResource(entry.item);newEnabled!==void 0&&(this.updateItem(entry.item,newEnabled),this.onToggle?.(entry.item,newEnabled))}return}this.searchInput.handleInput(data),this.filterItems(this.searchInput.getValue())}toggleResource(item){if(this.writeScope==="project"){let state2=this.getNextOverrideState(item);return this.setProjectResourceOverride(item,state2)?state2==="inherit"?this.getInheritedEnabled(item):state2==="load":void 0}let enabled=!item.enabled;return item.metadata.origin==="top-level"?this.toggleTopLevelResource(item,enabled):this.togglePackageResource(item,enabled),enabled}toggleTopLevelResource(item,enabled){let scope=item.metadata.scope,settings2=scope==="project"?this.settingsManager.getProjectSettings():this.settingsManager.getGlobalSettings(),arrayKey=item.resourceType,current=settings2[arrayKey]??[],pattern=this.getResourcePattern(item),disablePattern=`-${pattern}`,enablePattern=`+${pattern}`,updated=current.filter(p=>(p.startsWith("!")||p.startsWith("+")||p.startsWith("-")?p.slice(1):p)!==pattern);enabled?updated.push(enablePattern):updated.push(disablePattern),scope==="project"?arrayKey==="skills"?this.settingsManager.setProjectSkillPaths(updated):arrayKey==="prompts"?this.settingsManager.setProjectPromptTemplatePaths(updated):arrayKey==="themes"&&this.settingsManager.setProjectThemePaths(updated):arrayKey==="skills"?this.settingsManager.setSkillPaths(updated):arrayKey==="prompts"?this.settingsManager.setPromptTemplatePaths(updated):arrayKey==="themes"&&this.settingsManager.setThemePaths(updated)}togglePackageResource(item,enabled){let scope=item.metadata.scope,packages=[...(scope==="project"?this.settingsManager.getProjectSettings():this.settingsManager.getGlobalSettings()).packages??[]],pkgIndex=packages.findIndex(pkg3=>(typeof pkg3=="string"?pkg3:pkg3.source)===item.metadata.source);if(pkgIndex===-1)return;let pkg2=packages[pkgIndex];typeof pkg2=="string"&&(pkg2={source:pkg2},packages[pkgIndex]=pkg2);let arrayKey=item.resourceType,current=pkg2[arrayKey]??[],pattern=this.getPackageResourcePattern(item),disablePattern=`-${pattern}`,enablePattern=`+${pattern}`,updated=current.filter(p=>(p.startsWith("!")||p.startsWith("+")||p.startsWith("-")?p.slice(1):p)!==pattern);enabled?updated.push(enablePattern):updated.push(disablePattern),pkg2[arrayKey]=updated.length>0?updated:void 0,["skills","prompts","themes"].some(k=>pkg2[k]!==void 0)||(packages[pkgIndex]=pkg2.source),scope==="project"?this.settingsManager.setProjectPackages(packages):this.settingsManager.setPackages(packages)}renderCheckbox(item){if(this.writeScope==="project"){let state2=this.getProjectOverrideState(item);return state2==="load"?theme.fg("success","[+]"):state2==="unload"?theme.fg("warning","[-]"):theme.fg("dim",item.enabled?"[x]":"[ ]")}return item.enabled?theme.fg("success","[x]"):theme.fg("dim","[ ]")}getItemSuffix(item){if(this.writeScope!=="project")return"";let state2=this.getProjectOverrideState(item);return state2==="load"?theme.fg("muted"," project load"):state2==="unload"?theme.fg("muted"," project unload"):this.isInheritedGlobalItem(item)?theme.fg("dim"," inherited global"):""}isDimmedItem(item){return this.writeScope==="project"&&this.isInheritedGlobalItem(item)&&this.getProjectOverrideState(item)==="inherit"}setProjectResourceOverride(item,state2){return item.metadata.origin==="top-level"?this.setProjectTopLevelOverride(item,state2):this.setProjectPackageOverride(item,state2)}setProjectTopLevelOverride(item,state2){let current=this.settingsManager.getProjectSettings()[item.resourceType]??[],pattern=this.isInheritedGlobalItem(item)?item.path:this.getResourcePatternForScope(item,"project"),patterns=this.getTopLevelOverridePatterns(item,"project"),updated=current.filter(entry=>{let target=this.getPatternEntryTarget(entry);return(entry.startsWith("!")||entry.startsWith("+")||entry.startsWith("-"))&&patterns.has(target)?!1:!(state2==="inherit"&&this.isInheritedGlobalItem(item)&&target===pattern)});return state2!=="inherit"&&(this.isInheritedGlobalItem(item)&&!updated.includes(pattern)&&updated.push(pattern),updated.push(`${state2==="load"?"+":"-"}${pattern}`)),this.setProjectTopLevelPaths(item.resourceType,updated),!0}setProjectTopLevelPaths(key,paths){key==="skills"?this.settingsManager.setProjectSkillPaths(paths):key==="prompts"?this.settingsManager.setProjectPromptTemplatePaths(paths):this.settingsManager.setProjectThemePaths(paths)}setProjectPackageOverride(item,state2){let packages=[...this.settingsManager.getProjectSettings().packages??[]],pkgIndex=packages.findIndex(pkg3=>this.packageSourceStringMatches(item.metadata.source,this.getItemScope(item),typeof pkg3=="string"?pkg3:pkg3.source,"project"));if(pkgIndex===-1){if(state2==="inherit")return!1;packages.push(this.createPackageOverrideSource(item)),pkgIndex=packages.length-1}let pkg2=packages[pkgIndex];if(pkg2===void 0)return!1;typeof pkg2=="string"&&(pkg2={source:pkg2},packages[pkgIndex]=pkg2);let pattern=this.getPackageResourcePattern(item),updated=(pkg2[item.resourceType]??[]).filter(entry=>this.getPatternEntryTarget(entry)!==pattern);return state2!=="inherit"&&updated.push(`${state2==="load"?"+":"-"}${pattern}`),pkg2[item.resourceType]=updated.length>0?updated:void 0,RESOURCE_TYPES2.some(key=>pkg2[key]!==void 0)||(pkg2.autoload===!1?packages.splice(pkgIndex,1):packages[pkgIndex]=pkg2.source),this.settingsManager.setProjectPackages(packages),!0}getNextOverrideState(item){let state2=this.getProjectOverrideState(item),inheritedEnabled=this.getInheritedEnabled(item);return state2==="inherit"?inheritedEnabled?"unload":"load":state2==="unload"?inheritedEnabled?"load":"inherit":inheritedEnabled?"inherit":"unload"}getProjectOverrideState(item){if(this.writeScope!=="project")return"inherit";if(item.metadata.origin==="top-level")return this.getOverrideStateFromEntries(this.settingsManager.getProjectSettings()[item.resourceType]??[],this.getTopLevelOverridePatterns(item,"project"),!1);let pkg2=this.findMatchingPackageSource(item,"project");if(typeof pkg2!="object")return"inherit";let entries=pkg2[item.resourceType];return entries===void 0?"inherit":this.getOverrideStateFromEntries(entries,new Set([this.getPackageResourcePattern(item)]),pkg2.autoload!==!1)}getOverrideStateFromEntries(entries,patterns,emptyArrayIsUnload){if(entries.length===0&&emptyArrayIsUnload)return"unload";let state2="inherit";for(let entry of entries)patterns.has(this.getPatternEntryTarget(entry))&&(entry.startsWith("!")||entry.startsWith("-")?state2="unload":state2="load");return state2}getInheritedEnabled(item){return this.inheritedEnabledByKey.get(this.getResourceItemKey(item))??(this.getItemScope(item)==="user"?item.enabled:!0)}isInheritedGlobalItem(item){return this.getItemScope(item)==="user"||this.inheritedEnabledByKey.has(this.getResourceItemKey(item))}getTopLevelOverridePatterns(item,scope){let baseDir=this.getTopLevelBaseDir(scope),patterns=new Set([this.getResourcePatternForScope(item,scope),item.path,relative12(baseDir,item.path)]);return item.metadata.baseDir&&patterns.add(relative12(item.metadata.baseDir,item.path)),patterns}getResourcePatternForScope(item,scope){let sourceScope=this.getItemScope(item);if(scope!==sourceScope)return item.path;let baseDir=item.metadata.baseDir??this.getTopLevelBaseDir(sourceScope);return relative12(baseDir,item.path)}createPackageOverrideSource(item){let source=item.metadata.source;if(!isLocalPath(source))return{source,autoload:!1};let sourcePath=resolvePath(source,this.getTopLevelBaseDir(this.getItemScope(item)),{trim:!0});return{source:relative12(this.getTopLevelBaseDir("project"),sourcePath)||".",autoload:!1}}packageSourceStringMatches(leftSource,leftScope,rightSource,rightScope){if(leftSource===rightSource)return!0;if(!isLocalPath(leftSource)||!isLocalPath(rightSource))return!1;let left=resolvePath(leftSource,this.getTopLevelBaseDir(leftScope),{trim:!0}),right=resolvePath(rightSource,this.getTopLevelBaseDir(rightScope),{trim:!0});return left===right}findMatchingPackageSource(item,targetScope){return((targetScope==="project"?this.settingsManager.getProjectSettings():this.settingsManager.getGlobalSettings()).packages??[]).find(pkg2=>this.packageSourceStringMatches(item.metadata.source,this.getItemScope(item),typeof pkg2=="string"?pkg2:pkg2.source,targetScope))}getPatternEntryTarget(entry){return entry.startsWith("!")||entry.startsWith("+")||entry.startsWith("-")?entry.slice(1):entry}getResourceItemKey(item){return`${item.resourceType}:${canonicalizePath(item.path)}`}getItemScope(item){return item.metadata.scope==="project"?"project":"user"}getTopLevelBaseDir(scope){return scope==="project"?join65(this.cwd,CONFIG_DIR_NAME):this.agentDir}getResourcePattern(item){let scope=item.metadata.scope,baseDir=item.metadata.baseDir??this.getTopLevelBaseDir(scope);return relative12(baseDir,item.path)}getPackageResourcePattern(item){let baseDir=item.metadata.baseDir??dirname31(item.path);return relative12(baseDir,item.path)}},ConfigSelectorComponent=class extends Container{header;resourceList;pluginSelectionEntry;pluginManagerEntry;writeScope;_focused=!1;get focused(){return this._focused}set focused(value){this._focused=value,this.resourceList.focused=value}constructor(resolvedPaths,settingsManager,cwd,agentDir,onClose,onExit,requestRender,terminalHeight,writeScope="global",projectModeAvailable=!0,pluginSelection,pluginManager,pluginManagerScope="global"){super(),this.writeScope=writeScope;let groupsByScope={global:buildGroups(resolvedPaths.global,agentDir),project:buildGroups(resolvedPaths.project,agentDir)},pluginSelectionEntry=pluginSelection===void 0?void 0:new PluginSelectionEntryComponent({...pluginSelection,onClose:()=>{pluginSelection.onClose?.()},requestRender});this.pluginSelectionEntry=pluginSelectionEntry;let pluginManagerEntry=pluginManager===void 0?void 0:new PluginManagerEntryComponent({...pluginManager,onClose:()=>{pluginManager.onClose?.()},requestRender});this.pluginManagerEntry=pluginManagerEntry,this.addChild(new Spacer(1)),this.addChild(new DynamicBorder),this.addChild(new Spacer(1)),this.header=new ConfigSelectorHeader(this.writeScope,projectModeAvailable),this.addChild(this.header),this.addChild(new Spacer(1)),this.resourceList=new ResourceList(groupsByScope,settingsManager,cwd,agentDir,terminalHeight===void 0?void 0:Math.max(5,terminalHeight-(pluginSelection===void 0?0:2)-(pluginManager===void 0?0:2)),this.writeScope,pluginSelectionEntry,pluginManagerEntry,pluginManagerScope),this.resourceList.onCancel=onClose,this.resourceList.onExit=onExit,this.resourceList.onToggle=()=>requestRender(),projectModeAvailable&&(this.resourceList.onSwitchMode=()=>{this.switchWriteScope(),requestRender()}),this.addChild(this.resourceList),this.addChild(new Spacer(1)),this.addChild(new DynamicBorder)}switchWriteScope(){this.writeScope=this.writeScope==="global"?"project":"global",this.header.setWriteScope(this.writeScope),this.resourceList.setWriteScope(this.writeScope)}getResourceList(){return this.resourceList}getPluginSelectionEntry(){return this.pluginSelectionEntry}getPluginManagerEntry(){return this.pluginManagerEntry}async openPluginSelection(){return this.pluginSelectionEntry===void 0?void 0:await this.pluginSelectionEntry.openPluginSelection()}async openPluginManager(){return this.pluginManagerEntry===void 0?void 0:await this.pluginManagerEntry.openPluginManager()}};async function selectConfig(options){initTheme(options.settingsManager.getTheme(),!0);let pluginSnapshot=options.pluginSelectionController?await options.pluginSelectionController.getSnapshot():void 0,pluginManagerSnapshot=options.pluginManagerController?await options.pluginManagerController.getSnapshot():void 0;return new Promise(resolve25=>{let ui=new TuiMainScreen(new ProcessTerminal,void 0,options.agentDir),resolved=!1,selector=new ConfigSelectorComponent(options.resolvedPaths,options.settingsManager,options.cwd,options.agentDir,()=>{resolved||(resolved=!0,ui.stop(),stopThemeWatcher(),resolve25())},()=>{ui.stop(),stopThemeWatcher(),process.exit(0)},()=>ui.requestRender(),ui.terminal.rows,options.writeScope,options.projectModeAvailable,options.pluginSelectionController===void 0?void 0:{profileId:options.pluginSelectionProfileId??"coding-core",controller:options.pluginSelectionController,snapshot:pluginSnapshot?.status==="ok"?pluginSnapshot.snapshot:void 0,onOpen:()=>ui.requestRender(),requestRender:()=>ui.requestRender()},options.pluginManagerController===void 0?void 0:{controller:options.pluginManagerController,snapshot:pluginManagerSnapshot?.status==="ok"?pluginManagerSnapshot.snapshot:void 0,requestRender:()=>ui.requestRender()},options.pluginManagerScope);ui.addChild(selector),ui.setFocus(selector.getResourceList()),ui.start()})}import{randomUUID as randomUUID21}from"node:crypto";import{copyFileSync as copyFileSync2,existsSync as existsSync32,mkdirSync as mkdirSync21,renameSync as renameSync5,rmSync as rmSync7}from"node:fs";import{basename as basename17,dirname as dirname32,join as join66,relative as relative13,resolve as resolve23,toNamespacedPath}from"node:path";var QUARANTINE_DIR_NAME=".agent-forge-native-quarantine";function normalizePath2(path15){return toNamespacedPath(resolve23(path15))}function getQuarantineRoot(packageDir){let current=resolve23(packageDir);for(;;){if(basename17(current).toLowerCase()==="node_modules")return join66(current,QUARANTINE_DIR_NAME);let parent=dirname32(current);if(parent===current)return;current=parent}}function getLoadedSharedObjectsInPackageDir(packageDir){let sharedObjects=process.report.getReport().sharedObjects;if(!Array.isArray(sharedObjects))return[];let root=normalizePath2(packageDir).toLowerCase(),seen=new Set,loadedFiles=[];for(let value of sharedObjects){if(typeof value!="string")continue;let filePath=normalizePath2(value),comparisonPath=filePath.toLowerCase();getCwdRelativePath(comparisonPath,root)===void 0||seen.has(comparisonPath)||(seen.add(comparisonPath),loadedFiles.push(filePath))}return loadedFiles}function cleanupWindowsSelfUpdateQuarantine(packageDir){let quarantineRoot=getQuarantineRoot(packageDir);if(quarantineRoot)try{rmSync7(quarantineRoot,{recursive:!0,force:!0})}catch{}}function quarantineWindowsNativeDependencies(packageDir){let resolvedPackageDir=normalizePath2(packageDir),quarantineRoot=getQuarantineRoot(resolvedPackageDir);if(!quarantineRoot)return;let loadedFiles=getLoadedSharedObjectsInPackageDir(resolvedPackageDir);if(loadedFiles.length===0)return;let quarantineRunDir=join66(quarantineRoot,`${Date.now()}-${process.pid}-${randomUUID21()}`);for(let loadedFile of loadedFiles){if(!existsSync32(loadedFile))continue;let quarantinePath=join66(quarantineRunDir,relative13(resolvedPackageDir,loadedFile));mkdirSync21(dirname32(quarantinePath),{recursive:!0}),renameSync5(loadedFile,quarantinePath),copyFileSync2(quarantinePath,loadedFile)}}var MANAGED_INSTALL_MARKER="managed-install.json",MANAGED_RELEASE_VERSION_RE=/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/;function getActiveManagedInstallRoot(){let configuredRoot=process.env.AGENT_FORGE_MANAGED_INSTALL_ROOT?.trim();if(!configuredRoot)return;let managedRoot=resolve24(configuredRoot),releasesDir=canonicalizePath(join67(managedRoot,"releases"));if(getCwdRelativePath(canonicalizePath(getPackageDir()),releasesDir)===void 0)return;let markerPath=join67(managedRoot,MANAGED_INSTALL_MARKER);try{let marker=JSON.parse(readFileSync28(markerPath,"utf8"));if(marker.kind!=="agent-forge-managed-install"||marker.schemaVersion!==1||marker.layout!=="releases-v1")throw new Error}catch{throw new Error(`Managed install marker is missing or invalid: ${markerPath}`)}return managedRoot}async function fetchInstallerArtifact(url,label){let response2=await fetch(url,{headers:{"User-Agent":getAgentForgeUserAgent(VERSION)}});if(!response2.ok)throw new Error(`Could not download managed installer ${label} from ${url}: HTTP ${response2.status}`);return await response2.text()}async function runManagedNpmCi(stageDir){let args=["ci","--ignore-scripts","--min-release-age=0","--omit=dev","--include=optional","--no-fund","--no-audit","--loglevel=error","--progress=false"],code=await waitForChildProcess(spawnProcess("npm",args,{cwd:stageDir,stdio:"inherit"}));if(code!==0)throw new Error(`npm ${args.join(" ")} exited with code ${code??"unknown"}`)}function verifyManagedRelease(releaseDir,expectedVersion){let binPath=join67(releaseDir,"node_modules",".bin",process.platform==="win32"?`${APP_NAME}.cmd`:APP_NAME),result=spawnProcessSync(binPath,["--version"],{encoding:"utf8",stdio:["ignore","pipe","pipe"]});if(result.error||result.status!==0){let reason=result.error?.message||result.stderr.trim()||`exit code ${result.status??"unknown"}`;throw new Error(`Could not verify managed ${APP_NAME} ${expectedVersion}: ${reason}`)}let installedVersion=result.stdout.trim();if(installedVersion!==expectedVersion)throw new Error(`Managed ${APP_NAME} smoke test returned version ${installedVersion}; expected ${expectedVersion}.`)}async function activateStagedRelease(stageDir,releaseDir){for(let attempt2=0;;attempt2++)try{renameSync6(stageDir,releaseDir);return}catch(error2){if(attempt2>=9||!existsSync33(stageDir))throw error2;await sleep3(1e3)}}function activateManagedRelease(managedRoot,version){let currentPath=join67(managedRoot,"current-version"),temporaryPath=join67(managedRoot,`current-version.tmp.${process.pid}-${Date.now()}`);try{writeFileSync18(temporaryPath,`${version}
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url);
3
- import{APP_NAME,configureHttpDispatcher,main}from"./chunks/chunk-4NKZMFSZ.js";import"./chunks/chunk-JUUC5AZY.js";import"./chunks/chunk-XDUWOHPL.js";import"./chunks/chunk-3QKHSPQL.js";import"./chunks/chunk-DRQDKNXA.js";import"./chunks/chunk-7ZY7IXZD.js";import"./chunks/chunk-V46XUTK3.js";import"./chunks/chunk-WGLBM2BP.js";import"./chunks/chunk-4L3WN2XY.js";process.title=APP_NAME;process.env.AGENT_FORGE="true";process.env.AI_AGENT="agent-forge";process.emitWarning=(()=>{});configureHttpDispatcher();main(process.argv.slice(2));
3
+ import{APP_NAME,configureHttpDispatcher,main}from"./chunks/chunk-WJR4VZLQ.js";import"./chunks/chunk-JUUC5AZY.js";import"./chunks/chunk-XDUWOHPL.js";import"./chunks/chunk-3QKHSPQL.js";import"./chunks/chunk-DRQDKNXA.js";import"./chunks/chunk-7ZY7IXZD.js";import"./chunks/chunk-V46XUTK3.js";import"./chunks/chunk-WGLBM2BP.js";import"./chunks/chunk-4L3WN2XY.js";process.title=APP_NAME;process.env.AGENT_FORGE="true";process.env.AI_AGENT="agent-forge";process.emitWarning=(()=>{});configureHttpDispatcher();main(process.argv.slice(2));
@@ -1,5 +1,5 @@
1
1
  import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url);
2
- import{AgentCompositionRuntime,AgentSession,AgentSessionRuntime,ArminComponent,AssistantMessageComponent,BOOTSTRAP_COMPACTION_PLUGIN_ID,BOOTSTRAP_LIFECYCLE_PLUGIN_ID,BOOTSTRAP_RETRY_PLUGIN_ID,BOOTSTRAP_TOOLS_PLUGIN_ID,BashExecutionComponent,BranchSummaryMessageComponent,CAPABILITY_CALL_EVENT_ID,CAPABILITY_CALL_EVENT_VERSION,CONFIG_DIR_NAME,CURRENT_SESSION_VERSION,CancellableLoader,CodingAgentServerService,CodingAgentSessionRuntime,CompactionSummaryMessageComponent,Container,CredentialSynchronizationError,CustomEditor,CustomMessageComponent,DEFAULT_COMPACTION_POLICY_NAME,DEFAULT_COMPACTION_SETTINGS,DEFAULT_MAX_BYTES,DEFAULT_MAX_LINES,DEFAULT_RETRY_POLICY_NAME,DEFAULT_SUITE_ID,DefaultPackageManager,DefaultResourceLoader,DialogEditorComponent,DialogInputComponent,DialogSelectorComponent,DurableServiceErrorV1,DynamicBorder,EXPERIMENTAL_PUBLIC_API_VERSION,FileSessionStorageProvider,FooterComponent,InteractiveMode,LifecycleExecuteError,LifecycleTransformError,Loader,LoginDialogComponent,MEMORY_RECALL_TOOL_NAME,MODEL_RESPONSE_EVENT_ID,MODEL_RESPONSE_EVENT_VERSION,MODEL_STREAM_EVENT_ID,MODEL_STREAM_EVENT_VERSION,ModelRuntime,ModelSelectorComponent,OAuthSelectorComponent,OPERATION_CANCEL_EVENT_ID,OPERATION_CANCEL_EVENT_VERSION,OPERATION_END_EVENT_ID,OPERATION_END_EVENT_VERSION,OPERATION_START_EVENT_ID,OPERATION_START_EVENT_VERSION,OPERATION_STEP_EVENT_ID,OPERATION_STEP_EVENT_VERSION,PLUGIN_DISPOSE_EVENT_ID,PLUGIN_DISPOSE_EVENT_VERSION,PLUGIN_READY_EVENT_ID,PLUGIN_READY_EVENT_VERSION,PluginManagerEntryComponent,RpcClient,SESSION_COMPACTION_COMMIT_EVENT_ID,SESSION_COMPACTION_COMMIT_EVENT_VERSION,SESSION_CONTEXT_REPLACED_EVENT_ID,SESSION_CONTEXT_REPLACED_EVENT_VERSION,SESSION_RELOAD_EVENT_ID,SESSION_RELOAD_EVENT_VERSION,SUITE_DELETE_CONFIRM_TOKEN,SUMMARY_MODEL_INVOCATION_ERROR_CODES,SelectList,SessionHeaderScanLimitError,SessionManager,SessionSelectorComponent,SettingsManager,SettingsSelectorComponent,SkillInvocationMessageComponent,Spacer,SuiteLifecycleError,SuiteResolutionError,TOOL_CALL_EVENT_ID,TOOL_CALL_EVENT_VERSION,TOOL_COMMIT_EVENT_ID,TOOL_COMMIT_EVENT_VERSION,TOOL_EXECUTE_EVENT_ID,TOOL_EXECUTE_EVENT_VERSION,TOOL_RESULT_EVENT_ID,TOOL_RESULT_EVENT_VERSION,TOOL_RESULT_RAW_EVENT_ID,TOOL_RESULT_RAW_EVENT_VERSION,TOOL_RESULT_TRANSFORM_EVENT_ID,TOOL_RESULT_TRANSFORM_EVENT_VERSION,Text,Theme,ThinkingSelectorComponent,ToolExecutionComponent,TreeSelectorComponent,UserMessageComponent,UserMessageSelectorComponent,VERSION,assembleCodingAgentServer,assembleProfile,buildContextEntries,buildProfileIdentityV1,buildResolvedAgentProfileV1,buildSessionContext,calculateContextTokens,clearDanglingSuiteSettings,collectEntriesForBranchSummary,compact,convertToLlm,convertToPng,copyToClipboard,createAgentCompositionRuntime,createAgentSession,createAgentSessionFromServices,createAgentSessionRuntime,createAgentSessionServices,createBashTool,createBashToolDefinition,createCapabilityRuntime,createCodingTools,createDisposableRegistration,createDurableService,createEditTool,createEditToolDefinition,createEventEnvelope,createFileDurableStoreBackend,createFileSessionSource,createFindTool,createFindToolDefinition,createGrepTool,createGrepToolDefinition,createHostOutputProjector,createLocalBashOperations,createLocalPowerShellOperations,createLsTool,createLsToolDefinition,createPowerShellTool,createPowerShellToolDefinition,createProfileLock,createProfileMigrationPolicy,createProfileRegistry,createReadOnlyTools,createReadTool,createReadToolDefinition,createStableAgentSession,createStableAgentSessionRuntime,createStdioChannelAdapter,createSuite,createSyntheticSourceInfo,createWriteTool,createWriteToolDefinition,defineTool,deleteSuite,detachedSessionSnapshot,detectSupportedImageMimeTypeFromFile,discoverCapabilityPluginManifests,dist_exports,durableLogPath,ecosystem_exports,estimateTokens,findCutPoint,findSuiteSessionRefs,findTurnStartIndex,formatDimensionNote,formatSize,formatSkillsForPrompt,generateBranchSummary,generateDiffString,generateSummary,generateSummaryWithUsage,generateUnifiedPatch,getAgentDir,getAvailableThemes,getDocsPath,getExamplesPath,getLanguageFromPath,getLastAssistantUsage,getLatestCompactionEntry,getMarkdownTheme,getPackageDir,getPowerShellConfig,getReadmePath,getSelectListTheme,getSessionsDir,getSettingsListTheme,getShellConfig,highlightCode,initTheme,installBootstrapCompactionPolicy,installBootstrapLifecycle,installBootstrapRetryPolicy,installBootstrapTools,installSessionBootstrapTools,isBuiltinSuiteId,keyHint,keyText,killProcessTree,listBuiltinPluginManifestsV1,listBuiltinPluginProfilesV1,listSuiteIds,loadCapabilityPlugin,loadCapabilityPluginFromManifest,loadCapabilityPluginSync,loadProjectContextFiles,loadSkills,loadSkillsFromDir,main,migrateSessionEntries,parseArgs,parseCapabilityPluginManifest,parseFrontmatter,parseSessionEntries,parseSkillBlock,plugin_manager_controller_exports,plugin_selection_controller_exports,prepareBranchEntries,profileIdentitiesCompatible,projectSessionTranscript,rawKeyHint,readStoredCredential,renderDiff,replaceProfileLock,replaceProfilePlugin,resetSuite,resizeImage,resolveBuiltinPluginProfileV1,resolveCliModel,resolveModelScopeWithDiagnostics,resolvePluginCapabilityOrder,runPrintMode,runRpcMode,sanitizeBinaryOutput,serializeConversation,sessionEntryToContextMessages,shouldCompact,stableJsonDigest,startCodingAgentRemoteServer,stripFrontmatter,truncateHead,truncateLine,truncateTail,truncateToVisualLines,validateCapabilityCallEventDataV1,validateExecutionFactsV1,validateModelResponseEventDataV1,validateModelStreamEventDataV1,validateOperationCancelEventDataV1,validateOperationEndEventDataV1,validateOperationStartEventDataV1,validateOperationStepEventDataV1,validatePluginDisposeEventDataV1,validatePluginReadyEventDataV1,validateRetryScheduleV1,validateSessionCompactionCommitEventDataV1,validateSessionContextReplacedEventDataV1,validateSessionReloadEventDataV1,validateToolCallEventDataV1,validateToolCommitEventDataV1,validateToolExecuteEventDataV1,validateToolResultEventDataV1,validateToolResultRawEventDataV1,validateToolResultTransformEventDataV1,verifyProfileLock,withFileMutationQueue}from"./chunks/chunk-4NKZMFSZ.js";import"./chunks/chunk-JUUC5AZY.js";import"./chunks/chunk-XDUWOHPL.js";import"./chunks/chunk-3QKHSPQL.js";import"./chunks/chunk-DRQDKNXA.js";import"./chunks/chunk-7ZY7IXZD.js";import"./chunks/chunk-V46XUTK3.js";import"./chunks/chunk-WGLBM2BP.js";import"./chunks/chunk-4L3WN2XY.js";function contentHash(bytes){let hash=2166136261;for(let byte of bytes)hash^=byte,hash=Math.imul(hash,16777619);return(hash>>>0).toString(36)}function toStat(entry){return{artifactId:entry.ref.artifactId,sessionId:entry.ref.sessionId,operationId:entry.ref.operationId,kind:entry.ref.kind,mediaType:entry.ref.mediaType,sizeBytes:entry.ref.sizeBytes,state:entry.ended?"ended":"available",...entry.ended?{endReason:entry.endReason}:{}}}function createArtifactStore(options={}){let now=options.now??(()=>Date.now()),artifacts=new Map,sequenceByIdentity=new Map,globalWriteSequence=0;return{write(input){if(input.bytes.length===0)throw new Error("Artifact bytes must not be empty");let identity=`${input.sessionId}\0${input.operationId}`,sequence=(sequenceByIdentity.get(identity)??0)+1;sequenceByIdentity.set(identity,sequence),globalWriteSequence+=1;let artifactId=`art-${contentHash(input.bytes)}-${sequence}-${globalWriteSequence}`,ref={artifactId,sessionId:input.sessionId,operationId:input.operationId,kind:input.kind,mediaType:input.mediaType,sizeBytes:input.bytes.length,truncated:!1,createdAt:now()};return artifacts.set(artifactId,{ref,bytes:input.bytes,ended:!1}),{ref}},read(input){let entry=artifacts.get(input.artifactId);if(!entry)throw new Error(`Artifact not found: ${input.artifactId}`);if(entry.ref.sessionId!==input.sessionId)throw new Error(`Artifact ${input.artifactId} belongs to a different session`);if(entry.ended)throw new Error(`Artifact ${input.artifactId} lifecycle has ended: ${entry.endReason??"ended"}`);return{mediaType:entry.ref.mediaType,bytes:entry.bytes}},stat(artifactId){let entry=artifacts.get(artifactId);return entry===void 0?void 0:toStat(entry)},list(sessionId){return[...artifacts.values()].filter(entry=>entry.ref.sessionId===sessionId).map(entry=>toStat(entry))},endLifecycle(artifactId,input){let entry=artifacts.get(artifactId);if(!entry)throw new Error(`Artifact not found: ${artifactId}`);if(entry.ended)throw new Error(`Artifact ${artifactId} lifecycle has already ended`);return entry.ended=!0,entry.endReason=input.reason,entry.bytes=new Uint8Array(0),toStat(entry)}}}function planArtifactPages(store,input){if(!Number.isSafeInteger(input.pageSize)||input.pageSize<1)return{status:"invalid_page_size",pageSize:input.pageSize};let stat=store.stat(input.artifactId);if(!stat)return{status:"unavailable",reason:`Artifact not found: ${input.artifactId}`};if(stat.state==="ended")return{status:"unavailable",reason:`Artifact ${input.artifactId} lifecycle has ended: ${stat.endReason??"ended"}`};let totalBytes=stat.sizeBytes??0,pages=[];for(let offset=0;offset<totalBytes;offset+=input.pageSize)pages.push({index:pages.length,offset,size:Math.min(input.pageSize,totalBytes-offset)});return{status:"planned",totalBytes,pageSize:input.pageSize,pages:Object.freeze(pages)}}function readArtifactPage(store,input){if(!Number.isSafeInteger(input.pageSize)||input.pageSize<1)return{status:"unavailable",reason:`Invalid page size: ${input.pageSize}`};let plan=planArtifactPages(store,{artifactId:input.artifactId,pageSize:input.pageSize});if(plan.status!=="planned")return{status:"unavailable",reason:plan.status==="unavailable"?plan.reason:`Invalid page size: ${plan.pageSize}`};let page=plan.pages[input.index];if(!page)return{status:"unavailable",reason:`Page ${input.index} is outside the plan (${plan.pages.length} pages)`};let bytes;try{bytes=store.read({artifactId:input.artifactId,sessionId:input.sessionId}).bytes}catch(error){return{status:"unavailable",reason:error instanceof Error?error.message:String(error)}}let slice=bytes.slice(page.offset,page.offset+page.size),nextOffset=page.offset+page.size,hasMore=nextOffset<plan.totalBytes;return{status:"ok",index:page.index,offset:page.offset,bytes:slice,hasMore,...hasMore?{nextOffset}:{}}}var AGENT_CAPABILITY_CONTRACT_ID="agent-forge/agent-capability-contract",AGENT_CAPABILITY_CONTRACT_VERSION=1,AGENT_ERROR_CODES_V1=["provider_error","operation_timeout","operation_cancelled","idempotency_conflict","revision_conflict","revision_unavailable","unsupported_capability","invalid_request","invalid_ref","not_found","cancelled","unsupported","busy","session_locked","unauthorized","not_implemented","internal_error"],agentErrorCodeSet=new Set(AGENT_ERROR_CODES_V1);function isRegisteredAgentErrorCodeV1(code){return agentErrorCodeSet.has(code)}var PROTOCOL_ERROR_CODE_TO_AGENT_CODE_V1=Object.freeze({version:"unsupported",busy:"busy",session_locked:"session_locked",not_found:"not_found",invalid_request:"invalid_request",unauthorized:"unauthorized",not_implemented:"not_implemented",internal_error:"internal_error"});function mapProtocolErrorCodeToAgentErrorV1(code){return PROTOCOL_ERROR_CODE_TO_AGENT_CODE_V1[code]}function toErrorEnvelopeV1(error){let message=error instanceof Error?error.message:String(error),name=error instanceof Error?error.name:void 0,code;if(error&&typeof error=="object"&&"code"in error){let raw=error.code;typeof raw=="string"&&raw.trim()!==""&&(code=raw)}code===void 0&&(code="internal_error");let mapped=PROTOCOL_ERROR_CODE_TO_AGENT_CODE_V1[code];return buildErrorEnvelopeV1({version:1,code:mapped??code,message,retryable:!1,...name===void 0?{}:{name}})}function isPlainRecord(value){if(value===null||typeof value!="object"||Array.isArray(value))return!1;let prototype=Object.getPrototypeOf(value);return prototype===Object.prototype||prototype===null}function assertPlainRecord(value,label){if(!isPlainRecord(value))throw new Error(`${label} must be a plain object`)}function assertExactKeys(value,required,optional,label){let allowed=new Set([...required,...optional]),unsupported=Object.keys(value).filter(key=>!allowed.has(key)).sort();if(unsupported.length>0)throw new Error(`${label} has unsupported fields: ${unsupported.join(", ")}`);for(let key of required)if(!(key in value))throw new Error(`${label} is missing required field: ${key}`)}function assertNonEmptyString(value,label){if(typeof value!="string"||value.trim().length===0)throw new Error(`${label} must be a non-empty string`)}function assertPositiveSafeInteger(value,label){if(typeof value!="number"||!Number.isSafeInteger(value)||value<1)throw new Error(`${label} must be a positive safe integer`)}function assertNonNegativeSafeInteger(value,label){if(typeof value!="number"||!Number.isSafeInteger(value)||value<0)throw new Error(`${label} must be a non-negative safe integer`)}function assertJsonValue(value,label,seen=new WeakSet){if(!(value===null||typeof value=="boolean"||typeof value=="string")){if(typeof value=="number"){if(Number.isFinite(value))return;throw new Error(`${label} must contain finite JSON numbers`)}if(typeof value!="object")throw new Error(`${label} must be JSON-compatible`);if(seen.has(value))throw new Error(`${label} must not contain cycles`);if(seen.add(value),Array.isArray(value))for(let[index,child]of value.entries())assertJsonValue(child,`${label}[${index}]`,seen);else{if(!isPlainRecord(value))throw new Error(`${label} must contain only plain JSON objects`);for(let[key,child]of Object.entries(value))assertJsonValue(child,`${label}.${key}`,seen)}seen.delete(value)}}function detachedFreeze(value,seen=new WeakMap){if(value===null||typeof value!="object")return value;let existing=seen.get(value);if(existing!==void 0)return existing;if(Array.isArray(value)){let result2=[];seen.set(value,result2);for(let child of value)result2.push(detachedFreeze(child,seen));return Object.freeze(result2)}let result={};seen.set(value,result);for(let[key,child]of Object.entries(value))result[key]=detachedFreeze(child,seen);return Object.freeze(result)}function capabilitySort(left,right){return left.id<right.id?-1:left.id>right.id?1:left.version-right.version}function validateCapabilityRefs(value,label){if(!Array.isArray(value))throw new Error(`${label} must be an array`);let refs=value.map((item,index)=>validateCapabilityRefV1(item,`${label}[${index}]`)),seen=new Set;for(let ref of refs){let key=`${ref.id}\0${ref.version}`;if(seen.has(key))throw new Error(`${label} contains duplicate capability: ${ref.id}@${ref.version}`);seen.add(key)}return Object.freeze(refs.sort(capabilitySort))}function validateHostTransport(value,label){if(value!=="in-process"&&value!=="stdio"&&value!=="http"&&value!=="rpc"&&value!=="unix"&&value!=="websocket")throw new Error(`${label} is invalid`)}function validateCapabilityRefV1(value,label="Capability reference"){return assertPlainRecord(value,label),assertExactKeys(value,["id","version"],[],label),assertNonEmptyString(value.id,`${label}.id`),assertPositiveSafeInteger(value.version,`${label}.version`),detachedFreeze({id:value.id,version:value.version})}function validateHostContextV1(value){if(assertPlainRecord(value,"Host context"),assertExactKeys(value,["mode","features","transports"],[],"Host context"),value.mode!=="readonly"&&value.mode!=="full-control")throw new Error("Host context.mode is invalid");if(!Array.isArray(value.features))throw new Error("Host context.features must be an array");let features=value.features.map((feature,index)=>(assertNonEmptyString(feature,`Host context.features[${index}]`),feature));if(new Set(features).size!==features.length)throw new Error("Host context.features must not contain duplicates");if(!Array.isArray(value.transports))throw new Error("Host context.transports must be an array");let transports=value.transports.map((transport,index)=>(validateHostTransport(transport,`Host context.transports[${index}]`),transport));if(new Set(transports).size!==transports.length)throw new Error("Host context.transports must not contain duplicates");return detachedFreeze({mode:value.mode,features:[...features].sort(),transports:[...transports].sort()})}function buildHostContextV1(input){return validateHostContextV1(input)}function validateContractCompatibilityRequirementsV1(value){assertPlainRecord(value,"Contract compatibility requirements"),assertExactKeys(value,["contractId","version","mode","features","transports","capabilities"],[],"Contract compatibility requirements"),assertNonEmptyString(value.contractId,"Contract compatibility requirements.contractId"),assertPositiveSafeInteger(value.version,"Contract compatibility requirements.version");let hostContext=validateHostContextV1({mode:value.mode,features:value.features,transports:value.transports}),capabilities=validateCapabilityRefs(value.capabilities,"Contract compatibility requirements.capabilities");return detachedFreeze({contractId:value.contractId,version:value.version,mode:hostContext.mode,features:hostContext.features,transports:hostContext.transports,capabilities})}function buildContractCompatibilityRequirementsV1(input){return validateContractCompatibilityRequirementsV1(input)}var CONTRACT_COMPATIBILITY_ISSUE_CODES_V1=["unsupported_contract","host_mode_mismatch","unsupported_feature","unsupported_transport","unsupported_capability"];function validateContractCompatibilityResultV1(value){if(assertPlainRecord(value,"Contract compatibility result"),assertExactKeys(value,["version","compatible","issues"],[],"Contract compatibility result"),value.version!==1)throw new Error("Contract compatibility result.version must be 1");if(typeof value.compatible!="boolean")throw new Error("Contract compatibility result.compatible must be boolean");if(!Array.isArray(value.issues))throw new Error("Contract compatibility result.issues must be an array");if(value.compatible&&value.issues.length>0)throw new Error("Contract compatibility result.compatible must be false when issues exist");if(!value.compatible&&value.issues.length===0)throw new Error("Contract compatibility result.compatible must be true when no issues exist");let issues=value.issues.map((entry,index)=>{if(assertPlainRecord(entry,`Contract compatibility result.issues[${index}]`),assertExactKeys(entry,["code","error"],["missingFeatures","missingTransports","missingCapabilities"],`Contract compatibility result.issues[${index}]`),!CONTRACT_COMPATIBILITY_ISSUE_CODES_V1.includes(entry.code))throw new Error(`Contract compatibility result.issues[${index}].code is invalid`);let error=validateErrorEnvelopeV1(entry.error),missingFeatures=entry.missingFeatures;if(missingFeatures!==void 0&&(!Array.isArray(missingFeatures)||missingFeatures.some(item=>typeof item!="string")))throw new Error(`Contract compatibility result.issues[${index}].missingFeatures must be strings`);let missingTransports=entry.missingTransports;if(missingTransports!==void 0&&(!Array.isArray(missingTransports)||missingTransports.some(item=>typeof item!="string")))throw new Error(`Contract compatibility result.issues[${index}].missingTransports must be strings`);let missingCapabilities=entry.missingCapabilities;missingCapabilities!==void 0&&validateCapabilityRefs(missingCapabilities,`Contract compatibility result.issues[${index}].missingCapabilities`);let issue={code:entry.code,error,...missingFeatures===void 0?{}:{missingFeatures:Object.freeze(missingFeatures.map(item=>item))},...missingTransports===void 0?{}:{missingTransports:Object.freeze(missingTransports.map(item=>item))},...missingCapabilities===void 0?{}:{missingCapabilities:validateCapabilityRefs(missingCapabilities,"missingCapabilities")}};return detachedFreeze(issue)});return detachedFreeze({version:1,compatible:value.compatible,issues:Object.freeze(issues)})}function validateAgentCapabilityContractV1(value){if(assertPlainRecord(value,"Agent capability contract"),assertExactKeys(value,["contractId","version","capabilities","hostContext"],[],"Agent capability contract"),value.contractId!==AGENT_CAPABILITY_CONTRACT_ID)throw new Error(`Agent capability contract.contractId must be ${AGENT_CAPABILITY_CONTRACT_ID}`);if(value.version!==1)throw new Error("Agent capability contract.version must be 1");let capabilities=validateCapabilityRefs(value.capabilities,"Agent capability contract.capabilities"),hostContext=validateHostContextV1(value.hostContext);return detachedFreeze({contractId:value.contractId,version:1,capabilities,hostContext})}function buildAgentCapabilityContractV1(input){return validateAgentCapabilityContractV1({...input,version:input.version??1})}function validateAgentProfileV1(value){assertPlainRecord(value,"Agent profile"),assertExactKeys(value,["id","version","rootAgent","requiredPlugins"],["optionalPlugins","defaults"],"Agent profile"),assertNonEmptyString(value.id,"Agent profile.id"),assertPositiveSafeInteger(value.version,"Agent profile.version"),assertNonEmptyString(value.rootAgent,"Agent profile.rootAgent");let validatePluginIds=(candidate,label)=>{if(!Array.isArray(candidate))throw new Error(`${label} must be an array`);let ids=candidate.map((id,index)=>(assertNonEmptyString(id,`${label}[${index}]`),id));if(new Set(ids).size!==ids.length)throw new Error(`${label} must not contain duplicates`);return Object.freeze([...ids].sort())},requiredPlugins=validatePluginIds(value.requiredPlugins,"Agent profile.requiredPlugins"),optionalPlugins=value.optionalPlugins===void 0?void 0:validatePluginIds(value.optionalPlugins,"Agent profile.optionalPlugins");if(optionalPlugins?.some(id=>requiredPlugins.includes(id)))throw new Error("Agent profile.optionalPlugins must not overlap requiredPlugins");return value.defaults!==void 0&&assertJsonValue(value.defaults,"Agent profile.defaults"),detachedFreeze({id:value.id,version:value.version,rootAgent:value.rootAgent,requiredPlugins,...optionalPlugins===void 0?{}:{optionalPlugins},...value.defaults===void 0?{}:{defaults:value.defaults}})}function buildAgentProfileV1(input){return validateAgentProfileV1(input)}function validateArtifactRefV1(value){if(assertPlainRecord(value,"Artifact reference"),assertExactKeys(value,["sessionId","operationId","artifactId","kind","mediaType","truncated","createdAt"],["sizeBytes"],"Artifact reference"),assertNonEmptyString(value.sessionId,"Artifact reference.sessionId"),assertNonEmptyString(value.operationId,"Artifact reference.operationId"),assertNonEmptyString(value.artifactId,"Artifact reference.artifactId"),assertNonEmptyString(value.kind,"Artifact reference.kind"),assertNonEmptyString(value.mediaType,"Artifact reference.mediaType"),value.sizeBytes!==void 0&&assertNonNegativeSafeInteger(value.sizeBytes,"Artifact reference.sizeBytes"),typeof value.truncated!="boolean")throw new Error("Artifact reference.truncated must be boolean");return assertNonNegativeSafeInteger(value.createdAt,"Artifact reference.createdAt"),detachedFreeze({sessionId:value.sessionId,operationId:value.operationId,artifactId:value.artifactId,kind:value.kind,mediaType:value.mediaType,...value.sizeBytes===void 0?{}:{sizeBytes:value.sizeBytes},truncated:value.truncated,createdAt:value.createdAt})}function buildArtifactRefV1(input){return validateArtifactRefV1(input)}function checkContractCompatibilityV1(candidateInput,requirementsInput){let candidate=validateAgentCapabilityContractV1(candidateInput),requirements=validateContractCompatibilityRequirementsV1(requirementsInput),issues=[];(candidate.contractId!==requirements.contractId||candidate.version!==requirements.version)&&issues.push({code:"unsupported_contract",error:commandError("unsupported_contract",`Contract is unsupported: ${requirements.contractId}@${requirements.version}`)}),candidate.hostContext.mode!==requirements.mode&&issues.push({code:"host_mode_mismatch",error:commandError("host_mode_mismatch",`Host mode is incompatible: required ${requirements.mode}, received ${candidate.hostContext.mode}`)});let missingFeatures=requirements.features.filter(feature=>!candidate.hostContext.features.includes(feature));missingFeatures.length>0&&issues.push({code:"unsupported_feature",error:commandError("unsupported_feature",`Host features are unsupported: ${missingFeatures.join(", ")}`),missingFeatures:Object.freeze([...missingFeatures])});let missingTransports=requirements.transports.filter(transport=>!candidate.hostContext.transports.includes(transport));missingTransports.length>0&&issues.push({code:"unsupported_transport",error:commandError("unsupported_transport",`Host transports are unsupported: ${missingTransports.join(", ")}`),missingTransports:Object.freeze([...missingTransports])});let missingCapabilities=requirements.capabilities.filter(required=>!candidate.capabilities.some(available=>available.id===required.id&&available.version===required.version));return missingCapabilities.length>0&&issues.push({code:"unsupported_capability",error:commandError("unsupported_capability",`Capabilities are unsupported: ${missingCapabilities.map(item=>`${item.id}@${item.version}`).join(", ")}`),missingCapabilities:Object.freeze([...missingCapabilities])}),detachedFreeze({version:1,compatible:issues.length===0,issues})}function validateAgentRole(value,label){if(value!=="root-agent-controller"&&value!=="child-agent-controller")throw new Error(`${label} is invalid`)}function validateAgentDefinitionSnapshotV1(value){if(assertPlainRecord(value,"Agent definition snapshot"),assertExactKeys(value,["version","id","definitionVersion","role","capabilities"],["owner"],"Agent definition snapshot"),value.version!==1)throw new Error("Agent definition snapshot.version must be 1");assertNonEmptyString(value.id,"Agent definition snapshot.id"),assertPositiveSafeInteger(value.definitionVersion,"Agent definition snapshot.definitionVersion"),validateAgentRole(value.role,"Agent definition snapshot.role");let capabilities=validateCapabilityRefs(value.capabilities,"Agent definition snapshot.capabilities");return value.owner!==void 0&&assertNonEmptyString(value.owner,"Agent definition snapshot.owner"),detachedFreeze({version:1,id:value.id,definitionVersion:value.definitionVersion,role:value.role,capabilities,...value.owner===void 0?{}:{owner:value.owner}})}function buildAgentDefinitionSnapshotV1(input){return validateAgentDefinitionSnapshotV1(input)}function validateAgentInstanceSnapshotV1(value){if(assertPlainRecord(value,"Agent instance snapshot"),assertExactKeys(value,["version","id","definitionId","definitionVersion","role","status","revision"],["parentInstanceId","leaseOwner"],"Agent instance snapshot"),value.version!==1)throw new Error("Agent instance snapshot.version must be 1");if(assertNonEmptyString(value.id,"Agent instance snapshot.id"),assertNonEmptyString(value.definitionId,"Agent instance snapshot.definitionId"),assertPositiveSafeInteger(value.definitionVersion,"Agent instance snapshot.definitionVersion"),validateAgentRole(value.role,"Agent instance snapshot.role"),value.status!=="created"&&value.status!=="running"&&value.status!=="succeeded"&&value.status!=="failed"&&value.status!=="cancelled"&&value.status!=="disposed")throw new Error("Agent instance snapshot.status is invalid");return assertNonNegativeSafeInteger(value.revision,"Agent instance snapshot.revision"),value.parentInstanceId!==void 0&&assertNonEmptyString(value.parentInstanceId,"Agent instance snapshot.parentInstanceId"),value.leaseOwner!==void 0&&assertNonEmptyString(value.leaseOwner,"Agent instance snapshot.leaseOwner"),detachedFreeze({version:1,id:value.id,definitionId:value.definitionId,definitionVersion:value.definitionVersion,role:value.role,status:value.status,revision:value.revision,...value.parentInstanceId===void 0?{}:{parentInstanceId:value.parentInstanceId},...value.leaseOwner===void 0?{}:{leaseOwner:value.leaseOwner}})}function buildAgentInstanceSnapshotV1(input){return validateAgentInstanceSnapshotV1(input)}function validateSessionRevisionV1(value){if(assertPlainRecord(value,"Session revision"),assertExactKeys(value,["version","sessionId","sequence","leafId"],[],"Session revision"),value.version!==1)throw new Error("Session revision.version must be 1");if(assertNonEmptyString(value.sessionId,"Session revision.sessionId"),assertNonNegativeSafeInteger(value.sequence,"Session revision.sequence"),value.leafId!==null&&value.leafId!==void 0&&assertNonEmptyString(value.leafId,"Session revision.leafId"),value.leafId===void 0)throw new Error("Session revision.leafId is required");return detachedFreeze({version:1,sessionId:value.sessionId,sequence:value.sequence,leafId:value.leafId})}function buildSessionRevisionV1(input){return validateSessionRevisionV1(input)}function validateSessionSnapshotV1(value){if(assertPlainRecord(value,"Session snapshot"),assertExactKeys(value,["version","sessionId","revision"],[],"Session snapshot"),value.version!==1)throw new Error("Session snapshot.version must be 1");assertNonEmptyString(value.sessionId,"Session snapshot.sessionId");let revision=validateSessionRevisionV1(value.revision);if(revision.sessionId!==value.sessionId)throw new Error("Session snapshot.revision.sessionId must match sessionId");return detachedFreeze({version:1,sessionId:value.sessionId,revision})}function buildSessionSnapshotV1(input){return validateSessionSnapshotV1(input)}function validateErrorEnvelopeV1(value){if(assertPlainRecord(value,"Error envelope"),assertExactKeys(value,["version","code","message","retryable"],["details","name"],"Error envelope"),value.version!==1)throw new Error("Error envelope.version must be 1");if(assertNonEmptyString(value.code,"Error envelope.code"),typeof value.message!="string")throw new Error("Error envelope.message must be a string");if(typeof value.retryable!="boolean")throw new Error("Error envelope.retryable must be a boolean");return value.name!==void 0&&assertNonEmptyString(value.name,"Error envelope.name"),value.details!==void 0&&assertJsonValue(value.details,"Error envelope.details"),detachedFreeze({version:1,code:value.code,message:value.message,retryable:value.retryable,...value.details===void 0?{}:{details:value.details},...value.name===void 0?{}:{name:value.name}})}function buildErrorEnvelopeV1(input){return validateErrorEnvelopeV1(input)}function validateOperationTerminalStatus(value,label){if(value!=="succeeded"&&value!=="failed"&&value!=="cancelled"&&value!=="timed_out")throw new Error(`${label} is invalid`)}function validateOperationTerminalV1(value){if(assertPlainRecord(value,"Operation terminal"),!("version"in value)||!("status"in value))throw new Error("Operation terminal is missing required field: version or status");if(value.version!==1)throw new Error("Operation terminal.version must be 1");if(validateOperationTerminalStatus(value.status,"Operation terminal.status"),value.status==="succeeded")return assertExactKeys(value,["version","status"],["result"],"Operation terminal"),value.result!==void 0&&assertJsonValue(value.result,"Operation terminal.result"),detachedFreeze({version:1,status:"succeeded",...value.result===void 0?{}:{result:value.result}});assertExactKeys(value,["version","status","error"],[],"Operation terminal");let error=validateErrorEnvelopeV1(value.error);return detachedFreeze({version:1,status:value.status,error})}function buildOperationTerminalV1(input){return validateOperationTerminalV1(input)}function validateOperationSnapshotV1(value){if(assertPlainRecord(value,"Operation snapshot"),assertExactKeys(value,["version","operationId","kind","status"],["terminal","instanceId","sessionId","inputRevision"],"Operation snapshot"),value.version!==1)throw new Error("Operation snapshot.version must be 1");if(assertNonEmptyString(value.operationId,"Operation snapshot.operationId"),assertNonEmptyString(value.kind,"Operation snapshot.kind"),value.status!=="queued"&&value.status!=="running"&&value.status!=="succeeded"&&value.status!=="failed"&&value.status!=="cancelled"&&value.status!=="timed_out")throw new Error("Operation snapshot.status is invalid");if((value.status==="queued"||value.status==="running")&&value.terminal!==void 0)throw new Error("Operation snapshot active status must not have a terminal");if(value.status!=="queued"&&value.status!=="running"&&value.terminal===void 0)throw new Error("Operation snapshot terminal status requires a terminal");let terminal=value.terminal===void 0?void 0:validateOperationTerminalV1(value.terminal);if(terminal!==void 0&&terminal.status!==value.status)throw new Error("Operation snapshot.terminal.status must match status");value.instanceId!==void 0&&assertNonEmptyString(value.instanceId,"Operation snapshot.instanceId"),value.sessionId!==void 0&&assertNonEmptyString(value.sessionId,"Operation snapshot.sessionId");let inputRevision=value.inputRevision===void 0?void 0:validateSessionRevisionV1(value.inputRevision);if(inputRevision!==void 0&&value.sessionId!==void 0&&inputRevision.sessionId!==value.sessionId)throw new Error("Operation snapshot.inputRevision.sessionId must match sessionId");return detachedFreeze({version:1,operationId:value.operationId,kind:value.kind,status:value.status,...terminal===void 0?{}:{terminal},...value.instanceId===void 0?{}:{instanceId:value.instanceId},...value.sessionId===void 0?{}:{sessionId:value.sessionId},...inputRevision===void 0?{}:{inputRevision}})}function buildOperationSnapshotV1(input){return validateOperationSnapshotV1(input)}function validateCommandRequestV1(value){if(assertPlainRecord(value,"Command request"),assertExactKeys(value,["version","operationId","idempotencyKey","command","target","input","hostContext"],["expectedRevision"],"Command request"),value.version!==1)throw new Error("Command request.version must be 1");assertNonEmptyString(value.operationId,"Command request.operationId"),assertNonEmptyString(value.idempotencyKey,"Command request.idempotencyKey"),assertNonEmptyString(value.command,"Command request.command"),assertNonEmptyString(value.target,"Command request.target"),assertJsonValue(value.input,"Command request.input");let expectedRevision=value.expectedRevision===void 0?void 0:validateSessionRevisionV1(value.expectedRevision);if(expectedRevision!==void 0&&expectedRevision.sessionId!==value.target)throw new Error("Command request.expectedRevision.sessionId does not match target");let hostContext=validateHostContextV1(value.hostContext);return detachedFreeze({version:1,operationId:value.operationId,idempotencyKey:value.idempotencyKey,command:value.command,target:value.target,input:value.input,...expectedRevision===void 0?{}:{expectedRevision},hostContext})}function buildCommandRequestV1(input){return validateCommandRequestV1({...input,version:input.version??1})}function validateCommandAdmissionV1(value){if(assertPlainRecord(value,"Command admission"),assertExactKeys(value,["version","status","request"],["operation","error"],"Command admission"),value.version!==1)throw new Error("Command admission.version must be 1");if(value.status!=="accepted"&&value.status!=="existing"&&value.status!=="rejected")throw new Error("Command admission.status is invalid");let request=validateCommandRequestV1(value.request),operation=value.operation===void 0?void 0:validateOperationSnapshotV1(value.operation);if((value.status==="accepted"||value.status==="existing")&&operation===void 0)throw new Error("Command admission accepted status requires an operation");if(value.status==="rejected"&&value.error===void 0)throw new Error("Command admission rejected status requires an error");let error=value.error===void 0?void 0:validateErrorEnvelopeV1(value.error);return detachedFreeze({version:1,status:value.status,request,...operation===void 0?{}:{operation},...error===void 0?{}:{error}})}function canonicalJson(value){if(value===null||typeof value!="object")return JSON.stringify(value);if(Array.isArray(value))return`[${value.map(canonicalJson).join(",")}]`;let record=value;return`{${Object.keys(record).sort().map(key=>`${JSON.stringify(key)}:${canonicalJson(record[key])}`).join(",")}}`}function sameRevision(left,right){return left.sessionId===right.sessionId&&left.sequence===right.sequence&&left.leafId===right.leafId}function commandError(code,message,details){return buildErrorEnvelopeV1({version:1,code,message,retryable:!1,...details===void 0?{}:{details}})}function rejectedAdmission(request,error){return detachedFreeze({version:1,status:"rejected",request,error})}function createCommandOperationRegistryV1(){let entries=new Map,read=operationId=>{assertNonEmptyString(operationId,"operationId");let entry=entries.get(operationId);if(!entry)throw new Error(`Operation is not retained: ${operationId}`);return entry},write=(entry,operation)=>(entry.operation=operation,operation),terminal=entry=>entry.operation.terminal!==void 0;return Object.freeze({admit(input,currentRevision){let request=validateCommandRequestV1(input),current=currentRevision===void 0?void 0:validateSessionRevisionV1(currentRevision),fingerprint=canonicalJson(request),existing=entries.get(request.operationId);if(existing)return existing.fingerprint===fingerprint?detachedFreeze({version:1,status:"existing",request,operation:existing.operation}):rejectedAdmission(request,commandError("idempotency_conflict",`Operation ID is already bound to different input: ${request.operationId}`));if(request.expectedRevision!==void 0){if(current===void 0)return rejectedAdmission(request,commandError("revision_unavailable",`Current revision is required for: ${request.target}`));if(!sameRevision(request.expectedRevision,current))return rejectedAdmission(request,commandError("revision_conflict",`Expected revision does not match: ${request.target}`,{expectedRevision:request.expectedRevision,currentRevision:current}))}let operation=buildOperationSnapshotV1({version:1,operationId:request.operationId,kind:`command:${request.command}`,status:"queued",...request.expectedRevision===void 0?{}:{sessionId:request.expectedRevision.sessionId,inputRevision:request.expectedRevision}});return entries.set(request.operationId,{request,fingerprint,operation}),detachedFreeze({version:1,status:"accepted",request,operation})},start(operationId){let entry=read(operationId);return entry.operation.status!=="queued"?entry.operation:write(entry,buildOperationSnapshotV1({...entry.operation,status:"running"}))},complete(operationId,terminalSnapshot){let entry=read(operationId),nextTerminal=validateOperationTerminalV1(terminalSnapshot);if(terminal(entry)){if(canonicalJson(entry.operation.terminal)!==canonicalJson(nextTerminal))throw new Error(`Operation already has a different terminal result: ${operationId}`);return entry.operation}return write(entry,buildOperationSnapshotV1({...entry.operation,status:nextTerminal.status,terminal:nextTerminal}))},cancel(operationId){let entry=read(operationId);return terminal(entry)?entry.operation:write(entry,buildOperationSnapshotV1({...entry.operation,status:"cancelled",terminal:{version:1,status:"cancelled",error:commandError("operation_cancelled",`Operation cancelled: ${operationId}`)}}))},get(operationId){return assertNonEmptyString(operationId,"operationId"),entries.get(operationId)?.operation},release(operationId){assertNonEmptyString(operationId,"operationId"),entries.delete(operationId)}})}function buildCanonicalContractVectorsV1(){let hostContext=buildHostContextV1({mode:"full-control",features:["agent.run","session.snapshot"],transports:["in-process"]}),contract=buildAgentCapabilityContractV1({contractId:AGENT_CAPABILITY_CONTRACT_ID,capabilities:[{id:"agent.run",version:1}],hostContext}),profile=buildAgentProfileV1({id:"coding-agent",version:1,rootAgent:"coding-agent.root",requiredPlugins:["bootstrap-tools"],optionalPlugins:["bootstrap-skills"],defaults:{mode:"full-control",context:{strategy:"default"}}}),artifact=buildArtifactRefV1({sessionId:"session-vector-1",operationId:"vector-operation-1",artifactId:"artifact-vector-1",kind:"operation_record",mediaType:"application/json",sizeBytes:13,truncated:!1,createdAt:0}),revision=buildSessionRevisionV1({version:1,sessionId:"session-vector-1",sequence:0,leafId:null}),definition=buildAgentDefinitionSnapshotV1({version:1,id:"coding-agent.root",definitionVersion:1,role:"root-agent-controller",capabilities:[{id:"agent.run",version:1}],owner:"coding-agent"}),instance=buildAgentInstanceSnapshotV1({version:1,id:"instance-vector-1",definitionId:definition.id,definitionVersion:definition.definitionVersion,role:definition.role,status:"created",revision:0}),session=buildSessionSnapshotV1({version:1,sessionId:revision.sessionId,revision}),error=buildErrorEnvelopeV1({version:1,code:"provider_error",message:"provider failed",retryable:!0}),command=buildCommandRequestV1({operationId:"vector-operation-1",idempotencyKey:"vector-request-1",command:"agent.run",target:"session-vector-1",input:{prompt:"vector"},expectedRevision:{version:1,sessionId:"session-vector-1",sequence:0,leafId:null},hostContext}),registry=createCommandOperationRegistryV1(),accepted=registry.admit(command,command.expectedRevision);if(accepted.status!=="accepted"||accepted.operation===void 0)throw new Error("Canonical contract vector admission failed");let running=registry.start(command.operationId),terminal=registry.complete(command.operationId,{version:1,status:"succeeded",result:{ok:!0}}),event=buildEventEnvelopeV1({id:"vector-event-1",deliveryId:"vector-delivery-1",type:"operation.end",source:"canonical-vector",category:"authoritative",deliveryGuarantee:"best-effort",timestamp:0,operationId:command.operationId,correlationId:command.operationId,data:{version:1,operationId:command.operationId,operationKind:command.command,status:"succeeded"}});return detachedFreeze({version:1,contract,definition,instance,session,revision,error,profile,artifact,command,accepted,running,terminal,event})}function buildCanonicalContractFixtureVectorsV1(){let base=buildCanonicalContractVectorsV1(),registry=createCommandOperationRegistryV1(),request=buildCommandRequestV1({operationId:"fixture-operation-1",idempotencyKey:"fixture-request-1",command:"agent.run",target:"session-fixture-1",input:{prompt:"fixture"},expectedRevision:{version:1,sessionId:"session-fixture-1",sequence:1,leafId:"leaf-1"},hostContext:base.contract.hostContext});registry.admit(request,request.expectedRevision);let existing=registry.admit(request,request.expectedRevision),idempotencyConflict=registry.admit({...request,input:{prompt:"different"}},request.expectedRevision),revisionConflict=registry.admit({...request,operationId:"fixture-operation-2",idempotencyKey:"fixture-request-2"},{version:1,sessionId:"session-fixture-1",sequence:2,leafId:"leaf-2"}),cancelled=registry.cancel(request.operationId),terminalReplay=registry.complete(request.operationId,cancelled.terminal);if(registry.admit(buildCommandRequestV1({...request,operationId:"fixture-operation-failed",idempotencyKey:"fixture-request-failed"}),request.expectedRevision).status!=="accepted")throw new Error("Canonical contract failed vector admission failed");let failedTerminal=registry.complete("fixture-operation-failed",{version:1,status:"failed",error:buildErrorEnvelopeV1({version:1,code:"provider_error",message:"provider failed",retryable:!0})});if(registry.admit(buildCommandRequestV1({...request,operationId:"fixture-operation-timeout",idempotencyKey:"fixture-request-timeout"}),request.expectedRevision).status!=="accepted")throw new Error("Canonical contract timeout vector admission failed");let timedOutTerminal=registry.complete("fixture-operation-timeout",{version:1,status:"timed_out",error:buildErrorEnvelopeV1({version:1,code:"operation_timeout",message:"operation timed out",retryable:!0})}),unsupported=buildUnsupportedCapabilityV1({id:"fixture.missing",version:1}),observation=buildEventEnvelopeV1({id:"fixture-event-1",deliveryId:"fixture-delivery-1",type:"fixture.observation",source:"canonical-vector",timestamp:0,data:{observed:!0}}),correlated=buildEventEnvelopeV1({id:"fixture-event-correlated",deliveryId:"fixture-delivery-correlated",type:"operation.end",source:"canonical-vector",category:"authoritative",timestamp:0,operationId:"fixture-operation-1",correlationId:"fixture-operation-1",data:{status:"cancelled"}}),steer=buildCommandRequestV1({operationId:"fixture-operation-steer",idempotencyKey:"fixture-request-steer",command:"session.steer",target:"session-fixture-1",input:{text:"steer"},expectedRevision:request.expectedRevision,hostContext:base.contract.hostContext}),operationStep=buildEventEnvelopeV1({id:"fixture-event-step",deliveryId:"fixture-delivery-step",type:"operation.step",source:"canonical-vector",category:"progress",timestamp:0,operationId:"fixture-operation-steer",correlationId:"fixture-operation-steer",data:{version:1,operationId:"fixture-operation-steer",operationKind:"session.steer",step:1,message:"accepted"}}),compatibilityRequirements=overrides=>buildContractCompatibilityRequirementsV1({contractId:AGENT_CAPABILITY_CONTRACT_ID,version:1,mode:"full-control",features:[],transports:[],capabilities:[],...overrides}),compatibilityAccepted=checkContractCompatibilityV1(base.contract,compatibilityRequirements({features:["agent.run","session.snapshot"],transports:["in-process"],capabilities:[{id:"agent.run",version:1}]})),compatibilityContractUnsupported=checkContractCompatibilityV1(base.contract,compatibilityRequirements({version:2})),compatibilityCapabilityVersionUnsupported=checkContractCompatibilityV1(base.contract,compatibilityRequirements({capabilities:[{id:"agent.run",version:2}]})),compatibilityFeatureSubset=checkContractCompatibilityV1(base.contract,compatibilityRequirements({features:["agent.run","session.compact"]}));return detachedFreeze([{id:"agent-definition",value:base.definition},{id:"agent-instance",value:base.instance},{id:"session-snapshot",value:base.session},{id:"session-revision",value:base.revision},{id:"error-envelope",value:base.error},{id:"profile-snapshot",value:base.profile},{id:"artifact-reference",value:base.artifact},{id:"command-success",value:base.terminal},{id:"command-failed-terminal",value:failedTerminal},{id:"command-timed-out-terminal",value:timedOutTerminal},{id:"command-idempotency-replay",value:existing},{id:"command-idempotency-conflict",value:idempotencyConflict},{id:"command-revision-conflict",value:revisionConflict},{id:"command-cancel-terminal",value:cancelled},{id:"command-terminal-replay",value:terminalReplay},{id:"capability-unsupported",value:unsupported},{id:"event-without-operation",value:observation},{id:"event-with-operation",value:correlated},{id:"command-steer",value:steer},{id:"event-operation-step",value:operationStep},{id:"compatibility-accepted",value:compatibilityAccepted},{id:"compatibility-contract-unsupported",value:compatibilityContractUnsupported},{id:"compatibility-capability-version-unsupported",value:compatibilityCapabilityVersionUnsupported},{id:"compatibility-feature-subset",value:compatibilityFeatureSubset}])}function validateEventEnvelopeV1(value){if(assertPlainRecord(value,"Event envelope"),assertExactKeys(value,["version","id","deliveryId","type","source","category","deliveryGuarantee","timestamp","data"],["operationId","correlationId","causationId"],"Event envelope"),value.version!==1)throw new Error("Event envelope.version must be 1");if(assertNonEmptyString(value.id,"Event envelope.id"),assertNonEmptyString(value.deliveryId,"Event envelope.deliveryId"),assertNonEmptyString(value.type,"Event envelope.type"),assertNonEmptyString(value.source,"Event envelope.source"),value.category!=="authoritative"&&value.category!=="progress"&&value.category!=="observation")throw new Error("Event envelope.category is invalid");if(value.deliveryGuarantee!=="best-effort"&&value.deliveryGuarantee!=="at-least-once")throw new Error("Event envelope.deliveryGuarantee is invalid");if(assertNonNegativeSafeInteger(value.timestamp,"Event envelope.timestamp"),assertJsonValue(value.data,"Event envelope.data"),value.operationId!==void 0&&assertNonEmptyString(value.operationId,"Event envelope.operationId"),value.correlationId!==void 0&&assertNonEmptyString(value.correlationId,"Event envelope.correlationId"),value.causationId!==void 0&&assertNonEmptyString(value.causationId,"Event envelope.causationId"),value.operationId===void 0&&value.correlationId!==void 0)throw new Error("Event envelope.correlationId requires a real operationId");if(value.operationId!==void 0&&value.correlationId===void 0)throw new Error("Event envelope.operationId requires correlationId");return detachedFreeze({version:1,id:value.id,deliveryId:value.deliveryId,type:value.type,source:value.source,category:value.category,deliveryGuarantee:value.deliveryGuarantee,timestamp:value.timestamp,data:value.data,...value.operationId===void 0?{}:{operationId:value.operationId},...value.correlationId===void 0?{}:{correlationId:value.correlationId},...value.causationId===void 0?{}:{causationId:value.causationId}})}function buildEventEnvelopeV1(input){return validateEventEnvelopeV1({...input,version:input.version??1,category:input.category??"observation",deliveryGuarantee:input.deliveryGuarantee??"best-effort"})}function buildUnsupportedCapabilityV1(capability){let reference=validateCapabilityRefV1(capability),error=buildErrorEnvelopeV1({version:1,code:"unsupported_capability",message:`Capability is unsupported: ${reference.id}@${reference.version}`,retryable:!1});return detachedFreeze({status:"unsupported",capability:reference,error})}function resolveCapabilityV1(requested,supported){let reference=validateCapabilityRefV1(requested);return validateCapabilityRefs(supported,"Supported capabilities").some(candidate=>candidate.id===reference.id&&candidate.version===reference.version)?detachedFreeze({status:"supported",capability:reference}):buildUnsupportedCapabilityV1(reference)}function assertCapabilitySupportedV1(requested,supported){let resolution=resolveCapabilityV1(requested,supported);if(resolution.status==="unsupported")throw new Error(resolution.error.message);return resolution.capability}var validateAgentCapabilityContract=validateAgentCapabilityContractV1,buildAgentCapabilityContract=buildAgentCapabilityContractV1,validateEventEnvelope=validateEventEnvelopeV1,buildEventEnvelope=buildEventEnvelopeV1;function detachedFreeze2(value,seen=new WeakMap){if(value===null||typeof value!="object")return value;let existing=seen.get(value);if(existing!==void 0)return existing;if(Array.isArray(value)){let copy2=[];seen.set(value,copy2);for(let child of value)copy2.push(detachedFreeze2(child,seen));return Object.freeze(copy2)}let copy=Object.create(null);seen.set(value,copy);for(let[key,child]of Object.entries(value))copy[key]=detachedFreeze2(child,seen);return Object.freeze(copy)}function assertActive(disposed,label){if(disposed)throw new Error(`Embedded SDK binding is disposed: ${label}`)}function errorEnvelope(error,code){let message=error instanceof Error?error.message:String(error);return buildErrorEnvelopeV1({version:1,code,message,retryable:!1,...error instanceof Error?{name:error.name}:{}})}function agentDefinitionSnapshot(definition){return buildAgentDefinitionSnapshotV1({version:1,id:definition.id,definitionVersion:definition.version,role:definition.role,capabilities:[],...definition.owner===void 0?{}:{owner:definition.owner}})}function agentInstanceSnapshot(snapshot){return buildAgentInstanceSnapshotV1({version:1,id:snapshot.id,definitionId:snapshot.definitionId,definitionVersion:snapshot.definitionVersion,role:snapshot.role,status:snapshot.status,revision:snapshot.revision,...snapshot.parentInstanceId===void 0?{}:{parentInstanceId:snapshot.parentInstanceId},...snapshot.leaseOwner===void 0?{}:{leaseOwner:snapshot.leaseOwner}})}function resultSnapshot(result){return result.status==="succeeded"?detachedFreeze2({status:"succeeded",output:canonicalOutput(result.output,`wait:${result.revision}`),revision:result.revision}):detachedFreeze2({status:result.status,revision:result.revision,...result.error===void 0?{}:{error:errorEnvelope(result.error,`agent_${result.status}`)}})}function canonicalOutput(value,operationId){return buildOperationSnapshotV1({version:1,operationId,kind:"agent.run",status:"succeeded",terminal:{version:1,status:"succeeded",result:value}}),detachedFreeze2(value)}function canonicalInput(value){if(value===void 0)throw new Error("Embedded SDK run input must be JSON-compatible");return buildOperationSnapshotV1({version:1,operationId:"embedded-sdk:input",kind:"agent.run",status:"succeeded",terminal:{version:1,status:"succeeded",result:value}}),detachedFreeze2(value)}function createEmbeddedSessionBindingV1(session){if(!session.getRevision)throw new Error("Embedded SDK session requires revision support");let getRevision=()=>detachedFreeze2(session.getRevision()),context=session.getContextSnapshot&&session.commitContext?Object.freeze({version:1,get:()=>detachedFreeze2(session.getContextSnapshot()),commit:request=>session.commitContext(request)}):void 0;return Object.freeze({version:1,getSessionId:()=>session.getSessionId(),getRevision,snapshot:()=>buildSessionSnapshotV1({version:1,sessionId:session.getSessionId(),revision:getRevision()}),getMessages:()=>detachedFreeze2(session.getMessages()),getBranchEntries:()=>detachedFreeze2(session.getBranchEntries()),isIdle:()=>session.isIdle(),prompt:text=>session.prompt(text),steer:text=>session.steer?session.steer(text):Promise.reject(new Error("Embedded SDK session does not support steer")),abort:()=>session.abort(),waitForIdle:()=>session.waitForIdle(),...context===void 0?{}:{context}})}function createEmbeddedSdkBindingV1(options={}){let composition=options.composition??createAgentCompositionRuntime(),ownsComposition=options.ownsComposition??options.composition===void 0,defaultFeatures=["agent-composition-v1",...options.session===void 0?[]:["session","session-revision-v1","context"]],hostContext=detachedFreeze2({mode:options.mode??"full-control",features:[...options.features??defaultFeatures].sort(),transports:["in-process"]}),session=options.session===void 0?void 0:createEmbeddedSessionBindingV1(options.session),contract=buildAgentCapabilityContractV1({contractId:"agent-forge/agent-capability-contract",capabilities:[],hostContext}),definitions=new Map,instances=new Map,listeners=new Map,sequence=0,disposePromise,disposed=!1,nextId=kind=>(sequence+=1,options.idFactory?.(kind,sequence)??`embedded-sdk:${kind}:${sequence}`),emit=(type,data,operationId)=>{let event=buildEventEnvelopeV1({id:nextId("event"),deliveryId:nextId("delivery"),type,source:"embedded-sdk",timestamp:options.clock?.()??0,category:type===OPERATION_START_EVENT_ID||type===OPERATION_CANCEL_EVENT_ID||type===OPERATION_END_EVENT_ID?"authoritative":"observation",deliveryGuarantee:"best-effort",data,...operationId===void 0?{}:{operationId,correlationId:operationId}});for(let listener of listeners.values())try{listener(event)}catch{}},resolveDefinition=definition=>{let snapshot="snapshot"in definition?definition.snapshot:definition,definitionVersion="definitionVersion"in snapshot?snapshot.definitionVersion:snapshot.version,resolved=definitions.get(`${snapshot.id}@${definitionVersion}`);if(resolved)return resolved;if(options.composition!==void 0)return composition.get(snapshot.id,definitionVersion);throw new Error(`Embedded SDK has no defined Agent: ${snapshot.id}@${definitionVersion}`)},binding={version:1,contract,hostContext,...session===void 0?{}:{session},define(definition){assertActive(disposed,"define");let registered=composition.define(definition);return definitions.set(`${registered.id}@${registered.version}`,registered),detachedFreeze2({snapshot:agentDefinitionSnapshot(registered)})},create(definition,instanceOptions={}){assertActive(disposed,"create");let raw=composition.create(resolveDefinition(definition),instanceOptions),instanceDisposed=!1,instanceDisposePromise,leases=new WeakMap,wrapper={id:raw.id,snapshot:()=>(assertActive(disposed||instanceDisposed,raw.id),agentInstanceSnapshot(raw.snapshot())),acquireControllerLease:async owner=>{assertActive(disposed||instanceDisposed,raw.id);let lease=await raw.acquireControllerLease(owner),projected=Object.freeze({id:lease.id,instanceId:lease.instanceId,owner:lease.owner,revision:lease.revision,isActive:()=>!disposed&&!instanceDisposed&&lease.isActive(),release:async()=>{assertActive(disposed||instanceDisposed,raw.id),await lease.release()}});return leases.set(projected,lease),projected},run:(input,runOptions)=>{assertActive(disposed||instanceDisposed,raw.id);let lease=leases.get(runOptions.lease);if(!lease)throw new Error(`Embedded SDK lease does not belong to Agent instance: ${raw.id}`);let operation=raw.run(canonicalInput(input),{lease,signal:runOptions.signal}),terminal,cancelEmitted=!1,reportCancel=()=>{cancelEmitted||(cancelEmitted=!0,emit(OPERATION_CANCEL_EVENT_ID,validateOperationCancelEventDataV1({version:1,operationId:operation.id,operationKind:"agent.run"}),operation.id))};operation.signal.addEventListener("abort",reportCancel,{once:!0}),operation.signal.aborted&&reportCancel(),runOptions.signal?.aborted||emit(OPERATION_START_EVENT_ID,validateOperationStartEventDataV1({version:1,operationId:operation.id,operationKind:"agent.run"}),operation.id);let result=operation.result.then(value=>{try{let output=canonicalOutput(value,operation.id);return terminal={version:1,status:"succeeded",result:output},emit(OPERATION_END_EVENT_ID,validateOperationEndEventDataV1({version:1,operationId:operation.id,operationKind:"agent.run",status:"succeeded"}),operation.id),output}catch(error){throw terminal={version:1,status:"failed",error:errorEnvelope(error,"agent_invalid_result")},emit(OPERATION_END_EVENT_ID,validateOperationEndEventDataV1({version:1,operationId:operation.id,operationKind:"agent.run",status:"failed",errorMessage:error instanceof Error?error.message:String(error)}),operation.id),error}},error=>{let status=operation.status()==="cancelled"?"cancelled":"failed";throw terminal={version:1,status,error:errorEnvelope(error,`agent_${status}`)},emit(OPERATION_END_EVENT_ID,validateOperationEndEventDataV1({version:1,operationId:operation.id,operationKind:"agent.run",status,errorMessage:error instanceof Error?error.message:String(error)}),operation.id),error});return Object.freeze({id:operation.id,result,snapshot:()=>buildOperationSnapshotV1({version:1,operationId:operation.id,kind:"agent.run",status:terminal?.status??operation.status(),...terminal===void 0&&operation.status()==="cancelled"?{terminal:{version:1,status:"cancelled",error:errorEnvelope(new Error("Operation cancelled"),"agent_cancelled")}}:terminal===void 0?{}:{terminal},instanceId:raw.id}),cancel:async reason=>{assertActive(disposed||instanceDisposed,raw.id),!(operation.status()!=="queued"&&operation.status()!=="running")&&await operation.cancel(reason)}})},wait:async()=>detachedFreeze2(resultSnapshot(await raw.wait())),cancel:async reason=>{assertActive(disposed||instanceDisposed,raw.id),await raw.cancel(reason)},dispose:async()=>(instanceDisposePromise??=(async()=>{instanceDisposed||(instanceDisposed=!0,await raw.dispose(),instances.delete(raw.id))})(),instanceDisposePromise)};return instances.set(raw.id,wrapper),Object.freeze(wrapper)},listInstances:()=>Object.freeze([...instances.values()].map(instance=>instance.snapshot()).sort((left,right)=>left.id.localeCompare(right.id))),subscribe(listener){assertActive(disposed,"subscribe");let id=`embedded-sdk:subscription:${++sequence}`,released=!1;return listeners.set(id,listener),Object.freeze({id,dispose:()=>{released||(released=!0,listeners.delete(id))}})},dispose:async()=>(disposePromise??=(async()=>{if(disposed)return;disposed=!0;let failures=[];for(let instance of[...instances.values()])try{await instance.dispose()}catch(error){failures.push(error)}if(listeners.clear(),ownsComposition&&"disposeDefinitions"in composition)try{composition.disposeDefinitions([...definitions.values()])}catch(error){failures.push(error)}if(definitions.clear(),failures.length===1)throw failures[0];if(failures.length>1)throw new AggregateError(failures,"Embedded SDK disposal failed")})(),disposePromise)};return Object.freeze(binding)}var createEmbeddedSdkBinding=createEmbeddedSdkBindingV1;import{EventEmitter}from"node:events";function createEventBus(){let emitter=new EventEmitter;return{emit:(channel,data)=>{emitter.emit(channel,data)},on:(channel,handler)=>{let safeHandler=async data=>{try{await handler(data)}catch(err){console.error(`Event handler error (${channel}):`,err)}};return emitter.on(channel,safeHandler),()=>emitter.off(channel,safeHandler)},clear:()=>{emitter.removeAllListeners()}}}var ModelRegistry=class{runtime;constructor(runtime){this.runtime=runtime}refresh(options){return this.runtime.refresh(options)}getError(){return this.runtime.getError()}getAll(){return[...this.runtime.getModels()]}getAvailable(){return[...this.runtime.getAvailableSnapshot()]}find(provider,modelId){return this.runtime.getModel(provider,modelId)}hasConfiguredAuth(model){return this.runtime.hasConfiguredAuth(model.provider)}async getApiKeyAndHeaders(model){try{let resolution=await this.runtime.getAuth(model);if(!resolution){let compatibility=this.runtime.getCompatibilityRequestConfig(model);return compatibility.authHeader?{ok:!1,error:`No API key found for "${model.provider}"`}:{ok:!0,headers:compatibility.headers}}return{ok:!0,apiKey:resolution.auth.apiKey,headers:resolution.auth.headers,...resolution.auth.baseUrl?{baseUrl:resolution.auth.baseUrl}:{},env:resolution.env}}catch(error){let cause=error instanceof Error?error.cause:void 0,message=cause instanceof Error?cause.message:error instanceof Error?error.message:String(error);return{ok:!1,error:message==="authHeader requires a resolved API key"?`No API key found for "${model.provider}"`:message}}}getProviderAuthStatus(provider){return this.runtime.getProviderAuthStatus(provider)}getProvider(provider){return this.runtime.getProvider(provider)}stream(model,context,options){return this.runtime.stream(model,context,options)}complete(model,context,options){return this.runtime.complete(model,context,options)}streamSimple(model,context,options){return this.runtime.streamSimple(model,context,options)}getProviderDisplayName(provider){return this.runtime.getProvider(provider)?.name??provider}getProviderAuth(provider){return this.runtime.getAuth(provider)}async getApiKeyForProvider(provider){try{return(await this.runtime.getAuth(provider))?.auth.apiKey}catch{return}}isUsingOAuth(model){return this.runtime.isUsingOAuth(model.provider)}registerProvider(providerOrName,config){if(typeof providerOrName=="string"){if(!config)throw new Error("Provider config is required when registering by name");this.runtime.registerProvider(providerOrName,config);return}this.runtime.registerNativeProvider(providerOrName)}unregisterProvider(providerName){this.runtime.unregisterProvider(providerName)}getRegisteredProviderConfig(providerName){return this.runtime.getRegisteredProviderConfig(providerName)}getRegisteredNativeProvider(providerName){return this.runtime.getRegisteredNativeProvider(providerName)}getRegisteredProviderIds(){return this.runtime.getRegisteredProviderIds()}};function retryBackoffMs(policy,attempt){return Math.min(policy.baseWaitMs*2**(attempt-1),policy.maxWaitMs)}function createAgentRetryScheduler(){let terminalStates=new Map;return{schedule(input){let existing=terminalStates.get(input.operationId);if(existing)return{...existing,duplicate:!0};let signal=input.signal,now=input.now??(()=>0),sleep=input.sleep??(()=>{}),attempts=[],finish=outcome=>(terminalStates.set(input.operationId,outcome),outcome);for(let attempt=1;attempt<=input.policy.attemptLimit;attempt+=1){if(signal?.aborted)return finish({status:"cancelled",operationId:input.operationId,attempts});let at=now(),step=input.task(attempt);if(step.ok)return attempts.push({attempt,at,ok:!0,waitedMs:0}),finish({status:"succeeded",operationId:input.operationId,result:step.result,attempts});if(!step.retryable)return attempts.push({attempt,at,ok:!1,failure:step.reason,retryable:!1,waitedMs:0}),finish({status:"failed_terminal",operationId:input.operationId,reason:step.reason,attempts});let waitedMs=retryBackoffMs(input.policy,attempt);if(attempts.push({attempt,at,ok:!1,failure:step.reason,retryable:!0,waitedMs}),attempt<input.policy.attemptLimit&&(sleep(waitedMs),signal?.aborted))return finish({status:"cancelled",operationId:input.operationId,attempts})}return finish({status:"exhausted",operationId:input.operationId,attempts})},terminalOf(operationId){return terminalStates.get(operationId)}}}function createAutoCompactionExecutor(options){let coordinator=options.coordinator,policy=options.policy,inProgress=!1;return{get inProgress(){return inProgress},maybeCompact(input){if(!policy.enabled)return{status:"disabled"};if(inProgress)return{status:"busy"};if(input.currentTokens<policy.tokenThreshold)return{status:"below_threshold",currentTokens:input.currentTokens,threshold:policy.tokenThreshold};inProgress=!0;try{let staged=coordinator.stage({operationId:input.operationId,expectedRevision:coordinator.currentRevision,payload:null});if(staged.status==="stale")return{status:"stale",currentRevision:staged.currentRevision};if(staged.status==="duplicate")return{status:"cancelled"};if(input.signal?.aborted)return coordinator.cancelStage(staged.staged.token),{status:"cancelled"};let summary;try{summary=input.summarize(input.signal)}catch(error){return coordinator.cancelStage(staged.staged.token),{status:"summary_failed",reason:error instanceof Error?error.message:String(error)}}if(input.signal?.aborted)return coordinator.cancelStage(staged.staged.token),{status:"cancelled"};let outcome=coordinator.commitStage({token:staged.staged.token,apply:()=>{}});return outcome.status==="stale"?{status:"stale",currentRevision:outcome.currentRevision}:outcome.status==="committed"?{status:"completed",revision:outcome.revision,summary}:(coordinator.cancelStage(staged.staged.token),{status:"cancelled"})}finally{inProgress=!1}}}}function createBranchStateMigration(){return{migrate({entries,fromBranch,toBranch}){let source=entries.filter(entry=>entry.branch===fromBranch);return source.length===0?{status:"empty_source",fromBranch}:{status:"migrated",fromBranch,toBranch,migrated:Object.freeze(source.map(entry=>({key:entry.key,value:entry.value})))}},scan(entries,branch){return Object.freeze(entries.filter(entry=>entry.branch===branch))}}}function createReloadTransaction(){return{reload(items){let failures=[];for(let[index,item]of items.entries()){let failure=item.validate();failure!==null&&failures.push({index,reason:failure})}if(failures.length>0)return{status:"rolled_back",failures:Object.freeze(failures)};for(let item of items)item.commit();return{status:"committed",count:items.length}}}}function createHostCheckpointCoordinator(options={}){let revision=options.startRevision??0,staged=new Map,committed=new Map,tokenSequence=0;return{get currentRevision(){return revision},stage(input){if(typeof input.operationId!="string"||input.operationId.trim().length===0)throw new Error("Checkpoint operationId must be a non-empty string");let appliedRevision=committed.get(input.operationId);if(appliedRevision!==void 0)return{status:"duplicate",revision:appliedRevision};if(input.expectedRevision!==revision)return{status:"stale",currentRevision:revision};tokenSequence+=1;let token=`ckpt-${tokenSequence}`,entry={operationId:input.operationId,expectedRevision:input.expectedRevision,payload:input.payload,state:"staged"};return staged.set(token,entry),{status:"staged",staged:{token,operationId:input.operationId,expectedRevision:input.expectedRevision,currentRevision:revision}}},commitStage({token,apply}){let entry=staged.get(token);if(!entry)return{status:"unknown_token"};if(entry.state==="cancelled")return{status:"cancelled"};if(entry.expectedRevision!==revision)return staged.delete(token),{status:"stale",currentRevision:revision};try{apply(entry.payload,revision+1)}catch(error){return staged.delete(token),{status:"write_failed",reason:error instanceof Error?error.message:String(error)}}return revision+=1,committed.set(entry.operationId,revision),staged.delete(token),{status:"committed",revision}},cancelStage(token){let entry=staged.get(token);return entry?committed.has(entry.operationId)?{status:"already_committed"}:(entry.state="cancelled",{status:"cancelled"}):{status:"unknown_token"}},committedOperationIds(){return Object.freeze([...committed.keys()].sort())}}}function createManualCompactionExecutor(options){let coordinator=options.coordinator,state="idle",currentOperationId;return{get state(){return state},requestCompaction(input){if(state==="in_progress")return{status:"busy",currentOperationId:currentOperationId??"unknown"};if(input.pluginId.trim().length===0)throw new Error("Compaction pluginId must be a non-empty string");state="in_progress",currentOperationId=input.operationId;try{let staged=coordinator.stage({operationId:input.operationId,expectedRevision:coordinator.currentRevision,payload:null});if(staged.status==="stale")return{status:"stale",currentRevision:staged.currentRevision};if(staged.status==="duplicate")return{status:"completed",revision:staged.revision,summary:{duplicate:!0}};let summary;try{summary=input.summarize()}catch(error){return coordinator.cancelStage(staged.staged.token),{status:"summary_failed",reason:error instanceof Error?error.message:String(error)}}let outcome=coordinator.commitStage({token:staged.staged.token,apply:(payload,revision)=>{}});return outcome.status==="stale"?{status:"stale",currentRevision:outcome.currentRevision}:outcome.status==="committed"?{status:"completed",revision:outcome.revision,summary}:{status:"summary_failed",reason:`Unexpected checkpoint outcome: ${outcome.status}`}}finally{state="idle",currentOperationId=void 0}}}}function createOutputReducer(){return{fold(records){let groups=[],pendingTool=null,flushTool=()=>{pendingTool&&(groups.push(pendingTool),pendingTool=null)};for(let record of records){if(record.channel==="tool"&&record.correlationId!==void 0){let isCall=record.severity==="info"&&record.summary.endsWith("called");pendingTool&&pendingTool.correlationId!==record.correlationId&&flushTool(),pendingTool||(pendingTool={kind:"tool",toolName:record.code??record.summary,correlationId:record.correlationId,detailsRef:`trace:${record.traceId}#call:${record.correlationId}`,calls:0,ok:0,failed:0,records:[]}),pendingTool.records.push(record),isCall?pendingTool.calls+=1:record.severity==="ok"?pendingTool.ok+=1:record.severity==="error"&&(pendingTool.failed+=1);continue}flushTool();let last=groups.at(-1);last?.kind==="records"?(last.records.push(record),last.detailsRef=`trace:${record.traceId}#records:${last.records.length}`):groups.push({kind:"records",detailsRef:`trace:${record.traceId}#records:1`,records:[record]})}flushTool();let foldedToolGroups=0,frozenGroups=groups.map(group=>{let base={...group,records:Object.freeze([...group.records])};if(base.kind==="tool"){foldedToolGroups+=1;let firstAt=base.records[0]?.at??0,lastAt=base.records.at(-1)?.at??firstAt;return Object.freeze({...base,durationMs:Math.max(lastAt-firstAt,0)})}return Object.freeze(base)});return{groups:Object.freeze(frozenGroups),totalRecords:records.length,foldedToolGroups}},unfold(folded){return Object.freeze(folded.groups.flatMap(group=>[...group.records]))}}}var INTERNAL_FIELD_KEYS=["memoryId","memoryIds","score","scores","ranking","queryPlan","budget","budgets","agentRole","pluginRole","lease","leaseId","purgeState","rawSources"];function isArtifactLike(value){return typeof value=="object"&&value!==null&&"artifactId"in value&&"sessionId"in value&&"kind"in value}function toArtifactRef(value){if(!(typeof value.sessionId!="string"||typeof value.operationId!="string"||typeof value.artifactId!="string"||typeof value.kind!="string"||typeof value.mediaType!="string"||typeof value.truncated!="boolean"||typeof value.createdAt!="number"))return{sessionId:value.sessionId,operationId:value.operationId,artifactId:value.artifactId,kind:value.kind,mediaType:value.mediaType,...typeof value.sizeBytes=="number"?{sizeBytes:value.sizeBytes}:{},truncated:value.truncated,createdAt:value.createdAt}}function createHostOutputSerializer(){return{project(input,context){if(context.policyVersion.trim().length===0)return{text:"",diagnostics:["output_projection_rejected: policyVersion must be a non-empty string"],rejected:{code:"output_projection_rejected",reason:"policyVersion must be a non-empty string"}};let redactions=[],diagnostics=[],artifacts=[],showInternal=context.surface==="inspector"&&context.inspectorAuthorized,isAllowedKey=key=>!INTERNAL_FIELD_KEYS.includes(key)||showInternal,renderValue=(key,value,path)=>{if(!isAllowedKey(key))return redactions.push(`${path}.${key}`),`[redacted:${key}]`;if(isArtifactLike(value)){let ref=toArtifactRef(value);return ref?(artifacts.push(ref),`[artifact:${ref.artifactId}]`):(diagnostics.push(`output_projection_rejected: ${path}.${key} is a malformed artifact reference`),`[unrenderable:${key}]`)}return typeof value=="string"?value:typeof value=="number"||typeof value=="boolean"?String(value):value===null?"null":Array.isArray(value)?`[${value.map(item=>renderValue(key,item,path)).join(", ")}]`:typeof value=="object"?`{${Object.entries(value).map(([nestedKey,nestedValue])=>`${nestedKey}:${renderValue(nestedKey,nestedValue,`${path}.${key}`)}`).join(", ")}}`:(diagnostics.push(`output_projection_rejected: ${path}.${key} cannot be serialized`),`[unrenderable:${key}]`)},textParts=[];for(let[key,value]of Object.entries(input)){if(key==="artifacts"&&Array.isArray(value)){for(let entry of value)if(isArtifactLike(entry)){let ref=toArtifactRef(entry);ref?artifacts.push(ref):diagnostics.push("output_projection_rejected: artifacts entry is malformed")}else diagnostics.push("output_projection_rejected: artifacts entry is malformed");continue}textParts.push(`${key}=${renderValue(key,value,"root")}`)}return{text:textParts.join(`
2
+ import{AgentCompositionRuntime,AgentSession,AgentSessionRuntime,ArminComponent,AssistantMessageComponent,BOOTSTRAP_COMPACTION_PLUGIN_ID,BOOTSTRAP_LIFECYCLE_PLUGIN_ID,BOOTSTRAP_RETRY_PLUGIN_ID,BOOTSTRAP_TOOLS_PLUGIN_ID,BashExecutionComponent,BranchSummaryMessageComponent,CAPABILITY_CALL_EVENT_ID,CAPABILITY_CALL_EVENT_VERSION,CONFIG_DIR_NAME,CURRENT_SESSION_VERSION,CancellableLoader,CodingAgentServerService,CodingAgentSessionRuntime,CompactionSummaryMessageComponent,Container,CredentialSynchronizationError,CustomEditor,CustomMessageComponent,DEFAULT_COMPACTION_POLICY_NAME,DEFAULT_COMPACTION_SETTINGS,DEFAULT_MAX_BYTES,DEFAULT_MAX_LINES,DEFAULT_RETRY_POLICY_NAME,DEFAULT_SUITE_ID,DefaultPackageManager,DefaultResourceLoader,DialogEditorComponent,DialogInputComponent,DialogSelectorComponent,DurableServiceErrorV1,DynamicBorder,EXPERIMENTAL_PUBLIC_API_VERSION,FileSessionStorageProvider,FooterComponent,InteractiveMode,LifecycleExecuteError,LifecycleTransformError,Loader,LoginDialogComponent,MEMORY_RECALL_TOOL_NAME,MODEL_RESPONSE_EVENT_ID,MODEL_RESPONSE_EVENT_VERSION,MODEL_STREAM_EVENT_ID,MODEL_STREAM_EVENT_VERSION,ModelRuntime,ModelSelectorComponent,OAuthSelectorComponent,OPERATION_CANCEL_EVENT_ID,OPERATION_CANCEL_EVENT_VERSION,OPERATION_END_EVENT_ID,OPERATION_END_EVENT_VERSION,OPERATION_START_EVENT_ID,OPERATION_START_EVENT_VERSION,OPERATION_STEP_EVENT_ID,OPERATION_STEP_EVENT_VERSION,PLUGIN_DISPOSE_EVENT_ID,PLUGIN_DISPOSE_EVENT_VERSION,PLUGIN_READY_EVENT_ID,PLUGIN_READY_EVENT_VERSION,PluginManagerEntryComponent,RpcClient,SESSION_COMPACTION_COMMIT_EVENT_ID,SESSION_COMPACTION_COMMIT_EVENT_VERSION,SESSION_CONTEXT_REPLACED_EVENT_ID,SESSION_CONTEXT_REPLACED_EVENT_VERSION,SESSION_RELOAD_EVENT_ID,SESSION_RELOAD_EVENT_VERSION,SUITE_DELETE_CONFIRM_TOKEN,SUMMARY_MODEL_INVOCATION_ERROR_CODES,SelectList,SessionHeaderScanLimitError,SessionManager,SessionSelectorComponent,SettingsManager,SettingsSelectorComponent,SkillInvocationMessageComponent,Spacer,SuiteLifecycleError,SuiteResolutionError,TOOL_CALL_EVENT_ID,TOOL_CALL_EVENT_VERSION,TOOL_COMMIT_EVENT_ID,TOOL_COMMIT_EVENT_VERSION,TOOL_EXECUTE_EVENT_ID,TOOL_EXECUTE_EVENT_VERSION,TOOL_RESULT_EVENT_ID,TOOL_RESULT_EVENT_VERSION,TOOL_RESULT_RAW_EVENT_ID,TOOL_RESULT_RAW_EVENT_VERSION,TOOL_RESULT_TRANSFORM_EVENT_ID,TOOL_RESULT_TRANSFORM_EVENT_VERSION,Text,Theme,ThinkingSelectorComponent,ToolExecutionComponent,TreeSelectorComponent,UserMessageComponent,UserMessageSelectorComponent,VERSION,assembleCodingAgentServer,assembleProfile,buildContextEntries,buildProfileIdentityV1,buildResolvedAgentProfileV1,buildSessionContext,calculateContextTokens,clearDanglingSuiteSettings,collectEntriesForBranchSummary,compact,convertToLlm,convertToPng,copyToClipboard,createAgentCompositionRuntime,createAgentSession,createAgentSessionFromServices,createAgentSessionRuntime,createAgentSessionServices,createBashTool,createBashToolDefinition,createCapabilityRuntime,createCodingTools,createDisposableRegistration,createDurableService,createEditTool,createEditToolDefinition,createEventEnvelope,createFileDurableStoreBackend,createFileSessionSource,createFindTool,createFindToolDefinition,createGrepTool,createGrepToolDefinition,createHostOutputProjector,createLocalBashOperations,createLocalPowerShellOperations,createLsTool,createLsToolDefinition,createPowerShellTool,createPowerShellToolDefinition,createProfileLock,createProfileMigrationPolicy,createProfileRegistry,createReadOnlyTools,createReadTool,createReadToolDefinition,createStableAgentSession,createStableAgentSessionRuntime,createStdioChannelAdapter,createSuite,createSyntheticSourceInfo,createWriteTool,createWriteToolDefinition,defineTool,deleteSuite,detachedSessionSnapshot,detectSupportedImageMimeTypeFromFile,discoverCapabilityPluginManifests,dist_exports,durableLogPath,ecosystem_exports,estimateTokens,findCutPoint,findSuiteSessionRefs,findTurnStartIndex,formatDimensionNote,formatSize,formatSkillsForPrompt,generateBranchSummary,generateDiffString,generateSummary,generateSummaryWithUsage,generateUnifiedPatch,getAgentDir,getAvailableThemes,getDocsPath,getExamplesPath,getLanguageFromPath,getLastAssistantUsage,getLatestCompactionEntry,getMarkdownTheme,getPackageDir,getPowerShellConfig,getReadmePath,getSelectListTheme,getSessionsDir,getSettingsListTheme,getShellConfig,highlightCode,initTheme,installBootstrapCompactionPolicy,installBootstrapLifecycle,installBootstrapRetryPolicy,installBootstrapTools,installSessionBootstrapTools,isBuiltinSuiteId,keyHint,keyText,killProcessTree,listBuiltinPluginManifestsV1,listBuiltinPluginProfilesV1,listSuiteIds,loadCapabilityPlugin,loadCapabilityPluginFromManifest,loadCapabilityPluginSync,loadProjectContextFiles,loadSkills,loadSkillsFromDir,main,migrateSessionEntries,parseArgs,parseCapabilityPluginManifest,parseFrontmatter,parseSessionEntries,parseSkillBlock,plugin_manager_controller_exports,plugin_selection_controller_exports,prepareBranchEntries,profileIdentitiesCompatible,projectSessionTranscript,rawKeyHint,readStoredCredential,renderDiff,replaceProfileLock,replaceProfilePlugin,resetSuite,resizeImage,resolveBuiltinPluginProfileV1,resolveCliModel,resolveModelScopeWithDiagnostics,resolvePluginCapabilityOrder,runPrintMode,runRpcMode,sanitizeBinaryOutput,serializeConversation,sessionEntryToContextMessages,shouldCompact,stableJsonDigest,startCodingAgentRemoteServer,stripFrontmatter,truncateHead,truncateLine,truncateTail,truncateToVisualLines,validateCapabilityCallEventDataV1,validateExecutionFactsV1,validateModelResponseEventDataV1,validateModelStreamEventDataV1,validateOperationCancelEventDataV1,validateOperationEndEventDataV1,validateOperationStartEventDataV1,validateOperationStepEventDataV1,validatePluginDisposeEventDataV1,validatePluginReadyEventDataV1,validateRetryScheduleV1,validateSessionCompactionCommitEventDataV1,validateSessionContextReplacedEventDataV1,validateSessionReloadEventDataV1,validateToolCallEventDataV1,validateToolCommitEventDataV1,validateToolExecuteEventDataV1,validateToolResultEventDataV1,validateToolResultRawEventDataV1,validateToolResultTransformEventDataV1,verifyProfileLock,withFileMutationQueue}from"./chunks/chunk-WJR4VZLQ.js";import"./chunks/chunk-JUUC5AZY.js";import"./chunks/chunk-XDUWOHPL.js";import"./chunks/chunk-3QKHSPQL.js";import"./chunks/chunk-DRQDKNXA.js";import"./chunks/chunk-7ZY7IXZD.js";import"./chunks/chunk-V46XUTK3.js";import"./chunks/chunk-WGLBM2BP.js";import"./chunks/chunk-4L3WN2XY.js";function contentHash(bytes){let hash=2166136261;for(let byte of bytes)hash^=byte,hash=Math.imul(hash,16777619);return(hash>>>0).toString(36)}function toStat(entry){return{artifactId:entry.ref.artifactId,sessionId:entry.ref.sessionId,operationId:entry.ref.operationId,kind:entry.ref.kind,mediaType:entry.ref.mediaType,sizeBytes:entry.ref.sizeBytes,state:entry.ended?"ended":"available",...entry.ended?{endReason:entry.endReason}:{}}}function createArtifactStore(options={}){let now=options.now??(()=>Date.now()),artifacts=new Map,sequenceByIdentity=new Map,globalWriteSequence=0;return{write(input){if(input.bytes.length===0)throw new Error("Artifact bytes must not be empty");let identity=`${input.sessionId}\0${input.operationId}`,sequence=(sequenceByIdentity.get(identity)??0)+1;sequenceByIdentity.set(identity,sequence),globalWriteSequence+=1;let artifactId=`art-${contentHash(input.bytes)}-${sequence}-${globalWriteSequence}`,ref={artifactId,sessionId:input.sessionId,operationId:input.operationId,kind:input.kind,mediaType:input.mediaType,sizeBytes:input.bytes.length,truncated:!1,createdAt:now()};return artifacts.set(artifactId,{ref,bytes:input.bytes,ended:!1}),{ref}},read(input){let entry=artifacts.get(input.artifactId);if(!entry)throw new Error(`Artifact not found: ${input.artifactId}`);if(entry.ref.sessionId!==input.sessionId)throw new Error(`Artifact ${input.artifactId} belongs to a different session`);if(entry.ended)throw new Error(`Artifact ${input.artifactId} lifecycle has ended: ${entry.endReason??"ended"}`);return{mediaType:entry.ref.mediaType,bytes:entry.bytes}},stat(artifactId){let entry=artifacts.get(artifactId);return entry===void 0?void 0:toStat(entry)},list(sessionId){return[...artifacts.values()].filter(entry=>entry.ref.sessionId===sessionId).map(entry=>toStat(entry))},endLifecycle(artifactId,input){let entry=artifacts.get(artifactId);if(!entry)throw new Error(`Artifact not found: ${artifactId}`);if(entry.ended)throw new Error(`Artifact ${artifactId} lifecycle has already ended`);return entry.ended=!0,entry.endReason=input.reason,entry.bytes=new Uint8Array(0),toStat(entry)}}}function planArtifactPages(store,input){if(!Number.isSafeInteger(input.pageSize)||input.pageSize<1)return{status:"invalid_page_size",pageSize:input.pageSize};let stat=store.stat(input.artifactId);if(!stat)return{status:"unavailable",reason:`Artifact not found: ${input.artifactId}`};if(stat.state==="ended")return{status:"unavailable",reason:`Artifact ${input.artifactId} lifecycle has ended: ${stat.endReason??"ended"}`};let totalBytes=stat.sizeBytes??0,pages=[];for(let offset=0;offset<totalBytes;offset+=input.pageSize)pages.push({index:pages.length,offset,size:Math.min(input.pageSize,totalBytes-offset)});return{status:"planned",totalBytes,pageSize:input.pageSize,pages:Object.freeze(pages)}}function readArtifactPage(store,input){if(!Number.isSafeInteger(input.pageSize)||input.pageSize<1)return{status:"unavailable",reason:`Invalid page size: ${input.pageSize}`};let plan=planArtifactPages(store,{artifactId:input.artifactId,pageSize:input.pageSize});if(plan.status!=="planned")return{status:"unavailable",reason:plan.status==="unavailable"?plan.reason:`Invalid page size: ${plan.pageSize}`};let page=plan.pages[input.index];if(!page)return{status:"unavailable",reason:`Page ${input.index} is outside the plan (${plan.pages.length} pages)`};let bytes;try{bytes=store.read({artifactId:input.artifactId,sessionId:input.sessionId}).bytes}catch(error){return{status:"unavailable",reason:error instanceof Error?error.message:String(error)}}let slice=bytes.slice(page.offset,page.offset+page.size),nextOffset=page.offset+page.size,hasMore=nextOffset<plan.totalBytes;return{status:"ok",index:page.index,offset:page.offset,bytes:slice,hasMore,...hasMore?{nextOffset}:{}}}var AGENT_CAPABILITY_CONTRACT_ID="agent-forge/agent-capability-contract",AGENT_CAPABILITY_CONTRACT_VERSION=1,AGENT_ERROR_CODES_V1=["provider_error","operation_timeout","operation_cancelled","idempotency_conflict","revision_conflict","revision_unavailable","unsupported_capability","invalid_request","invalid_ref","not_found","cancelled","unsupported","busy","session_locked","unauthorized","not_implemented","internal_error"],agentErrorCodeSet=new Set(AGENT_ERROR_CODES_V1);function isRegisteredAgentErrorCodeV1(code){return agentErrorCodeSet.has(code)}var PROTOCOL_ERROR_CODE_TO_AGENT_CODE_V1=Object.freeze({version:"unsupported",busy:"busy",session_locked:"session_locked",not_found:"not_found",invalid_request:"invalid_request",unauthorized:"unauthorized",not_implemented:"not_implemented",internal_error:"internal_error"});function mapProtocolErrorCodeToAgentErrorV1(code){return PROTOCOL_ERROR_CODE_TO_AGENT_CODE_V1[code]}function toErrorEnvelopeV1(error){let message=error instanceof Error?error.message:String(error),name=error instanceof Error?error.name:void 0,code;if(error&&typeof error=="object"&&"code"in error){let raw=error.code;typeof raw=="string"&&raw.trim()!==""&&(code=raw)}code===void 0&&(code="internal_error");let mapped=PROTOCOL_ERROR_CODE_TO_AGENT_CODE_V1[code];return buildErrorEnvelopeV1({version:1,code:mapped??code,message,retryable:!1,...name===void 0?{}:{name}})}function isPlainRecord(value){if(value===null||typeof value!="object"||Array.isArray(value))return!1;let prototype=Object.getPrototypeOf(value);return prototype===Object.prototype||prototype===null}function assertPlainRecord(value,label){if(!isPlainRecord(value))throw new Error(`${label} must be a plain object`)}function assertExactKeys(value,required,optional,label){let allowed=new Set([...required,...optional]),unsupported=Object.keys(value).filter(key=>!allowed.has(key)).sort();if(unsupported.length>0)throw new Error(`${label} has unsupported fields: ${unsupported.join(", ")}`);for(let key of required)if(!(key in value))throw new Error(`${label} is missing required field: ${key}`)}function assertNonEmptyString(value,label){if(typeof value!="string"||value.trim().length===0)throw new Error(`${label} must be a non-empty string`)}function assertPositiveSafeInteger(value,label){if(typeof value!="number"||!Number.isSafeInteger(value)||value<1)throw new Error(`${label} must be a positive safe integer`)}function assertNonNegativeSafeInteger(value,label){if(typeof value!="number"||!Number.isSafeInteger(value)||value<0)throw new Error(`${label} must be a non-negative safe integer`)}function assertJsonValue(value,label,seen=new WeakSet){if(!(value===null||typeof value=="boolean"||typeof value=="string")){if(typeof value=="number"){if(Number.isFinite(value))return;throw new Error(`${label} must contain finite JSON numbers`)}if(typeof value!="object")throw new Error(`${label} must be JSON-compatible`);if(seen.has(value))throw new Error(`${label} must not contain cycles`);if(seen.add(value),Array.isArray(value))for(let[index,child]of value.entries())assertJsonValue(child,`${label}[${index}]`,seen);else{if(!isPlainRecord(value))throw new Error(`${label} must contain only plain JSON objects`);for(let[key,child]of Object.entries(value))assertJsonValue(child,`${label}.${key}`,seen)}seen.delete(value)}}function detachedFreeze(value,seen=new WeakMap){if(value===null||typeof value!="object")return value;let existing=seen.get(value);if(existing!==void 0)return existing;if(Array.isArray(value)){let result2=[];seen.set(value,result2);for(let child of value)result2.push(detachedFreeze(child,seen));return Object.freeze(result2)}let result={};seen.set(value,result);for(let[key,child]of Object.entries(value))result[key]=detachedFreeze(child,seen);return Object.freeze(result)}function capabilitySort(left,right){return left.id<right.id?-1:left.id>right.id?1:left.version-right.version}function validateCapabilityRefs(value,label){if(!Array.isArray(value))throw new Error(`${label} must be an array`);let refs=value.map((item,index)=>validateCapabilityRefV1(item,`${label}[${index}]`)),seen=new Set;for(let ref of refs){let key=`${ref.id}\0${ref.version}`;if(seen.has(key))throw new Error(`${label} contains duplicate capability: ${ref.id}@${ref.version}`);seen.add(key)}return Object.freeze(refs.sort(capabilitySort))}function validateHostTransport(value,label){if(value!=="in-process"&&value!=="stdio"&&value!=="http"&&value!=="rpc"&&value!=="unix"&&value!=="websocket")throw new Error(`${label} is invalid`)}function validateCapabilityRefV1(value,label="Capability reference"){return assertPlainRecord(value,label),assertExactKeys(value,["id","version"],[],label),assertNonEmptyString(value.id,`${label}.id`),assertPositiveSafeInteger(value.version,`${label}.version`),detachedFreeze({id:value.id,version:value.version})}function validateHostContextV1(value){if(assertPlainRecord(value,"Host context"),assertExactKeys(value,["mode","features","transports"],[],"Host context"),value.mode!=="readonly"&&value.mode!=="full-control")throw new Error("Host context.mode is invalid");if(!Array.isArray(value.features))throw new Error("Host context.features must be an array");let features=value.features.map((feature,index)=>(assertNonEmptyString(feature,`Host context.features[${index}]`),feature));if(new Set(features).size!==features.length)throw new Error("Host context.features must not contain duplicates");if(!Array.isArray(value.transports))throw new Error("Host context.transports must be an array");let transports=value.transports.map((transport,index)=>(validateHostTransport(transport,`Host context.transports[${index}]`),transport));if(new Set(transports).size!==transports.length)throw new Error("Host context.transports must not contain duplicates");return detachedFreeze({mode:value.mode,features:[...features].sort(),transports:[...transports].sort()})}function buildHostContextV1(input){return validateHostContextV1(input)}function validateContractCompatibilityRequirementsV1(value){assertPlainRecord(value,"Contract compatibility requirements"),assertExactKeys(value,["contractId","version","mode","features","transports","capabilities"],[],"Contract compatibility requirements"),assertNonEmptyString(value.contractId,"Contract compatibility requirements.contractId"),assertPositiveSafeInteger(value.version,"Contract compatibility requirements.version");let hostContext=validateHostContextV1({mode:value.mode,features:value.features,transports:value.transports}),capabilities=validateCapabilityRefs(value.capabilities,"Contract compatibility requirements.capabilities");return detachedFreeze({contractId:value.contractId,version:value.version,mode:hostContext.mode,features:hostContext.features,transports:hostContext.transports,capabilities})}function buildContractCompatibilityRequirementsV1(input){return validateContractCompatibilityRequirementsV1(input)}var CONTRACT_COMPATIBILITY_ISSUE_CODES_V1=["unsupported_contract","host_mode_mismatch","unsupported_feature","unsupported_transport","unsupported_capability"];function validateContractCompatibilityResultV1(value){if(assertPlainRecord(value,"Contract compatibility result"),assertExactKeys(value,["version","compatible","issues"],[],"Contract compatibility result"),value.version!==1)throw new Error("Contract compatibility result.version must be 1");if(typeof value.compatible!="boolean")throw new Error("Contract compatibility result.compatible must be boolean");if(!Array.isArray(value.issues))throw new Error("Contract compatibility result.issues must be an array");if(value.compatible&&value.issues.length>0)throw new Error("Contract compatibility result.compatible must be false when issues exist");if(!value.compatible&&value.issues.length===0)throw new Error("Contract compatibility result.compatible must be true when no issues exist");let issues=value.issues.map((entry,index)=>{if(assertPlainRecord(entry,`Contract compatibility result.issues[${index}]`),assertExactKeys(entry,["code","error"],["missingFeatures","missingTransports","missingCapabilities"],`Contract compatibility result.issues[${index}]`),!CONTRACT_COMPATIBILITY_ISSUE_CODES_V1.includes(entry.code))throw new Error(`Contract compatibility result.issues[${index}].code is invalid`);let error=validateErrorEnvelopeV1(entry.error),missingFeatures=entry.missingFeatures;if(missingFeatures!==void 0&&(!Array.isArray(missingFeatures)||missingFeatures.some(item=>typeof item!="string")))throw new Error(`Contract compatibility result.issues[${index}].missingFeatures must be strings`);let missingTransports=entry.missingTransports;if(missingTransports!==void 0&&(!Array.isArray(missingTransports)||missingTransports.some(item=>typeof item!="string")))throw new Error(`Contract compatibility result.issues[${index}].missingTransports must be strings`);let missingCapabilities=entry.missingCapabilities;missingCapabilities!==void 0&&validateCapabilityRefs(missingCapabilities,`Contract compatibility result.issues[${index}].missingCapabilities`);let issue={code:entry.code,error,...missingFeatures===void 0?{}:{missingFeatures:Object.freeze(missingFeatures.map(item=>item))},...missingTransports===void 0?{}:{missingTransports:Object.freeze(missingTransports.map(item=>item))},...missingCapabilities===void 0?{}:{missingCapabilities:validateCapabilityRefs(missingCapabilities,"missingCapabilities")}};return detachedFreeze(issue)});return detachedFreeze({version:1,compatible:value.compatible,issues:Object.freeze(issues)})}function validateAgentCapabilityContractV1(value){if(assertPlainRecord(value,"Agent capability contract"),assertExactKeys(value,["contractId","version","capabilities","hostContext"],[],"Agent capability contract"),value.contractId!==AGENT_CAPABILITY_CONTRACT_ID)throw new Error(`Agent capability contract.contractId must be ${AGENT_CAPABILITY_CONTRACT_ID}`);if(value.version!==1)throw new Error("Agent capability contract.version must be 1");let capabilities=validateCapabilityRefs(value.capabilities,"Agent capability contract.capabilities"),hostContext=validateHostContextV1(value.hostContext);return detachedFreeze({contractId:value.contractId,version:1,capabilities,hostContext})}function buildAgentCapabilityContractV1(input){return validateAgentCapabilityContractV1({...input,version:input.version??1})}function validateAgentProfileV1(value){assertPlainRecord(value,"Agent profile"),assertExactKeys(value,["id","version","rootAgent","requiredPlugins"],["optionalPlugins","defaults"],"Agent profile"),assertNonEmptyString(value.id,"Agent profile.id"),assertPositiveSafeInteger(value.version,"Agent profile.version"),assertNonEmptyString(value.rootAgent,"Agent profile.rootAgent");let validatePluginIds=(candidate,label)=>{if(!Array.isArray(candidate))throw new Error(`${label} must be an array`);let ids=candidate.map((id,index)=>(assertNonEmptyString(id,`${label}[${index}]`),id));if(new Set(ids).size!==ids.length)throw new Error(`${label} must not contain duplicates`);return Object.freeze([...ids].sort())},requiredPlugins=validatePluginIds(value.requiredPlugins,"Agent profile.requiredPlugins"),optionalPlugins=value.optionalPlugins===void 0?void 0:validatePluginIds(value.optionalPlugins,"Agent profile.optionalPlugins");if(optionalPlugins?.some(id=>requiredPlugins.includes(id)))throw new Error("Agent profile.optionalPlugins must not overlap requiredPlugins");return value.defaults!==void 0&&assertJsonValue(value.defaults,"Agent profile.defaults"),detachedFreeze({id:value.id,version:value.version,rootAgent:value.rootAgent,requiredPlugins,...optionalPlugins===void 0?{}:{optionalPlugins},...value.defaults===void 0?{}:{defaults:value.defaults}})}function buildAgentProfileV1(input){return validateAgentProfileV1(input)}function validateArtifactRefV1(value){if(assertPlainRecord(value,"Artifact reference"),assertExactKeys(value,["sessionId","operationId","artifactId","kind","mediaType","truncated","createdAt"],["sizeBytes"],"Artifact reference"),assertNonEmptyString(value.sessionId,"Artifact reference.sessionId"),assertNonEmptyString(value.operationId,"Artifact reference.operationId"),assertNonEmptyString(value.artifactId,"Artifact reference.artifactId"),assertNonEmptyString(value.kind,"Artifact reference.kind"),assertNonEmptyString(value.mediaType,"Artifact reference.mediaType"),value.sizeBytes!==void 0&&assertNonNegativeSafeInteger(value.sizeBytes,"Artifact reference.sizeBytes"),typeof value.truncated!="boolean")throw new Error("Artifact reference.truncated must be boolean");return assertNonNegativeSafeInteger(value.createdAt,"Artifact reference.createdAt"),detachedFreeze({sessionId:value.sessionId,operationId:value.operationId,artifactId:value.artifactId,kind:value.kind,mediaType:value.mediaType,...value.sizeBytes===void 0?{}:{sizeBytes:value.sizeBytes},truncated:value.truncated,createdAt:value.createdAt})}function buildArtifactRefV1(input){return validateArtifactRefV1(input)}function checkContractCompatibilityV1(candidateInput,requirementsInput){let candidate=validateAgentCapabilityContractV1(candidateInput),requirements=validateContractCompatibilityRequirementsV1(requirementsInput),issues=[];(candidate.contractId!==requirements.contractId||candidate.version!==requirements.version)&&issues.push({code:"unsupported_contract",error:commandError("unsupported_contract",`Contract is unsupported: ${requirements.contractId}@${requirements.version}`)}),candidate.hostContext.mode!==requirements.mode&&issues.push({code:"host_mode_mismatch",error:commandError("host_mode_mismatch",`Host mode is incompatible: required ${requirements.mode}, received ${candidate.hostContext.mode}`)});let missingFeatures=requirements.features.filter(feature=>!candidate.hostContext.features.includes(feature));missingFeatures.length>0&&issues.push({code:"unsupported_feature",error:commandError("unsupported_feature",`Host features are unsupported: ${missingFeatures.join(", ")}`),missingFeatures:Object.freeze([...missingFeatures])});let missingTransports=requirements.transports.filter(transport=>!candidate.hostContext.transports.includes(transport));missingTransports.length>0&&issues.push({code:"unsupported_transport",error:commandError("unsupported_transport",`Host transports are unsupported: ${missingTransports.join(", ")}`),missingTransports:Object.freeze([...missingTransports])});let missingCapabilities=requirements.capabilities.filter(required=>!candidate.capabilities.some(available=>available.id===required.id&&available.version===required.version));return missingCapabilities.length>0&&issues.push({code:"unsupported_capability",error:commandError("unsupported_capability",`Capabilities are unsupported: ${missingCapabilities.map(item=>`${item.id}@${item.version}`).join(", ")}`),missingCapabilities:Object.freeze([...missingCapabilities])}),detachedFreeze({version:1,compatible:issues.length===0,issues})}function validateAgentRole(value,label){if(value!=="root-agent-controller"&&value!=="child-agent-controller")throw new Error(`${label} is invalid`)}function validateAgentDefinitionSnapshotV1(value){if(assertPlainRecord(value,"Agent definition snapshot"),assertExactKeys(value,["version","id","definitionVersion","role","capabilities"],["owner"],"Agent definition snapshot"),value.version!==1)throw new Error("Agent definition snapshot.version must be 1");assertNonEmptyString(value.id,"Agent definition snapshot.id"),assertPositiveSafeInteger(value.definitionVersion,"Agent definition snapshot.definitionVersion"),validateAgentRole(value.role,"Agent definition snapshot.role");let capabilities=validateCapabilityRefs(value.capabilities,"Agent definition snapshot.capabilities");return value.owner!==void 0&&assertNonEmptyString(value.owner,"Agent definition snapshot.owner"),detachedFreeze({version:1,id:value.id,definitionVersion:value.definitionVersion,role:value.role,capabilities,...value.owner===void 0?{}:{owner:value.owner}})}function buildAgentDefinitionSnapshotV1(input){return validateAgentDefinitionSnapshotV1(input)}function validateAgentInstanceSnapshotV1(value){if(assertPlainRecord(value,"Agent instance snapshot"),assertExactKeys(value,["version","id","definitionId","definitionVersion","role","status","revision"],["parentInstanceId","leaseOwner"],"Agent instance snapshot"),value.version!==1)throw new Error("Agent instance snapshot.version must be 1");if(assertNonEmptyString(value.id,"Agent instance snapshot.id"),assertNonEmptyString(value.definitionId,"Agent instance snapshot.definitionId"),assertPositiveSafeInteger(value.definitionVersion,"Agent instance snapshot.definitionVersion"),validateAgentRole(value.role,"Agent instance snapshot.role"),value.status!=="created"&&value.status!=="running"&&value.status!=="succeeded"&&value.status!=="failed"&&value.status!=="cancelled"&&value.status!=="disposed")throw new Error("Agent instance snapshot.status is invalid");return assertNonNegativeSafeInteger(value.revision,"Agent instance snapshot.revision"),value.parentInstanceId!==void 0&&assertNonEmptyString(value.parentInstanceId,"Agent instance snapshot.parentInstanceId"),value.leaseOwner!==void 0&&assertNonEmptyString(value.leaseOwner,"Agent instance snapshot.leaseOwner"),detachedFreeze({version:1,id:value.id,definitionId:value.definitionId,definitionVersion:value.definitionVersion,role:value.role,status:value.status,revision:value.revision,...value.parentInstanceId===void 0?{}:{parentInstanceId:value.parentInstanceId},...value.leaseOwner===void 0?{}:{leaseOwner:value.leaseOwner}})}function buildAgentInstanceSnapshotV1(input){return validateAgentInstanceSnapshotV1(input)}function validateSessionRevisionV1(value){if(assertPlainRecord(value,"Session revision"),assertExactKeys(value,["version","sessionId","sequence","leafId"],[],"Session revision"),value.version!==1)throw new Error("Session revision.version must be 1");if(assertNonEmptyString(value.sessionId,"Session revision.sessionId"),assertNonNegativeSafeInteger(value.sequence,"Session revision.sequence"),value.leafId!==null&&value.leafId!==void 0&&assertNonEmptyString(value.leafId,"Session revision.leafId"),value.leafId===void 0)throw new Error("Session revision.leafId is required");return detachedFreeze({version:1,sessionId:value.sessionId,sequence:value.sequence,leafId:value.leafId})}function buildSessionRevisionV1(input){return validateSessionRevisionV1(input)}function validateSessionSnapshotV1(value){if(assertPlainRecord(value,"Session snapshot"),assertExactKeys(value,["version","sessionId","revision"],[],"Session snapshot"),value.version!==1)throw new Error("Session snapshot.version must be 1");assertNonEmptyString(value.sessionId,"Session snapshot.sessionId");let revision=validateSessionRevisionV1(value.revision);if(revision.sessionId!==value.sessionId)throw new Error("Session snapshot.revision.sessionId must match sessionId");return detachedFreeze({version:1,sessionId:value.sessionId,revision})}function buildSessionSnapshotV1(input){return validateSessionSnapshotV1(input)}function validateErrorEnvelopeV1(value){if(assertPlainRecord(value,"Error envelope"),assertExactKeys(value,["version","code","message","retryable"],["details","name"],"Error envelope"),value.version!==1)throw new Error("Error envelope.version must be 1");if(assertNonEmptyString(value.code,"Error envelope.code"),typeof value.message!="string")throw new Error("Error envelope.message must be a string");if(typeof value.retryable!="boolean")throw new Error("Error envelope.retryable must be a boolean");return value.name!==void 0&&assertNonEmptyString(value.name,"Error envelope.name"),value.details!==void 0&&assertJsonValue(value.details,"Error envelope.details"),detachedFreeze({version:1,code:value.code,message:value.message,retryable:value.retryable,...value.details===void 0?{}:{details:value.details},...value.name===void 0?{}:{name:value.name}})}function buildErrorEnvelopeV1(input){return validateErrorEnvelopeV1(input)}function validateOperationTerminalStatus(value,label){if(value!=="succeeded"&&value!=="failed"&&value!=="cancelled"&&value!=="timed_out")throw new Error(`${label} is invalid`)}function validateOperationTerminalV1(value){if(assertPlainRecord(value,"Operation terminal"),!("version"in value)||!("status"in value))throw new Error("Operation terminal is missing required field: version or status");if(value.version!==1)throw new Error("Operation terminal.version must be 1");if(validateOperationTerminalStatus(value.status,"Operation terminal.status"),value.status==="succeeded")return assertExactKeys(value,["version","status"],["result"],"Operation terminal"),value.result!==void 0&&assertJsonValue(value.result,"Operation terminal.result"),detachedFreeze({version:1,status:"succeeded",...value.result===void 0?{}:{result:value.result}});assertExactKeys(value,["version","status","error"],[],"Operation terminal");let error=validateErrorEnvelopeV1(value.error);return detachedFreeze({version:1,status:value.status,error})}function buildOperationTerminalV1(input){return validateOperationTerminalV1(input)}function validateOperationSnapshotV1(value){if(assertPlainRecord(value,"Operation snapshot"),assertExactKeys(value,["version","operationId","kind","status"],["terminal","instanceId","sessionId","inputRevision"],"Operation snapshot"),value.version!==1)throw new Error("Operation snapshot.version must be 1");if(assertNonEmptyString(value.operationId,"Operation snapshot.operationId"),assertNonEmptyString(value.kind,"Operation snapshot.kind"),value.status!=="queued"&&value.status!=="running"&&value.status!=="succeeded"&&value.status!=="failed"&&value.status!=="cancelled"&&value.status!=="timed_out")throw new Error("Operation snapshot.status is invalid");if((value.status==="queued"||value.status==="running")&&value.terminal!==void 0)throw new Error("Operation snapshot active status must not have a terminal");if(value.status!=="queued"&&value.status!=="running"&&value.terminal===void 0)throw new Error("Operation snapshot terminal status requires a terminal");let terminal=value.terminal===void 0?void 0:validateOperationTerminalV1(value.terminal);if(terminal!==void 0&&terminal.status!==value.status)throw new Error("Operation snapshot.terminal.status must match status");value.instanceId!==void 0&&assertNonEmptyString(value.instanceId,"Operation snapshot.instanceId"),value.sessionId!==void 0&&assertNonEmptyString(value.sessionId,"Operation snapshot.sessionId");let inputRevision=value.inputRevision===void 0?void 0:validateSessionRevisionV1(value.inputRevision);if(inputRevision!==void 0&&value.sessionId!==void 0&&inputRevision.sessionId!==value.sessionId)throw new Error("Operation snapshot.inputRevision.sessionId must match sessionId");return detachedFreeze({version:1,operationId:value.operationId,kind:value.kind,status:value.status,...terminal===void 0?{}:{terminal},...value.instanceId===void 0?{}:{instanceId:value.instanceId},...value.sessionId===void 0?{}:{sessionId:value.sessionId},...inputRevision===void 0?{}:{inputRevision}})}function buildOperationSnapshotV1(input){return validateOperationSnapshotV1(input)}function validateCommandRequestV1(value){if(assertPlainRecord(value,"Command request"),assertExactKeys(value,["version","operationId","idempotencyKey","command","target","input","hostContext"],["expectedRevision"],"Command request"),value.version!==1)throw new Error("Command request.version must be 1");assertNonEmptyString(value.operationId,"Command request.operationId"),assertNonEmptyString(value.idempotencyKey,"Command request.idempotencyKey"),assertNonEmptyString(value.command,"Command request.command"),assertNonEmptyString(value.target,"Command request.target"),assertJsonValue(value.input,"Command request.input");let expectedRevision=value.expectedRevision===void 0?void 0:validateSessionRevisionV1(value.expectedRevision);if(expectedRevision!==void 0&&expectedRevision.sessionId!==value.target)throw new Error("Command request.expectedRevision.sessionId does not match target");let hostContext=validateHostContextV1(value.hostContext);return detachedFreeze({version:1,operationId:value.operationId,idempotencyKey:value.idempotencyKey,command:value.command,target:value.target,input:value.input,...expectedRevision===void 0?{}:{expectedRevision},hostContext})}function buildCommandRequestV1(input){return validateCommandRequestV1({...input,version:input.version??1})}function validateCommandAdmissionV1(value){if(assertPlainRecord(value,"Command admission"),assertExactKeys(value,["version","status","request"],["operation","error"],"Command admission"),value.version!==1)throw new Error("Command admission.version must be 1");if(value.status!=="accepted"&&value.status!=="existing"&&value.status!=="rejected")throw new Error("Command admission.status is invalid");let request=validateCommandRequestV1(value.request),operation=value.operation===void 0?void 0:validateOperationSnapshotV1(value.operation);if((value.status==="accepted"||value.status==="existing")&&operation===void 0)throw new Error("Command admission accepted status requires an operation");if(value.status==="rejected"&&value.error===void 0)throw new Error("Command admission rejected status requires an error");let error=value.error===void 0?void 0:validateErrorEnvelopeV1(value.error);return detachedFreeze({version:1,status:value.status,request,...operation===void 0?{}:{operation},...error===void 0?{}:{error}})}function canonicalJson(value){if(value===null||typeof value!="object")return JSON.stringify(value);if(Array.isArray(value))return`[${value.map(canonicalJson).join(",")}]`;let record=value;return`{${Object.keys(record).sort().map(key=>`${JSON.stringify(key)}:${canonicalJson(record[key])}`).join(",")}}`}function sameRevision(left,right){return left.sessionId===right.sessionId&&left.sequence===right.sequence&&left.leafId===right.leafId}function commandError(code,message,details){return buildErrorEnvelopeV1({version:1,code,message,retryable:!1,...details===void 0?{}:{details}})}function rejectedAdmission(request,error){return detachedFreeze({version:1,status:"rejected",request,error})}function createCommandOperationRegistryV1(){let entries=new Map,read=operationId=>{assertNonEmptyString(operationId,"operationId");let entry=entries.get(operationId);if(!entry)throw new Error(`Operation is not retained: ${operationId}`);return entry},write=(entry,operation)=>(entry.operation=operation,operation),terminal=entry=>entry.operation.terminal!==void 0;return Object.freeze({admit(input,currentRevision){let request=validateCommandRequestV1(input),current=currentRevision===void 0?void 0:validateSessionRevisionV1(currentRevision),fingerprint=canonicalJson(request),existing=entries.get(request.operationId);if(existing)return existing.fingerprint===fingerprint?detachedFreeze({version:1,status:"existing",request,operation:existing.operation}):rejectedAdmission(request,commandError("idempotency_conflict",`Operation ID is already bound to different input: ${request.operationId}`));if(request.expectedRevision!==void 0){if(current===void 0)return rejectedAdmission(request,commandError("revision_unavailable",`Current revision is required for: ${request.target}`));if(!sameRevision(request.expectedRevision,current))return rejectedAdmission(request,commandError("revision_conflict",`Expected revision does not match: ${request.target}`,{expectedRevision:request.expectedRevision,currentRevision:current}))}let operation=buildOperationSnapshotV1({version:1,operationId:request.operationId,kind:`command:${request.command}`,status:"queued",...request.expectedRevision===void 0?{}:{sessionId:request.expectedRevision.sessionId,inputRevision:request.expectedRevision}});return entries.set(request.operationId,{request,fingerprint,operation}),detachedFreeze({version:1,status:"accepted",request,operation})},start(operationId){let entry=read(operationId);return entry.operation.status!=="queued"?entry.operation:write(entry,buildOperationSnapshotV1({...entry.operation,status:"running"}))},complete(operationId,terminalSnapshot){let entry=read(operationId),nextTerminal=validateOperationTerminalV1(terminalSnapshot);if(terminal(entry)){if(canonicalJson(entry.operation.terminal)!==canonicalJson(nextTerminal))throw new Error(`Operation already has a different terminal result: ${operationId}`);return entry.operation}return write(entry,buildOperationSnapshotV1({...entry.operation,status:nextTerminal.status,terminal:nextTerminal}))},cancel(operationId){let entry=read(operationId);return terminal(entry)?entry.operation:write(entry,buildOperationSnapshotV1({...entry.operation,status:"cancelled",terminal:{version:1,status:"cancelled",error:commandError("operation_cancelled",`Operation cancelled: ${operationId}`)}}))},get(operationId){return assertNonEmptyString(operationId,"operationId"),entries.get(operationId)?.operation},release(operationId){assertNonEmptyString(operationId,"operationId"),entries.delete(operationId)}})}function buildCanonicalContractVectorsV1(){let hostContext=buildHostContextV1({mode:"full-control",features:["agent.run","session.snapshot"],transports:["in-process"]}),contract=buildAgentCapabilityContractV1({contractId:AGENT_CAPABILITY_CONTRACT_ID,capabilities:[{id:"agent.run",version:1}],hostContext}),profile=buildAgentProfileV1({id:"coding-agent",version:1,rootAgent:"coding-agent.root",requiredPlugins:["bootstrap-tools"],optionalPlugins:["bootstrap-skills"],defaults:{mode:"full-control",context:{strategy:"default"}}}),artifact=buildArtifactRefV1({sessionId:"session-vector-1",operationId:"vector-operation-1",artifactId:"artifact-vector-1",kind:"operation_record",mediaType:"application/json",sizeBytes:13,truncated:!1,createdAt:0}),revision=buildSessionRevisionV1({version:1,sessionId:"session-vector-1",sequence:0,leafId:null}),definition=buildAgentDefinitionSnapshotV1({version:1,id:"coding-agent.root",definitionVersion:1,role:"root-agent-controller",capabilities:[{id:"agent.run",version:1}],owner:"coding-agent"}),instance=buildAgentInstanceSnapshotV1({version:1,id:"instance-vector-1",definitionId:definition.id,definitionVersion:definition.definitionVersion,role:definition.role,status:"created",revision:0}),session=buildSessionSnapshotV1({version:1,sessionId:revision.sessionId,revision}),error=buildErrorEnvelopeV1({version:1,code:"provider_error",message:"provider failed",retryable:!0}),command=buildCommandRequestV1({operationId:"vector-operation-1",idempotencyKey:"vector-request-1",command:"agent.run",target:"session-vector-1",input:{prompt:"vector"},expectedRevision:{version:1,sessionId:"session-vector-1",sequence:0,leafId:null},hostContext}),registry=createCommandOperationRegistryV1(),accepted=registry.admit(command,command.expectedRevision);if(accepted.status!=="accepted"||accepted.operation===void 0)throw new Error("Canonical contract vector admission failed");let running=registry.start(command.operationId),terminal=registry.complete(command.operationId,{version:1,status:"succeeded",result:{ok:!0}}),event=buildEventEnvelopeV1({id:"vector-event-1",deliveryId:"vector-delivery-1",type:"operation.end",source:"canonical-vector",category:"authoritative",deliveryGuarantee:"best-effort",timestamp:0,operationId:command.operationId,correlationId:command.operationId,data:{version:1,operationId:command.operationId,operationKind:command.command,status:"succeeded"}});return detachedFreeze({version:1,contract,definition,instance,session,revision,error,profile,artifact,command,accepted,running,terminal,event})}function buildCanonicalContractFixtureVectorsV1(){let base=buildCanonicalContractVectorsV1(),registry=createCommandOperationRegistryV1(),request=buildCommandRequestV1({operationId:"fixture-operation-1",idempotencyKey:"fixture-request-1",command:"agent.run",target:"session-fixture-1",input:{prompt:"fixture"},expectedRevision:{version:1,sessionId:"session-fixture-1",sequence:1,leafId:"leaf-1"},hostContext:base.contract.hostContext});registry.admit(request,request.expectedRevision);let existing=registry.admit(request,request.expectedRevision),idempotencyConflict=registry.admit({...request,input:{prompt:"different"}},request.expectedRevision),revisionConflict=registry.admit({...request,operationId:"fixture-operation-2",idempotencyKey:"fixture-request-2"},{version:1,sessionId:"session-fixture-1",sequence:2,leafId:"leaf-2"}),cancelled=registry.cancel(request.operationId),terminalReplay=registry.complete(request.operationId,cancelled.terminal);if(registry.admit(buildCommandRequestV1({...request,operationId:"fixture-operation-failed",idempotencyKey:"fixture-request-failed"}),request.expectedRevision).status!=="accepted")throw new Error("Canonical contract failed vector admission failed");let failedTerminal=registry.complete("fixture-operation-failed",{version:1,status:"failed",error:buildErrorEnvelopeV1({version:1,code:"provider_error",message:"provider failed",retryable:!0})});if(registry.admit(buildCommandRequestV1({...request,operationId:"fixture-operation-timeout",idempotencyKey:"fixture-request-timeout"}),request.expectedRevision).status!=="accepted")throw new Error("Canonical contract timeout vector admission failed");let timedOutTerminal=registry.complete("fixture-operation-timeout",{version:1,status:"timed_out",error:buildErrorEnvelopeV1({version:1,code:"operation_timeout",message:"operation timed out",retryable:!0})}),unsupported=buildUnsupportedCapabilityV1({id:"fixture.missing",version:1}),observation=buildEventEnvelopeV1({id:"fixture-event-1",deliveryId:"fixture-delivery-1",type:"fixture.observation",source:"canonical-vector",timestamp:0,data:{observed:!0}}),correlated=buildEventEnvelopeV1({id:"fixture-event-correlated",deliveryId:"fixture-delivery-correlated",type:"operation.end",source:"canonical-vector",category:"authoritative",timestamp:0,operationId:"fixture-operation-1",correlationId:"fixture-operation-1",data:{status:"cancelled"}}),steer=buildCommandRequestV1({operationId:"fixture-operation-steer",idempotencyKey:"fixture-request-steer",command:"session.steer",target:"session-fixture-1",input:{text:"steer"},expectedRevision:request.expectedRevision,hostContext:base.contract.hostContext}),operationStep=buildEventEnvelopeV1({id:"fixture-event-step",deliveryId:"fixture-delivery-step",type:"operation.step",source:"canonical-vector",category:"progress",timestamp:0,operationId:"fixture-operation-steer",correlationId:"fixture-operation-steer",data:{version:1,operationId:"fixture-operation-steer",operationKind:"session.steer",step:1,message:"accepted"}}),compatibilityRequirements=overrides=>buildContractCompatibilityRequirementsV1({contractId:AGENT_CAPABILITY_CONTRACT_ID,version:1,mode:"full-control",features:[],transports:[],capabilities:[],...overrides}),compatibilityAccepted=checkContractCompatibilityV1(base.contract,compatibilityRequirements({features:["agent.run","session.snapshot"],transports:["in-process"],capabilities:[{id:"agent.run",version:1}]})),compatibilityContractUnsupported=checkContractCompatibilityV1(base.contract,compatibilityRequirements({version:2})),compatibilityCapabilityVersionUnsupported=checkContractCompatibilityV1(base.contract,compatibilityRequirements({capabilities:[{id:"agent.run",version:2}]})),compatibilityFeatureSubset=checkContractCompatibilityV1(base.contract,compatibilityRequirements({features:["agent.run","session.compact"]}));return detachedFreeze([{id:"agent-definition",value:base.definition},{id:"agent-instance",value:base.instance},{id:"session-snapshot",value:base.session},{id:"session-revision",value:base.revision},{id:"error-envelope",value:base.error},{id:"profile-snapshot",value:base.profile},{id:"artifact-reference",value:base.artifact},{id:"command-success",value:base.terminal},{id:"command-failed-terminal",value:failedTerminal},{id:"command-timed-out-terminal",value:timedOutTerminal},{id:"command-idempotency-replay",value:existing},{id:"command-idempotency-conflict",value:idempotencyConflict},{id:"command-revision-conflict",value:revisionConflict},{id:"command-cancel-terminal",value:cancelled},{id:"command-terminal-replay",value:terminalReplay},{id:"capability-unsupported",value:unsupported},{id:"event-without-operation",value:observation},{id:"event-with-operation",value:correlated},{id:"command-steer",value:steer},{id:"event-operation-step",value:operationStep},{id:"compatibility-accepted",value:compatibilityAccepted},{id:"compatibility-contract-unsupported",value:compatibilityContractUnsupported},{id:"compatibility-capability-version-unsupported",value:compatibilityCapabilityVersionUnsupported},{id:"compatibility-feature-subset",value:compatibilityFeatureSubset}])}function validateEventEnvelopeV1(value){if(assertPlainRecord(value,"Event envelope"),assertExactKeys(value,["version","id","deliveryId","type","source","category","deliveryGuarantee","timestamp","data"],["operationId","correlationId","causationId"],"Event envelope"),value.version!==1)throw new Error("Event envelope.version must be 1");if(assertNonEmptyString(value.id,"Event envelope.id"),assertNonEmptyString(value.deliveryId,"Event envelope.deliveryId"),assertNonEmptyString(value.type,"Event envelope.type"),assertNonEmptyString(value.source,"Event envelope.source"),value.category!=="authoritative"&&value.category!=="progress"&&value.category!=="observation")throw new Error("Event envelope.category is invalid");if(value.deliveryGuarantee!=="best-effort"&&value.deliveryGuarantee!=="at-least-once")throw new Error("Event envelope.deliveryGuarantee is invalid");if(assertNonNegativeSafeInteger(value.timestamp,"Event envelope.timestamp"),assertJsonValue(value.data,"Event envelope.data"),value.operationId!==void 0&&assertNonEmptyString(value.operationId,"Event envelope.operationId"),value.correlationId!==void 0&&assertNonEmptyString(value.correlationId,"Event envelope.correlationId"),value.causationId!==void 0&&assertNonEmptyString(value.causationId,"Event envelope.causationId"),value.operationId===void 0&&value.correlationId!==void 0)throw new Error("Event envelope.correlationId requires a real operationId");if(value.operationId!==void 0&&value.correlationId===void 0)throw new Error("Event envelope.operationId requires correlationId");return detachedFreeze({version:1,id:value.id,deliveryId:value.deliveryId,type:value.type,source:value.source,category:value.category,deliveryGuarantee:value.deliveryGuarantee,timestamp:value.timestamp,data:value.data,...value.operationId===void 0?{}:{operationId:value.operationId},...value.correlationId===void 0?{}:{correlationId:value.correlationId},...value.causationId===void 0?{}:{causationId:value.causationId}})}function buildEventEnvelopeV1(input){return validateEventEnvelopeV1({...input,version:input.version??1,category:input.category??"observation",deliveryGuarantee:input.deliveryGuarantee??"best-effort"})}function buildUnsupportedCapabilityV1(capability){let reference=validateCapabilityRefV1(capability),error=buildErrorEnvelopeV1({version:1,code:"unsupported_capability",message:`Capability is unsupported: ${reference.id}@${reference.version}`,retryable:!1});return detachedFreeze({status:"unsupported",capability:reference,error})}function resolveCapabilityV1(requested,supported){let reference=validateCapabilityRefV1(requested);return validateCapabilityRefs(supported,"Supported capabilities").some(candidate=>candidate.id===reference.id&&candidate.version===reference.version)?detachedFreeze({status:"supported",capability:reference}):buildUnsupportedCapabilityV1(reference)}function assertCapabilitySupportedV1(requested,supported){let resolution=resolveCapabilityV1(requested,supported);if(resolution.status==="unsupported")throw new Error(resolution.error.message);return resolution.capability}var validateAgentCapabilityContract=validateAgentCapabilityContractV1,buildAgentCapabilityContract=buildAgentCapabilityContractV1,validateEventEnvelope=validateEventEnvelopeV1,buildEventEnvelope=buildEventEnvelopeV1;function detachedFreeze2(value,seen=new WeakMap){if(value===null||typeof value!="object")return value;let existing=seen.get(value);if(existing!==void 0)return existing;if(Array.isArray(value)){let copy2=[];seen.set(value,copy2);for(let child of value)copy2.push(detachedFreeze2(child,seen));return Object.freeze(copy2)}let copy=Object.create(null);seen.set(value,copy);for(let[key,child]of Object.entries(value))copy[key]=detachedFreeze2(child,seen);return Object.freeze(copy)}function assertActive(disposed,label){if(disposed)throw new Error(`Embedded SDK binding is disposed: ${label}`)}function errorEnvelope(error,code){let message=error instanceof Error?error.message:String(error);return buildErrorEnvelopeV1({version:1,code,message,retryable:!1,...error instanceof Error?{name:error.name}:{}})}function agentDefinitionSnapshot(definition){return buildAgentDefinitionSnapshotV1({version:1,id:definition.id,definitionVersion:definition.version,role:definition.role,capabilities:[],...definition.owner===void 0?{}:{owner:definition.owner}})}function agentInstanceSnapshot(snapshot){return buildAgentInstanceSnapshotV1({version:1,id:snapshot.id,definitionId:snapshot.definitionId,definitionVersion:snapshot.definitionVersion,role:snapshot.role,status:snapshot.status,revision:snapshot.revision,...snapshot.parentInstanceId===void 0?{}:{parentInstanceId:snapshot.parentInstanceId},...snapshot.leaseOwner===void 0?{}:{leaseOwner:snapshot.leaseOwner}})}function resultSnapshot(result){return result.status==="succeeded"?detachedFreeze2({status:"succeeded",output:canonicalOutput(result.output,`wait:${result.revision}`),revision:result.revision}):detachedFreeze2({status:result.status,revision:result.revision,...result.error===void 0?{}:{error:errorEnvelope(result.error,`agent_${result.status}`)}})}function canonicalOutput(value,operationId){return buildOperationSnapshotV1({version:1,operationId,kind:"agent.run",status:"succeeded",terminal:{version:1,status:"succeeded",result:value}}),detachedFreeze2(value)}function canonicalInput(value){if(value===void 0)throw new Error("Embedded SDK run input must be JSON-compatible");return buildOperationSnapshotV1({version:1,operationId:"embedded-sdk:input",kind:"agent.run",status:"succeeded",terminal:{version:1,status:"succeeded",result:value}}),detachedFreeze2(value)}function createEmbeddedSessionBindingV1(session){if(!session.getRevision)throw new Error("Embedded SDK session requires revision support");let getRevision=()=>detachedFreeze2(session.getRevision()),context=session.getContextSnapshot&&session.commitContext?Object.freeze({version:1,get:()=>detachedFreeze2(session.getContextSnapshot()),commit:request=>session.commitContext(request)}):void 0;return Object.freeze({version:1,getSessionId:()=>session.getSessionId(),getRevision,snapshot:()=>buildSessionSnapshotV1({version:1,sessionId:session.getSessionId(),revision:getRevision()}),getMessages:()=>detachedFreeze2(session.getMessages()),getBranchEntries:()=>detachedFreeze2(session.getBranchEntries()),isIdle:()=>session.isIdle(),prompt:text=>session.prompt(text),steer:text=>session.steer?session.steer(text):Promise.reject(new Error("Embedded SDK session does not support steer")),abort:()=>session.abort(),waitForIdle:()=>session.waitForIdle(),...context===void 0?{}:{context}})}function createEmbeddedSdkBindingV1(options={}){let composition=options.composition??createAgentCompositionRuntime(),ownsComposition=options.ownsComposition??options.composition===void 0,defaultFeatures=["agent-composition-v1",...options.session===void 0?[]:["session","session-revision-v1","context"]],hostContext=detachedFreeze2({mode:options.mode??"full-control",features:[...options.features??defaultFeatures].sort(),transports:["in-process"]}),session=options.session===void 0?void 0:createEmbeddedSessionBindingV1(options.session),contract=buildAgentCapabilityContractV1({contractId:"agent-forge/agent-capability-contract",capabilities:[],hostContext}),definitions=new Map,instances=new Map,listeners=new Map,sequence=0,disposePromise,disposed=!1,nextId=kind=>(sequence+=1,options.idFactory?.(kind,sequence)??`embedded-sdk:${kind}:${sequence}`),emit=(type,data,operationId)=>{let event=buildEventEnvelopeV1({id:nextId("event"),deliveryId:nextId("delivery"),type,source:"embedded-sdk",timestamp:options.clock?.()??0,category:type===OPERATION_START_EVENT_ID||type===OPERATION_CANCEL_EVENT_ID||type===OPERATION_END_EVENT_ID?"authoritative":"observation",deliveryGuarantee:"best-effort",data,...operationId===void 0?{}:{operationId,correlationId:operationId}});for(let listener of listeners.values())try{listener(event)}catch{}},resolveDefinition=definition=>{let snapshot="snapshot"in definition?definition.snapshot:definition,definitionVersion="definitionVersion"in snapshot?snapshot.definitionVersion:snapshot.version,resolved=definitions.get(`${snapshot.id}@${definitionVersion}`);if(resolved)return resolved;if(options.composition!==void 0)return composition.get(snapshot.id,definitionVersion);throw new Error(`Embedded SDK has no defined Agent: ${snapshot.id}@${definitionVersion}`)},binding={version:1,contract,hostContext,...session===void 0?{}:{session},define(definition){assertActive(disposed,"define");let registered=composition.define(definition);return definitions.set(`${registered.id}@${registered.version}`,registered),detachedFreeze2({snapshot:agentDefinitionSnapshot(registered)})},create(definition,instanceOptions={}){assertActive(disposed,"create");let raw=composition.create(resolveDefinition(definition),instanceOptions),instanceDisposed=!1,instanceDisposePromise,leases=new WeakMap,wrapper={id:raw.id,snapshot:()=>(assertActive(disposed||instanceDisposed,raw.id),agentInstanceSnapshot(raw.snapshot())),acquireControllerLease:async owner=>{assertActive(disposed||instanceDisposed,raw.id);let lease=await raw.acquireControllerLease(owner),projected=Object.freeze({id:lease.id,instanceId:lease.instanceId,owner:lease.owner,revision:lease.revision,isActive:()=>!disposed&&!instanceDisposed&&lease.isActive(),release:async()=>{assertActive(disposed||instanceDisposed,raw.id),await lease.release()}});return leases.set(projected,lease),projected},run:(input,runOptions)=>{assertActive(disposed||instanceDisposed,raw.id);let lease=leases.get(runOptions.lease);if(!lease)throw new Error(`Embedded SDK lease does not belong to Agent instance: ${raw.id}`);let operation=raw.run(canonicalInput(input),{lease,signal:runOptions.signal}),terminal,cancelEmitted=!1,reportCancel=()=>{cancelEmitted||(cancelEmitted=!0,emit(OPERATION_CANCEL_EVENT_ID,validateOperationCancelEventDataV1({version:1,operationId:operation.id,operationKind:"agent.run"}),operation.id))};operation.signal.addEventListener("abort",reportCancel,{once:!0}),operation.signal.aborted&&reportCancel(),runOptions.signal?.aborted||emit(OPERATION_START_EVENT_ID,validateOperationStartEventDataV1({version:1,operationId:operation.id,operationKind:"agent.run"}),operation.id);let result=operation.result.then(value=>{try{let output=canonicalOutput(value,operation.id);return terminal={version:1,status:"succeeded",result:output},emit(OPERATION_END_EVENT_ID,validateOperationEndEventDataV1({version:1,operationId:operation.id,operationKind:"agent.run",status:"succeeded"}),operation.id),output}catch(error){throw terminal={version:1,status:"failed",error:errorEnvelope(error,"agent_invalid_result")},emit(OPERATION_END_EVENT_ID,validateOperationEndEventDataV1({version:1,operationId:operation.id,operationKind:"agent.run",status:"failed",errorMessage:error instanceof Error?error.message:String(error)}),operation.id),error}},error=>{let status=operation.status()==="cancelled"?"cancelled":"failed";throw terminal={version:1,status,error:errorEnvelope(error,`agent_${status}`)},emit(OPERATION_END_EVENT_ID,validateOperationEndEventDataV1({version:1,operationId:operation.id,operationKind:"agent.run",status,errorMessage:error instanceof Error?error.message:String(error)}),operation.id),error});return Object.freeze({id:operation.id,result,snapshot:()=>buildOperationSnapshotV1({version:1,operationId:operation.id,kind:"agent.run",status:terminal?.status??operation.status(),...terminal===void 0&&operation.status()==="cancelled"?{terminal:{version:1,status:"cancelled",error:errorEnvelope(new Error("Operation cancelled"),"agent_cancelled")}}:terminal===void 0?{}:{terminal},instanceId:raw.id}),cancel:async reason=>{assertActive(disposed||instanceDisposed,raw.id),!(operation.status()!=="queued"&&operation.status()!=="running")&&await operation.cancel(reason)}})},wait:async()=>detachedFreeze2(resultSnapshot(await raw.wait())),cancel:async reason=>{assertActive(disposed||instanceDisposed,raw.id),await raw.cancel(reason)},dispose:async()=>(instanceDisposePromise??=(async()=>{instanceDisposed||(instanceDisposed=!0,await raw.dispose(),instances.delete(raw.id))})(),instanceDisposePromise)};return instances.set(raw.id,wrapper),Object.freeze(wrapper)},listInstances:()=>Object.freeze([...instances.values()].map(instance=>instance.snapshot()).sort((left,right)=>left.id.localeCompare(right.id))),subscribe(listener){assertActive(disposed,"subscribe");let id=`embedded-sdk:subscription:${++sequence}`,released=!1;return listeners.set(id,listener),Object.freeze({id,dispose:()=>{released||(released=!0,listeners.delete(id))}})},dispose:async()=>(disposePromise??=(async()=>{if(disposed)return;disposed=!0;let failures=[];for(let instance of[...instances.values()])try{await instance.dispose()}catch(error){failures.push(error)}if(listeners.clear(),ownsComposition&&"disposeDefinitions"in composition)try{composition.disposeDefinitions([...definitions.values()])}catch(error){failures.push(error)}if(definitions.clear(),failures.length===1)throw failures[0];if(failures.length>1)throw new AggregateError(failures,"Embedded SDK disposal failed")})(),disposePromise)};return Object.freeze(binding)}var createEmbeddedSdkBinding=createEmbeddedSdkBindingV1;import{EventEmitter}from"node:events";function createEventBus(){let emitter=new EventEmitter;return{emit:(channel,data)=>{emitter.emit(channel,data)},on:(channel,handler)=>{let safeHandler=async data=>{try{await handler(data)}catch(err){console.error(`Event handler error (${channel}):`,err)}};return emitter.on(channel,safeHandler),()=>emitter.off(channel,safeHandler)},clear:()=>{emitter.removeAllListeners()}}}var ModelRegistry=class{runtime;constructor(runtime){this.runtime=runtime}refresh(options){return this.runtime.refresh(options)}getError(){return this.runtime.getError()}getAll(){return[...this.runtime.getModels()]}getAvailable(){return[...this.runtime.getAvailableSnapshot()]}find(provider,modelId){return this.runtime.getModel(provider,modelId)}hasConfiguredAuth(model){return this.runtime.hasConfiguredAuth(model.provider)}async getApiKeyAndHeaders(model){try{let resolution=await this.runtime.getAuth(model);if(!resolution){let compatibility=this.runtime.getCompatibilityRequestConfig(model);return compatibility.authHeader?{ok:!1,error:`No API key found for "${model.provider}"`}:{ok:!0,headers:compatibility.headers}}return{ok:!0,apiKey:resolution.auth.apiKey,headers:resolution.auth.headers,...resolution.auth.baseUrl?{baseUrl:resolution.auth.baseUrl}:{},env:resolution.env}}catch(error){let cause=error instanceof Error?error.cause:void 0,message=cause instanceof Error?cause.message:error instanceof Error?error.message:String(error);return{ok:!1,error:message==="authHeader requires a resolved API key"?`No API key found for "${model.provider}"`:message}}}getProviderAuthStatus(provider){return this.runtime.getProviderAuthStatus(provider)}getProvider(provider){return this.runtime.getProvider(provider)}stream(model,context,options){return this.runtime.stream(model,context,options)}complete(model,context,options){return this.runtime.complete(model,context,options)}streamSimple(model,context,options){return this.runtime.streamSimple(model,context,options)}getProviderDisplayName(provider){return this.runtime.getProvider(provider)?.name??provider}getProviderAuth(provider){return this.runtime.getAuth(provider)}async getApiKeyForProvider(provider){try{return(await this.runtime.getAuth(provider))?.auth.apiKey}catch{return}}isUsingOAuth(model){return this.runtime.isUsingOAuth(model.provider)}registerProvider(providerOrName,config){if(typeof providerOrName=="string"){if(!config)throw new Error("Provider config is required when registering by name");this.runtime.registerProvider(providerOrName,config);return}this.runtime.registerNativeProvider(providerOrName)}unregisterProvider(providerName){this.runtime.unregisterProvider(providerName)}getRegisteredProviderConfig(providerName){return this.runtime.getRegisteredProviderConfig(providerName)}getRegisteredNativeProvider(providerName){return this.runtime.getRegisteredNativeProvider(providerName)}getRegisteredProviderIds(){return this.runtime.getRegisteredProviderIds()}};function retryBackoffMs(policy,attempt){return Math.min(policy.baseWaitMs*2**(attempt-1),policy.maxWaitMs)}function createAgentRetryScheduler(){let terminalStates=new Map;return{schedule(input){let existing=terminalStates.get(input.operationId);if(existing)return{...existing,duplicate:!0};let signal=input.signal,now=input.now??(()=>0),sleep=input.sleep??(()=>{}),attempts=[],finish=outcome=>(terminalStates.set(input.operationId,outcome),outcome);for(let attempt=1;attempt<=input.policy.attemptLimit;attempt+=1){if(signal?.aborted)return finish({status:"cancelled",operationId:input.operationId,attempts});let at=now(),step=input.task(attempt);if(step.ok)return attempts.push({attempt,at,ok:!0,waitedMs:0}),finish({status:"succeeded",operationId:input.operationId,result:step.result,attempts});if(!step.retryable)return attempts.push({attempt,at,ok:!1,failure:step.reason,retryable:!1,waitedMs:0}),finish({status:"failed_terminal",operationId:input.operationId,reason:step.reason,attempts});let waitedMs=retryBackoffMs(input.policy,attempt);if(attempts.push({attempt,at,ok:!1,failure:step.reason,retryable:!0,waitedMs}),attempt<input.policy.attemptLimit&&(sleep(waitedMs),signal?.aborted))return finish({status:"cancelled",operationId:input.operationId,attempts})}return finish({status:"exhausted",operationId:input.operationId,attempts})},terminalOf(operationId){return terminalStates.get(operationId)}}}function createAutoCompactionExecutor(options){let coordinator=options.coordinator,policy=options.policy,inProgress=!1;return{get inProgress(){return inProgress},maybeCompact(input){if(!policy.enabled)return{status:"disabled"};if(inProgress)return{status:"busy"};if(input.currentTokens<policy.tokenThreshold)return{status:"below_threshold",currentTokens:input.currentTokens,threshold:policy.tokenThreshold};inProgress=!0;try{let staged=coordinator.stage({operationId:input.operationId,expectedRevision:coordinator.currentRevision,payload:null});if(staged.status==="stale")return{status:"stale",currentRevision:staged.currentRevision};if(staged.status==="duplicate")return{status:"cancelled"};if(input.signal?.aborted)return coordinator.cancelStage(staged.staged.token),{status:"cancelled"};let summary;try{summary=input.summarize(input.signal)}catch(error){return coordinator.cancelStage(staged.staged.token),{status:"summary_failed",reason:error instanceof Error?error.message:String(error)}}if(input.signal?.aborted)return coordinator.cancelStage(staged.staged.token),{status:"cancelled"};let outcome=coordinator.commitStage({token:staged.staged.token,apply:()=>{}});return outcome.status==="stale"?{status:"stale",currentRevision:outcome.currentRevision}:outcome.status==="committed"?{status:"completed",revision:outcome.revision,summary}:(coordinator.cancelStage(staged.staged.token),{status:"cancelled"})}finally{inProgress=!1}}}}function createBranchStateMigration(){return{migrate({entries,fromBranch,toBranch}){let source=entries.filter(entry=>entry.branch===fromBranch);return source.length===0?{status:"empty_source",fromBranch}:{status:"migrated",fromBranch,toBranch,migrated:Object.freeze(source.map(entry=>({key:entry.key,value:entry.value})))}},scan(entries,branch){return Object.freeze(entries.filter(entry=>entry.branch===branch))}}}function createReloadTransaction(){return{reload(items){let failures=[];for(let[index,item]of items.entries()){let failure=item.validate();failure!==null&&failures.push({index,reason:failure})}if(failures.length>0)return{status:"rolled_back",failures:Object.freeze(failures)};for(let item of items)item.commit();return{status:"committed",count:items.length}}}}function createHostCheckpointCoordinator(options={}){let revision=options.startRevision??0,staged=new Map,committed=new Map,tokenSequence=0;return{get currentRevision(){return revision},stage(input){if(typeof input.operationId!="string"||input.operationId.trim().length===0)throw new Error("Checkpoint operationId must be a non-empty string");let appliedRevision=committed.get(input.operationId);if(appliedRevision!==void 0)return{status:"duplicate",revision:appliedRevision};if(input.expectedRevision!==revision)return{status:"stale",currentRevision:revision};tokenSequence+=1;let token=`ckpt-${tokenSequence}`,entry={operationId:input.operationId,expectedRevision:input.expectedRevision,payload:input.payload,state:"staged"};return staged.set(token,entry),{status:"staged",staged:{token,operationId:input.operationId,expectedRevision:input.expectedRevision,currentRevision:revision}}},commitStage({token,apply}){let entry=staged.get(token);if(!entry)return{status:"unknown_token"};if(entry.state==="cancelled")return{status:"cancelled"};if(entry.expectedRevision!==revision)return staged.delete(token),{status:"stale",currentRevision:revision};try{apply(entry.payload,revision+1)}catch(error){return staged.delete(token),{status:"write_failed",reason:error instanceof Error?error.message:String(error)}}return revision+=1,committed.set(entry.operationId,revision),staged.delete(token),{status:"committed",revision}},cancelStage(token){let entry=staged.get(token);return entry?committed.has(entry.operationId)?{status:"already_committed"}:(entry.state="cancelled",{status:"cancelled"}):{status:"unknown_token"}},committedOperationIds(){return Object.freeze([...committed.keys()].sort())}}}function createManualCompactionExecutor(options){let coordinator=options.coordinator,state="idle",currentOperationId;return{get state(){return state},requestCompaction(input){if(state==="in_progress")return{status:"busy",currentOperationId:currentOperationId??"unknown"};if(input.pluginId.trim().length===0)throw new Error("Compaction pluginId must be a non-empty string");state="in_progress",currentOperationId=input.operationId;try{let staged=coordinator.stage({operationId:input.operationId,expectedRevision:coordinator.currentRevision,payload:null});if(staged.status==="stale")return{status:"stale",currentRevision:staged.currentRevision};if(staged.status==="duplicate")return{status:"completed",revision:staged.revision,summary:{duplicate:!0}};let summary;try{summary=input.summarize()}catch(error){return coordinator.cancelStage(staged.staged.token),{status:"summary_failed",reason:error instanceof Error?error.message:String(error)}}let outcome=coordinator.commitStage({token:staged.staged.token,apply:(payload,revision)=>{}});return outcome.status==="stale"?{status:"stale",currentRevision:outcome.currentRevision}:outcome.status==="committed"?{status:"completed",revision:outcome.revision,summary}:{status:"summary_failed",reason:`Unexpected checkpoint outcome: ${outcome.status}`}}finally{state="idle",currentOperationId=void 0}}}}function createOutputReducer(){return{fold(records){let groups=[],pendingTool=null,flushTool=()=>{pendingTool&&(groups.push(pendingTool),pendingTool=null)};for(let record of records){if(record.channel==="tool"&&record.correlationId!==void 0){let isCall=record.severity==="info"&&record.summary.endsWith("called");pendingTool&&pendingTool.correlationId!==record.correlationId&&flushTool(),pendingTool||(pendingTool={kind:"tool",toolName:record.code??record.summary,correlationId:record.correlationId,detailsRef:`trace:${record.traceId}#call:${record.correlationId}`,calls:0,ok:0,failed:0,records:[]}),pendingTool.records.push(record),isCall?pendingTool.calls+=1:record.severity==="ok"?pendingTool.ok+=1:record.severity==="error"&&(pendingTool.failed+=1);continue}flushTool();let last=groups.at(-1);last?.kind==="records"?(last.records.push(record),last.detailsRef=`trace:${record.traceId}#records:${last.records.length}`):groups.push({kind:"records",detailsRef:`trace:${record.traceId}#records:1`,records:[record]})}flushTool();let foldedToolGroups=0,frozenGroups=groups.map(group=>{let base={...group,records:Object.freeze([...group.records])};if(base.kind==="tool"){foldedToolGroups+=1;let firstAt=base.records[0]?.at??0,lastAt=base.records.at(-1)?.at??firstAt;return Object.freeze({...base,durationMs:Math.max(lastAt-firstAt,0)})}return Object.freeze(base)});return{groups:Object.freeze(frozenGroups),totalRecords:records.length,foldedToolGroups}},unfold(folded){return Object.freeze(folded.groups.flatMap(group=>[...group.records]))}}}var INTERNAL_FIELD_KEYS=["memoryId","memoryIds","score","scores","ranking","queryPlan","budget","budgets","agentRole","pluginRole","lease","leaseId","purgeState","rawSources"];function isArtifactLike(value){return typeof value=="object"&&value!==null&&"artifactId"in value&&"sessionId"in value&&"kind"in value}function toArtifactRef(value){if(!(typeof value.sessionId!="string"||typeof value.operationId!="string"||typeof value.artifactId!="string"||typeof value.kind!="string"||typeof value.mediaType!="string"||typeof value.truncated!="boolean"||typeof value.createdAt!="number"))return{sessionId:value.sessionId,operationId:value.operationId,artifactId:value.artifactId,kind:value.kind,mediaType:value.mediaType,...typeof value.sizeBytes=="number"?{sizeBytes:value.sizeBytes}:{},truncated:value.truncated,createdAt:value.createdAt}}function createHostOutputSerializer(){return{project(input,context){if(context.policyVersion.trim().length===0)return{text:"",diagnostics:["output_projection_rejected: policyVersion must be a non-empty string"],rejected:{code:"output_projection_rejected",reason:"policyVersion must be a non-empty string"}};let redactions=[],diagnostics=[],artifacts=[],showInternal=context.surface==="inspector"&&context.inspectorAuthorized,isAllowedKey=key=>!INTERNAL_FIELD_KEYS.includes(key)||showInternal,renderValue=(key,value,path)=>{if(!isAllowedKey(key))return redactions.push(`${path}.${key}`),`[redacted:${key}]`;if(isArtifactLike(value)){let ref=toArtifactRef(value);return ref?(artifacts.push(ref),`[artifact:${ref.artifactId}]`):(diagnostics.push(`output_projection_rejected: ${path}.${key} is a malformed artifact reference`),`[unrenderable:${key}]`)}return typeof value=="string"?value:typeof value=="number"||typeof value=="boolean"?String(value):value===null?"null":Array.isArray(value)?`[${value.map(item=>renderValue(key,item,path)).join(", ")}]`:typeof value=="object"?`{${Object.entries(value).map(([nestedKey,nestedValue])=>`${nestedKey}:${renderValue(nestedKey,nestedValue,`${path}.${key}`)}`).join(", ")}}`:(diagnostics.push(`output_projection_rejected: ${path}.${key} cannot be serialized`),`[unrenderable:${key}]`)},textParts=[];for(let[key,value]of Object.entries(input)){if(key==="artifacts"&&Array.isArray(value)){for(let entry of value)if(isArtifactLike(entry)){let ref=toArtifactRef(entry);ref?artifacts.push(ref):diagnostics.push("output_projection_rejected: artifacts entry is malformed")}else diagnostics.push("output_projection_rejected: artifacts entry is malformed");continue}textParts.push(`${key}=${renderValue(key,value,"root")}`)}return{text:textParts.join(`
3
3
  `),...artifacts.length>0?{artifacts:Object.freeze(artifacts)}:{},...redactions.length>0?{redactions:Object.freeze([...redactions])}:{},...diagnostics.length>0?{diagnostics:Object.freeze([...diagnostics])}:{}}}}}var CLASSIFICATION_TABLE=[["context_overflow",["context length","maximum context","context window","token limit","too many tokens","overflow"]],["rate_limit",["rate limit","429","too many requests"]],["auth",["401","403","unauthorized","forbidden","invalid api key"]],["transient",["timeout","econnreset","econnrefused","socket hang up","502","503"]]];function createOverflowRecovery(options){let coordinator=options.coordinator,classify=error=>{let rawName=error instanceof Error?error.name:typeof error=="object"&&error!==null&&"name"in error?String(error.name):"unknown",rawMessage=error instanceof Error?error.message:String(error),haystack=`${rawName} ${rawMessage}`.toLowerCase();for(let[errorClass,patterns]of CLASSIFICATION_TABLE)if(patterns.some(pattern=>haystack.includes(pattern)))return{errorClass,rawMessage,rawName};return{errorClass:"unknown",rawMessage,rawName}};return{classify,recover({operationId,error,shrink}){let classification=classify(error);if(classification.errorClass!=="context_overflow")return{status:"not_recoverable",errorClass:classification.errorClass,rawMessage:classification.rawMessage,hint:"Only context overflow is recoverable here; rate-limit retry belongs to 2A.4"};let staged=coordinator.stage({operationId,expectedRevision:coordinator.currentRevision,payload:null});if(staged.status==="stale")return{status:"stale",currentRevision:staged.currentRevision,errorClass:classification.errorClass,rawMessage:classification.rawMessage};if(staged.status==="duplicate")return{status:"recovered",revision:staged.revision,shrunk:{duplicate:!0}};let shrunk;try{shrunk=shrink(classification)}catch(shrinkError){return coordinator.cancelStage(staged.staged.token),{status:"projection_failed",errorClass:classification.errorClass,rawMessage:classification.rawMessage,reason:shrinkError instanceof Error?shrinkError.message:String(shrinkError)}}let outcome=coordinator.commitStage({token:staged.staged.token,apply:()=>{}});return outcome.status==="stale"?{status:"stale",currentRevision:outcome.currentRevision,errorClass:classification.errorClass,rawMessage:classification.rawMessage}:outcome.status==="committed"?{status:"recovered",revision:outcome.revision,shrunk}:{status:"projection_failed",errorClass:classification.errorClass,rawMessage:classification.rawMessage,reason:`Unexpected checkpoint outcome: ${outcome.status}`}}}}function createSummaryRetryExecutor(options){let coordinator=options.coordinator,policy=options.policy,now=options.now??(()=>0),sleep=options.sleep??(()=>{});if(policy.attemptLimit<1)throw new Error("Summary retry attemptLimit must be at least 1");if(policy.baseWaitMs<0||policy.maxWaitMs<policy.baseWaitMs)throw new Error("Summary retry wait bounds are invalid");return{execute({operationId,summarize}){let attempts=[];for(let attempt=1;attempt<=policy.attemptLimit;attempt+=1){let at=now(),staged=coordinator.stage({operationId:`${operationId}#${attempt}`,expectedRevision:coordinator.currentRevision,payload:null});if(staged.status==="stale")return{status:"stale",operationId,currentRevision:staged.currentRevision,attempts};if(staged.status==="duplicate")return{status:"succeeded",operationId,revision:staged.revision,summary:{duplicate:!0},attempts};let summary;try{summary=summarize(attempt)}catch(error){coordinator.cancelStage(staged.staged.token);let waitedMs=retryBackoffMs(policy,attempt);attempts.push({attempt,at,ok:!1,failure:error instanceof Error?error.message:String(error),waitedMs}),attempt<policy.attemptLimit&&sleep(waitedMs);continue}let outcome=coordinator.commitStage({token:staged.staged.token,apply:()=>{}});if(outcome.status==="stale")return attempts.push({attempt,at,ok:!0,waitedMs:0}),{status:"stale",operationId,currentRevision:outcome.currentRevision,attempts};if(outcome.status==="committed")return attempts.push({attempt,at,ok:!0,waitedMs:0}),{status:"succeeded",operationId,revision:outcome.revision,summary,attempts}}return{status:"exhausted",operationId,attempts}}}}function createMigrationTool(){let steps=new Map;return{registerStep(step){let key=`${step.fromVersion}->${step.toVersion}`;if(steps.has(key))throw new Error(`Migration step already registered: ${key}`);steps.set(key,step)},migrate({version,targetVersion,data}){if(version===targetVersion)return{status:"already_current",version,data};let applied=[],currentVersion=version,currentData=data;for(;currentVersion!==targetVersion;){let step=steps.get(`${currentVersion}->${targetVersion}`);if(step){try{currentData=step.migrate(currentData)}catch(error){return{status:"failed",data,evidence:Object.freeze([...applied]),failure:{fromVersion:currentVersion,toVersion:targetVersion,reason:error instanceof Error?error.message:String(error)}}}applied.push({fromVersion:currentVersion,toVersion:targetVersion,applied:!0}),currentVersion=targetVersion;break}let nextHop=[...steps.values()].find(candidate=>candidate.fromVersion===currentVersion);if(!nextHop)return{status:"no_path",fromVersion:version,targetVersion};try{currentData=nextHop.migrate(currentData)}catch(error){return{status:"failed",data,evidence:Object.freeze([...applied]),failure:{fromVersion:nextHop.fromVersion,toVersion:nextHop.toVersion,reason:error instanceof Error?error.message:String(error)}}}applied.push({fromVersion:nextHop.fromVersion,toVersion:nextHop.toVersion,applied:!0}),currentVersion=nextHop.toVersion}return{status:"migrated",version:currentVersion,data:currentData,evidence:Object.freeze([...applied])}}}}var BorderedLoader=class extends Container{loader;cancellable;signalController;constructor(tui,theme,message,options){super(),this.cancellable=options?.cancellable??!0;let borderColor=s=>theme.fg("border",s);this.addChild(new DynamicBorder(borderColor)),this.cancellable?this.loader=new CancellableLoader(tui,s=>theme.fg("accent",s),s=>theme.fg("muted",s),message):(this.signalController=new AbortController,this.loader=new Loader(tui,s=>theme.fg("accent",s),s=>theme.fg("muted",s),message)),this.addChild(this.loader),this.cancellable&&(this.addChild(new Spacer(1)),this.addChild(new Text(keyHint("tui.select.cancel","cancel"),1,0))),this.addChild(new Spacer(1)),this.addChild(new DynamicBorder(borderColor))}get signal(){return this.cancellable?this.loader.signal:this.signalController?.signal??new AbortController().signal}set onAbort(fn){this.cancellable&&(this.loader.onAbort=fn)}handleInput(data){this.cancellable&&this.loader.handleInput(data)}dispose(){"dispose"in this.loader&&typeof this.loader.dispose=="function"?this.loader.dispose():"stop"in this.loader&&typeof this.loader.stop=="function"&&this.loader.stop()}};var SHOW_IMAGES_SELECT_LIST_LAYOUT={minPrimaryColumnWidth:12,maxPrimaryColumnWidth:32},ShowImagesSelectorComponent=class extends Container{selectList;constructor(currentValue,onSelect,onCancel){super();let items=[{value:"yes",label:"Yes",description:"Show images inline in terminal"},{value:"no",label:"No",description:"Show text placeholder instead"}];this.addChild(new DynamicBorder),this.selectList=new SelectList(items,5,getSelectListTheme(),SHOW_IMAGES_SELECT_LIST_LAYOUT),this.selectList.setSelectedIndex(currentValue?0:1),this.selectList.onSelect=item=>{onSelect(item.value==="yes")},this.selectList.onCancel=()=>{onCancel()},this.addChild(this.selectList),this.addChild(new DynamicBorder)}getSelectList(){return this.selectList}};var THEME_SELECT_LIST_LAYOUT={minPrimaryColumnWidth:12,maxPrimaryColumnWidth:32},ThemeSelectorComponent=class extends Container{selectList;onPreview;constructor(currentTheme,onSelect,onCancel,onPreview){super(),this.onPreview=onPreview;let themes=getAvailableThemes(),themeItems=themes.map(name=>({value:name,label:name,description:name===currentTheme?"(current)":void 0}));this.addChild(new DynamicBorder),this.selectList=new SelectList(themeItems,10,getSelectListTheme(),THEME_SELECT_LIST_LAYOUT);let currentIndex=themes.indexOf(currentTheme);currentIndex!==-1&&this.selectList.setSelectedIndex(currentIndex),this.selectList.onSelect=item=>{onSelect(item.value)},this.selectList.onCancel=()=>{onCancel()},this.selectList.onSelectionChange=item=>{this.onPreview(item.value)},this.addChild(this.selectList),this.addChild(new DynamicBorder)}getSelectList(){return this.selectList}};function compareVersions(a,b){let pa=a.split(".").map(part=>Number.parseInt(part,10)||0),pb=b.split(".").map(part=>Number.parseInt(part,10)||0),length=Math.max(pa.length,pb.length);for(let index=0;index<length;index+=1){let diff=(pa[index]??0)-(pb[index]??0);if(diff!==0)return diff}return 0}function createIntegrityAdapter(){return{seal(input){let manifest={pluginId:input.pluginId,version:input.version,source:input.source,payload:input.payload};return Object.freeze({...manifest,digest:stableJsonDigest(manifest)})},verify(manifest,expectation){let actualDigest=stableJsonDigest({pluginId:manifest.pluginId,version:manifest.version,source:manifest.source,payload:manifest.payload});if(expectation.digest!==void 0&&expectation.digest!==actualDigest)return{status:"tampered",expectedDigest:expectation.digest,actualDigest};if(expectation.sourceEquals!==void 0&&manifest.source!==expectation.sourceEquals)return{status:"source_rejected",reason:`Source "${manifest.source}" is not the accepted "${expectation.sourceEquals}"`,source:manifest.source};let range=expectation.versionRange;return range?.min!==void 0&&compareVersions(manifest.version,range.min)<0?{status:"incompatible",reason:`Version ${manifest.version} is below the required ${range.min}`,version:manifest.version}:range?.max!==void 0&&compareVersions(manifest.version,range.max)>0?{status:"incompatible",reason:`Version ${manifest.version} is above the accepted ${range.max}`,version:manifest.version}:{status:"accepted",pluginId:manifest.pluginId,version:manifest.version,digest:actualDigest}}}}function createMcpHttpTransport(options){let timeoutMs=options.timeoutMs??1e4,retryLimit=options.retryLimit??2,baseRetryMs=options.baseRetryMs??100,maxRetryMs=options.maxRetryMs??1600,now=options.now??(()=>Date.now()),sleep=options.sleep??(()=>{}),events=[],nextId=1,closed=!1,record=event=>{events.push(event),options.onEvent?.(event)},postOnce=async(body,requestOptions)=>{let controller=new AbortController,timer=setTimeout(()=>controller.abort(),requestOptions?.timeoutMs??timeoutMs);try{let response=await fetch(options.url,{method:"POST",headers:{"content-type":"application/json",accept:"application/json, text/event-stream",...options.headers??{}},body,signal:controller.signal}),text=await response.text();return{status:response.status,text}}catch(error){return{status:"connect_error",reason:error instanceof Error?`${error.name}: ${error.message}`:String(error)}}finally{clearTimeout(timer)}},postWithRetry=async(body,requestOptions)=>{for(let attempt=1;;attempt+=1){let response=await postOnce(body,requestOptions);if(response.status!=="connect_error"&&response.status<500&&response.status!==429)return record({kind:"response",at:now(),detail:`HTTP ${response.status}`,attempt}),response;let reason=response.status==="connect_error"?response.reason:`HTTP ${response.status}`;if(attempt>retryLimit)throw record({kind:"transport_error",at:now(),detail:`giving up after ${attempt-1} retries: ${reason}`,attempt}),new Error(`MCP HTTP transport error: ${reason}`);let waitedMs=Math.min(baseRetryMs*2**(attempt-1),maxRetryMs);record({kind:"retry",at:now(),detail:`attempt ${attempt} failed (${reason}); waiting ${waitedMs}ms`,attempt}),await sleep(waitedMs),attempt===1&&response.status==="connect_error"&&record({kind:"reconnect",at:now(),detail:"re-establishing HTTP connection",attempt})}},rpc=async(method,params,requestOptions)=>{if(closed)throw new Error("MCP HTTP transport is closed");let id=nextId;nextId+=1;let body=JSON.stringify({jsonrpc:"2.0",id,method,...params===void 0?{}:{params}}),response=await postWithRetry(body,requestOptions);if(response.status!==200)throw new Error(`MCP HTTP transport returned HTTP ${response.status}`);let parsed;try{parsed=JSON.parse(response.text)}catch(error){throw new Error(`MCP HTTP transport returned non-JSON body: ${error instanceof Error?error.message:String(error)}`)}if(parsed.error!==void 0)throw new Error(`MCP error ${parsed.error.code??""}: ${parsed.error.message??"unknown error"}`);return parsed.result};return{async request(method,params,requestOptions){return rpc(method,params,requestOptions)},async notify(method,params){await postWithRetry(JSON.stringify({jsonrpc:"2.0",method,...params===void 0?{}:{params}}),void 0)},async close(){closed=!0},events(){return Object.freeze([...events])}}}function createPluginHost(options){let plugins=[...options.plugins],errors=[],stateRef={current:"created"},messageOf=error=>error instanceof Error?error.message:String(error);return{get state(){return stateRef.current},get errors(){return Object.freeze([...errors])},async start(){let failures=0;for(let plugin of plugins)if(plugin.start)try{await plugin.start()}catch(error){failures+=1,errors.push({pluginId:plugin.pluginId,phase:"start",message:messageOf(error)})}return failures===0?(stateRef.current="started",{state:"started",errors:Object.freeze([...errors])}):failures===plugins.length?(stateRef.current="failed",{state:"failed",errors:Object.freeze([...errors])}):(stateRef.current="partial",{state:"partial",errors:Object.freeze([...errors])})},async dispose(){if(stateRef.current==="disposed")return{errors:Object.freeze([...errors]),leakedResources:Object.freeze([])};for(let plugin of[...plugins].reverse())if(plugin.dispose)try{await plugin.dispose()}catch(error){errors.push({pluginId:plugin.pluginId,phase:"dispose",message:messageOf(error)})}let leaked=[];for(let plugin of plugins)if(plugin.resources)for(let resource of plugin.resources()){try{await resource.release()}catch(error){errors.push({pluginId:plugin.pluginId,phase:"dispose",message:`resource ${resource.name}: ${messageOf(error)}`})}leaked.push(`${plugin.pluginId}/${resource.name}`)}return stateRef.current="disposed",{errors:Object.freeze([...errors]),leakedResources:Object.freeze(leaked)}}}}function createPluginSupervisor(options){let policy=options.policy,now=options.now??(()=>0),entries=new Map,events=[],queue=[];for(let plugin of options.plugins)entries.set(plugin.pluginId,{pluginId:plugin.pluginId,health:"healthy",restarts:0,lastBeatAt:now()});return{supervise(plugin){entries.set(plugin.pluginId,{pluginId:plugin.pluginId,health:"healthy",restarts:0,lastBeatAt:now()})},beat(pluginId){let entry=entries.get(pluginId);if(!entry)throw new Error(`Unknown supervised plugin: ${pluginId}`);entry.lastBeatAt=now(),entry.health="healthy",events.push({kind:"beat",pluginId,at:entry.lastBeatAt})},tick(at){for(let entry of entries.values())entry.health!=="unhealthy"&&at-entry.lastBeatAt>policy.heartbeatIntervalMs&&(entry.health="unhealthy",events.push({kind:"unhealthy",pluginId:entry.pluginId,at}))},restart(pluginId){let entry=entries.get(pluginId);if(!entry)return{status:"unknown"};if(entry.health==="exhausted")return{status:"exhausted",attempts:entry.restarts};if(entry.nextRestartAllowedAt!==void 0&&now()<entry.nextRestartAllowedAt)return{status:"restarted",attempt:entry.restarts};if(entry.restarts+=1,entry.restarts>policy.restartLimit)return entry.health="exhausted",events.push({kind:"exhausted",pluginId,at:now(),attempts:entry.restarts-1}),{status:"exhausted",attempts:entry.restarts-1};options.restartPlugin?.(pluginId,entry.restarts),entry.health="healthy",entry.lastBeatAt=now();let backoff=Math.min(policy.baseRestartMs*2**(entry.restarts-1),Number.MAX_SAFE_INTEGER);return entry.nextRestartAllowedAt=now()+backoff,events.push({kind:"restart",pluginId,at:now(),attempt:entry.restarts}),{status:"restarted",attempt:entry.restarts}},enqueue(event){return queue.length>=policy.queueCap?(events.push({kind:"queue_full",at:now()}),{status:"queue_full",size:queue.length}):(queue.push(event),{status:"enqueued",size:queue.length})},drain(){return Object.freeze(queue.splice(0,queue.length))},health(){return Object.freeze([...entries.values()].map(entry=>({...entry})))},get queueSize(){return queue.length}}}function createChildAgentFacade(options){let childDefinitionId=options.childDefinitionId??"child-agent-controller",owner=options.owner??"parent",definition=options.composition.define({id:childDefinitionId,version:options.childVersion??1,role:"child-agent-controller",run:(input,context)=>options.run(input,{parentInstanceId:options.parentInstanceId,signal:context?.signal})});return{childDefinitionId,spawnChild(input,spawnOptions){let instance=options.composition.create(definition,{parentInstanceId:options.parentInstanceId}),childInstanceId=instance.id,settledRevision,runPromise=instance.acquireControllerLease(owner).then(async lease=>{try{await instance.run(input,{lease,signal:spawnOptions?.signal}).result}catch{}let instanceResult=await instance.wait();return settledRevision=instanceResult.revision,lease.isActive()&&await lease.release(),{status:instanceResult.status,...instanceResult.output!==void 0?{output:instanceResult.output}:{},...instanceResult.error!==void 0?{error:instanceResult.error instanceof Error?instanceResult.error:new Error(String(instanceResult.error))}:{},revision:instanceResult.revision}});return{childInstanceId,resultRef:()=>settledRevision===void 0?void 0:Object.freeze({childInstanceId,revision:settledRevision}),wait:()=>runPromise,cancel:reason=>instance.cancel(reason)}}}}function wireProfileDependencies(input){let registry=new Map;for(let capability of input.availableCapabilities)registry.set(capability.id,capability.version);let disabled=new Set(input.disabledPluginIds??[]),plugins=[],missing=[];for(let plugin of input.resolvedPlugins){if(disabled.has(plugin.pluginId)){plugins.push({pluginId:plugin.pluginId,pluginVersion:plugin.pluginVersion,status:"skipped_disabled",wired:[]});continue}let wired=[];for(let reference of plugin.capabilityRefs){let availableVersion=registry.get(reference.id);availableVersion===void 0?missing.push({pluginId:plugin.pluginId,capabilityId:reference.id,requestedVersion:reference.version,reason:"missing"}):availableVersion!==reference.version?missing.push({pluginId:plugin.pluginId,capabilityId:reference.id,requestedVersion:reference.version,availableVersion,reason:"version_mismatch"}):wired.push({id:reference.id,version:reference.version})}plugins.push({pluginId:plugin.pluginId,pluginVersion:plugin.pluginVersion,status:"wired",wired})}return{status:missing.length>0?"missing":"wired",plugins,missing}}var GOAL_TERMINAL=new Set(["achieved","archived"]),PLAN_TERMINAL=new Set(["completed","discarded"]),TODO_TERMINAL=new Set(["completed","cancelled"]);function recoverPlansForBranch(plans,currentBranch){let entries=plans.map(plan=>{let terminal=PLAN_TERMINAL.has(plan.status);return plan.branch!==currentBranch?{planId:plan.planId,outcome:"skipped_other_branch",branch:plan.branch,statusBefore:plan.status}:{planId:plan.planId,outcome:terminal?"terminal_kept":"recovered",branch:plan.branch,statusBefore:plan.status}});return{currentBranch,entries:Object.freeze(entries)}}function buildRestartReport(snapshots,restored,owner){let records=[],identical=!0,compare=(domain,entityId,statusAfter,revisionAfter,evidenceCount,terminal,statusBefore,revisionBefore)=>{(statusAfter!==statusBefore||revisionAfter!==revisionBefore)&&(identical=!1),records.push({domain,entityId,statusAfter,revisionAfter,evidenceCount,terminal})};for(let goal of snapshots.goal??[]){let after=restored.goals.get(goal.goalId,owner);if(!after){identical=!1,records.push({domain:"goal",entityId:goal.goalId,statusAfter:"missing",revisionAfter:0,evidenceCount:0,terminal:!1});continue}compare("goal",goal.goalId,after.status,after.revision,after.evidence.length,GOAL_TERMINAL.has(after.status),goal.status,goal.revision)}for(let plan of snapshots.plan??[]){let after=restored.plans.get(plan.planId,owner);if(!after){identical=!1,records.push({domain:"plan",entityId:plan.planId,statusAfter:"missing",revisionAfter:0,evidenceCount:0,terminal:!1});continue}compare("plan",plan.planId,after.status,after.revisionNo,after.evidence.length,PLAN_TERMINAL.has(after.status),plan.status,plan.revisionNo)}for(let todo of snapshots.todo??[]){let after=restored.todos.get(todo.todoId,owner);if(!after){identical=!1,records.push({domain:"todo",entityId:todo.todoId,statusAfter:"missing",revisionAfter:0,evidenceCount:0,terminal:!1});continue}compare("todo",todo.todoId,after.status,after.revision,after.evidence.length,TODO_TERMINAL.has(after.status),todo.status,todo.revision)}return{records:Object.freeze(records),identical}}var WRITABLE_SCOPES=["session","cycle","long-term"];function assertNonEmptyString2(value,label){if(typeof value!="string"||value.trim().length===0)throw new Error(`${label} must be a non-empty string`)}function assertIOSchemaRef(value,label){if(value===null||typeof value!="object"||Array.isArray(value))throw new Error(`${label} must be a plain object`);let record=value;if(assertNonEmptyString2(record.schemaId,`${label}.schemaId`),typeof record.schemaVersion!="number"||!Number.isSafeInteger(record.schemaVersion)||record.schemaVersion<1)throw new Error(`${label}.schemaVersion must be a positive safe integer`);return Object.freeze({schemaId:record.schemaId,schemaVersion:record.schemaVersion})}function validateRoleMetadataV1(value){if(value===null||typeof value!="object"||Array.isArray(value))throw new Error("Role metadata must be a plain object");let record=value,required=["roleId","title","input","output","capabilityDependencies","writableScopes","concurrency","completionCriteria"];for(let key of required)if(!(key in record))throw new Error(`Role metadata is missing required field: ${key}`);let unsupported=Object.keys(record).filter(key=>!required.includes(key)).sort();if(unsupported.length>0)throw new Error(`Role metadata has unsupported fields: ${unsupported.join(", ")}`);assertNonEmptyString2(record.roleId,"Role metadata.roleId"),assertNonEmptyString2(record.title,"Role metadata.title");let input=assertIOSchemaRef(record.input,"Role metadata.input"),output=assertIOSchemaRef(record.output,"Role metadata.output");if(!Array.isArray(record.capabilityDependencies))throw new Error("Role metadata.capabilityDependencies must be an array");let capabilityDependencies=record.capabilityDependencies.map((item,index)=>{let depLabel=`Role metadata.capabilityDependencies[${index}]`;if(item===null||typeof item!="object"||Array.isArray(item))throw new Error(`${depLabel} must be a plain object`);let dep=item;if(assertNonEmptyString2(dep.capabilityId,`${depLabel}.capabilityId`),typeof dep.capabilityVersion!="number"||!Number.isSafeInteger(dep.capabilityVersion)||dep.capabilityVersion<1)throw new Error(`${depLabel}.capabilityVersion must be a positive safe integer`);if(typeof dep.required!="boolean")throw new Error(`${depLabel}.required must be boolean`);return Object.freeze({capabilityId:dep.capabilityId,capabilityVersion:dep.capabilityVersion,required:dep.required})});if(!Array.isArray(record.writableScopes))throw new Error("Role metadata.writableScopes must be an array");for(let[index,scope]of record.writableScopes.entries())if(!WRITABLE_SCOPES.includes(scope))throw new Error(`Role metadata.writableScopes[${index}] is invalid`);if(assertNonEmptyString2(record.completionCriteria,"Role metadata.completionCriteria"),record.concurrency!=="single"&&record.concurrency!=="parallel")throw new Error("Role metadata.concurrency is invalid");return Object.freeze({roleId:record.roleId,title:record.title,input,output,capabilityDependencies:Object.freeze(capabilityDependencies),writableScopes:Object.freeze([...record.writableScopes]),concurrency:record.concurrency,completionCriteria:record.completionCriteria})}function createRoleCatalog(initial=[]){let roles=new Map;for(let metadata of initial){let validated=validateRoleMetadataV1(metadata);if(roles.has(validated.roleId))throw new Error(`Role already registered: ${validated.roleId}`);roles.set(validated.roleId,validated)}return{register(metadata){let validated=validateRoleMetadataV1(metadata);if(roles.has(validated.roleId))throw new Error(`Role already registered: ${validated.roleId}`);return roles.set(validated.roleId,validated),validated},get(roleId){return roles.get(roleId)},list(){return Object.freeze([...roles.values()].sort((left,right)=>left.roleId.localeCompare(right.roleId)))},findByCapability(capabilityId){return Object.freeze([...roles.values()].filter(role=>role.capabilityDependencies.some(dependency=>dependency.capabilityId===capabilityId)))}}}var ARCHITECTURE_ROLE={roleId:"architecture-analyst",title:"Architecture Analyst",input:{schemaId:"role/architecture-input@1",schemaVersion:1},output:{schemaId:"role/architecture-output@1",schemaVersion:1},capabilityDependencies:[{capabilityId:"tool.read",capabilityVersion:1,required:!0}],writableScopes:["session"],concurrency:"parallel",completionCriteria:"module structure findings recorded"},IMPLEMENTER_ROLE={roleId:"implementer",title:"Implementer",input:{schemaId:"role/implement-input@1",schemaVersion:1},output:{schemaId:"role/implement-output@1",schemaVersion:1},capabilityDependencies:[{capabilityId:"tool.edit",capabilityVersion:1,required:!0},{capabilityId:"tool.write",capabilityVersion:1,required:!1}],writableScopes:["session","cycle"],concurrency:"single",completionCriteria:"patch produced for the requested spec"},TEST_DESIGNER_ROLE={roleId:"test-designer",title:"Test Designer",input:{schemaId:"role/test-input@1",schemaVersion:1},output:{schemaId:"role/test-output@1",schemaVersion:1},capabilityDependencies:[{capabilityId:"tool.read",capabilityVersion:1,required:!0}],writableScopes:["session"],concurrency:"parallel",completionCriteria:"test cases derived from the spec"},FIRST_BATCH_ROLES=[{metadata:ARCHITECTURE_ROLE,run:async input=>({result:`architecture findings for: ${input.spec.slice(0,64)}`})},{metadata:IMPLEMENTER_ROLE,run:async input=>({result:`patch for: ${input.spec.slice(0,64)}`})},{metadata:TEST_DESIGNER_ROLE,run:async input=>({result:`test cases for: ${input.spec.slice(0,64)}`})}];function createFirstBatchRoleSlices(catalog){let roles=FIRST_BATCH_ROLES.map(role=>({metadata:validateRoleMetadataV1(role.metadata),run:role.run}));for(let role of roles)catalog.register(role.metadata);let runners=new Map(roles.map(role=>[role.metadata.roleId,role.run]));return{roles,async run(roleId,spec){let run=runners.get(roleId);if(!run)throw new Error(`Unknown first-batch role: ${roleId}`);return{roleId,result:(await run({spec})).result}}}}function createGoalPlugin(options){let transitions=options.transitions,goalHistory=(goalId,owner)=>transitions.history(goalId).filter(record=>record.domain==="goal"&&record.owner===owner),current=(goalId,owner)=>{let state=transitions.currentStatus("goal",goalId);if(!(state===void 0||goalHistory(goalId,owner).length===0))return{status:state.status,revision:state.revision}},titleOf=(goalId,owner)=>{for(let record of goalHistory(goalId,owner)){if(record.fromStatus!==null)continue;let payload=record.payload;if(payload!==null&&typeof payload=="object"&&!Array.isArray(payload)){let title=payload.title;if(typeof title=="string")return title}}return goalId},goalGet=(goalId,owner)=>{let state=current(goalId,owner);if(!state)return;let lastEvidence=[...goalHistory(goalId,owner)].reverse().find(record=>record.evidence.length>0)?.evidence??[];return{goalId,owner,title:titleOf(goalId,owner),status:state.status,evidence:lastEvidence,revision:state.revision}},replayedGoal=(goalId,owner,toStatus,operationId)=>operationId&&goalHistory(goalId,owner).some(record=>record.toStatus===toStatus&&record.operationId===operationId)?goalGet(goalId,owner):void 0,transitionGoal=(goalId,owner,fromStatus,toStatus,goalOptions)=>{transitions.transition({domain:"goal",entityId:goalId,owner,fromStatus,toStatus,operationId:goalOptions.operationId??`${toStatus}:${goalId}`,evidence:goalOptions.evidence,payload:goalOptions.payload});let state=transitions.currentStatus("goal",goalId);return{goalId,owner,title:titleOf(goalId,owner),status:state?.status,evidence:goalOptions.evidence??[],revision:state?.revision??0}};return{createGoal({goalId,owner,title}){if(title.trim().length===0)throw new Error("Goal title must be a non-empty string");return transitionGoal(goalId,owner,null,"draft",{payload:{title},operationId:`create:${goalId}`})},activate(goalId,owner,activateOptions){let replayed=replayedGoal(goalId,owner,"active",activateOptions?.operationId);if(replayed)return replayed;let existing=current(goalId,owner);if(existing?.status!=="draft")throw new Error(`Goal ${goalId} must be in draft status to activate (current: ${existing?.status??"missing"})`);return transitionGoal(goalId,owner,"draft","active",{operationId:activateOptions?.operationId})},achieve(goalId,owner,evidence,achieveOptions){let replayed=replayedGoal(goalId,owner,"achieved",achieveOptions?.operationId);if(replayed)return replayed;let existing=current(goalId,owner);if(existing?.status!=="active")throw new Error(`Goal ${goalId} must be active to achieve (current: ${existing?.status??"missing"})`);if(evidence.length===0)throw new Error("Achieving a goal requires at least one evidence reference");return transitionGoal(goalId,owner,"active","achieved",{evidence,operationId:achieveOptions?.operationId})},archive(goalId,owner){let existing=current(goalId,owner);if(!existing||existing.status==="achieved"||existing.status==="archived")throw new Error(`Goal ${goalId} cannot be archived from status ${existing?.status??"missing"}`);return transitionGoal(goalId,owner,existing.status,"archived",{})},get(goalId,owner){return goalGet(goalId,owner)}}}function planPayloadOf(record){let payload=record.payload;if(payload!==null&&typeof payload=="object"&&!Array.isArray(payload))return payload}function createPlanPlugin(options){let transitions=options.transitions,planHistory=(planId,owner)=>transitions.history(planId).filter(record=>record.domain==="plan"&&record.owner===owner),current=(planId,owner)=>{let state=transitions.currentStatus("plan",planId);if(!(state===void 0||planHistory(planId,owner).length===0))return{status:state.status,revisionNo:state.revision}},planGet=(planId,owner)=>{let state=current(planId,owner);if(!state)return;let history=planHistory(planId,owner),createPayload=planPayloadOf(history.find(record=>record.fromStatus===null)??{}),lastLinked=[...history].reverse().map(record=>planPayloadOf(record)?.linkedRevision).find(revision=>typeof revision=="number"),lastEvidence=[...history].reverse().find(record=>record.evidence.length>0)?.evidence??[];return{planId,owner,title:createPayload?.title??planId,branch:createPayload?.branch??"",steps:createPayload?.steps??[],status:state.status,...lastLinked===void 0?{}:{revision:lastLinked},evidence:lastEvidence,revisionNo:state.revisionNo}},replayedPlan=(planId,owner,toStatus,operationId)=>operationId&&planHistory(planId,owner).some(record=>record.toStatus===toStatus&&record.operationId===operationId)?planGet(planId,owner):void 0,transitionPlan=(planId,owner,fromStatus,toStatus,planOptions)=>(transitions.transition({domain:"plan",entityId:planId,owner,fromStatus,toStatus,operationId:planOptions.operationId??`${toStatus}:${planId}`,evidence:planOptions.evidence,payload:planOptions.payload}),planGet(planId,owner));return{createPlan({planId,owner,title,branch,steps}){if(title.trim().length===0)throw new Error("Plan title must be a non-empty string");if(branch.trim().length===0)throw new Error("Plan branch must be a non-empty string");if(steps.length===0)throw new Error("Plan requires at least one step");let stepIds=new Set;for(let step of steps){if(typeof step.stepId!="string"||step.stepId.trim().length===0)throw new Error("Plan stepId must be a non-empty string");if(typeof step.title!="string"||step.title.trim().length===0)throw new Error("Plan step title must be a non-empty string");if(stepIds.has(step.stepId))throw new Error(`Duplicate plan stepId: ${step.stepId}`);stepIds.add(step.stepId)}return transitionPlan(planId,owner,null,"draft",{payload:{title,branch,steps:[...steps]},operationId:`create:${planId}`})},activate(planId,owner,activateOptions){let replayed=replayedPlan(planId,owner,"active",activateOptions?.operationId);if(replayed)return replayed;let plan=planGet(planId,owner);if(plan?.status!=="draft")throw new Error(`Plan ${planId} must be in draft status to activate (current: ${plan?.status??"missing"})`);return transitionPlan(planId,owner,"draft","active",{operationId:activateOptions?.operationId})},linkRevision(planId,owner,revision,linkOptions){let replayed=replayedPlan(planId,owner,"active",linkOptions?.operationId);if(replayed)return replayed;let plan=planGet(planId,owner);if(plan?.status!=="active")throw new Error(`Plan ${planId} must be active to link a revision (current: ${plan?.status??"missing"})`);if(!Number.isSafeInteger(revision)||revision<1)throw new Error(`Plan revision must be a positive safe integer, got ${revision}`);return transitionPlan(planId,owner,"active","active",{payload:{title:plan.title,branch:plan.branch,steps:plan.steps,linkedRevision:revision},operationId:linkOptions?.operationId??`link:${planId}:${revision}`})},complete(planId,owner,evidence,completeOptions){let replayed=replayedPlan(planId,owner,"completed",completeOptions?.operationId);if(replayed)return replayed;let plan=planGet(planId,owner);if(plan?.status!=="active")throw new Error(`Plan ${planId} must be active to complete (current: ${plan?.status??"missing"})`);if(evidence.length===0)throw new Error("Completing a plan requires at least one evidence reference");let target=completeOptions?.atRevision??plan.revision;if(typeof target!="number")throw new Error(`Plan ${planId} requires atRevision or a linked revision to complete`);return transitionPlan(planId,owner,"active","completed",{evidence,payload:{title:plan.title,branch:plan.branch,steps:plan.steps,linkedRevision:target},operationId:completeOptions?.operationId})},discard(planId,owner){let plan=planGet(planId,owner);if(!plan||plan.status==="completed"||plan.status==="discarded")throw new Error(`Plan ${planId} cannot be discarded from status ${plan?.status??"missing"}`);return transitionPlan(planId,owner,plan.status,"discarded",{})},get(planId,owner){return planGet(planId,owner)}}}function assertDeclaration(value){if(!["confirmation","permission","dangerous_operation"].includes(value.policyKind))throw new Error(`Policy manifest policyKind is invalid: ${String(value.policyKind)}`);if(typeof value.policyId!="string"||value.policyId.trim().length===0)throw new Error("Policy manifest policyId must be a non-empty string");if(typeof value.enabled!="boolean")throw new Error(`Policy manifest ${value.policyId}: enabled must be stated explicitly`)}function createPolicyManifestBuilder(){let buildManifest=input=>{if(input.profileId.trim().length===0)throw new Error("Policy manifest profileId must be a non-empty string");for(let declaration of input.declarations)assertDeclaration(declaration);let declarations=Object.freeze(input.declarations.map(declaration=>Object.freeze({...declaration})));return Object.freeze({manifestVersion:1,profileId:input.profileId,declarations,manifestDigest:stableJsonDigest(declarations)})};return{buildManifest,selectExternalPolicy(manifest,input){assertDeclaration(input.external??{policyKind:input.policyKind,policyId:input.policyId,description:"",enabled:!1});let kept=manifest.declarations.filter(declaration=>!(declaration.policyKind===input.policyKind&&declaration.policyId===input.policyId)),existed=kept.length!==manifest.declarations.length,declarations=input.external===null?kept:[...kept,input.external];return{manifest:buildManifest({profileId:manifest.profileId,declarations}),change:{policyKind:input.policyKind,policyId:input.policyId,action:input.external===null?"disabled":"external_selected",reason:input.reason}}}}}var DEFINITION_VERSION=1,FIRST_BATCH_RUNS=new Map(FIRST_BATCH_ROLES.map(role=>[role.metadata.roleId,role.run]));function runFirstBatchRole(roleId,input,context){let callback=FIRST_BATCH_RUNS.get(roleId);if(!callback)throw new Error(`No run binding for role: ${roleId}`);return callback(input,context)}function createRoleRunner(options){let catalog=options.catalog;function requireRole(roleId){let metadata=catalog.get(roleId);if(!metadata)throw new Error(`Unknown role: ${roleId}`);return metadata}async function execute(roleId,input,context){return requireRole(roleId),options.run?options.run(roleId,input,context):runFirstBatchRole(roleId,input,context)}return{catalog,listRoleIds(){return catalog.list().map(role=>role.roleId)},createDefinition(roleId){let metadata=requireRole(roleId);return{id:`role:${metadata.roleId}`,version:DEFINITION_VERSION,role:"child-agent-controller",...options.owner===void 0?{}:{owner:options.owner},run:(input,context)=>execute(metadata.roleId,input,context)}},checkCapabilities(roleId,availableCapabilities){let metadata=requireRole(roleId),registry=new Map(availableCapabilities.map(capability=>[capability.id,capability.version])),missing=[];for(let dependency of metadata.capabilityDependencies){if(!dependency.required)continue;let availableVersion=registry.get(dependency.capabilityId);availableVersion===void 0?missing.push({roleId,capabilityId:dependency.capabilityId,requestedVersion:dependency.capabilityVersion,reason:"missing"}):availableVersion!==dependency.capabilityVersion&&missing.push({roleId,capabilityId:dependency.capabilityId,requestedVersion:dependency.capabilityVersion,availableVersion,reason:"version_mismatch"})}return{roleId,status:missing.length>0?"missing":"satisfied",missing}},run(roleId,input,context){return execute(roleId,input,context)}}}function assembleRoles(input){let catalog=createRoleCatalog(input.roles.map(role=>role.metadata)),overrides=new Map(input.roles.flatMap(role=>role.run?[[role.metadata.roleId,role.run]]:[])),runner=createRoleRunner({catalog,...input.owner===void 0?{}:{owner:input.owner},...overrides.size>0?{run:((roleId,runInput,context)=>{let override=overrides.get(roleId);return override?override(runInput,context):runFirstBatchRole(roleId,runInput,context)})}:{}}),roleIds=catalog.list().map(role=>role.roleId),missing=roleIds.flatMap(roleId=>runner.checkCapabilities(roleId,input.availableCapabilities).missing);return Object.freeze({catalog,runner,roleIds:Object.freeze([...roleIds]),capabilityDiagnostics:Object.freeze({status:missing.length>0?"missing":"satisfied",missing:Object.freeze(missing)})})}var DEFAULT_ROLE_AGGREGATION_LIMIT_BYTES=16384,DEFAULT_ORCHESTRATION_OWNER="role-orchestrator";function createRoleOrchestrator(options){let owner=options.owner??DEFAULT_ORCHESTRATION_OWNER,definitions=new Map,activeOverrides=new Map,runInFlight=!1;function requireMetadata(roleId){let metadata=options.runner.catalog.get(roleId);if(!metadata)throw new Error(`Unknown role: ${roleId}`);return metadata}function definitionFor(roleId){let cached=definitions.get(roleId);if(cached)return cached;let definition={...options.runner.createDefinition(roleId),run:(input,context)=>{let override=activeOverrides.get(roleId);return override?override(input,context):options.runner.run(roleId,input,context)}},registered=options.composition.define(definition);return definitions.set(roleId,registered),registered}async function runOne(roleId,spec,settled){let definition=definitionFor(roleId),instance=options.composition.create({id:definition.id,version:definition.version},{parentInstanceId:options.parentInstanceId}),childInstanceId=instance.id,lease=await instance.acquireControllerLease(owner);try{let operation=instance.run({spec},{lease});try{await operation.result}catch{}let terminal=await instance.wait(),error=terminal.error===void 0?void 0:terminal.error instanceof Error?terminal.error.message:String(terminal.error);settled.set(roleId,{roleId,definitionId:definition.id,childInstanceId,revision:terminal.revision,status:terminal.status,...terminal.output!==void 0?{output:terminal.output}:{},...error!==void 0?{error}:{}})}finally{lease.isActive()&&await lease.release()}}async function runRoles(request){if(runInFlight)throw new Error("Role orchestrator is already running an orchestration");let seen=new Set;for(let roleId of request.roleIds){if(typeof roleId!="string"||roleId.trim().length===0)throw new Error("Role id must be a non-empty string");if(seen.has(roleId))throw new Error(`Duplicate roleId in orchestration request: ${roleId}`);seen.add(roleId)}let overrides=new Map;for(let override of request.runs??[]){if(overrides.has(override.roleId))throw new Error(`Duplicate run override for role: ${override.roleId}`);overrides.set(override.roleId,override.run)}for(let roleId of overrides.keys())if(!seen.has(roleId))throw new Error(`Run override for unrequested role: ${roleId}`);let sorted=[...request.roleIds].sort((left,right)=>left.localeCompare(right));for(let roleId of sorted)requireMetadata(roleId),definitionFor(roleId);runInFlight=!0;try{activeOverrides=overrides;let settled=new Map;if(sorted.length>0){let parallelIds=sorted.filter(roleId=>requireMetadata(roleId).concurrency==="parallel"),singleIds=sorted.filter(roleId=>requireMetadata(roleId).concurrency==="single");await Promise.all(parallelIds.map(roleId=>runOne(roleId,request.spec,settled)));for(let roleId of singleIds)await runOne(roleId,request.spec,settled)}return aggregate(sorted,settled,request)}finally{activeOverrides=new Map,runInFlight=!1}}function aggregate(sorted,settled,request){let limitBytes=request.limitBytes??options.limitBytes??16384,used=0,truncated=!1,frozenEntries=sorted.map(roleId=>{let outcome=settled.get(roleId);if(!outcome)throw new Error(`Orchestration outcome missing for role: ${roleId}`);let base={roleId:outcome.roleId,definitionId:outcome.definitionId,childInstanceId:outcome.childInstanceId,revision:outcome.revision,status:outcome.status};if(outcome.status!=="succeeded"||outcome.output===void 0)return Object.freeze({...base,truncated:!1,missing:!0,...outcome.error!==void 0?{error:outcome.error}:{}});let size=JSON.stringify(outcome.output).length;return used+size>limitBytes?(truncated=!0,Object.freeze({...base,truncated:!0,missing:!1})):(used+=size,Object.freeze({...base,truncated:!1,missing:!1,result:outcome.output}))}),entryByRole=new Map(frozenEntries.map(entry=>[entry.roleId,entry])),evaluate=request.evaluateCompletion??options.evaluateCompletion,frozenChecks=sorted.map(roleId=>{let criteria=requireMetadata(roleId).completionCriteria,outcome=settled.get(roleId),entry=entryByRole.get(roleId),output=outcome?.output;if(!evaluate||!output||entry?.truncated===!0)return Object.freeze({roleId,criteria,status:"unchecked"});let verdict=evaluate({roleId,criteria,result:output});return Object.freeze({roleId,criteria,status:verdict===!0?"satisfied":verdict===!1?"unmet":"unchecked"})});return Object.freeze({entries:Object.freeze(frozenEntries),truncated,completionChecks:Object.freeze(frozenChecks)})}return{composition:options.composition,runner:options.runner,parentInstanceId:options.parentInstanceId,runRoles}}function createRootAgentFacade(options){let definitionId=options.rootDefinitionId??"root-agent-controller",owner=options.owner??"root-facade",definition=options.composition.define({id:definitionId,version:options.rootVersion??1,role:"root-agent-controller",run:(input,context)=>options.run(input,context)}),turnInFlight=!1;return{definitionId,async runTurn(input,runOptions){if(turnInFlight)throw new Error("Root facade is already running a turn");turnInFlight=!0;try{let instance=options.composition.create(definition),lease=await instance.acquireControllerLease(owner),leaseId=lease.id;try{await instance.run(input,{lease,signal:runOptions?.signal}).result;let instanceResult=await instance.wait();return{status:instanceResult.status,...instanceResult.output!==void 0?{output:instanceResult.output}:{},...instanceResult.error instanceof Error?{error:instanceResult.error}:{},revision:instanceResult.revision,instanceId:instance.id,leaseId}}finally{lease.isActive()&&await lease.release()}}finally{turnInFlight=!1}}}}function createSkillDiscoveryWiring(){let items=new Map,keyOf=item=>`${item.sourceKind}:${item.itemId}`;return{register(item){if(item.itemId.trim().length===0)throw new Error("Discovered item id must be a non-empty string");let existing=items.get(keyOf(item));if(existing&&existing.version!==item.version)throw new Error(`Item ${keyOf(item)} re-registered with a different version (${existing.version} -> ${item.version})`);items.set(keyOf(item),{...item,capabilities:[...item.capabilities]})},deriveMcpItem({serverId,version,tools,enabled=!0}){return{sourceKind:"mcp",itemId:serverId,version,capabilities:tools.map(tool=>({id:`mcp:${serverId}:${tool.name}`,version:1})),enabled}},wireDiscoveredDependencies({availableCapabilities,disabledItemIds}){let disabled=new Set(disabledItemIds??[]),enabledItems=[...items.values()].filter(item=>item.enabled&&!disabled.has(keyOf(item))),byCapability=new Map;for(let item of enabledItems)for(let capability of item.capabilities){let list=byCapability.get(capability.id)??[];list.some(entry=>entry.itemId===item.itemId)||list.push({sourceKind:item.sourceKind,itemId:item.itemId,version:capability.version}),byCapability.set(capability.id,list)}let conflicts=[];for(let[capabilityId,declarations]of byCapability)new Set(declarations.map(entry=>entry.version)).size>1&&conflicts.push({capabilityId,declarations});let manifests=[...items.values()].map(item=>({pluginId:keyOf(item),pluginVersion:item.version,capabilityRefs:[...item.capabilities]})),wiring=wireProfileDependencies({resolvedPlugins:manifests,availableCapabilities,disabledPluginIds:disabledItemIds});return{conflicts:Object.freeze(conflicts),wiring}}}}function assertNonEmptyString3(value,label){if(typeof value!="string"||value.trim().length===0)throw new Error(`${label} must be a non-empty string`)}function validateEvidence(value,label){if(value===void 0)return[];if(!Array.isArray(value))throw new Error(`${label} must be an array`);return value.map((item,index)=>{let depLabel=`${label}[${index}]`;if(item===null||typeof item!="object"||Array.isArray(item))throw new Error(`${depLabel} must be a plain object`);let record=item;return assertNonEmptyString3(record.kind,`${depLabel}.kind`),assertNonEmptyString3(record.ref,`${depLabel}.ref`),record.digest!==void 0&&assertNonEmptyString3(record.digest,`${depLabel}.digest`),Object.freeze({kind:record.kind,ref:record.ref,...record.digest===void 0?{}:{digest:record.digest}})})}function validatePayload(value,label){if(value===void 0)return;let seen=new Set,check=node=>{if(!(node===null||typeof node=="string"||typeof node=="boolean")){if(typeof node=="number"){if(!Number.isFinite(node))throw new Error(`${label} must be JSON-safe: ${node} is not a finite number`);return}if(typeof node=="object"){if(seen.has(node))throw new Error(`${label} must be JSON-safe: circular reference`);if(seen.add(node),Array.isArray(node))for(let item of node)check(item);else{let proto=Object.getPrototypeOf(node);if(proto!==Object.prototype&&proto!==null)throw new Error(`${label} must be a plain object`);for(let entry of Object.entries(node)){if(entry[1]===void 0)throw new Error(`${label} must be JSON-safe: ${entry[0]} is undefined`);check(entry[1])}}seen.delete(node);return}throw new Error(`${label} must be JSON-safe: unsupported value of type ${typeof node}`)}};return check(value),JSON.parse(JSON.stringify(value))}function createTransitionStore(options={}){let now=options.now??(()=>Date.now()),recordsByEntity=new Map,idempotency=new Map,currentStatus=new Map,revisions=new Map,entityKey=(domain,entityId)=>`${domain}\0${entityId}`;return{transition(input){assertNonEmptyString3(input.domain,"Transition domain"),assertNonEmptyString3(input.entityId,"Transition entityId"),assertNonEmptyString3(input.owner,"Transition owner"),assertNonEmptyString3(input.operationId,"Transition operationId"),assertNonEmptyString3(input.toStatus,"Transition toStatus");let evidence=validateEvidence(input.evidence,"Transition evidence"),payload=validatePayload(input.payload,"Transition payload"),key=`${entityKey(input.domain,input.entityId)}\0${input.operationId}\0${input.toStatus}`,existing=idempotency.get(key);if(existing)return{record:existing,deduped:!0};let entityKeyId=entityKey(input.domain,input.entityId),current=currentStatus.get(entityKeyId),fromStatus=input.fromStatus;if((current?.status??null)!==fromStatus)throw new Error(`Transition conflict: expected fromStatus ${JSON.stringify(current?.status??null)}, got ${JSON.stringify(fromStatus)}`);let revision=(revisions.get(entityKeyId)??0)+1;revisions.set(entityKeyId,revision);let record=Object.freeze({domain:input.domain,entityId:input.entityId,owner:input.owner,fromStatus,toStatus:input.toStatus,operationId:input.operationId,evidence:Object.freeze(evidence),...payload===void 0?{}:{payload},revision,at:input.at??now()}),log=recordsByEntity.get(entityKeyId)??[];return log.push(record),recordsByEntity.set(entityKeyId,log),currentStatus.set(entityKeyId,{status:input.toStatus,revision}),idempotency.set(key,record),{record,deduped:!1}},currentStatus(domain,entityId){return currentStatus.get(entityKey(domain,entityId))},history(entityId){return Object.freeze([...recordsByEntity.entries()].filter(([entityKeyId])=>entityKeyId.endsWith(`\0${entityId}`)).flatMap(([,log])=>log))},replay(history){for(let record of history)this.transition({domain:record.domain,entityId:record.entityId,owner:record.owner,fromStatus:record.fromStatus,toStatus:record.toStatus,operationId:record.operationId,evidence:record.evidence,payload:record.payload,at:record.at})},entities(){return Object.freeze([...new Set([...currentStatus.keys()].map(key=>key.split("\0")[1]))])}}}function contentHash2(content){let hash=2166136261;for(let index=0;index<content.length;index+=1)hash^=content.charCodeAt(index),hash=Math.imul(hash,16777619);return(hash>>>0).toString(36)}function todoPayloadOf(record){let payload=record.payload;if(payload!==null&&typeof payload=="object"&&!Array.isArray(payload))return payload}function createTodoPlugin(options){let transitions=options.transitions,todoHistory=(todoId,owner)=>transitions.history(todoId).filter(record=>record.domain==="todo"&&record.owner===owner),current=(todoId,owner)=>{let state=transitions.currentStatus("todo",todoId);if(!(state===void 0||todoHistory(todoId,owner).length===0))return{status:state.status,revision:state.revision}},todoGet=(todoId,owner)=>{let state=current(todoId,owner);if(!state)return;let history=todoHistory(todoId,owner),content=[...history].reverse().map(record=>todoPayloadOf(record)?.content).find(value=>typeof value=="string"),lastEvidence=[...history].reverse().find(record=>record.evidence.length>0)?.evidence??[];return{todoId,owner,content:content??"",status:state.status,evidence:lastEvidence,revision:state.revision}},replayedTodo=(todoId,owner,toStatus,operationId)=>operationId&&todoHistory(todoId,owner).some(record=>record.toStatus===toStatus&&record.operationId===operationId)?todoGet(todoId,owner):void 0,transitionTodo=(todoId,owner,fromStatus,toStatus,todoOptions)=>(transitions.transition({domain:"todo",entityId:todoId,owner,fromStatus,toStatus,operationId:todoOptions.operationId??`${toStatus}:${todoId}`,evidence:todoOptions.evidence,payload:todoOptions.payload}),todoGet(todoId,owner)),requireStatus=(todoId,owner,allowed)=>{let todo=todoGet(todoId,owner);if(!todo||!allowed.includes(todo.status))throw new Error(`Todo ${todoId} must be ${allowed.join("/")} (current: ${todo?.status??"missing"})`);return todo};return{createTodo({todoId,owner,content}){if(content.trim().length===0)throw new Error("Todo content must be a non-empty string");return transitionTodo(todoId,owner,null,"open",{payload:{content},operationId:`create:${todoId}`})},start(todoId,owner,startOptions){let replayed=replayedTodo(todoId,owner,"in_progress",startOptions?.operationId);return replayed||(requireStatus(todoId,owner,["open"]),transitionTodo(todoId,owner,"open","in_progress",{operationId:startOptions?.operationId}))},update(todoId,owner,content,updateOptions){if(content.trim().length===0)throw new Error("Todo content must be a non-empty string");let replayed=replayedTodo(todoId,owner,todoGet(todoId,owner)?.status??"open",updateOptions?.operationId);if(replayed)return replayed;let todo=requireStatus(todoId,owner,["open","in_progress"]);return transitionTodo(todoId,owner,todo.status,todo.status,{payload:{content},operationId:updateOptions?.operationId??`update:${todoId}:${contentHash2(content)}`})},complete(todoId,owner,evidence,completeOptions){let replayed=replayedTodo(todoId,owner,"completed",completeOptions?.operationId);return replayed||(requireStatus(todoId,owner,["in_progress"]),transitionTodo(todoId,owner,"in_progress","completed",{evidence:evidence??[],operationId:completeOptions?.operationId}))},cancel(todoId,owner,reason){let todo=requireStatus(todoId,owner,["open","in_progress"]);if(reason!==void 0&&reason.trim().length===0)throw new Error("Todo cancel reason must be a non-empty string when provided");return transitionTodo(todoId,owner,todo.status,"cancelled",{...reason===void 0?{}:{payload:{content:todo.content,cancelReason:reason}}})},reopen(todoId,owner,reopenOptions){let replayed=replayedTodo(todoId,owner,"open",reopenOptions?.operationId);return replayed||(requireStatus(todoId,owner,["cancelled"]),transitionTodo(todoId,owner,"cancelled","open",{operationId:reopenOptions?.operationId}))},get(todoId,owner){return todoGet(todoId,owner)}}}function createSessionShare(options){let now=options.now??(()=>Date.now()),contracts=new Map,shareSequence=0,shareIdOf=sessionId=>{shareSequence+=1;let hash=2166136261,value=`${sessionId}#${shareSequence}`;for(let index=0;index<value.length;index+=1)hash^=value.charCodeAt(index),hash=Math.imul(hash,16777619);return`share-${(hash>>>0).toString(36)}`};return{transport:options.transport,createShare(input){let contract={shareId:shareIdOf(input.sessionId),sessionId:input.sessionId,permission:"read_only",scope:input.scope,createdAt:now(),...input.expiresAt===void 0?{}:{expiresAt:input.expiresAt}};return contracts.set(contract.shareId,{contract}),contract},resolve({shareId,request,now:at}){let record=contracts.get(shareId);if(!record)return{status:"not_found",shareId};let currentTime=at??now();if(record.revokedReason!==void 0)return{status:"denied",reason:`Share ${shareId} is revoked: ${record.revokedReason}`};if(record.contract.expiresAt!==void 0&&currentTime>record.contract.expiresAt)return{status:"denied",reason:`Share ${shareId} expired at ${record.contract.expiresAt}`};let{scope}=record.contract;switch(request.kind){case"messages":return scope.messages?{status:"resolved",kind:"messages",content:options.readMessages(record.contract.sessionId)}:{status:"denied",reason:"Messages are outside the share scope"};case"diagnostics":return scope.diagnostics?{status:"resolved",kind:"diagnostics",content:options.readDiagnostics(record.contract.sessionId)}:{status:"denied",reason:"Diagnostics are outside the share scope"};case"artifact":return scope.artifacts.includes(request.artifactId)?{status:"resolved",kind:"artifact",artifact:options.readArtifact({sessionId:record.contract.sessionId,artifactId:request.artifactId})}:{status:"denied",reason:`Artifact ${request.artifactId} is not in the share whitelist`}}},revoke(shareId,input){let record=contracts.get(shareId);if(!record)throw new Error(`Share not found: ${shareId}`);if(record.revokedReason!==void 0)throw new Error(`Share ${shareId} has already been revoked`);return record.revokedReason=input.reason,record.contract}}}function escapeHtml(value){return value.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function failureView(shareId,reason){return[`<article class="share-share-failure" data-share="${escapeHtml(shareId)}">`,"<h1>Share unavailable</h1>",`<p class="share-reason">${escapeHtml(reason)}</p>`,"</article>"].join(`
4
4
  `)}function createShareViewer(){return{render({contract,result}){if(result.status!=="resolved"){let reason=result.status==="denied"?result.reason:`Unknown share: ${result.shareId}`;return{shareId:contract.shareId,state:"failed",html:failureView(contract.shareId,reason),payload:{shareId:contract.shareId,state:"failed",reason}}}let bodyHtml,payload;switch(result.kind){case"messages":{let content=result.content,turns=Array.isArray(content.turns)?content.turns:[];bodyHtml=["<h1>Shared messages</h1>",'<ol class="share-turns">',...turns.map(turn=>`<li>${escapeHtml(String(turn))}</li>`),"</ol>"].join(`
5
5
  `),payload={shareId:contract.shareId,state:"resolved",kind:"messages",turns:[...turns]};break}case"diagnostics":{bodyHtml=`<h1>Shared diagnostics</h1><pre class="share-diagnostics">${escapeHtml(JSON.stringify(result.content))}</pre>`,payload={shareId:contract.shareId,state:"resolved",kind:"diagnostics",content:result.content};break}case"artifact":{bodyHtml=["<h1>Shared artifact</h1>",`<p class="share-artifact" data-artifact="${escapeHtml(result.artifact.artifactId)}">`,`${escapeHtml(result.artifact.mediaType)} \xB7 ${escapeHtml(result.artifact.bytesBase64)}`,"</p>"].join(`
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url);
3
- import{APP_NAME,configureHttpDispatcher,main}from"./chunks/chunk-4NKZMFSZ.js";import"./chunks/chunk-JUUC5AZY.js";import"./chunks/chunk-XDUWOHPL.js";import"./chunks/chunk-3QKHSPQL.js";import"./chunks/chunk-DRQDKNXA.js";import"./chunks/chunk-7ZY7IXZD.js";import"./chunks/chunk-V46XUTK3.js";import"./chunks/chunk-WGLBM2BP.js";import"./chunks/chunk-4L3WN2XY.js";process.title=`${APP_NAME}-rpc`;process.env.AGENT_FORGE="true";process.env.AI_AGENT="agent-forge";process.emitWarning=(()=>{});configureHttpDispatcher();main(["--mode","rpc",...process.argv.slice(2)]);
3
+ import{APP_NAME,configureHttpDispatcher,main}from"./chunks/chunk-WJR4VZLQ.js";import"./chunks/chunk-JUUC5AZY.js";import"./chunks/chunk-XDUWOHPL.js";import"./chunks/chunk-3QKHSPQL.js";import"./chunks/chunk-DRQDKNXA.js";import"./chunks/chunk-7ZY7IXZD.js";import"./chunks/chunk-V46XUTK3.js";import"./chunks/chunk-WGLBM2BP.js";import"./chunks/chunk-4L3WN2XY.js";process.title=`${APP_NAME}-rpc`;process.env.AGENT_FORGE="true";process.env.AI_AGENT="agent-forge";process.emitWarning=(()=>{});configureHttpDispatcher();main(["--mode","rpc",...process.argv.slice(2)]);
@@ -1,14 +1,3 @@
1
- /**
2
- * Factory plugin manifest for the startup bootstrap (design
3
- * `插件独立分发与启动装配设计.md` §4.4). Pure data only: the framework
4
- * declares which first-party plugin packages a fresh install should end up
5
- * with, as `pluginId → npm name + version constraint`. It ships with the
6
- * framework version and is never a code branch.
7
- *
8
- * Each S2–S4 migrated package appends one entry here with its publish name
9
- * (`@ai-agent-forge/plugin-<name>`, §0.8) together with the legacy short-id
10
- * mapping noted in §4.1.
11
- */
12
1
  /** One factory-declared first-party plugin package. */
13
2
  export interface PluginBootstrapFactoryEntryV1 {
14
3
  /** Ecosystem plugin id (`agent-forge.plugin.<name>` domain, §4.1). */
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap-factory-manifest.d.ts","sourceRoot":"","sources":["../../../src/plugins/ecosystem/bootstrap-factory-manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,uDAAuD;AACvD,MAAM,WAAW,6BAA6B;IAC7C,uEAAsE;IACtE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,iEAAgE;IAChE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,oCAAoC,EAAE,SAAS,6BAA6B,EAYvF,CAAC","sourcesContent":["/**\n * Factory plugin manifest for the startup bootstrap (design\n * `插件独立分发与启动装配设计.md` §4.4). Pure data only: the framework\n * declares which first-party plugin packages a fresh install should end up\n * with, as `pluginId → npm name + version constraint`. It ships with the\n * framework version and is never a code branch.\n *\n * Each S2–S4 migrated package appends one entry here with its publish name\n * (`@ai-agent-forge/plugin-<name>`, §0.8) together with the legacy short-id\n * mapping noted in §4.1.\n */\n\n/** One factory-declared first-party plugin package. */\nexport interface PluginBootstrapFactoryEntryV1 {\n\t/** Ecosystem plugin id (`agent-forge.plugin.<name>` domain, §4.1). */\n\treadonly pluginId: string;\n\t/** npm publish name (`@ai-agent-forge/plugin-<name>`, §0.8). */\n\treadonly npmName: string;\n\t/**\n\t * Minimal range subset shared with npm resolution (`x.y.z`, `^x.y.z`,\n\t * `~x.y.z`, `latest`); omitted means the highest available version.\n\t */\n\treadonly range?: string;\n}\n\n/**\n * Frozen factory manifest consumed by `runPluginBootstrapV1`. D-075 S4 first\n * batch: the goal/plan/todo-set capability packages joined; second batch:\n * session-share and observability joined; third batch: subagent-delegate\n * joined; fourth batch: memory joined (completing the six-package split).\n * Later B-class batches append their entries per package.\n */\nexport const BOOTSTRAP_FACTORY_PLUGIN_MANIFEST_V1: readonly PluginBootstrapFactoryEntryV1[] = Object.freeze([\n\t{ pluginId: \"agent-forge.plugin.goal\", npmName: \"@ai-agent-forge/plugin-goal\", range: \"^0.84.4\" },\n\t{ pluginId: \"agent-forge.plugin.plan\", npmName: \"@ai-agent-forge/plugin-plan\", range: \"^0.84.4\" },\n\t{ pluginId: \"agent-forge.plugin.todo-set\", npmName: \"@ai-agent-forge/plugin-todo-set\", range: \"^0.84.4\" },\n\t{ pluginId: \"agent-forge.plugin.session-share\", npmName: \"@ai-agent-forge/plugin-session-share\", range: \"^0.84.4\" },\n\t{ pluginId: \"agent-forge.plugin.observability\", npmName: \"@ai-agent-forge/plugin-observability\", range: \"^0.84.4\" },\n\t{\n\t\tpluginId: \"agent-forge.plugin.subagent-delegate\",\n\t\tnpmName: \"@ai-agent-forge/plugin-subagent-delegate\",\n\t\trange: \"^0.84.4\",\n\t},\n\t{ pluginId: \"agent-forge.plugin.memory\", npmName: \"@ai-agent-forge/plugin-memory\", range: \"^0.84.4\" },\n]);\n"]}
1
+ {"version":3,"file":"bootstrap-factory-manifest.d.ts","sourceRoot":"","sources":["../../../src/plugins/ecosystem/bootstrap-factory-manifest.ts"],"names":[],"mappings":"AAoBA,uDAAuD;AACvD,MAAM,WAAW,6BAA6B;IAC7C,uEAAsE;IACtE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,iEAAgE;IAChE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACxB;AAKD;;;;;;GAMG;AACH,eAAO,MAAM,oCAAoC,EAAE,SAAS,6BAA6B,EAoBvF,CAAC","sourcesContent":["/**\n * Factory plugin manifest for the startup bootstrap (design\n * `插件独立分发与启动装配设计.md` §4.4). Pure data only: the framework\n * declares which first-party plugin packages a fresh install should end up\n * with, as `pluginId → npm name + version constraint`. It ships with the\n * framework version and is never a code branch.\n *\n * Each S2–S4 migrated package appends one entry here with its publish name\n * (`@ai-agent-forge/plugin-<name>`, §0.8) together with the legacy short-id\n * mapping noted in §4.1.\n *\n * Ranges are derived from the framework's own VERSION at module init — a\n * hardcoded range here outlived a lockstep bump once (published 0.85.0 kept\n * `^0.84.4`, which excludes 0.85.0 under caret-on-0.x semantics, breaking\n * every fresh install's npm bootstrap). Deriving keeps the manifest in step\n * with the version the publish channel stamps, including the\n * rename/version rewrite in the local publish script.\n */\nimport { VERSION } from \"../../config.ts\";\n\n/** One factory-declared first-party plugin package. */\nexport interface PluginBootstrapFactoryEntryV1 {\n\t/** Ecosystem plugin id (`agent-forge.plugin.<name>` domain, §4.1). */\n\treadonly pluginId: string;\n\t/** npm publish name (`@ai-agent-forge/plugin-<name>`, §0.8). */\n\treadonly npmName: string;\n\t/**\n\t * Minimal range subset shared with npm resolution (`x.y.z`, `^x.y.z`,\n\t * `~x.y.z`, `latest`); omitted means the highest available version.\n\t */\n\treadonly range?: string;\n}\n\n/** Lockstep range every first-party bootstrap entry ships under. */\nconst FACTORY_PLUGIN_RANGE = `^${VERSION}`;\n\n/**\n * Frozen factory manifest consumed by `runPluginBootstrapV1`. D-075 S4 first\n * batch: the goal/plan/todo-set capability packages joined; second batch:\n * session-share and observability joined; third batch: subagent-delegate\n * joined; fourth batch: memory joined (completing the six-package split).\n * Later B-class batches append their entries per package.\n */\nexport const BOOTSTRAP_FACTORY_PLUGIN_MANIFEST_V1: readonly PluginBootstrapFactoryEntryV1[] = Object.freeze([\n\t{ pluginId: \"agent-forge.plugin.goal\", npmName: \"@ai-agent-forge/plugin-goal\", range: FACTORY_PLUGIN_RANGE },\n\t{ pluginId: \"agent-forge.plugin.plan\", npmName: \"@ai-agent-forge/plugin-plan\", range: FACTORY_PLUGIN_RANGE },\n\t{ pluginId: \"agent-forge.plugin.todo-set\", npmName: \"@ai-agent-forge/plugin-todo-set\", range: FACTORY_PLUGIN_RANGE },\n\t{\n\t\tpluginId: \"agent-forge.plugin.session-share\",\n\t\tnpmName: \"@ai-agent-forge/plugin-session-share\",\n\t\trange: FACTORY_PLUGIN_RANGE,\n\t},\n\t{\n\t\tpluginId: \"agent-forge.plugin.observability\",\n\t\tnpmName: \"@ai-agent-forge/plugin-observability\",\n\t\trange: FACTORY_PLUGIN_RANGE,\n\t},\n\t{\n\t\tpluginId: \"agent-forge.plugin.subagent-delegate\",\n\t\tnpmName: \"@ai-agent-forge/plugin-subagent-delegate\",\n\t\trange: FACTORY_PLUGIN_RANGE,\n\t},\n\t{ pluginId: \"agent-forge.plugin.memory\", npmName: \"@ai-agent-forge/plugin-memory\", range: FACTORY_PLUGIN_RANGE },\n]);\n"]}
@@ -8,7 +8,17 @@
8
8
  * Each S2–S4 migrated package appends one entry here with its publish name
9
9
  * (`@ai-agent-forge/plugin-<name>`, §0.8) together with the legacy short-id
10
10
  * mapping noted in §4.1.
11
+ *
12
+ * Ranges are derived from the framework's own VERSION at module init — a
13
+ * hardcoded range here outlived a lockstep bump once (published 0.85.0 kept
14
+ * `^0.84.4`, which excludes 0.85.0 under caret-on-0.x semantics, breaking
15
+ * every fresh install's npm bootstrap). Deriving keeps the manifest in step
16
+ * with the version the publish channel stamps, including the
17
+ * rename/version rewrite in the local publish script.
11
18
  */
19
+ import { VERSION } from "../../config.js";
20
+ /** Lockstep range every first-party bootstrap entry ships under. */
21
+ const FACTORY_PLUGIN_RANGE = `^${VERSION}`;
12
22
  /**
13
23
  * Frozen factory manifest consumed by `runPluginBootstrapV1`. D-075 S4 first
14
24
  * batch: the goal/plan/todo-set capability packages joined; second batch:
@@ -17,16 +27,24 @@
17
27
  * Later B-class batches append their entries per package.
18
28
  */
19
29
  export const BOOTSTRAP_FACTORY_PLUGIN_MANIFEST_V1 = Object.freeze([
20
- { pluginId: "agent-forge.plugin.goal", npmName: "@ai-agent-forge/plugin-goal", range: "^0.84.4" },
21
- { pluginId: "agent-forge.plugin.plan", npmName: "@ai-agent-forge/plugin-plan", range: "^0.84.4" },
22
- { pluginId: "agent-forge.plugin.todo-set", npmName: "@ai-agent-forge/plugin-todo-set", range: "^0.84.4" },
23
- { pluginId: "agent-forge.plugin.session-share", npmName: "@ai-agent-forge/plugin-session-share", range: "^0.84.4" },
24
- { pluginId: "agent-forge.plugin.observability", npmName: "@ai-agent-forge/plugin-observability", range: "^0.84.4" },
30
+ { pluginId: "agent-forge.plugin.goal", npmName: "@ai-agent-forge/plugin-goal", range: FACTORY_PLUGIN_RANGE },
31
+ { pluginId: "agent-forge.plugin.plan", npmName: "@ai-agent-forge/plugin-plan", range: FACTORY_PLUGIN_RANGE },
32
+ { pluginId: "agent-forge.plugin.todo-set", npmName: "@ai-agent-forge/plugin-todo-set", range: FACTORY_PLUGIN_RANGE },
33
+ {
34
+ pluginId: "agent-forge.plugin.session-share",
35
+ npmName: "@ai-agent-forge/plugin-session-share",
36
+ range: FACTORY_PLUGIN_RANGE,
37
+ },
38
+ {
39
+ pluginId: "agent-forge.plugin.observability",
40
+ npmName: "@ai-agent-forge/plugin-observability",
41
+ range: FACTORY_PLUGIN_RANGE,
42
+ },
25
43
  {
26
44
  pluginId: "agent-forge.plugin.subagent-delegate",
27
45
  npmName: "@ai-agent-forge/plugin-subagent-delegate",
28
- range: "^0.84.4",
46
+ range: FACTORY_PLUGIN_RANGE,
29
47
  },
30
- { pluginId: "agent-forge.plugin.memory", npmName: "@ai-agent-forge/plugin-memory", range: "^0.84.4" },
48
+ { pluginId: "agent-forge.plugin.memory", npmName: "@ai-agent-forge/plugin-memory", range: FACTORY_PLUGIN_RANGE },
31
49
  ]);
32
50
  //# sourceMappingURL=bootstrap-factory-manifest.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap-factory-manifest.js","sourceRoot":"","sources":["../../../src/plugins/ecosystem/bootstrap-factory-manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAeH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,oCAAoC,GAA6C,MAAM,CAAC,MAAM,CAAC;IAC3G,EAAE,QAAQ,EAAE,yBAAyB,EAAE,OAAO,EAAE,6BAA6B,EAAE,KAAK,EAAE,SAAS,EAAE;IACjG,EAAE,QAAQ,EAAE,yBAAyB,EAAE,OAAO,EAAE,6BAA6B,EAAE,KAAK,EAAE,SAAS,EAAE;IACjG,EAAE,QAAQ,EAAE,6BAA6B,EAAE,OAAO,EAAE,iCAAiC,EAAE,KAAK,EAAE,SAAS,EAAE;IACzG,EAAE,QAAQ,EAAE,kCAAkC,EAAE,OAAO,EAAE,sCAAsC,EAAE,KAAK,EAAE,SAAS,EAAE;IACnH,EAAE,QAAQ,EAAE,kCAAkC,EAAE,OAAO,EAAE,sCAAsC,EAAE,KAAK,EAAE,SAAS,EAAE;IACnH;QACC,QAAQ,EAAE,sCAAsC;QAChD,OAAO,EAAE,0CAA0C;QACnD,KAAK,EAAE,SAAS;KAChB;IACD,EAAE,QAAQ,EAAE,2BAA2B,EAAE,OAAO,EAAE,+BAA+B,EAAE,KAAK,EAAE,SAAS,EAAE;CACrG,CAAC,CAAC","sourcesContent":["/**\n * Factory plugin manifest for the startup bootstrap (design\n * `插件独立分发与启动装配设计.md` §4.4). Pure data only: the framework\n * declares which first-party plugin packages a fresh install should end up\n * with, as `pluginId → npm name + version constraint`. It ships with the\n * framework version and is never a code branch.\n *\n * Each S2–S4 migrated package appends one entry here with its publish name\n * (`@ai-agent-forge/plugin-<name>`, §0.8) together with the legacy short-id\n * mapping noted in §4.1.\n */\n\n/** One factory-declared first-party plugin package. */\nexport interface PluginBootstrapFactoryEntryV1 {\n\t/** Ecosystem plugin id (`agent-forge.plugin.<name>` domain, §4.1). */\n\treadonly pluginId: string;\n\t/** npm publish name (`@ai-agent-forge/plugin-<name>`, §0.8). */\n\treadonly npmName: string;\n\t/**\n\t * Minimal range subset shared with npm resolution (`x.y.z`, `^x.y.z`,\n\t * `~x.y.z`, `latest`); omitted means the highest available version.\n\t */\n\treadonly range?: string;\n}\n\n/**\n * Frozen factory manifest consumed by `runPluginBootstrapV1`. D-075 S4 first\n * batch: the goal/plan/todo-set capability packages joined; second batch:\n * session-share and observability joined; third batch: subagent-delegate\n * joined; fourth batch: memory joined (completing the six-package split).\n * Later B-class batches append their entries per package.\n */\nexport const BOOTSTRAP_FACTORY_PLUGIN_MANIFEST_V1: readonly PluginBootstrapFactoryEntryV1[] = Object.freeze([\n\t{ pluginId: \"agent-forge.plugin.goal\", npmName: \"@ai-agent-forge/plugin-goal\", range: \"^0.84.4\" },\n\t{ pluginId: \"agent-forge.plugin.plan\", npmName: \"@ai-agent-forge/plugin-plan\", range: \"^0.84.4\" },\n\t{ pluginId: \"agent-forge.plugin.todo-set\", npmName: \"@ai-agent-forge/plugin-todo-set\", range: \"^0.84.4\" },\n\t{ pluginId: \"agent-forge.plugin.session-share\", npmName: \"@ai-agent-forge/plugin-session-share\", range: \"^0.84.4\" },\n\t{ pluginId: \"agent-forge.plugin.observability\", npmName: \"@ai-agent-forge/plugin-observability\", range: \"^0.84.4\" },\n\t{\n\t\tpluginId: \"agent-forge.plugin.subagent-delegate\",\n\t\tnpmName: \"@ai-agent-forge/plugin-subagent-delegate\",\n\t\trange: \"^0.84.4\",\n\t},\n\t{ pluginId: \"agent-forge.plugin.memory\", npmName: \"@ai-agent-forge/plugin-memory\", range: \"^0.84.4\" },\n]);\n"]}
1
+ {"version":3,"file":"bootstrap-factory-manifest.js","sourceRoot":"","sources":["../../../src/plugins/ecosystem/bootstrap-factory-manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAe1C,oEAAoE;AACpE,MAAM,oBAAoB,GAAG,IAAI,OAAO,EAAE,CAAC;AAE3C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,oCAAoC,GAA6C,MAAM,CAAC,MAAM,CAAC;IAC3G,EAAE,QAAQ,EAAE,yBAAyB,EAAE,OAAO,EAAE,6BAA6B,EAAE,KAAK,EAAE,oBAAoB,EAAE;IAC5G,EAAE,QAAQ,EAAE,yBAAyB,EAAE,OAAO,EAAE,6BAA6B,EAAE,KAAK,EAAE,oBAAoB,EAAE;IAC5G,EAAE,QAAQ,EAAE,6BAA6B,EAAE,OAAO,EAAE,iCAAiC,EAAE,KAAK,EAAE,oBAAoB,EAAE;IACpH;QACC,QAAQ,EAAE,kCAAkC;QAC5C,OAAO,EAAE,sCAAsC;QAC/C,KAAK,EAAE,oBAAoB;KAC3B;IACD;QACC,QAAQ,EAAE,kCAAkC;QAC5C,OAAO,EAAE,sCAAsC;QAC/C,KAAK,EAAE,oBAAoB;KAC3B;IACD;QACC,QAAQ,EAAE,sCAAsC;QAChD,OAAO,EAAE,0CAA0C;QACnD,KAAK,EAAE,oBAAoB;KAC3B;IACD,EAAE,QAAQ,EAAE,2BAA2B,EAAE,OAAO,EAAE,+BAA+B,EAAE,KAAK,EAAE,oBAAoB,EAAE;CAChH,CAAC,CAAC","sourcesContent":["/**\n * Factory plugin manifest for the startup bootstrap (design\n * `插件独立分发与启动装配设计.md` §4.4). Pure data only: the framework\n * declares which first-party plugin packages a fresh install should end up\n * with, as `pluginId → npm name + version constraint`. It ships with the\n * framework version and is never a code branch.\n *\n * Each S2–S4 migrated package appends one entry here with its publish name\n * (`@ai-agent-forge/plugin-<name>`, §0.8) together with the legacy short-id\n * mapping noted in §4.1.\n *\n * Ranges are derived from the framework's own VERSION at module init — a\n * hardcoded range here outlived a lockstep bump once (published 0.85.0 kept\n * `^0.84.4`, which excludes 0.85.0 under caret-on-0.x semantics, breaking\n * every fresh install's npm bootstrap). Deriving keeps the manifest in step\n * with the version the publish channel stamps, including the\n * rename/version rewrite in the local publish script.\n */\nimport { VERSION } from \"../../config.ts\";\n\n/** One factory-declared first-party plugin package. */\nexport interface PluginBootstrapFactoryEntryV1 {\n\t/** Ecosystem plugin id (`agent-forge.plugin.<name>` domain, §4.1). */\n\treadonly pluginId: string;\n\t/** npm publish name (`@ai-agent-forge/plugin-<name>`, §0.8). */\n\treadonly npmName: string;\n\t/**\n\t * Minimal range subset shared with npm resolution (`x.y.z`, `^x.y.z`,\n\t * `~x.y.z`, `latest`); omitted means the highest available version.\n\t */\n\treadonly range?: string;\n}\n\n/** Lockstep range every first-party bootstrap entry ships under. */\nconst FACTORY_PLUGIN_RANGE = `^${VERSION}`;\n\n/**\n * Frozen factory manifest consumed by `runPluginBootstrapV1`. D-075 S4 first\n * batch: the goal/plan/todo-set capability packages joined; second batch:\n * session-share and observability joined; third batch: subagent-delegate\n * joined; fourth batch: memory joined (completing the six-package split).\n * Later B-class batches append their entries per package.\n */\nexport const BOOTSTRAP_FACTORY_PLUGIN_MANIFEST_V1: readonly PluginBootstrapFactoryEntryV1[] = Object.freeze([\n\t{ pluginId: \"agent-forge.plugin.goal\", npmName: \"@ai-agent-forge/plugin-goal\", range: FACTORY_PLUGIN_RANGE },\n\t{ pluginId: \"agent-forge.plugin.plan\", npmName: \"@ai-agent-forge/plugin-plan\", range: FACTORY_PLUGIN_RANGE },\n\t{ pluginId: \"agent-forge.plugin.todo-set\", npmName: \"@ai-agent-forge/plugin-todo-set\", range: FACTORY_PLUGIN_RANGE },\n\t{\n\t\tpluginId: \"agent-forge.plugin.session-share\",\n\t\tnpmName: \"@ai-agent-forge/plugin-session-share\",\n\t\trange: FACTORY_PLUGIN_RANGE,\n\t},\n\t{\n\t\tpluginId: \"agent-forge.plugin.observability\",\n\t\tnpmName: \"@ai-agent-forge/plugin-observability\",\n\t\trange: FACTORY_PLUGIN_RANGE,\n\t},\n\t{\n\t\tpluginId: \"agent-forge.plugin.subagent-delegate\",\n\t\tnpmName: \"@ai-agent-forge/plugin-subagent-delegate\",\n\t\trange: FACTORY_PLUGIN_RANGE,\n\t},\n\t{ pluginId: \"agent-forge.plugin.memory\", npmName: \"@ai-agent-forge/plugin-memory\", range: FACTORY_PLUGIN_RANGE },\n]);\n"]}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "agent-forge-extension-with-deps",
3
3
  "private": true,
4
- "version": "0.85.0",
4
+ "version": "0.85.2",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,10 +1,10 @@
1
1
  {
2
- "id": "agent-forge.example.with-deps",
3
- "version": "0.1.0",
4
- "hostVersion": ">=0.84.0",
5
- "apiVersion": "1-draft",
6
- "entry": "./index.ts",
7
- "requiredCapabilities": [
8
- "tools"
9
- ]
2
+ "id": "agent-forge.example.with-deps",
3
+ "version": "0.85.2",
4
+ "hostVersion": ">=0.84.0",
5
+ "apiVersion": "1-draft",
6
+ "entry": "./index.ts",
7
+ "requiredCapabilities": [
8
+ "tools"
9
+ ]
10
10
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-agent-forge/agent-forge",
3
- "version": "0.85.0",
3
+ "version": "0.85.2",
4
4
  "description": "Coding agent CLI with read, bash, edit, write tools and session management",
5
5
  "type": "module",
6
6
  "agentForgeConfig": {