aontu 0.63.0 → 0.65.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -8
- package/dist/agentsmd.js +3 -3
- package/dist/agentsmd.js.map +1 -1
- package/dist/aontu.d.ts +3 -3
- package/dist/aontu.js +4 -6
- package/dist/aontu.js.map +1 -1
- package/dist/aontumodel.js +6 -12
- package/dist/aontumodel.js.map +1 -1
- package/dist/casing.d.ts +5 -0
- package/dist/casing.js +90 -0
- package/dist/casing.js.map +1 -0
- package/dist/cli.d.ts +16 -3
- package/dist/cli.js +653 -455
- package/dist/cli.js.map +1 -1
- package/dist/compat.d.ts +7 -0
- package/dist/compat.js +113 -0
- package/dist/compat.js.map +1 -0
- package/dist/helpdoc.js +5 -5
- package/dist/helpdoc.js.map +1 -1
- package/dist/hints.js +14 -5
- package/dist/hints.js.map +1 -1
- package/dist/lang.d.ts +1 -0
- package/dist/lang.js +8 -0
- package/dist/lang.js.map +1 -1
- package/dist/lsp.d.ts +1 -1
- package/dist/mcp.js +0 -36
- package/dist/mcp.js.map +1 -1
- package/dist/mod.d.ts +18 -3
- package/dist/mod.js +117 -46
- package/dist/mod.js.map +1 -1
- package/dist/pkg-net.d.ts +227 -0
- package/dist/pkg-net.js +1598 -0
- package/dist/pkg-net.js.map +1 -0
- package/dist/pkg-zip.d.ts +8 -0
- package/dist/pkg-zip.js +196 -0
- package/dist/pkg-zip.js.map +1 -0
- package/dist/pkg.d.ts +159 -0
- package/dist/pkg.js +767 -0
- package/dist/pkg.js.map +1 -0
- package/dist/profile.d.ts +9 -0
- package/dist/profile.js +28 -0
- package/dist/profile.js.map +1 -0
- package/dist/report-sarif.js +1 -1
- package/dist/report-sarif.js.map +1 -1
- package/dist/subsume.d.ts +3 -1
- package/dist/subsume.js +2 -0
- package/dist/subsume.js.map +1 -1
- package/dist/trace.d.ts +21 -0
- package/dist/trace.js +107 -0
- package/dist/trace.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/unify.js +1 -6
- package/dist/unify.js.map +1 -1
- package/dist/val/CmpFuncVal.d.ts +2 -0
- package/dist/val/CmpFuncVal.js +47 -13
- package/dist/val/CmpFuncVal.js.map +1 -1
- package/dist/val/NomFuncVal.js +11 -13
- package/dist/val/NomFuncVal.js.map +1 -1
- package/dist/val/ReferFuncVal.js +3 -0
- package/dist/val/ReferFuncVal.js.map +1 -1
- package/package.json +1 -1
- package/skill/SKILL.md +3 -3
- package/skill/error-codes.md +4 -4
- package/skill/examples.md +4 -4
- package/skill/grammar-card.md +1 -1
- package/skill/init/check.sh +2 -2
- package/skill/tasks.md +14 -12
- package/src/agentsmd.ts +3 -3
- package/src/aontu.ts +3 -8
- package/src/aontumodel.ts +6 -12
- package/src/casing.ts +95 -0
- package/src/cli.ts +758 -495
- package/src/compat.ts +148 -0
- package/src/helpdoc.ts +5 -5
- package/src/hints.ts +14 -7
- package/src/lang.ts +9 -1
- package/src/mcp.ts +0 -39
- package/src/mod.ts +142 -51
- package/src/pkg-net.ts +1945 -0
- package/src/pkg-zip.ts +228 -0
- package/src/pkg.ts +1018 -0
- package/src/profile.ts +42 -0
- package/src/report-sarif.ts +1 -1
- package/src/subsume.ts +2 -2
- package/src/trace.ts +157 -0
- package/src/unify.ts +1 -6
- package/src/val/CmpFuncVal.ts +66 -20
- package/src/val/NomFuncVal.ts +3 -5
- package/src/val/ReferFuncVal.ts +4 -0
- package/dist/lower.d.ts +0 -23
- package/dist/lower.js +0 -528
- package/dist/lower.js.map +0 -1
- package/dist/mod-tool.d.ts +0 -58
- package/dist/mod-tool.js +0 -403
- package/dist/mod-tool.js.map +0 -1
- package/dist/render.d.ts +0 -53
- package/dist/render.js +0 -432
- package/dist/render.js.map +0 -1
- package/src/lower.ts +0 -586
- package/src/mod-tool.ts +0 -561
- package/src/render.ts +0 -580
package/src/pkg-zip.ts
ADDED
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/* Copyright (c) 2025 Richard Rodger, MIT License */
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
import { createHash } from 'node:crypto'
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
// THE CANONICAL ARCHIVE (ADR-039 part 7): entries sorted by path,
|
|
8
|
+
// stored uncompressed, dated to the zip epoch, no attributes, extra
|
|
9
|
+
// fields or comments. One tree has one digest in both ports, which a
|
|
10
|
+
// compressor could not promise. The reader refuses anything the writer
|
|
11
|
+
// would not produce.
|
|
12
|
+
|
|
13
|
+
export type ZipEntry = { path: string, data: Uint8Array }
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
const LOCAL_SIG = 0x04034b50
|
|
17
|
+
const CENTRAL_SIG = 0x02014b50
|
|
18
|
+
const END_SIG = 0x06054b50
|
|
19
|
+
const DOS_EPOCH_DATE = 0x0021
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
let CRC_TABLE: Uint32Array | undefined
|
|
23
|
+
|
|
24
|
+
function crc32(data: Uint8Array): number {
|
|
25
|
+
if (undefined === CRC_TABLE) {
|
|
26
|
+
CRC_TABLE = new Uint32Array(256)
|
|
27
|
+
for (let n = 0; n < 256; n++) {
|
|
28
|
+
let c = n
|
|
29
|
+
for (let k = 0; k < 8; k++) {
|
|
30
|
+
c = 0 !== (c & 1) ? 0xedb88320 ^ (c >>> 1) : c >>> 1
|
|
31
|
+
}
|
|
32
|
+
CRC_TABLE[n] = c >>> 0
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
let crc = 0xffffffff
|
|
36
|
+
for (let i = 0; i < data.length; i++) {
|
|
37
|
+
crc = CRC_TABLE[(crc ^ data[i]) & 0xff] ^ (crc >>> 8)
|
|
38
|
+
}
|
|
39
|
+
return (crc ^ 0xffffffff) >>> 0
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
export function cmpBytes(a: string, b: string): number {
|
|
44
|
+
return a < b ? -1 : a > b ? 1 : 0
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
export function sha256Hex(data: Uint8Array): string {
|
|
49
|
+
return 'sha256:' + createHash('sha256').update(data).digest('hex')
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class Writer {
|
|
54
|
+
parts: Uint8Array[] = []
|
|
55
|
+
size = 0
|
|
56
|
+
|
|
57
|
+
u16(n: number): void {
|
|
58
|
+
this.bytes(new Uint8Array([n & 0xff, (n >>> 8) & 0xff]))
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
u32(n: number): void {
|
|
62
|
+
this.bytes(new Uint8Array([
|
|
63
|
+
n & 0xff, (n >>> 8) & 0xff, (n >>> 16) & 0xff, (n >>> 24) & 0xff]))
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
bytes(b: Uint8Array): void {
|
|
67
|
+
this.parts.push(b)
|
|
68
|
+
this.size += b.length
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
out(): Uint8Array {
|
|
72
|
+
const all = new Uint8Array(this.size)
|
|
73
|
+
let at = 0
|
|
74
|
+
for (const p of this.parts) {
|
|
75
|
+
all.set(p, at)
|
|
76
|
+
at += p.length
|
|
77
|
+
}
|
|
78
|
+
return all
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
export function zipCanonical(entries: ZipEntry[]): Uint8Array {
|
|
84
|
+
const sorted = [...entries].sort((a, b) => cmpBytes(a.path, b.path))
|
|
85
|
+
const w = new Writer()
|
|
86
|
+
const central = new Writer()
|
|
87
|
+
const enc = new TextEncoder()
|
|
88
|
+
|
|
89
|
+
for (const e of sorted) {
|
|
90
|
+
const name = enc.encode(e.path)
|
|
91
|
+
const crc = crc32(e.data)
|
|
92
|
+
const offset = w.size
|
|
93
|
+
|
|
94
|
+
w.u32(LOCAL_SIG)
|
|
95
|
+
w.u16(10)
|
|
96
|
+
w.u16(0)
|
|
97
|
+
w.u16(0)
|
|
98
|
+
w.u16(0)
|
|
99
|
+
w.u16(DOS_EPOCH_DATE)
|
|
100
|
+
w.u32(crc)
|
|
101
|
+
w.u32(e.data.length)
|
|
102
|
+
w.u32(e.data.length)
|
|
103
|
+
w.u16(name.length)
|
|
104
|
+
w.u16(0)
|
|
105
|
+
w.bytes(name)
|
|
106
|
+
w.bytes(e.data)
|
|
107
|
+
|
|
108
|
+
central.u32(CENTRAL_SIG)
|
|
109
|
+
central.u16(10)
|
|
110
|
+
central.u16(10)
|
|
111
|
+
central.u16(0)
|
|
112
|
+
central.u16(0)
|
|
113
|
+
central.u16(0)
|
|
114
|
+
central.u16(DOS_EPOCH_DATE)
|
|
115
|
+
central.u32(crc)
|
|
116
|
+
central.u32(e.data.length)
|
|
117
|
+
central.u32(e.data.length)
|
|
118
|
+
central.u16(name.length)
|
|
119
|
+
central.u16(0)
|
|
120
|
+
central.u16(0)
|
|
121
|
+
central.u16(0)
|
|
122
|
+
central.u16(0)
|
|
123
|
+
central.u32(0)
|
|
124
|
+
central.u32(offset)
|
|
125
|
+
central.bytes(name)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const cdOffset = w.size
|
|
129
|
+
const cd = central.out()
|
|
130
|
+
w.bytes(cd)
|
|
131
|
+
w.u32(END_SIG)
|
|
132
|
+
w.u16(0)
|
|
133
|
+
w.u16(0)
|
|
134
|
+
w.u16(sorted.length)
|
|
135
|
+
w.u16(sorted.length)
|
|
136
|
+
w.u32(cd.length)
|
|
137
|
+
w.u32(cdOffset)
|
|
138
|
+
w.u16(0)
|
|
139
|
+
return w.out()
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
function u16(b: Uint8Array, at: number): number {
|
|
144
|
+
return b[at] | (b[at + 1] << 8)
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function u32(b: Uint8Array, at: number): number {
|
|
148
|
+
return (b[at] | (b[at + 1] << 8) | (b[at + 2] << 16)) + b[at + 3] * 0x1000000
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
// Read a canonical archive, refusing any shape the writer above would
|
|
153
|
+
// not have produced: the digest was taken over the canonical bytes, so
|
|
154
|
+
// a non-canonical archive is a corrupted one whatever it unpacks to.
|
|
155
|
+
export function unzipCanonical(zip: Uint8Array): ZipEntry[] {
|
|
156
|
+
const bad = (why: string): never => {
|
|
157
|
+
throw new Error('archive is not canonical: ' + why)
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if (zip.length < 22 || END_SIG !== u32(zip, zip.length - 22)) {
|
|
161
|
+
bad('no end record')
|
|
162
|
+
}
|
|
163
|
+
const end = zip.length - 22
|
|
164
|
+
const count = u16(zip, end + 10)
|
|
165
|
+
const cdSize = u32(zip, end + 12)
|
|
166
|
+
const cdOffset = u32(zip, end + 16)
|
|
167
|
+
if (0 !== u16(zip, end + 4) || 0 !== u16(zip, end + 6) ||
|
|
168
|
+
count !== u16(zip, end + 8) || 0 !== u16(zip, end + 20) ||
|
|
169
|
+
cdOffset + cdSize !== end) {
|
|
170
|
+
bad('end record')
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
const dec = new TextDecoder('utf-8', { fatal: true })
|
|
174
|
+
const out: ZipEntry[] = []
|
|
175
|
+
let at = cdOffset
|
|
176
|
+
let prev: string | undefined
|
|
177
|
+
let expectLocal = 0
|
|
178
|
+
|
|
179
|
+
for (let i = 0; i < count; i++) {
|
|
180
|
+
if (at + 46 > end || CENTRAL_SIG !== u32(zip, at)) {
|
|
181
|
+
bad('central directory')
|
|
182
|
+
}
|
|
183
|
+
const crc = u32(zip, at + 16)
|
|
184
|
+
const csize = u32(zip, at + 20)
|
|
185
|
+
const usize = u32(zip, at + 24)
|
|
186
|
+
const nameLen = u16(zip, at + 28)
|
|
187
|
+
const offset = u32(zip, at + 42)
|
|
188
|
+
if (10 !== u16(zip, at + 4) || 10 !== u16(zip, at + 6) ||
|
|
189
|
+
0 !== u16(zip, at + 8) || 0 !== u16(zip, at + 10) ||
|
|
190
|
+
0 !== u16(zip, at + 12) || DOS_EPOCH_DATE !== u16(zip, at + 14) ||
|
|
191
|
+
csize !== usize || 0 !== u16(zip, at + 30) || 0 !== u16(zip, at + 32) ||
|
|
192
|
+
0 !== u16(zip, at + 34) || 0 !== u16(zip, at + 36) ||
|
|
193
|
+
0 !== u32(zip, at + 38) || offset !== expectLocal) {
|
|
194
|
+
bad('entry ' + i)
|
|
195
|
+
}
|
|
196
|
+
const name = dec.decode(zip.subarray(at + 46, at + 46 + nameLen))
|
|
197
|
+
if (undefined !== prev && 0 <= cmpBytes(prev, name)) {
|
|
198
|
+
bad('entries out of order at ' + name)
|
|
199
|
+
}
|
|
200
|
+
prev = name
|
|
201
|
+
at += 46 + nameLen
|
|
202
|
+
|
|
203
|
+
if (offset + 30 + nameLen > cdOffset || LOCAL_SIG !== u32(zip, offset) ||
|
|
204
|
+
10 !== u16(zip, offset + 4) || 0 !== u16(zip, offset + 6) ||
|
|
205
|
+
0 !== u16(zip, offset + 8) || 0 !== u16(zip, offset + 10) ||
|
|
206
|
+
DOS_EPOCH_DATE !== u16(zip, offset + 12) || crc !== u32(zip, offset + 14) ||
|
|
207
|
+
usize !== u32(zip, offset + 18) || usize !== u32(zip, offset + 22) ||
|
|
208
|
+
nameLen !== u16(zip, offset + 26) || 0 !== u16(zip, offset + 28) ||
|
|
209
|
+
name !== dec.decode(zip.subarray(offset + 30, offset + 30 + nameLen))) {
|
|
210
|
+
bad('local header of ' + name)
|
|
211
|
+
}
|
|
212
|
+
const start = offset + 30 + nameLen
|
|
213
|
+
if (start + usize > cdOffset) {
|
|
214
|
+
bad('data of ' + name)
|
|
215
|
+
}
|
|
216
|
+
const data = zip.slice(start, start + usize)
|
|
217
|
+
if (crc32(data) !== crc) {
|
|
218
|
+
bad('checksum of ' + name)
|
|
219
|
+
}
|
|
220
|
+
out.push({ path: name, data })
|
|
221
|
+
expectLocal = start + usize
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
if (expectLocal !== cdOffset) {
|
|
225
|
+
bad('trailing bytes')
|
|
226
|
+
}
|
|
227
|
+
return out
|
|
228
|
+
}
|