BigPizzaV3/CodexPlusPlus · error · Error

当前 Codex 版本尚未适配对话脉络,请更新插件;已有整理结果仍保留

Error message

当前 Codex 版本尚未适配对话脉络,请更新插件;已有整理结果仍保留

What it means

bindNativeRuntime looks up the discovered app-initial-*.js asset filename in the plugin's nativeBuilds mapping of supported Codex builds. An unmapped filename means the installed Codex app ships a build the plugin has no adapter for. The error tells the user to update the plugin; existing organize results are preserved.

Solutions

  1. Update the conversation-canvas plugin to a version whose nativeBuilds includes the new app-initial hash
  2. Downgrade or pin the Codex app to a version supported by the installed plugin
  3. Check the plugin's release notes / nativeBuilds table for the newly supported Codex version
  4. Existing organize results are retained — export them before troubleshooting

Example fix

// before
const nativeBuilds={'app-initial-abc123.js':{...}};
// after (add mapping for the new Codex build)
const nativeBuilds={
  'app-initial-abc123.js':{...},
  'app-initial-def456.js':{...} // new Codex version
};
Defensive patterns

Strategy: fallback

Validate before calling

const discovered=await nativeAssetCandidates();
const unsupported=discovered.some(u=>!nativeBuilds[u.split('/').pop()]);
if(unsupported) console.warn('Codex build not supported by this plugin version; update the plugin');

Type guard

function isSupportedBuild(filename){ return Object.hasOwn(nativeBuilds,filename); }

Try / catch

try { runtime=await nativeGetRuntime() } catch(e){ if(String(e.message).includes('尚未适配')){ showUpdatePluginDialog(); } else throw e; }

Prevention

When it happens

Trigger: Loading the native runtime after a Codex app update changed the content-hashed asset name (app-initial-<hash>.js) so the filename has no entry in nativeBuilds.

Common situations: Codex desktop app auto-updated to a new version while the conversation-canvas plugin is older; or running a dev/nightly Codex build whose asset hash is not in the plugin's mapping table.

Understand the failure class

Background: "unsupported platform" / "not supported on this platform" errors: what they mean and how to fix them — this error's family across 47 libraries.

Related errors


AI-assisted analysis of BigPizzaV3/CodexPlusPlus@b1ed92e5e4 (2026-09-19). Data as JSON: /api/errors/03c7c4aa9771368d. Report an issue: GitHub.

Appendix: source

Thrown at tools/conversation-canvas/public/canvas.user.js:362

  return {async get(key){if(memory.has(key))return memory.get(key);const value=await canvasStore(`history:${key}`);if(value!==undefined)memory.set(key,value);while(memory.size>500)memory.delete(memory.keys().next().value);return value;},
    async set(key,value){await canvasStore(`history:${key}`,value);memory.set(key,value);while(memory.size>500)memory.delete(memory.keys().next().value);},
    async delete(key){memory.delete(key);await canvasStore(`history:${key}`,null,true);}};
}

// Private Desktop exports change between builds. Only bind reviewed contracts;
// discovering a new asset does not make its minified export names compatible.
const nativeBuilds={
  'app-initial-f87238153a19.js':{ESt:'ESt',kr:'kr',Mr:'Mr',Q1:'Q1',lGt:'lGt',cGt:'cGt',jR:'jR'},
  'app-initial-bcc2ff475eb6.js':{ESt:'EDt',kr:'MDt',lGt:'hJt',cGt:'mJt',jR:'TW'},
};
function nativeAssetCandidates(doc=globalThis.document,perf=globalThis.performance){
  const urls=[...Array.from(doc?.querySelectorAll?.('script[src],link[rel="modulepreload"][href]')||[],e=>e.src||e.href),
    ...(perf?.getEntriesByType?.('resource')||[]).map(e=>e.name)];
  return [...new Set(urls.filter(url=>/^app:\/\/-\/assets\/app-initial-[\w-]+\.js$/.test(url)))];
}
function bindNativeRuntime(module,filename){
  const mapping=nativeBuilds[filename];
  if(!mapping)throw Error('当前 Codex 版本尚未适配对话脉络,请更新插件;已有整理结果仍保留');
  const adapter={};
  // Keep live bindings: initialization populates the HTTP class and services.
  for(const [key,value] of Object.entries(mapping))Object.defineProperty(adapter,key,{get:()=>module[value]});
  return adapter;
}
function createNativeLoader({discover=nativeAssetCandidates,importModule=url=>import(url)}={}){
  let pending;
  return function load(){
    if(!pending)pending=(async()=>{
      const discovered=discover();
      // Without resource timing (e.g. after a reload), try reviewed builds only.
      const candidates=discovered.length?discovered:Object.keys(nativeBuilds).reverse().map(name=>'app://-/assets/'+name);
      for(const url of candidates){
        const filename=url.split('/').pop();
        if(!nativeBuilds[filename])continue;
        let module;
        try{module=await importModule(url);}catch{continue;}
        return bindNativeRuntime(module,filename);

View on GitHub (pinned to b1ed92e5e4)