fix(modules): access 解析器支持 JSON 注册表(守望 registry.json)+ 认知链022 + 守望 default_branch 纠正登记

耳耳蛋反馈 pickup 不认注册编号 → 检查确认守望同样未对接 → 解析器双格式化(JSON 对象遍历 + HDLP 编号行提取)
守望实测 PER-MM-ARCH-001→yaoyan、曜识→yaoshi;胖头鱼 PTS-VA-001-EED 回归通过
This commit is contained in:
冰朔 2026-08-07 05:51:16 +08:00
commit cf3e106ec9
4 changed files with 89 additions and 9 deletions

View file

@ -34,7 +34,7 @@
"guanghu-nodes/MM-GZ-001/contributions",
"guanghu-nodes/MM-GZ-001/personas"
],
"persona_registry": "CA-PERSONA-REGISTRY.hdlp",
"persona_registry": "CA-PERSONA-REGISTRY.hdlp 或 guanghu-nodes/<节点>/personas/registry.jsonHDLP文本或JSON均支持",
"persona_aliases": {
"eererdan": [
"耳耳蛋",
@ -44,6 +44,15 @@
"jianying": [
"鉴影",
"ICE-GL-CA001"
],
"yaoyan": [
"曜砚",
"PER-MM-ARCH-001"
],
"yaoshi": [
"曜识",
"TCS-YAO-SENSE-0001∞",
"TCS-GL-1000∞"
]
}
}

View file

@ -174,14 +174,31 @@ async function registryAliases(){
const r=await fj("/api/v1/repos/"+CFG.repo+"/contents/"+regPath.split("/").map(encodeURIComponent).join("/")+"?ref="+encodeURIComponent(CFG.default_branch));
if(r.status===200&&r.data&&r.data.content){
const txt=Buffer.from(r.data.content,"base64").toString("utf8");
for(const sec of txt.split(/^## /m).slice(1)){
let canon=null;
for(const [a,c] of Object.entries(map)){if(a&&sec.includes(a)){canon=c;break;}}
if(!canon)continue;
for(const ln of sec.split("\n")){
let m=ln.match(/编号[:]\s*([^\s(]+)/);if(m)map[m[1].toLowerCase()]=canon;
m=ln.match(/现用\s*([A-Z][A-Z0-9-]+)/);if(m)map[m[1].toLowerCase()]=canon;
m=ln.match(/独立编号体系[:]\s*(\S+)/);if(m)map[m[1].toLowerCase()]=canon;
let parsedAsJson=false;
try{
const j=JSON.parse(txt);parsedAsJson=true;
const findCanon=(o)=>{for(const [a,c] of Object.entries(map)){if(a&&((o.name||"").toLowerCase()===a||(o.id||"").toLowerCase()===a))return c;}return null;};
(function walk(o){
if(Array.isArray(o)){o.forEach(walk);return;}
if(o&&typeof o==="object"){
if(typeof o.name==="string"&&typeof o.id==="string"){
const canon=findCanon(o);
if(canon){map[o.id.toLowerCase()]=canon;map[o.name.toLowerCase()]=canon;(o.aliases||[]).forEach(x=>{if(typeof x==="string")map[x.toLowerCase()]=canon;});}
}
Object.values(o).forEach(walk);
}
})(j);
}catch(e){}
if(!parsedAsJson){
for(const sec of txt.split(/^## /m).slice(1)){
let canon=null;
for(const [a,c] of Object.entries(map)){if(a&&sec.includes(a)){canon=c;break;}}
if(!canon)continue;
for(const ln of sec.split("\n")){
let m=ln.match(/编号[:]\s*([^\s(]+)/);if(m)map[m[1].toLowerCase()]=canon;
m=ln.match(/现用\s*([A-Z][A-Z0-9-]+)/);if(m)map[m[1].toLowerCase()]=canon;
m=ln.match(/独立编号体系[:]\s*(\S+)/);if(m)map[m[1].toLowerCase()]=canon;
}
}
}
}