code wiki / (root) / nx_crew_serve.nx

nx_crew_serve.nx source

↩ module page · 237 lines · 14376 B

1// nx_crew_serve.nx -- the ONE consolidated crew-capabilities MCP backend (operator 2026-07-10: "each role owns its raci 2// capabilities and gets them to be mcp apis"). No-tool-proliferation: ONE nishi_crew tool serves the whole crew. 3// nishi_crew -> the full crew directory (36 roles) + MCP-exposure coverage. 4// nishi_crew <role> -> that role's capability record + its RACI cell (who is A/R/C/I for the activity it OWNS). 5// nishi_crew <role> <activity> -> DISPATCH: RACI-GATE (the role MUST be Accountable for the activity -- no self-escalation), 6// then fork-exec the role's organ and RETURN its output+exit; honest "not deployed" if the 7// organ is not on this host (never faked). This makes a role's capability CALLABLE over MCP. 8// Data-driven from crew_capabilities.data + nishi_raci.tsv. JSON trick: cs_w2() converts ' (39) -> " (34); no '#'/'!'/'"' in 9// string literals (nx_cc lexer traps). Dispatch mirrors nx_ccheck (pipe2 + fork + dup3 + wait4). license_tier: ORIGINAL expect_exit: 0 10import "nx_syscalls.nx" 11import "nx_itoa_lib.nx" // shared MSB-first emitter (zero-alloc) 12import "nx_raci_sov.nx" // raci_read_all -- RACI from the SOVEREIGN store (NO TSV; flip 2026-07-16) 13const CS_MAGIC_2026: i64 = 2026 14 15const CS_CAP: i64 = 262144 16const CS_OUT: i64 = 8192 17 18func cs_raw(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 19func cs_w2(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){ if s[n]==(39 as u8) { let q: *u8=sys_mmap(1); q[0]=34 as u8; sys_write(1,q,1) } else { sys_write(1, (s as i64 + n) as *u8, 1) } n=n+1 } return 0 } 20func cs_byte(b: i64) -> i64 { let q: *u8=sys_mmap(1); q[0]=b as u8; sys_write(1,q,1); return 0 } 21// MIGRATED to the shared emitter (debt 1785563586). The old body mmapped a scratch buffer 22// per call and never freed it. At PAGE granularity that is 4096B leaked PER CALL -- the 23// defect that took 28.5GB of a 36GB host in nx_ts_lumadiff (2MB input, ~3.66M calls). 24// nxi_* is MSB-first, allocates NOTHING, and emits identical bytes including the sign. 25func cs_wn(v: i64) -> i64 { nxi_out(v); return 0 } 26func cs_read(path: *u8, buf: *u8, cap: i64) -> i64 { 27 let fd: i64 = sys_openat_rd(path); if fd < 0 { return 0 - 1 } 28 var off: i64 = 0; var go: i64 = 1 29 while go == 1 { if off >= cap { go = 0 } else { let r: i64 = sys_read(fd, buf + off, cap - off); if r <= 0 { go = 0 } else { off = off + r } } } 30 sys_close(fd); return off 31} 32func cs_streq(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 0} return 1 } 33func cs_field_raw(line: *u8, len: i64, n: i64, delim: i64) -> i64 { 34 var i: i64=0; var f: i64=0 35 while i < len { let c: i64 = line[i] as i64; if c == delim { f=f+1; i=i+1 } else { if c != 13 { if f == n { sys_write(1, (line as i64 + i) as *u8, 1) } } i=i+1 } } 36 return 0 37} 38func cs_field_cp(line: *u8, len: i64, n: i64, delim: i64, out: *u8, outcap: i64) -> i64 { 39 var i: i64=0; var f: i64=0; var w: i64=0 40 while i < len { let c: i64 = line[i] as i64; if c==delim { f=f+1; i=i+1 } else { if c!=13 { if f==n { if w<outcap-1 { out[w]=line[i]; w=w+1 } } } i=i+1 } } 41 out[w]=0 as u8; return 0 42} 43// emit s (NUL-term) JSON-string-escaped. 44func cs_jesc(s: *u8) -> i64 { 45 var i: i64=0 46 while s[i]!=(0 as u8) { let c: i64=s[i] as i64 47 if c==34 { cs_byte(92); cs_byte(34) } else { if c==92 { cs_byte(92); cs_byte(92) } else { if c==10 { cs_byte(92); cs_byte(110) } else { if c<32 { cs_byte(32) } else { cs_byte(c) } } } } 48 i=i+1 } 49 return 0 50} 51// scopy into dst at off; return new off. 52func cs_scopy(dst: *u8, off: i64, src: *u8) -> i64 { var i: i64=0; while src[i]!=(0 as u8){ let d: *u8=(dst as i64 + off + i) as *u8; d[0]=src[i]; i=i+1 } return off+i } 53 54// is <role> Accountable for <activity>? (nishi_raci.tsv: role<TAB>activity<TAB>letters, A in letters). TAB=9. 55func cs_is_accountable(role: *u8, activity: *u8) -> i64 { 56 let buf: *u8 = sys_mmap(CS_CAP); let n: i64 = raci_read_all(buf, CS_CAP) 57 if n <= 0 { return 0 } 58 let r: *u8 = sys_mmap(64); let a: *u8 = sys_mmap(64); let lt: *u8 = sys_mmap(32) 59 var ls: i64=0; var i: i64=0 60 while i <= n { 61 var nl: i64=0; if i>=n {nl=1} else { if buf[i]==(10 as u8) {nl=1} } 62 if nl==1 { let ll: i64=i-ls 63 if ll>0 { let line: *u8=((buf as i64)+ls) as *u8 64 if line[0]!=(35 as u8) { 65 cs_field_cp(line, ll, 0, 9, r, 64); cs_field_cp(line, ll, 1, 9, a, 64) 66 if cs_streq(r, role)==1 { if cs_streq(a, activity)==1 { 67 cs_field_cp(line, ll, 2, 9, lt, 32) 68 var k: i64=0; while lt[k]!=(0 as u8) { if lt[k]==(65 as u8) { return 1 } k=k+1 } 69 } } } } 70 ls=i+1 } 71 i=i+1 72 } 73 return 0 74} 75// look up <role>'s organ (field2) + activity (field1) from crew_capabilities.data (pipe=124). returns 1 if found. 76func cs_lookup_organ(role: *u8, organ_out: *u8, act_out: *u8) -> i64 { 77 let buf: *u8 = sys_mmap(CS_CAP); let n: i64 = cs_read("knowledge/registry/crew_capabilities.data" as *u8, buf, CS_CAP) 78 if n <= 0 { return 0 } 79 let r: *u8 = sys_mmap(64) 80 var ls: i64=0; var i: i64=0 81 while i <= n { 82 var nl: i64=0; if i>=n {nl=1} else { if buf[i]==(10 as u8) {nl=1} } 83 if nl==1 { let ll: i64=i-ls 84 if ll>0 { let line: *u8=((buf as i64)+ls) as *u8 85 if line[0]!=(35 as u8) { cs_field_cp(line, ll, 0, 124, r, 64) 86 if cs_streq(r, role)==1 { cs_field_cp(line, ll, 2, 124, organ_out, 64); cs_field_cp(line, ll, 1, 124, act_out, 64); return 1 } } } 87 ls=i+1 } 88 i=i+1 89 } 90 return 0 91} 92// resolve an organ ELF path: try "<name>.elf" (NAS CWD) then "_offc/<name>.elf" (dev). returns 1 + fills pathout, else 0. 93func cs_organ_resolve(name: *u8, pathout: *u8) -> i64 { 94 var o: i64 = cs_scopy(pathout, 0, name); o = cs_scopy(pathout, o, ".elf" as *u8); let z1: *u8=(pathout as i64 + o) as *u8; z1[0]=0 as u8 95 let f1: i64 = sys_openat_rd(pathout); if f1>=0 { sys_close(f1); return 1 } 96 var p: i64 = cs_scopy(pathout, 0, "_offc/" as *u8); p = cs_scopy(pathout, p, name); p = cs_scopy(pathout, p, ".elf" as *u8); let z2: *u8=(pathout as i64 + p) as *u8; z2[0]=0 as u8 97 let f2: i64 = sys_openat_rd(pathout); if f2>=0 { sys_close(f2); return 1 } 98 return 0 99} 100// fork-exec organ_path (no args), CAPTURE stdout+stderr into out (NUL-term, capped), return WEXITSTATUS. 101func cs_dispatch(organ_path: *u8, out: *u8, outcap: i64) -> i64 { 102 let av: *i64 = sys_mmap(4*8) as *i64; av[0]=organ_path as i64; av[1]=0 103 let pb: *i64 = sys_mmap(16); sys_pipe2(pb, 0) 104 let rfd: i64 = pb[0] & 0xFFFFFFFF 105 let wfd: i64 = (pb[0] >> 32) & 0xFFFFFFFF 106 let pid: i64 = sys_fork() 107 if pid==0 { sys_dup3(wfd,1,0); sys_dup3(wfd,2,0); sys_close(rfd); sys_close(wfd); sys_execve(organ_path, av, 0 as *i64); sys_exit(127); return 0 } 108 sys_close(wfd) 109 var tot: i64=0; var go: i64=1 110 while go==1 { let room: i64=outcap-1-tot; if room<=0 { go=0 } else { let k: i64=sys_read(rfd, (out as i64 + tot) as *u8, room); if k<=0 { go=0 } else { tot=tot+k } } } 111 sys_close(rfd) 112 let st: *i64 = sys_mmap(8); sys_wait4(pid, st, 0) 113 let zt: *u8=(out as i64 + tot) as *u8; zt[0]=0 as u8 114 return wait_exit_code(st[0]) 115} 116 117func main(argc: i64, argv: *i64) -> i64 { 118 // ---- DISPATCH MODE: nishi_crew <role> <activity> ---- 119 if argc >= 3 { 120 let role: *u8 = argv[1] as *u8; let activity: *u8 = argv[2] as *u8 121 let organ: *u8 = sys_mmap(64); let ract: *u8 = sys_mmap(64) 122 let found: i64 = cs_lookup_organ(role, organ, ract) 123 cs_w2("{'v':1,'api':'nishi-crew/v1','resource':'role-dispatch','role':'" as *u8); cs_raw(role); cs_w2("','activity':'" as *u8); cs_raw(activity); cs_w2("'" as *u8) 124 if found==0 { cs_w2(",'error':'no such role','dispatched':false}\n" as *u8); sys_exit(1); return 1 } 125 // RACI GATE: the role must be Accountable for the requested activity. 126 if cs_is_accountable(role, activity)==0 { 127 cs_w2(",'accountable':false,'dispatched':false,'refused':'RACI: role is not Accountable for this activity (no self-escalation)'}\n" as *u8); sys_exit(1); return 1 128 } 129 cs_w2(",'accountable':true,'organ':'" as *u8); cs_raw(organ); cs_w2("'" as *u8) 130 let pathb: *u8 = sys_mmap(512) 131 if cs_organ_resolve(organ, pathb)==0 { 132 cs_w2(",'dispatched':false,'run_status':'organ not deployed on this host'}\n" as *u8); sys_exit(0); return 0 133 } 134 let outb: *u8 = sys_mmap(CS_OUT) 135 let ec: i64 = cs_dispatch(pathb, outb, CS_OUT) 136 cs_w2(",'dispatched':true,'exit_code':" as *u8); cs_wn(ec); cs_w2(",'output':'" as *u8); cs_jesc(outb); cs_w2("'}\n" as *u8) 137 sys_exit(0); return 0 138 } 139 140 let buf: *u8 = sys_mmap(CS_CAP); let n: i64 = cs_read("knowledge/registry/crew_capabilities.data" as *u8, buf, CS_CAP) 141 if n <= 0 { cs_w2("{'error':'crew_capabilities.data unreadable'}\n" as *u8); sys_exit(2); return 2 } 142 var filter: *u8 = 0 as *u8 143 if argc >= 2 { filter = argv[1] as *u8 } 144 let role: *u8 = sys_mmap(64); let act: *u8 = sys_mmap(64); let stat: *u8 = sys_mmap(64) 145 146 if (filter as i64) != 0 { 147 // ---- DETAIL MODE: nishi_crew <role> ---- 148 var found: i64=0; var ls: i64=0; var i: i64=0 149 while i <= n { 150 var nl: i64=0; if i>=n {nl=1} else { if buf[i]==(10 as u8) {nl=1} } 151 if nl==1 { let ll: i64=i-ls 152 if ll>0 { let line: *u8=((buf as i64)+ls) as *u8 153 if line[0]!=(35 as u8) { cs_field_cp(line, ll, 0, 124, role, 64) 154 if found==0 { if cs_streq(role, filter)==1 { 155 found=1 156 cs_field_cp(line, ll, 1, 124, act, 64) 157 cs_w2("{'v':1,'api':'nishi-crew/v1','resource':'role-capability','role':{'role':'" as *u8); cs_field_raw(line, ll, 0, 124) 158 cs_w2("','activity':'" as *u8); cs_field_raw(line, ll, 1, 124) 159 cs_w2("','organ':'" as *u8); cs_field_raw(line, ll, 2, 124) 160 cs_w2("','mcp_tool':'" as *u8); cs_field_raw(line, ll, 3, 124) 161 cs_w2("','status':'" as *u8); cs_field_raw(line, ll, 4, 124) 162 cs_w2("'},'raci_cells':[" as *u8) 163 cs_emit_raci_inline(act) 164 cs_w2("]}\n" as *u8) 165 } } } } 166 ls=i+1 } 167 i=i+1 168 } 169 if found==0 { cs_w2("{'error':'no such role','role':'" as *u8); cs_raw(filter); cs_w2("'}\n" as *u8); sys_exit(1); return 1 } 170 sys_exit(0); return 0 171 } 172 173 // ---- LIST MODE: nishi_crew ---- 174 var mcp: i64=0; var dispatch: i64=0; var organ: i64=0; var concept: i64=0; var human: i64=0; var rows: i64=0 175 var ls2: i64=0; var i2: i64=0 176 while i2 <= n { 177 var nlc: i64=0; if i2>=n {nlc=1} else { if buf[i2]==(10 as u8) {nlc=1} } 178 if nlc==1 { let ll: i64=i2-ls2 179 if ll>0 { let line: *u8=((buf as i64)+ls2) as *u8 180 if line[0]!=(35 as u8) { cs_field_cp(line, ll, 4, 124, stat, 64) 181 if stat[0]!=(0 as u8) { rows=rows+1 182 if cs_streq(stat,"mcp" as *u8)==1 { mcp=mcp+1 } else { if cs_streq(stat,"dispatch" as *u8)==1 { dispatch=dispatch+1 } else { if cs_streq(stat,"organ" as *u8)==1 { organ=organ+1 } else { if cs_streq(stat,"concept" as *u8)==1 { concept=concept+1 } else { human=human+1 } } } } } } } 183 ls2=i2+1 } 184 i2=i2+1 185 } 186 let denom: i64 = rows - human 187 let served: i64 = mcp + dispatch 188 var permil: i64=0; if denom>0 { permil=(served*1000)/denom } 189 cs_w2("{'v':1,'api':'nishi-crew/v1','resource':'crew-capabilities','coverage_permil':" as *u8); cs_wn(permil) 190 cs_w2(",'counts':{'roles':" as *u8); cs_wn(rows); cs_w2(",'mcp':" as *u8); cs_wn(mcp); cs_w2(",'dispatch':" as *u8); cs_wn(dispatch); cs_w2(",'organ_only':" as *u8); cs_wn(organ); cs_w2(",'concept':" as *u8); cs_wn(concept); cs_w2(",'human':" as *u8); cs_wn(human) 191 cs_w2("},'roles':[" as *u8) 192 var first: i64=1; var ls3: i64=0; var i3: i64=0 193 while i3 <= n { 194 var nl3: i64=0; if i3>=n {nl3=1} else { if buf[i3]==(10 as u8) {nl3=1} } 195 if nl3==1 { let ll: i64=i3-ls3 196 if ll>0 { let line: *u8=((buf as i64)+ls3) as *u8 197 if line[0]!=(35 as u8) { cs_field_cp(line, ll, 0, 124, role, 64) 198 if role[0]!=(0 as u8) { 199 if first==0 { cs_w2("," as *u8) } 200 first=0 201 cs_w2("{'role':'" as *u8); cs_field_raw(line, ll, 0, 124) 202 cs_w2("','activity':'" as *u8); cs_field_raw(line, ll, 1, 124) 203 cs_w2("','organ':'" as *u8); cs_field_raw(line, ll, 2, 124) 204 cs_w2("','mcp_tool':'" as *u8); cs_field_raw(line, ll, 3, 124) 205 cs_w2("','status':'" as *u8); cs_field_raw(line, ll, 4, 124) 206 cs_w2("'}" as *u8) 207 } } } 208 ls3=i3+1 } 209 i3=i3+1 210 } 211 cs_w2("]}\n" as *u8) 212 sys_exit(0); return 0 213} 214 215// emit the RACI cells (role,letters) for activity, from nishi_raci.tsv (TAB=9). caller wrote the '[' already. 216func cs_emit_raci_inline(activity: *u8) -> i64 { 217 let buf: *u8 = sys_mmap(CS_CAP); let n: i64 = raci_read_all(buf, CS_CAP) 218 if n <= 0 { return 0 } 219 let act: *u8 = sys_mmap(64) 220 var first: i64=1; var ls: i64=0; var i: i64=0 221 while i <= n { 222 var nl: i64=0; if i>=n {nl=1} else { if buf[i]==(10 as u8) {nl=1} } 223 if nl==1 { let ll: i64=i-ls 224 if ll>0 { let line: *u8=((buf as i64)+ls) as *u8 225 if line[0]!=(35 as u8) { cs_field_cp(line, ll, 1, 9, act, 64) 226 if cs_streq(act, activity)==1 { 227 if first==0 { cs_w2("," as *u8) } 228 first=0 229 cs_w2("{'role':'" as *u8); cs_field_raw(line, ll, 0, 9) 230 cs_w2("','letters':'" as *u8); cs_field_raw(line, ll, 2, 9) 231 cs_w2("'}" as *u8) 232 } } } 233 ls=i+1 } 234 i=i+1 235 } 236 return 0 237}