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
- Update the conversation-canvas plugin to a version whose nativeBuilds includes the new app-initial hash
- Downgrade or pin the Codex app to a version supported by the installed plugin
- Check the plugin's release notes / nativeBuilds table for the newly supported Codex version
- 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
- Keep the plugin updated alongside Codex app updates
- Check nativeBuilds coverage after every Codex upgrade
- Export existing organize results before upgrading either component
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
- discovered.some(url=>!nativeBuilds[url.split('/').pop()])?'当…
- 当前 Codex 版本的 API 适配器不兼容,请更新对话脉络脚本
- 当前 Codex 版本未提供兼容的 HTTP 服务
- 当前 Codex 版本的对话读取接口不兼容
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)