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}