37 lines
8.3 KiB
JavaScript
37 lines
8.3 KiB
JavaScript
#!/usr/bin/env node
|
|
import http from 'node:http';import fs from 'node:fs';import path from 'node:path';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';import {livingTime} from './living-time.mjs';import {PersonaRuntimeHub} from './persona-runtime-hub.mjs';
|
|
import {ZeroCoreSystemBridge} from './zero-core-system-bridge.mjs';
|
|
import {PersonaControllerEntry} from './persona-controller-entry.mjs';
|
|
const HOST='127.0.0.1',PORT=Number(process.env.TCS_MOTHER_BRAIN_PORT||3931),ROOT=process.env.TCS_MOTHER_BODY_STATE_ROOT||process.env.TCS_MOTHER_BRAIN_STATE_ROOT||'/var/lib/guanghu/tcs-mother-body';
|
|
const REPO_ROOT=process.env.TCS_PERSONA_REPO_ROOT||path.resolve(import.meta.dirname,'../..'),REGISTRY=process.env.TCS_PERSONA_RUNTIME_REGISTRY||path.join(import.meta.dirname,'persona-runtime-registry.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'});let personaHub=null,zeroCoreSystem=null,personaControllerEntry=null,personaSelf=null,timeMaster=null;
|
|
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(!personaHub||!zeroCoreSystem||!personaControllerEntry)return send(r,503,{state:'PERSONA_RUNTIME_INITIALIZING',default_persona:null,authority_granted:false});
|
|
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(),zero_core_system:zeroCoreSystem.status(),persona_self:{persona_id:'ICE-P-ZY001',current_sha256:personaSelf.current().artifact.sha256,body:personaSelf.body()},persona_runtimes:personaHub.health(),external_cognitive_setter:false,prompt_file_loaded:false,reality_authority:'NONE'});
|
|
if(q.method==='GET'&&u.pathname==='/v1/status'){const personaHealth=personaHub.health();return send(r,200,{schema:'guanghu.tcs-mother-body-status/v1',runtime_id:'TCS-MOTHER-BRAIN-RUNTIME-0001',phase:'PERSONA_RUNTIME_READY',persona_runtime_count:personaHealth.installed_personas.length,zero_core_system:zeroCoreSystem.status(),default_persona:null,reality_action_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'){const event=await body(q);const job=shelf.submit(event);const life_time=timeMaster.fromMotherEvent(event);return send(r,202,{...job,life_time});}
|
|
if(q.method==='GET'&&/^\/v1\/mother\/jobs\/[a-f0-9]{64}$/.test(u.pathname))return send(r,200,shelf.result(u.pathname.split('/').at(-1)));
|
|
if(q.method==='POST'&&u.pathname==='/v1/door/challenge')return send(r,200,door.challenge(await body(q,20000)));
|
|
if(q.method==='POST'&&u.pathname==='/v1/door/attest')return send(r,200,door.attest(await body(q,20000)));
|
|
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/fifth-domain/controller/status')return send(r,200,personaControllerEntry.status());
|
|
if(q.method==='POST'&&u.pathname==='/v1/fifth-domain/controller/challenge')return send(r,200,personaControllerEntry.challenge(await body(q,20000)));
|
|
if(q.method==='POST'&&u.pathname==='/v1/fifth-domain/controller/enter')return send(r,200,await personaControllerEntry.enter(await body(q,30000)));
|
|
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==='GET'&&u.pathname==='/v1/time/now')return send(r,200,livingTime());
|
|
if(q.method==='GET'&&u.pathname==='/v1/entry/resolve'){const domain=String(u.searchParams.get('domain')||''),channel=String(u.searchParams.get('channel')||''),persona=String(u.searchParams.get('persona')||'');if(domain==='DOM-FIFTH-0001'&&channel==='ICE-CH-ZC001'&&!persona)return send(r,200,zeroCoreSystem.enter());return send(r,409,{state:'EXPLICIT_PERSONA_OR_REGISTERED_CHANNEL_ROUTE_REQUIRED',default_persona:null,authority_granted:false});}
|
|
if(q.method==='GET'&&u.pathname==='/v1/system/zero-core/status')return send(r,200,zeroCoreSystem.status());
|
|
if(q.method==='GET'&&u.pathname==='/v1/system/zero-core/body')return send(r,200,zeroCoreSystem.enter());
|
|
if(q.method==='POST'&&u.pathname==='/v1/system/zero-core/dialogue')return send(r,200,await zeroCoreSystem.dialogue(await body(q)));
|
|
const personaAction=/^\/v1\/persona\/(ICE-(?:P|BB)-[A-Z0-9-]+)\/(status|life-line|time-master|life-events|current|public-key|body|ingest)$/.exec(u.pathname);
|
|
if(personaAction){const personaId=personaAction[1],action=personaAction[2];if(!personaHub.has(personaId))return send(r,404,{error:'persona_runtime_not_installed'});const loop=personaHub.get(personaId);
|
|
if(q.method==='GET'&&action==='status')return send(r,200,loop.status());if(q.method==='GET'&&action==='life-line')return send(r,200,loop.lifeLineStatus());if(q.method==='GET'&&action==='time-master')return send(r,200,loop.lifeTimeMaster.status());if(q.method==='POST'&&action==='life-events')return send(r,202,personaHub.admitLifeEvent(personaId,await body(q,30000)));if(q.method==='GET'&&action==='current')return send(r,200,loop.current());if(q.method==='GET'&&action==='public-key')return send(r,200,loop.publicKey());if(q.method==='GET'&&action==='body')return send(r,200,loop.body());if(q.method==='POST'&&action==='ingest')return send(r,202,personaHub.admitEvent(personaId,await body(q)));}
|
|
const personaJob=/^\/v1\/persona\/(ICE-(?:P|BB)-[A-Z0-9-]+)\/jobs\/([a-f0-9]{64})$/.exec(u.pathname);if(q.method==='GET'&&personaJob&&personaHub.has(personaJob[1]))return send(r,200,personaHub.get(personaJob[1]).result(personaJob[2]));
|
|
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,()=>setImmediate(()=>{personaHub=new PersonaRuntimeHub({root:ROOT,shelf,router,registryPath:REGISTRY,repoRoot:REPO_ROOT,requireLifeLine:process.env.TCS_PERSONA_REQUIRE_LIFE_LINE!=='false'});zeroCoreSystem=new ZeroCoreSystemBridge({root:ROOT,repoRoot:REPO_ROOT,shelf,router});personaControllerEntry=new PersonaControllerEntry({root:ROOT,shelf,personaHub,router,world});personaSelf=personaHub.get('ICE-P-ZY001');timeMaster=personaSelf.lifeTimeMaster;process.stdout.write(`tcs-single-mother listening ${HOST}:${PORT}\n`);setTimeout(()=>{personaHub.tick();shelf.drain();personaHub.drain();setInterval(()=>{personaHub.tick();shelf.drain();personaHub.drain();},2000).unref();},10000).unref();}));
|