code wiki / _hdl_build / nx_gen_mesh_gate.nx

nx_gen_mesh_gate.nx source

↩ module page · 159 lines · 8739 B

1// nx_gen_mesh_gate.nx -- end-to-end gate for the /gen 3D lane over REAL loopback sockets (G2 of the gen-UI 2// capability ladder: the CF-studio capability -- text -> printable watertight STL -- surfaced in the product). 3// Forks the orchestrator server (go_serve_conn, the daemon's exact handler), then acts as the HTTP client: 4// T1 POST /api/mesh {"prompt":"a snowman in the yard"} -> 200 {"object":"snowman",...,"stl":"/gen/mesh/snowman.stl"} 5// T2 GET /mesh/snowman.stl -> 200 model/stl with a REAL ASCII STL body (solid...endsolid) 6// T3 NEG traversal: GET /mesh/../../../etc/passwd -> 404 (client bytes never reach a filesystem path) 7// T4 NEG empty prompt -> 400 8// T5 REGRESSION: GET / -> 200 gen UI still serves AND carries the new 3D section (no dead button) 9// license_tier: ORIGINAL expect_exit: 0 10import "nx_gen_orchestrator.nx" 11import "nx_connect.nx" // bounded connect: a raw sys_connect hangs ~127s on a black-holed host 12import "nx_syscalls.nx" 13 14func gm(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 15func gm_slen(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n } 16func gm_cat(dst: *u8, off: i64, s: *u8) -> i64 { var o: i64=off; var i: i64=0; while s[i]!=(0 as u8){dst[o]=s[i]; o=o+1; i=i+1} return o } 17func gm_catb(dst: *u8, off: i64, src: *u8, n: i64) -> i64 { var o: i64=off; var i: i64=0; while i<n {dst[o]=src[i]; o=o+1; i=i+1} return o } 18func gm_itoa(dst: *u8, off: i64, v: i64) -> i64 { let t: *u8=sys_mmap(28); var m: i64=v; var k: i64=0; if m==0{t[0]=48 as u8;k=1} while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1} var o: i64=off; var q: i64=k-1; while q>=0{dst[o]=t[q];o=o+1;q=q-1} return o } 19func gm_find(buf: *u8, n: i64, needle: *u8) -> i64 { 20 let nl: i64 = gm_slen(needle) 21 if nl==0 {return 0} 22 var i: i64=0 23 while i+nl<=n { var j: i64=0; var ok: i64=1; while j<nl { if (buf[i+j]&0xff)!=(needle[j]&0xff){ok=0;j=nl} else {j=j+1} } if ok==1{return i} i=i+1 } 24 return 0-1 25} 26func gm_listen(port: i64) -> i64 { 27 let lfd: i64 = sys_socket(2,1,0); if lfd<0 {return 0-1} 28 let optv: *u8 = sys_mmap(4); optv[0]=1 as u8; sys_setsockopt(lfd,1,2,optv,4) 29 let addr: *u8 = sys_mmap(16) 30 addr[0]=2 as u8; addr[1]=0 as u8; addr[2]=((port>>8)&0xff) as u8; addr[3]=(port&0xff) as u8 31 addr[4]=127 as u8; addr[5]=0 as u8; addr[6]=0 as u8; addr[7]=1 as u8 32 var zi: i64=8; while zi<16 {addr[zi]=0 as u8; zi=zi+1} 33 if sys_bind(lfd, addr, 16) < 0 { return 0-1 } 34 if sys_listen(lfd, 16) < 0 { return 0-1 } 35 return lfd 36} 37func gm_connect(port: i64) -> i64 { 38 let fd: i64 = sys_socket(2,1,0); if fd<0 {return 0-1} 39 sys_set_socket_timeout(fd, 120) 40 let a: *u8 = sys_mmap(16) 41 a[0]=2 as u8; a[1]=0 as u8; a[2]=((port>>8)&0xff) as u8; a[3]=(port&0xff) as u8 42 a[4]=127 as u8; a[5]=0 as u8; a[6]=0 as u8; a[7]=1 as u8 43 var zi: i64=8; while zi<16 {a[zi]=0 as u8; zi=zi+1} 44 if nx_connect_bounded(fd, a, 16, NX_CONN_DEFAULT_MS) != 0 { sys_close(fd); return 0-1 } 45 return fd 46} 47func gm_readresp(fd: i64, resp: *u8, cap: i64) -> i64 { 48 var rn: i64 = 0; var g: i64 = 1 49 while g==1 { let r: i64 = sys_read(fd, (resp as i64+rn) as *u8, cap-rn); if r<=0 {g=0} else { rn=rn+r; if rn>=cap {g=0} } } 50 return rn 51} 52func gm_truncate(path: *u8) -> i64 { let fd: i64 = sys_openat_wr(path, 0x1a4); if fd>=0 {sys_close(fd)} return 0 } 53// simple request helpers 54func gm_post_mesh(port: i64, body: *u8, resp: *u8, cap: i64) -> i64 { 55 let fd: i64 = gm_connect(port); if fd<0 { return 0-1 } 56 var bl: i64 = gm_slen(body) 57 let rq: *u8 = sys_mmap(4096); var o: i64 = 0 58 o = gm_cat(rq, o, "POST /api/mesh HTTP/1.1\r\nHost: x\r\nConnection: close\r\nContent-Type: application/json\r\nContent-Length: " as *u8) 59 o = gm_itoa(rq, o, bl); o = gm_cat(rq, o, "\r\n\r\n" as *u8); o = gm_catb(rq, o, body, bl) 60 sys_write(fd, rq, o) 61 let rn: i64 = gm_readresp(fd, resp, cap) 62 sys_close(fd) 63 return rn 64} 65func gm_get(port: i64, path: *u8, resp: *u8, cap: i64) -> i64 { 66 let fd: i64 = gm_connect(port); if fd<0 { return 0-1 } 67 let rq: *u8 = sys_mmap(2048); var o: i64 = 0 68 o = gm_cat(rq, o, "GET " as *u8); o = gm_cat(rq, o, path) 69 o = gm_cat(rq, o, " HTTP/1.1\r\nHost: x\r\nConnection: close\r\n\r\n" as *u8) 70 sys_write(fd, rq, o) 71 let rn: i64 = gm_readresp(fd, resp, cap) 72 sys_close(fd) 73 return rn 74} 75 76func main() -> i64 { 77 let OPORT: i64 = 39281 78 gm_truncate("/tmp/genmeshblob-mesh_snowman.stl" as *u8) // stale STL cannot fake T2 79 80 let cfg: *i64 = sys_mmap(8*32) as *i64 81 cfg[0]=127; cfg[1]=0; cfg[2]=0; cfg[3]=1; cfg[4]=1 // worker never used by the mesh lane 82 let sp_store: *u8 = "/tmp/genmesh-" as *u8 83 let sp_blob: *u8 = "/tmp/genmeshblob-" as *u8 84 let sp_side: *u8 = "/tmp/genmesh_cids.tsv" as *u8 85 let sp_host: *u8 = "gate" as *u8 86 cfg[5]=sp_store as i64; cfg[6]=sp_blob as i64; cfg[7]=sp_side as i64; cfg[8]=sp_host as i64 87 cfg[9]=0 88 89 let ofd: i64 = gm_listen(OPORT); if ofd<0 { gm("GATE FAIL: orch listen\n" as *u8); sys_exit(1); return 1 } 90 let pidO: i64 = sys_fork() 91 if pidO == 0 { 92 var i: i64 = 0 93 while i < 6 { let c: i64 = sys_accept(ofd); if c>=0 { go_serve_conn(c, cfg); sys_close(c) } i=i+1 } 94 sys_exit(0) 95 } 96 sys_close(ofd) 97 var fails: i64 = 0 98 99 // T1 text -> mesh 100 let r1: *u8 = sys_mmap(65536) 101 let n1: i64 = gm_post_mesh(OPORT, "{\"prompt\":\"a snowman in the yard\"}" as *u8, r1, 65536) 102 var t1: i64 = 1 103 if gm_find(r1, n1, "200 OK" as *u8) < 0 { t1 = 0 } 104 if gm_find(r1, n1, "\"object\":\"snowman\"" as *u8) < 0 { t1 = 0 } 105 if gm_find(r1, n1, "\"stl\":\"/gen/mesh/snowman.stl\"" as *u8) < 0 { t1 = 0 } 106 if t1 == 1 { gm("T1 PASS POST /api/mesh -> 200 snowman emitted (verts/tris/stl in response)\n" as *u8) } 107 else { fails = fails + 1; gm("T1 FAIL /api/mesh response:\n" as *u8); sys_write(1, r1, n1); gm("\n" as *u8) } 108 109 // T2 download the STL 110 let r2: *u8 = sys_mmap(4194304) 111 let n2: i64 = gm_get(OPORT, "/mesh/snowman.stl" as *u8, r2, 4194304) 112 var t2: i64 = 1 113 if gm_find(r2, n2, "200 OK" as *u8) < 0 { t2 = 0 } 114 if gm_find(r2, n2, "model/stl" as *u8) < 0 { t2 = 0 } 115 if gm_find(r2, n2, "solid nishi_t2m" as *u8) < 0 { t2 = 0 } 116 if gm_find(r2, n2, "endsolid" as *u8) < 0 { t2 = 0 } 117 if n2 < 100000 { t2 = 0 } 118 if t2 == 1 { gm("T2 PASS GET /mesh/snowman.stl -> 200 model/stl, real ASCII STL body, bytes=" as *u8); let nb: *u8 = sys_mmap(32); let nl2: i64 = gm_itoa(nb, 0, n2); sys_write(1, nb, nl2); gm("\n" as *u8) } 119 else { fails = fails + 1; gm("T2 FAIL /mesh/snowman.stl (n=" as *u8); let nb2: *u8 = sys_mmap(32); let nl3: i64 = gm_itoa(nb2, 0, n2); sys_write(1, nb2, nl3); gm(")\n" as *u8) } 120 121 // T3 NEG traversal 122 let r3: *u8 = sys_mmap(16384) 123 let n3: i64 = gm_get(OPORT, "/mesh/../../../etc/passwd" as *u8, r3, 16384) 124 var t3: i64 = 1 125 if gm_find(r3, n3, "404" as *u8) < 0 { t3 = 0 } 126 if gm_find(r3, n3, "root:" as *u8) >= 0 { t3 = 0 } 127 if gm_find(r3, n3, "solid nishi_t2m" as *u8) >= 0 { t3 = 0 } 128 if t3 == 1 { gm("T3 PASS NEG traversal /mesh/../../../etc/passwd -> 404, no file bytes leak\n" as *u8) } 129 else { fails = fails + 1; gm("T3 FAIL traversal not blocked\n" as *u8) } 130 131 // T4 NEG empty prompt 132 let r4: *u8 = sys_mmap(16384) 133 let n4: i64 = gm_post_mesh(OPORT, "{\"prompt\":\"\"}" as *u8, r4, 16384) 134 var t4: i64 = 1 135 if gm_find(r4, n4, "400" as *u8) < 0 { t4 = 0 } 136 if t4 == 1 { gm("T4 PASS NEG empty prompt -> 400\n" as *u8) } 137 else { fails = fails + 1; gm("T4 FAIL empty prompt not rejected\n" as *u8) } 138 139 // T5 regression: UI serves + carries the 3D section (no dead surface) 140 let r5: *u8 = sys_mmap(131072) 141 let n5: i64 = gm_get(OPORT, "/" as *u8, r5, 131072) 142 var t5: i64 = 1 143 if gm_find(r5, n5, "200 OK" as *u8) < 0 { t5 = 0 } 144 if gm_find(r5, n5, "Elder AI" as *u8) < 0 { t5 = 0 } 145 if gm_find(r5, n5, "Generate 3D" as *u8) < 0 { t5 = 0 } 146 if gm_find(r5, n5, "/gen/api/mesh" as *u8) < 0 { t5 = 0 } 147 if t5 == 1 { gm("T5 PASS GET / -> gen UI serves AND carries the wired 3D section (button + fetch target)\n" as *u8) } 148 else { fails = fails + 1; gm("T5 FAIL UI regression\n" as *u8) } 149 150 // let the server loop finish + reap 151 let r6: *u8 = sys_mmap(4096) 152 gm_get(OPORT, "/health" as *u8, r6, 4096) 153 let stx: *i64 = sys_mmap(16) as *i64 154 sys_wait4(pidO, stx, 0) 155 156 if fails == 0 { gm("GEN-MESH-GATE 5/5 GREEN -- text->STL emitted, downloadable, traversal-dead, UI wired, over real loopback HTTP\n" as *u8); sys_exit(0); return 0 } 157 gm("GEN-MESH-GATE RED fails=" as *u8); let fb: *u8 = sys_mmap(32); let fl: i64 = gm_itoa(fb, 0, fails); sys_write(1, fb, fl); gm("\n" as *u8) 158 sys_exit(1); return 1 159}