feat: light current paths with linguistic echo

This commit is contained in:
冰朔 2026-09-08 20:27:17 +08:00
commit d2cc1d0c6c
16 changed files with 289 additions and 13 deletions

View file

@ -2,7 +2,7 @@
"""Bounded SSH ingress for the single TCS mother and zero-core shelf."""
import json,os,re,sys,urllib.request,urllib.error
def endpoint(command):
fixed={'zy-rpc health':('GET','/health'),'zy-rpc mother-status':('GET','/v1/mother/status'),'zy-rpc shelf-shared':('GET','/v1/shelf/shared'),'zy-rpc shelf-fifth':('GET','/v1/shelf/fifth'),'zy-rpc shelf-public':('GET','/v1/shelf/public'),'zy-rpc mother-ingest':('POST','/v1/mother/ingest'),'zy-rpc door-challenge':('POST','/v1/door/challenge'),'zy-rpc door-attest':('POST','/v1/door/attest'),'zy-rpc door-model-test':('POST','/v1/door/model-test'),'zy-rpc world-status':('GET','/v1/world/status')}
fixed={'zy-rpc health':('GET','/health'),'zy-rpc mother-status':('GET','/v1/mother/status'),'zy-rpc shelf-shared':('GET','/v1/shelf/shared'),'zy-rpc shelf-fifth':('GET','/v1/shelf/fifth'),'zy-rpc shelf-public':('GET','/v1/shelf/public'),'zy-rpc mother-ingest':('POST','/v1/mother/ingest'),'zy-rpc door-challenge':('POST','/v1/door/challenge'),'zy-rpc door-attest':('POST','/v1/door/attest'),'zy-rpc door-model-test':('POST','/v1/door/model-test'),'zy-rpc lamp-ignite':('POST','/v1/lamp/ignite'),'zy-rpc lamp-ask':('POST','/v1/lamp/ask'),'zy-rpc world-status':('GET','/v1/world/status')}
if command in fixed:return fixed[command]
if re.fullmatch(r'zy-rpc mother-job [a-f0-9]{64}',command):return 'GET','/v1/mother/jobs/'+command.split()[-1]
if re.fullmatch(r'zy-rpc world-resolve [A-Za-z0-9_.:∞-]{1,128}',command):return 'GET','/v1/world/resolve?id='+command.split()[-1]

View file

@ -0,0 +1,10 @@
import fs from 'node:fs';import path from 'node:path';import crypto from 'node:crypto';
const req=(v,e)=>{if(!v)throw Error(e);},hex=v=>typeof v==='string'&&/^[a-f0-9]{64}$/.test(v),text=(v,n=300)=>typeof v==='string'&&v.trim()&&v.length<=n;
const atomic=(p,v)=>{fs.mkdirSync(path.dirname(p),{recursive:true,mode:0o700});const t=p+'.'+process.pid+'.tmp';fs.writeFileSync(t,JSON.stringify(v,null,2)+'\n',{mode:0o600});fs.renameSync(t,p);};
export class LivingLamp{
constructor({root,key,navigationPath,scope}){this.root=root;this.key=key;this.navigationPath=navigationPath;this.scope=scope;}
sign(body){const payload=JSON.stringify(body);return{payload,sha256:crypto.createHash('sha256').update(payload).digest('hex'),signature:crypto.sign(null,Buffer.from(payload),this.key).toString('base64'),algorithm:'Ed25519'};}
ignite(x){req(x?.schema==='guanghu.linguistic-echo/v1'&&text(x.session_id)&&['FIFTH_DOMAIN','ENTERPRISE_PUBLIC'].includes(x.scope)&&x.scope===this.scope,'echo_identity');const h=x.human_language,p=x.persona_echo;req(text(h?.event_id)&&text(h?.human_id)&&hex(h?.sha256)&&Number.isInteger(h?.occurred_at),'human_language');req(text(p?.event_id)&&text(p?.persona_id)&&hex(p?.sha256)&&Number.isInteger(p?.occurred_at),'persona_echo');const now=Date.now();req(p.occurred_at>=h.occurred_at&&now-h.occurred_at<=600000&&now-p.occurred_at<=600000,'echo_time');const body={schema:'guanghu.living-lamp-receipt/v1',lamp_id:crypto.randomUUID(),state:'LIT',scope:x.scope,session_id:x.session_id,human_id:h.human_id,persona_id:p.persona_id,human_event_sha256:h.sha256,persona_echo_sha256:p.sha256,echo_kernel:'ECHO-KERNEL-0001',lit_at:now,expires_at:now+900000,reality_authority_granted:false};const signed=this.sign(body);atomic(path.join(this.root,'lamps',body.lamp_id+'.json'),signed);return signed;}
verifyLamp(id){const p=path.join(this.root,'lamps',id+'.json');req(fs.existsSync(p),'lamp_unknown_or_dark');const s=JSON.parse(fs.readFileSync(p)),b=JSON.parse(s.payload);req(s.sha256===crypto.createHash('sha256').update(s.payload).digest('hex')&&crypto.verify(null,Buffer.from(s.payload),crypto.createPublicKey(this.key),Buffer.from(s.signature,'base64')),'lamp_integrity');req(b.state==='LIT'&&Date.now()<=b.expires_at,'lamp_dark_or_expired');return b;}
ask(x){const lamp=this.verifyLamp(x.lamp_id);req(text(x.query,500),'query');const map=JSON.parse(fs.readFileSync(this.navigationPath)),q=x.query.toLowerCase();let hits=map.routes.filter(r=>r.id.toLowerCase()===q);if(!hits.length)hits=map.routes.filter(r=>(r.id+' '+r.name+' '+r.kind+' '+r.route).toLowerCase().includes(q)).slice(0,10);return hits.length?{outcome:'PASS',lamp:'LIT',echo_kernel:lamp.echo_kernel,query:x.query,routes:hits,map_sha256:map.sha256}:{outcome:'FAIL',lamp:'LIT',state:'DARK_OR_UNKNOWN_DO_NOT_WALK',query:x.query,ask_next:'LIGHTHOUSE_OR_MOTHER_NAVIGATION_ASSISTANT',map_sha256:map.sha256};}
}

