code wiki / _hdl_build / nx_prim_query.nx
nx_prim_query.nx source
↩ module page · 148 lines · 8307 B
1// nx_prim_query.nx -- prim lane F782 (query_primitives: the 'what do I have' half of meet-in-the-middle).
2// Reads the F781 manifest knowledge/store/prim_registry.json and returns every primitive object whose
3// text matches the query (substring facet over domain/capabilities/signature/output/id) -- the sovereign
4// query the top-down orchestrator (F783) calls to find matching blocks. Objects copied VERBATIM (already
5// valid JSON). Result to stdout AND an atomic out-file (verifiable). READ-ONLY. Empty query = match-all.
6// Object boundaries found via PLAIN-WORD anchors + numeric-byte confirm ({\x22 before primitive_id) so the
7// match logic carries NO string-escape dependency (cannot silently 0-match).
8// nx_prim_query <query> [manifest.json] [out.json]
9// exit: 0 GREEN | 4 ABSENT/MALFORMED | 2 usage.
10// license_tier: ORIGINAL expect_exit: 0
11import "nx_syscalls.nx"
12const K_MAGIC_2048: i64 = 2048
13const K_MAGIC_262100: i64 = 262100
14const K_MAGIC_1048576: i64 = 1048576
15
16func pq_w(fd: i64, s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(fd, s, n); return 0 }
17func pq_b(rep: *u8, pos: i64, s: *u8) -> i64 { var p: i64 = pos; var i: i64 = 0; while s[i] != (0 as u8) { if p < K_MAGIC_262100 { rep[p] = s[i]; p = p + 1 } i = i + 1 } return p }
18func pq_bn(rep: *u8, pos: i64, v: i64) -> i64 { var p: i64 = pos; var m: i64 = v; if m < 0 { if p < K_MAGIC_262100 { rep[p] = 45 as u8; p = p + 1 } m = 0 - m } let t: *u8 = sys_mmap(28); 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 i: i64 = 0; while i < k { if p < K_MAGIC_262100 { rep[p] = t[k - 1 - i]; p = p + 1 } i = i + 1 } return p }
19func pq_q(rep: *u8, pos: i64) -> i64 { var p: i64 = pos; if p < K_MAGIC_262100 { rep[p] = 34 as u8; p = p + 1 } return p }
20func pq_je(rep: *u8, pos: i64, src: *u8, s: i64, e: i64) -> i64 {
21 var p: i64 = pos
22 var i: i64 = s
23 while i < e {
24 let c: i64 = src[i]
25 if c == 34 { if p < K_MAGIC_262100 { rep[p] = 92 as u8; p = p + 1 } if p < K_MAGIC_262100 { rep[p] = 34 as u8; p = p + 1 } }
26 else { if c == 92 { if p < K_MAGIC_262100 { rep[p] = 92 as u8; p = p + 1 } if p < K_MAGIC_262100 { rep[p] = 92 as u8; p = p + 1 } }
27 else { if c < 32 { if p < K_MAGIC_262100 { rep[p] = 32 as u8; p = p + 1 } }
28 else { if p < K_MAGIC_262100 { rep[p] = c as u8; p = p + 1 } } } }
29 i = i + 1
30 }
31 return p
32}
33func pq_cp(rep: *u8, pos: i64, src: *u8, s: i64, e: i64) -> i64 { var p: i64 = pos; var i: i64 = s; while i < e { if p < K_MAGIC_262100 { rep[p] = src[i]; p = p + 1 } i = i + 1 } return p }
34func pq_reads(path: *u8, buf: *u8, cap: i64) -> i64 {
35 let fd: i64 = sys_openat_rd(path)
36 if fd < 0 { return 0 - 1 }
37 var n: i64 = 0
38 var go: i64 = 1
39 while go == 1 { let r: i64 = sys_read(fd, (buf as i64 + n) as *u8, cap - n); if r <= 0 { go = 0 } else { n = n + r } if n >= cap { go = 0 } }
40 sys_close(fd)
41 return n
42}
43func pq_has(buf: *u8, s: i64, e: i64, pat: *u8, pl: i64) -> i64 {
44 if pl == 0 { return 1 }
45 var i: i64 = s
46 var hit: i64 = 0
47 while i + pl <= e {
48 var k: i64 = 0
49 var m: i64 = 1
50 while k < pl { if buf[i + k] != pat[k] { m = 0; k = pl } else { k = k + 1 } }
51 if m == 1 { hit = 1; i = e } else { i = i + 1 }
52 }
53 return hit
54}
55func pq_off(buf: *u8, s: i64, e: i64, pat: *u8, pl: i64) -> i64 {
56 if pl == 0 { return 0 - 1 }
57 var i: i64 = s
58 var found: i64 = 0 - 1
59 while i + pl <= e {
60 var k: i64 = 0
61 var m: i64 = 1
62 while k < pl { if buf[i + k] != pat[k] { m = 0; k = pl } else { k = k + 1 } }
63 if m == 1 { found = i; i = e } else { i = i + 1 }
64 }
65 return found
66}
67func pq_slen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
68func main(argc: i64, argv: *i64) -> i64 {
69 if argc < 2 { pq_w(2, "usage: nx_prim_query <query> [manifest.json] [out.json]\n" as *u8); sys_exit(2); return 2 }
70 let query: *u8 = argv[1] as *u8
71 var manifest: *u8 = "knowledge/store/prim_registry.json" as *u8
72 var outpath: *u8 = "knowledge/status/prim_query.json" as *u8
73 var tmppath: *u8 = "knowledge/status/prim_query.json.tmp" as *u8
74 if argc >= 3 { manifest = argv[2] as *u8 }
75 if argc >= 4 { outpath = argv[3] as *u8 }
76 let qlen: i64 = pq_slen(query)
77 let win: i64 = K_MAGIC_1048576
78 let buf: *u8 = sys_mmap(win + 16)
79 let n: i64 = pq_reads(manifest, buf, win)
80 if n < 0 { pq_w(1, "PRIM-QUERY verdict=ABSENT manifest unreadable\n" as *u8); sys_exit(4); return 4 }
81 if n >= win { pq_w(1, "PRIM-QUERY verdict=REFUSED manifest-window-saturated: raise win, a torn manifest scan undercounts primitives\n" as *u8); sys_exit(4); return 4 }
82 // PLAIN-WORD region anchors (no embedded quotes -> escape-independent)
83 let ph: i64 = pq_off(buf, 0, n, "primitives" as *u8, 10)
84 if ph < 0 { pq_w(1, "PRIM-QUERY verdict=MALFORMED no-primitives-key\n" as *u8); sys_exit(4); return 4 }
85 let rstart: i64 = ph + 10
86 let endpat: *u8 = sys_mmap(16)
87 endpat[0] = 93 as u8
88 endpat[1] = 44 as u8
89 endpat[2] = 34 as u8
90 endpat[3] = 101 as u8
91 endpat[4] = 110 as u8
92 endpat[5] = 118 as u8
93 endpat[6] = 101 as u8
94 endpat[7] = 108 as u8
95 endpat[8] = 111 as u8
96 endpat[9] = 112 as u8
97 endpat[10] = 101 as u8
98 let eh: i64 = pq_off(buf, rstart, n, endpat, 11)
99 var arrend: i64 = n
100 if eh > 0 { arrend = eh }
101 // object boundaries: word 'primitive_id' whose preceding 2 bytes are { and \x22
102 let bounds: *i64 = sys_mmap(K_MAGIC_2048 * 8) as *i64
103 var nb: i64 = 0
104 var scan: i64 = rstart
105 var go: i64 = 1
106 while go == 1 {
107 let o: i64 = pq_off(buf, scan, arrend, "primitive_id" as *u8, 12)
108 if o < 0 { go = 0 } else {
109 if o >= 2 { if buf[o-2] == (123 as u8) { if buf[o-1] == (34 as u8) { if nb < K_MAGIC_2048 { bounds[nb] = o - 2; nb = nb + 1 } } } }
110 scan = o + 12
111 }
112 }
113 let rep: *u8 = sys_mmap(win + 16)
114 var p: i64 = 0
115 p = pq_b(rep, p, "{" as *u8); p = pq_q(rep, p); p = pq_b(rep, p, "v" as *u8); p = pq_q(rep, p); p = pq_b(rep, p, ":1," as *u8)
116 p = pq_q(rep, p); p = pq_b(rep, p, "query" as *u8); p = pq_q(rep, p); p = pq_b(rep, p, ":" as *u8); p = pq_q(rep, p); p = pq_je(rep, p, query, 0, qlen); p = pq_q(rep, p); p = pq_b(rep, p, "," as *u8)
117 p = pq_q(rep, p); p = pq_b(rep, p, "source" as *u8); p = pq_q(rep, p); p = pq_b(rep, p, ":" as *u8); p = pq_q(rep, p); p = pq_b(rep, p, "knowledge/store/prim_registry.json" as *u8); p = pq_q(rep, p); p = pq_b(rep, p, "," as *u8)
118 p = pq_q(rep, p); p = pq_b(rep, p, "match_kind" as *u8); p = pq_q(rep, p); p = pq_b(rep, p, ":" as *u8); p = pq_q(rep, p); p = pq_b(rep, p, "substring-facet-domain-capabilities-signature-output-id-case-sensitive" as *u8); p = pq_q(rep, p); p = pq_b(rep, p, "," as *u8)
119 p = pq_q(rep, p); p = pq_b(rep, p, "primitives" as *u8); p = pq_q(rep, p); p = pq_b(rep, p, ":[" as *u8)
120 var matched: i64 = 0
121 var first: i64 = 1
122 var k: i64 = 0
123 while k < nb {
124 let ostart: i64 = bounds[k]
125 var oend: i64 = arrend
126 if k + 1 < nb { oend = bounds[k+1] }
127 var ce: i64 = oend
128 if ce > ostart { if buf[ce-1] == (44 as u8) { ce = ce - 1 } }
129 var hit: i64 = 0
130 if qlen == 0 { hit = 1 } else { hit = pq_has(buf, ostart, ce, query, qlen) }
131 if hit == 1 {
132 if first == 1 { first = 0 } else { p = pq_b(rep, p, "," as *u8) }
133 p = pq_cp(rep, p, buf, ostart, ce)
134 matched = matched + 1
135 }
136 k = k + 1
137 }
138 p = pq_b(rep, p, "]," as *u8)
139 p = pq_q(rep, p); p = pq_b(rep, p, "matched" as *u8); p = pq_q(rep, p); p = pq_b(rep, p, ":" as *u8); p = pq_bn(rep, p, matched); p = pq_b(rep, p, "," as *u8)
140 p = pq_q(rep, p); p = pq_b(rep, p, "scanned" as *u8); p = pq_q(rep, p); p = pq_b(rep, p, ":" as *u8); p = pq_bn(rep, p, nb); p = pq_b(rep, p, "," as *u8)
141 p = pq_q(rep, p); p = pq_b(rep, p, "cap" as *u8); p = pq_q(rep, p); p = pq_b(rep, p, ":2048" as *u8)
142 p = pq_b(rep, p, "}" as *u8)
143 sys_write(1, rep, p)
144 let tmpfd: i64 = sys_openat_wr(tmppath, 420)
145 if tmpfd >= 0 { sys_write(tmpfd, rep, p); sys_close(tmpfd); sys_renameat(tmppath, outpath) }
146 sys_exit(0)
147 return 0
148}