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.
Files changed (101) hide show
  1. package/README.md +8 -8
  2. package/dist/agentsmd.js +3 -3
  3. package/dist/agentsmd.js.map +1 -1
  4. package/dist/aontu.d.ts +3 -3
  5. package/dist/aontu.js +4 -6
  6. package/dist/aontu.js.map +1 -1
  7. package/dist/aontumodel.js +6 -12
  8. package/dist/aontumodel.js.map +1 -1
  9. package/dist/casing.d.ts +5 -0
  10. package/dist/casing.js +90 -0
  11. package/dist/casing.js.map +1 -0
  12. package/dist/cli.d.ts +16 -3
  13. package/dist/cli.js +653 -455
  14. package/dist/cli.js.map +1 -1
  15. package/dist/compat.d.ts +7 -0
  16. package/dist/compat.js +113 -0
  17. package/dist/compat.js.map +1 -0
  18. package/dist/helpdoc.js +5 -5
  19. package/dist/helpdoc.js.map +1 -1
  20. package/dist/hints.js +14 -5
  21. package/dist/hints.js.map +1 -1
  22. package/dist/lang.d.ts +1 -0
  23. package/dist/lang.js +8 -0
  24. package/dist/lang.js.map +1 -1
  25. package/dist/lsp.d.ts +1 -1
  26. package/dist/mcp.js +0 -36
  27. package/dist/mcp.js.map +1 -1
  28. package/dist/mod.d.ts +18 -3
  29. package/dist/mod.js +117 -46
  30. package/dist/mod.js.map +1 -1
  31. package/dist/pkg-net.d.ts +227 -0
  32. package/dist/pkg-net.js +1598 -0
  33. package/dist/pkg-net.js.map +1 -0
  34. package/dist/pkg-zip.d.ts +8 -0
  35. package/dist/pkg-zip.js +196 -0
  36. package/dist/pkg-zip.js.map +1 -0
  37. package/dist/pkg.d.ts +159 -0
  38. package/dist/pkg.js +767 -0
  39. package/dist/pkg.js.map +1 -0
  40. package/dist/profile.d.ts +9 -0
  41. package/dist/profile.js +28 -0
  42. package/dist/profile.js.map +1 -0
  43. package/dist/report-sarif.js +1 -1
  44. package/dist/report-sarif.js.map +1 -1
  45. package/dist/subsume.d.ts +3 -1
  46. package/dist/subsume.js +2 -0
  47. package/dist/subsume.js.map +1 -1
  48. package/dist/trace.d.ts +21 -0
  49. package/dist/trace.js +107 -0
  50. package/dist/trace.js.map +1 -0
  51. package/dist/tsconfig.tsbuildinfo +1 -1
  52. package/dist/unify.js +1 -6
  53. package/dist/unify.js.map +1 -1
  54. package/dist/val/CmpFuncVal.d.ts +2 -0
  55. package/dist/val/CmpFuncVal.js +47 -13
  56. package/dist/val/CmpFuncVal.js.map +1 -1
  57. package/dist/val/NomFuncVal.js +11 -13
  58. package/dist/val/NomFuncVal.js.map +1 -1
  59. package/dist/val/ReferFuncVal.js +3 -0
  60. package/dist/val/ReferFuncVal.js.map +1 -1
  61. package/package.json +1 -1
  62. package/skill/SKILL.md +3 -3
  63. package/skill/error-codes.md +4 -4
  64. package/skill/examples.md +4 -4
  65. package/skill/grammar-card.md +1 -1
  66. package/skill/init/check.sh +2 -2
  67. package/skill/tasks.md +14 -12
  68. package/src/agentsmd.ts +3 -3
  69. package/src/aontu.ts +3 -8
  70. package/src/aontumodel.ts +6 -12
  71. package/src/casing.ts +95 -0
  72. package/src/cli.ts +758 -495
  73. package/src/compat.ts +148 -0
  74. package/src/helpdoc.ts +5 -5
  75. package/src/hints.ts +14 -7
  76. package/src/lang.ts +9 -1
  77. package/src/mcp.ts +0 -39
  78. package/src/mod.ts +142 -51
  79. package/src/pkg-net.ts +1945 -0
  80. package/src/pkg-zip.ts +228 -0
  81. package/src/pkg.ts +1018 -0
  82. package/src/profile.ts +42 -0
  83. package/src/report-sarif.ts +1 -1
  84. package/src/subsume.ts +2 -2
  85. package/src/trace.ts +157 -0
  86. package/src/unify.ts +1 -6
  87. package/src/val/CmpFuncVal.ts +66 -20
  88. package/src/val/NomFuncVal.ts +3 -5
  89. package/src/val/ReferFuncVal.ts +4 -0
  90. package/dist/lower.d.ts +0 -23
  91. package/dist/lower.js +0 -528
  92. package/dist/lower.js.map +0 -1
  93. package/dist/mod-tool.d.ts +0 -58
  94. package/dist/mod-tool.js +0 -403
  95. package/dist/mod-tool.js.map +0 -1
  96. package/dist/render.d.ts +0 -53
  97. package/dist/render.js +0 -432
  98. package/dist/render.js.map +0 -1
  99. package/src/lower.ts +0 -586
  100. package/src/mod-tool.ts +0 -561
  101. 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
+ }