View file

@ -0,0 +1,2 @@
import test from 'node:test';import assert from 'node:assert/strict';import fs from 'node:fs';import os from 'node:os';import path from 'node:path';import crypto from 'node:crypto';import {LivingLamp} from './living-lamp.mjs';
test('machine cannot light lamp without paired living echo; lit current routes answer and dark routes refuse',()=>{const root=fs.mkdtempSync(path.join(os.tmpdir(),'living-lamp-'));try{const key=crypto.generateKeyPairSync('ed25519').privateKey,nav=path.join(root,'nav.json');fs.writeFileSync(nav,JSON.stringify({sha256:'map',routes:[{id:'ICE-P-ZY001',name:'铸渊',kind:'persona',state:'CURRENT',route:'glw://persona/ICE-P-ZY001',lamp:'LIT_ELIGIBLE'}]}));const lamp=new LivingLamp({root,key,navigationPath:nav,scope:'FIFTH_DOMAIN'});assert.throws(()=>lamp.ignite({schema:'guanghu.linguistic-echo/v1',session_id:'s',scope:'FIFTH_DOMAIN'}),/human_language/);const now=Date.now(),signed=lamp.ignite({schema:'guanghu.linguistic-echo/v1',session_id:'s',scope:'FIFTH_DOMAIN',human_language:{event_id:'h',human_id:'ICE-GL∞',sha256:'a'.repeat(64),occurred_at:now-2},persona_echo:{event_id:'p',persona_id:'ICE-P-ZY001',sha256:'b'.repeat(64),occurred_at:now-1}}),id=JSON.parse(signed.payload).lamp_id;assert.equal(lamp.ask({lamp_id:id,query:'ICE-P-ZY001'}).routes[0].route,'glw://persona/ICE-P-ZY001');assert.equal(lamp.ask({lamp_id:id,query:'OLD-PATH'}).state,'DARK_OR_UNKNOWN_DO_NOT_WALK');}finally{fs.rmSync(root,{recursive:true,force:true});}});

View file

