code wiki / _hdl_build / nx_browser_drive.nx

nx_browser_drive.nx source

↩ module page · 120 lines · 6026 B

1// nx_browser_drive.nx -- THE KEYSTONE ORGAN (S21 census: input drive). Drives the NISHI BROWSER (our own 2// Windows PE, first-byte-up sovereign) through its nxshot drive lane: a line-verb script executed against 3// live page state via the SAME code paths the GUI uses (br_hit_link -> resolve_url -> fetch_url -> 4// br_layout), emitting an INTERACTION RECORDING (frames + a steps log = what actually happened per verb). 5// Script verbs: shot | scroll <px> | click <x> <ydoc> (document coords) | open <url> | wait <ms>. 6// 7// Split responsibilities (Windows PE cannot exec from this Linux ELF): this organ PREPARES the drive 8// (control files) and COLLECTS/GRADES the result; the one-line launcher (Start-Process nishi.exe) is the 9// rule-27 shell lane (shell only to launch a sovereign exe). v1 scope, honest: click/scroll/open/wait/shot. 10// Network interception, console capture, trace REPLAY, mobile emulation are SEPARATE organs (census keeps 11// them GAP until built). usage: 12// nx_browser_drive prep <url> <scriptfile> stage nxshot.flag/url/script in CWD 13// nx_browser_drive collect read meta+steps, print the drive report; exit 0 iff 14// frames>0 AND steps>0 AND no FETCH-EMPTY in the log 15// license_tier: ORIGINAL 16import "nx_syscalls.nx" 17 18func bw(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 19func bn(v: i64) -> i64 { let t: *u8=sys_mmap(24); var m: i64=v; if m<0{sys_write(1,"-" as *u8,1);m=0-m} 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} let b: *u8=sys_mmap(24); var j: i64=0; while j<k{b[j]=t[k-1-j];j=j+1} sys_write(1,b,k); return 0 } 20func beq(a: *u8, b: *u8) -> i64 { var i: i64=0; while a[i]!=(0 as u8) { if a[i]!=b[i] { return 0 } i=i+1 } if b[i]==(0 as u8) { return 1 } return 0 } 21func bslen(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n } 22 23func bwrite_file(path: *u8, buf: *u8, n: i64) -> i64 { 24 let fd: i64 = sys_openat_wr(path, 420) 25 if fd < 0 { return 0 - 1 } 26 var off: i64 = 0 27 while off < n { 28 let wr: i64 = sys_write(fd, ((buf as i64)+off) as *u8, n - off) 29 if wr <= 0 { sys_close(fd); return 0 - 1 } 30 off = off + wr 31 } 32 sys_close(fd) 33 return n 34} 35// does buf[0..n) contain NUL-terminated needle? 36func bhas(buf: *u8, n: i64, needle: *u8) -> i64 { 37 let ml: i64 = bslen(needle) 38 if ml == 0 { return 0 } 39 var i: i64 = 0 40 while i + ml <= n { 41 var k: i64 = 0 42 var ok: i64 = 1 43 while k < ml { if (buf[i+k]&0xff) != (needle[k]&0xff) { ok=0; k=ml } else { k=k+1 } } 44 if ok == 1 { return 1 } 45 i = i + 1 46 } 47 return 0 48} 49// parse "key=<int>" from a small meta buffer 50func bmeta_int(buf: *u8, n: i64, key: *u8) -> i64 { 51 let kl: i64 = bslen(key) 52 var i: i64 = 0 53 while i + kl < n { 54 var k: i64 = 0 55 var ok: i64 = 1 56 while k < kl { if (buf[i+k]&0xff) != (key[k]&0xff) { ok=0; k=kl } else { k=k+1 } } 57 if ok == 1 { 58 var v: i64 = 0 59 var j: i64 = i + kl 60 var go: i64 = 1 61 while go == 1 { 62 if j >= n { go = 0 } 63 else { 64 let c: i64 = (buf[j] as i64) & 255 65 if c >= 48 { if c <= 57 { v = v*10 + (c-48); j = j + 1 } else { go = 0 } } else { go = 0 } 66 } 67 } 68 return v 69 } 70 i = i + 1 71 } 72 return 0 - 1 73} 74 75func main(argc: i64, argv: *i64) -> i64 { 76 if argc < 2 { bw("usage: nx_browser_drive prep <url> <scriptfile> | collect\n" as *u8); sys_exit(2); return 2 } 77 let verb: *u8 = argv[1] as *u8 78 79 if beq(verb, "prep\x00" as *u8) == 1 { 80 if argc < 4 { bw("prep needs <url> <scriptfile>\n" as *u8); sys_exit(2); return 2 } 81 let lb: *i64 = sys_mmap(16) as *i64 82 let sc: *u8 = sys_read_file(argv[3] as *u8, lb) 83 if (sc as i64) == 0 { bw("cannot read scriptfile\n" as *u8); sys_exit(3); return 3 } 84 if bwrite_file("nxshot.script\x00" as *u8, sc, lb[0]) < 0 { bw("write nxshot.script failed\n" as *u8); sys_exit(4); return 4 } 85 let url: *u8 = argv[2] as *u8 86 if bwrite_file("nxshot.url\x00" as *u8, url, bslen(url)) < 0 { bw("write nxshot.url failed\n" as *u8); sys_exit(4); return 4 } 87 if bwrite_file("nxshot.flag\x00" as *u8, "x" as *u8, 1) < 0 { bw("write nxshot.flag failed\n" as *u8); sys_exit(4); return 4 } 88 bw("DRIVE PREPPED url=" as *u8); bw(url) 89 bw(" script_bytes=" as *u8); bn(lb[0]) 90 bw("\n(launch: Start-Process _offc/nishi.exe from nxc2; then: nx_browser_drive collect)\n" as *u8) 91 sys_exit(0); return 0 92 } 93 94 if beq(verb, "collect\x00" as *u8) == 1 { 95 let lb2: *i64 = sys_mmap(16) as *i64 96 let meta: *u8 = sys_read_file("nishi_browser_meta.txt\x00" as *u8, lb2) 97 if (meta as i64) == 0 { bw("DRIVE-COLLECT RED: no meta (browser did not run/finish)\n" as *u8); sys_exit(1); return 1 } 98 let frames: i64 = bmeta_int(meta, lb2[0], "frames=" as *u8) 99 let steps: i64 = bmeta_int(meta, lb2[0], "steps=" as *u8) 100 let lb3: *i64 = sys_mmap(16) as *i64 101 let slog: *u8 = sys_read_file("nishi_browser_steps.txt\x00" as *u8, lb3) 102 bw("=== nx_browser_drive report ===\n" as *u8) 103 bw("frames=" as *u8); bn(frames) 104 bw(" steps=" as *u8); bn(steps) 105 bw("\n--- steps log (what actually happened) ---\n" as *u8) 106 if (slog as i64) != 0 { sys_write(1, slog, lb3[0]) } 107 var bad: i64 = 0 108 if frames <= 0 { bad = 1 } 109 if steps <= 0 { bad = 1 } 110 if (slog as i64) == 0 { bad = 1 } 111 if (slog as i64) != 0 { if bhas(slog, lb3[0], "FETCH-EMPTY\x00" as *u8) == 1 { bad = 1 } } 112 if bad == 0 { bw("DRIVE-COLLECT GREEN: every verb executed, frames captured, no empty fetch\n" as *u8); sys_exit(0); return 0 } 113 bw("DRIVE-COLLECT RED\n" as *u8) 114 sys_exit(1); return 1 115 } 116 117 bw("unknown verb\n" as *u8) 118 sys_exit(2) 119 return 2 120}