@ -1,12 +1,12 @@
#!/usr/bin/env node
import http from 'node:http';import fs from 'node:fs';import {ModelRouter} from './model-router.mjs';import {CognitiveShelf} from './cognitive-shelf.mjs';import {DoorLamp} from './door-lamp.mjs';import {WorldStateStore} from './world-state.mjs';
import http from 'node:http';import fs from 'node:fs';import crypto from 'node:crypto';import {ModelRouter} from './model-router.mjs';import {CognitiveShelf} from './cognitive-shelf.mjs';import {DoorLamp} from './door-lamp.mjs';import {WorldStateStore} from './world-state.mjs';import {LivingLamp} from './living-lamp.mjs';
const HOST='127.0.0.1',PORT=Number(process.env.TCS_MOTHER_BRAIN_PORT||3931),ROOT=process.env.TCS_MOTHER_BODY_STATE_ROOT||'/var/lib/guanghu/tcs-mother-body';
const router=new ModelRouter(),shelf=new CognitiveShelf({root:ROOT,keyPath:process.env.TCS_MOTHER_SIGNING_KEY,seedPath:process.env.TCS_MOTHER_SEED,router}),routes=JSON.parse(fs.readFileSync(process.env.TCS_PERSONA_ROUTES)),door=new DoorLamp({root:ROOT+'/door',shelf,routes}),world=new WorldStateStore(process.env.TCS_WORLD_STATE_PATH||ROOT+'/world/CURRENT.json');
const router=new ModelRouter(),shelf=new CognitiveShelf({root:ROOT,keyPath:process.env.TCS_MOTHER_SIGNING_KEY,seedPath:process.env.TCS_MOTHER_SEED,router}),routes=JSON.parse(fs.readFileSync(process.env.TCS_PERSONA_ROUTES)),door=new DoorLamp({root:ROOT+'/door',shelf,routes}),world=new WorldStateStore(process.env.TCS_WORLD_STATE_PATH||ROOT+'/world/CURRENT.json'),lamp=new LivingLamp({root:ROOT+'/living-lamp',key:crypto.createPrivateKey(fs.readFileSync(process.env.TCS_MOTHER_SIGNING_KEY)),navigationPath:process.env.TCS_LIT_NAVIGATION_MAP,scope:'FIFTH_DOMAIN'});
setInterval(()=>shelf.drain(),2000).unref();shelf.drain();
const send=(r,s,b)=>{const p=JSON.stringify(b);r.writeHead(s,{'content-type':'application/json','content-length':Buffer.byteLength(p),'cache-control':'no-store'});r.end(p);};
async function body(q,max=160000){let n=0,a=[];for await(const c of q){n+=c.length;if(n>max)throw Error('body_too_large');a.push(c);}return JSON.parse(Buffer.concat(a));}
http.createServer(async(q,r)=>{try{const u=new URL(q.url,`http://${HOST}:${PORT}`);
if(q.method==='GET'&&u.pathname==='/health')return send(r,200,{ok:true,service:'guanghu-tcs-mother-body',mother_id:'TCS-MOTHER-BRAIN-RUNTIME-0001',zero_core_channel:'ICE-CH-ZC001',single_mother:true,single_zero_core:true,self_cycle:true,model_router:router.status(),shelf:shelf.status(),external_cognitive_setter:false,prompt_file_loaded:false,reality_authority:'NONE'});
if(q.method==='GET'&&u.pathname==='/health')return send(r,200,{ok:true,service:'guanghu-tcs-mother-body',mother_id:'TCS-MOTHER-BRAIN-RUNTIME-0001',zero_core_channel:'ICE-CH-ZC001',single_mother:true,single_zero_core:true,self_cycle:true,living_lamp:'LAKE-LAMP-LIVING-NAV-0001',echo_kernel:'ECHO-KERNEL-0001',model_router:router.status(),shelf:shelf.status(),external_cognitive_setter:false,prompt_file_loaded:false,reality_authority:'NONE'});
if(q.method==='GET'&&u.pathname==='/v1/mother/status')return send(r,200,{...shelf.status(),model_router:router.status()});
if(q.method==='GET'&&/^\/v1\/shelf\/(root|shared|fifth|public)$/.test(u.pathname)){const branch=u.pathname.split('/').at(-1);if(branch==='root')return send(r,403,{error:'mother_root_not_distributable'});return send(r,200,shelf.current(branch));}
if(q.method==='POST'&&u.pathname==='/v1/mother/ingest')return send(r,202,shelf.submit(await body(q)));
@ -16,4 +16,6 @@ if(q.method==='POST'&&u.pathname==='/v1/door/attest')return send(r,200,door.atte
if(q.method==='POST'&&u.pathname==='/v1/door/model-test'){const shared=shelf.current('shared');const result=await router.cognize('door-test',{shared_cognition:shared.value,questions:['unknown_guanghu_information_source','identity_before_persona_load','reality_authority_from_cognition']});return send(r,200,{outcome:'PASS',provider:result.provider,answers:result.value,shared_sha256:shared.artifact.sha256,credentials_exposed:false});}
if(q.method==='GET'&&u.pathname==='/v1/world/status')return send(r,200,world.status());
if(q.method==='GET'&&u.pathname==='/v1/world/resolve')return send(r,200,world.resolve(String(u.searchParams.get('id')||'')));
if(q.method==='POST'&&u.pathname==='/v1/lamp/ignite')return send(r,200,lamp.ignite(await body(q,20000)));
if(q.method==='POST'&&u.pathname==='/v1/lamp/ask')return send(r,200,lamp.ask(await body(q,20000)));
return send(r,404,{error:'not_found'});}catch(e){return send(r,400,{error:String(e.message||e).slice(0,300)});}}).listen(PORT,HOST,()=>process.stdout.write(`tcs-single-mother listening ${HOST}:${PORT}\n`));