prefix-safe-json 0.0.1-alpha.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 (104) hide show
  1. package/LICENSE-APACHE +114 -0
  2. package/LICENSE-MIT +21 -0
  3. package/README.md +169 -0
  4. package/dist/coordinator/coordinator.d.ts +43 -0
  5. package/dist/coordinator/coordinator.d.ts.map +1 -0
  6. package/dist/coordinator/coordinator.js +407 -0
  7. package/dist/coordinator/coordinator.js.map +1 -0
  8. package/dist/coordinator/protocol.d.ts +61 -0
  9. package/dist/coordinator/protocol.d.ts.map +1 -0
  10. package/dist/coordinator/protocol.js +2 -0
  11. package/dist/coordinator/protocol.js.map +1 -0
  12. package/dist/coordinator/types.d.ts +84 -0
  13. package/dist/coordinator/types.d.ts.map +1 -0
  14. package/dist/coordinator/types.js +7 -0
  15. package/dist/coordinator/types.js.map +1 -0
  16. package/dist/diagnostics/codes.d.ts +24 -0
  17. package/dist/diagnostics/codes.d.ts.map +1 -0
  18. package/dist/diagnostics/codes.js +28 -0
  19. package/dist/diagnostics/codes.js.map +1 -0
  20. package/dist/diagnostics/factory.d.ts +8 -0
  21. package/dist/diagnostics/factory.d.ts.map +1 -0
  22. package/dist/diagnostics/factory.js +17 -0
  23. package/dist/diagnostics/factory.js.map +1 -0
  24. package/dist/grammar/frame.d.ts +58 -0
  25. package/dist/grammar/frame.d.ts.map +1 -0
  26. package/dist/grammar/frame.js +87 -0
  27. package/dist/grammar/frame.js.map +1 -0
  28. package/dist/grammar/pointer.d.ts +10 -0
  29. package/dist/grammar/pointer.d.ts.map +1 -0
  30. package/dist/grammar/pointer.js +20 -0
  31. package/dist/grammar/pointer.js.map +1 -0
  32. package/dist/grammar/stack.d.ts +73 -0
  33. package/dist/grammar/stack.d.ts.map +1 -0
  34. package/dist/grammar/stack.js +168 -0
  35. package/dist/grammar/stack.js.map +1 -0
  36. package/dist/index.d.ts +27 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +27 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/lexer/scanner.d.ts +108 -0
  41. package/dist/lexer/scanner.d.ts.map +1 -0
  42. package/dist/lexer/scanner.js +676 -0
  43. package/dist/lexer/scanner.js.map +1 -0
  44. package/dist/lexer/states.d.ts +35 -0
  45. package/dist/lexer/states.d.ts.map +1 -0
  46. package/dist/lexer/states.js +39 -0
  47. package/dist/lexer/states.js.map +1 -0
  48. package/dist/lexer/tokens.d.ts +22 -0
  49. package/dist/lexer/tokens.d.ts.map +1 -0
  50. package/dist/lexer/tokens.js +22 -0
  51. package/dist/lexer/tokens.js.map +1 -0
  52. package/dist/limits.d.ts +14 -0
  53. package/dist/limits.d.ts.map +1 -0
  54. package/dist/limits.js +23 -0
  55. package/dist/limits.js.map +1 -0
  56. package/dist/parser.d.ts +6 -0
  57. package/dist/parser.d.ts.map +1 -0
  58. package/dist/parser.js +949 -0
  59. package/dist/parser.js.map +1 -0
  60. package/dist/providers/adapter.d.ts +10 -0
  61. package/dist/providers/adapter.d.ts.map +1 -0
  62. package/dist/providers/adapter.js +2 -0
  63. package/dist/providers/adapter.js.map +1 -0
  64. package/dist/providers/anthropic.d.ts +45 -0
  65. package/dist/providers/anthropic.d.ts.map +1 -0
  66. package/dist/providers/anthropic.js +112 -0
  67. package/dist/providers/anthropic.js.map +1 -0
  68. package/dist/providers/gemini.d.ts +31 -0
  69. package/dist/providers/gemini.d.ts.map +1 -0
  70. package/dist/providers/gemini.js +94 -0
  71. package/dist/providers/gemini.js.map +1 -0
  72. package/dist/providers/openai-compatible.d.ts +33 -0
  73. package/dist/providers/openai-compatible.d.ts.map +1 -0
  74. package/dist/providers/openai-compatible.js +160 -0
  75. package/dist/providers/openai-compatible.js.map +1 -0
  76. package/dist/providers/openai.d.ts +48 -0
  77. package/dist/providers/openai.d.ts.map +1 -0
  78. package/dist/providers/openai.js +205 -0
  79. package/dist/providers/openai.js.map +1 -0
  80. package/dist/providers/openrouter.d.ts +35 -0
  81. package/dist/providers/openrouter.d.ts.map +1 -0
  82. package/dist/providers/openrouter.js +55 -0
  83. package/dist/providers/openrouter.js.map +1 -0
  84. package/dist/semantic/builder.d.ts +55 -0
  85. package/dist/semantic/builder.d.ts.map +1 -0
  86. package/dist/semantic/builder.js +140 -0
  87. package/dist/semantic/builder.js.map +1 -0
  88. package/dist/semantic/events.d.ts +2 -0
  89. package/dist/semantic/events.d.ts.map +1 -0
  90. package/dist/semantic/events.js +5 -0
  91. package/dist/semantic/events.js.map +1 -0
  92. package/dist/semantic/snapshot.d.ts +49 -0
  93. package/dist/semantic/snapshot.d.ts.map +1 -0
  94. package/dist/semantic/snapshot.js +228 -0
  95. package/dist/semantic/snapshot.js.map +1 -0
  96. package/dist/types.d.ts +156 -0
  97. package/dist/types.d.ts.map +1 -0
  98. package/dist/types.js +5 -0
  99. package/dist/types.js.map +1 -0
  100. package/dist/utf8/decoder.d.ts +53 -0
  101. package/dist/utf8/decoder.d.ts.map +1 -0
  102. package/dist/utf8/decoder.js +318 -0
  103. package/dist/utf8/decoder.js.map +1 -0
  104. package/package.json +79 -0
@@ -0,0 +1,318 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Incremental UTF-8 Decoder
3
+ // ---------------------------------------------------------------------------
4
+ //
5
+ // Processes Uint8Array chunks and yields code points one at a time.
6
+ // Handles multi-byte characters split across chunk boundaries by buffering
7
+ // incomplete trailing bytes until the next push().
8
+ //
9
+ // Design decisions:
10
+ // - Does NOT silently replace invalid bytes with U+FFFD
11
+ // - Rejects overlong encodings
12
+ // - Reports invalid continuation bytes
13
+ // - Truncated sequences at finish() are reportable
14
+ // ---------------------------------------------------------------------------
15
+ /**
16
+ * Incremental UTF-8 decoder that handles multi-byte characters
17
+ * split across chunk boundaries.
18
+ */
19
+ export class Utf8Decoder {
20
+ /** Pending bytes from an incomplete multi-byte sequence. */
21
+ pending = [];
22
+ /** Expected total length of the current multi-byte sequence. */
23
+ pendingExpected = 0;
24
+ /** Total bytes processed across all push() calls. */
25
+ totalOffset = 0;
26
+ bomBuffer = [];
27
+ checkedForBom = false;
28
+ /**
29
+ * Decode a chunk of bytes, returning decoded text and any errors.
30
+ * Incomplete trailing multi-byte sequences are buffered for the next call.
31
+ */
32
+ decode(bytes) {
33
+ const errors = [];
34
+ const codePoints = [];
35
+ let strippedBom = false;
36
+ let i = 0;
37
+ // Handle BOM check at the very beginning of the stream
38
+ if (!this.checkedForBom) {
39
+ while (this.bomBuffer.length < 3 && i < bytes.length) {
40
+ this.bomBuffer.push(bytes[i]);
41
+ i++;
42
+ }
43
+ const isBomPrefix = (this.bomBuffer[0] === 0xef) &&
44
+ (this.bomBuffer.length < 2 || this.bomBuffer[1] === 0xbb) &&
45
+ (this.bomBuffer.length < 3 || this.bomBuffer[2] === 0xbf);
46
+ if (isBomPrefix && this.bomBuffer.length < 3) {
47
+ // Still possibly a BOM, wait for more data
48
+ return { text: "", consumed: i, errors, strippedBom: false };
49
+ }
50
+ this.checkedForBom = true;
51
+ let bufferToProcess = new Uint8Array();
52
+ if (this.bomBuffer.length >= 3 &&
53
+ this.bomBuffer[0] === 0xef &&
54
+ this.bomBuffer[1] === 0xbb &&
55
+ this.bomBuffer[2] === 0xbf) {
56
+ strippedBom = true;
57
+ this.totalOffset += 3;
58
+ // The remaining bytes in bomBuffer (if any) need to be processed
59
+ const remainingInBomBuffer = this.bomBuffer.slice(3);
60
+ const remainingInBytes = bytes.slice(i);
61
+ bufferToProcess = new Uint8Array(remainingInBomBuffer.length + remainingInBytes.length);
62
+ bufferToProcess.set(remainingInBomBuffer);
63
+ bufferToProcess.set(remainingInBytes, remainingInBomBuffer.length);
64
+ }
65
+ else {
66
+ // Not a BOM. Process the whole bomBuffer + remaining bytes.
67
+ const remainingInBytes = bytes.slice(i);
68
+ bufferToProcess = new Uint8Array(this.bomBuffer.length + remainingInBytes.length);
69
+ bufferToProcess.set(this.bomBuffer);
70
+ bufferToProcess.set(remainingInBytes, this.bomBuffer.length);
71
+ }
72
+ // Reset i and swap bytes to the reconstructed buffer
73
+ i = 0;
74
+ bytes = bufferToProcess;
75
+ }
76
+ const startOffset = this.totalOffset;
77
+ // If we have pending bytes from a previous chunk, try to complete the sequence
78
+ if (this.pending.length > 0) {
79
+ let brokenByInvalidContinuation = false;
80
+ while (i < bytes.length && this.pending.length < this.pendingExpected) {
81
+ const b = bytes[i];
82
+ if ((b & 0xc0) !== 0x80) {
83
+ // Not a valid continuation byte — the pending sequence is broken
84
+ errors.push({
85
+ kind: "invalid_continuation",
86
+ byteOffset: startOffset - this.pending.length,
87
+ });
88
+ this.pending = [];
89
+ this.pendingExpected = 0;
90
+ brokenByInvalidContinuation = true;
91
+ // Don't consume this byte — it might be a valid start byte
92
+ break;
93
+ }
94
+ this.pending.push(b);
95
+ i++;
96
+ this.totalOffset++;
97
+ }
98
+ // brokenByInvalidContinuation resets pending.length/pendingExpected to
99
+ // the same value (0), which would otherwise make the check below
100
+ // read as "0 of 0 bytes needed - sequence complete" and spuriously
101
+ // decode an empty byte array, producing a second, bogus diagnostic
102
+ // alongside the invalid_continuation one already pushed above.
103
+ if (!brokenByInvalidContinuation && this.pending.length === this.pendingExpected) {
104
+ // We have a complete sequence — decode it
105
+ const result = this.decodeSequence(this.pending, startOffset - (this.pending.length - (i - 0)));
106
+ if (result.error) {
107
+ errors.push(result.error);
108
+ }
109
+ else {
110
+ codePoints.push(result.codePoint);
111
+ }
112
+ this.pending = [];
113
+ this.pendingExpected = 0;
114
+ }
115
+ else if (!brokenByInvalidContinuation && i >= bytes.length) {
116
+ // Still incomplete — wait for more data
117
+ const consumed = this.totalOffset - startOffset;
118
+ return { text: "", consumed, errors, strippedBom };
119
+ }
120
+ }
121
+ // Process remaining bytes
122
+ while (i < bytes.length) {
123
+ const b = bytes[i];
124
+ const seqOffset = this.totalOffset;
125
+ if (b <= 0x7f) {
126
+ // Single-byte ASCII
127
+ codePoints.push(b);
128
+ i++;
129
+ this.totalOffset++;
130
+ }
131
+ else if ((b & 0xe0) === 0xc0) {
132
+ // 2-byte sequence
133
+ const needed = 2;
134
+ if (i + needed <= bytes.length) {
135
+ const seq = [b, bytes[i + 1]];
136
+ const result = this.decodeSequence(seq, seqOffset);
137
+ if (result.error) {
138
+ errors.push(result.error);
139
+ i++;
140
+ this.totalOffset++;
141
+ }
142
+ else {
143
+ codePoints.push(result.codePoint);
144
+ i += needed;
145
+ this.totalOffset += needed;
146
+ }
147
+ }
148
+ else {
149
+ // Incomplete at end of chunk — buffer it
150
+ this.pendingExpected = needed;
151
+ this.pending = [];
152
+ for (let j = i; j < bytes.length; j++) {
153
+ this.pending.push(bytes[j]);
154
+ }
155
+ this.totalOffset += bytes.length - i;
156
+ i = bytes.length;
157
+ }
158
+ }
159
+ else if ((b & 0xf0) === 0xe0) {
160
+ // 3-byte sequence
161
+ const needed = 3;
162
+ if (i + needed <= bytes.length) {
163
+ const seq = [b, bytes[i + 1], bytes[i + 2]];
164
+ const result = this.decodeSequence(seq, seqOffset);
165
+ if (result.error) {
166
+ errors.push(result.error);
167
+ i++;
168
+ this.totalOffset++;
169
+ }
170
+ else {
171
+ codePoints.push(result.codePoint);
172
+ i += needed;
173
+ this.totalOffset += needed;
174
+ }
175
+ }
176
+ else {
177
+ this.pendingExpected = needed;
178
+ this.pending = [];
179
+ for (let j = i; j < bytes.length; j++) {
180
+ this.pending.push(bytes[j]);
181
+ }
182
+ this.totalOffset += bytes.length - i;
183
+ i = bytes.length;
184
+ }
185
+ }
186
+ else if ((b & 0xf8) === 0xf0) {
187
+ // 4-byte sequence
188
+ const needed = 4;
189
+ if (i + needed <= bytes.length) {
190
+ const seq = [b, bytes[i + 1], bytes[i + 2], bytes[i + 3]];
191
+ const result = this.decodeSequence(seq, seqOffset);
192
+ if (result.error) {
193
+ errors.push(result.error);
194
+ i++;
195
+ this.totalOffset++;
196
+ }
197
+ else {
198
+ codePoints.push(result.codePoint);
199
+ i += needed;
200
+ this.totalOffset += needed;
201
+ }
202
+ }
203
+ else {
204
+ this.pendingExpected = needed;
205
+ this.pending = [];
206
+ for (let j = i; j < bytes.length; j++) {
207
+ this.pending.push(bytes[j]);
208
+ }
209
+ this.totalOffset += bytes.length - i;
210
+ i = bytes.length;
211
+ }
212
+ }
213
+ else {
214
+ // Invalid start byte (0x80-0xBF or 0xF8+)
215
+ errors.push({
216
+ kind: "invalid_start_byte",
217
+ byteOffset: seqOffset,
218
+ });
219
+ i++;
220
+ this.totalOffset++;
221
+ }
222
+ }
223
+ const text = codePointsToString(codePoints);
224
+ const consumed = this.totalOffset - startOffset;
225
+ return { text, consumed, errors, strippedBom };
226
+ }
227
+ /**
228
+ * Check if there are buffered incomplete bytes.
229
+ */
230
+ hasIncomplete() {
231
+ return this.pending.length > 0;
232
+ }
233
+ /**
234
+ * Get the byte offset where the incomplete sequence started.
235
+ */
236
+ incompleteByteOffset() {
237
+ return this.totalOffset - this.pending.length;
238
+ }
239
+ /**
240
+ * Decode a complete multi-byte UTF-8 sequence into a code point.
241
+ * Returns an error for invalid continuation, overlong, or out-of-range sequences.
242
+ */
243
+ decodeSequence(seq, offset) {
244
+ const len = seq.length;
245
+ // Validate continuation bytes
246
+ for (let i = 1; i < len; i++) {
247
+ if ((seq[i] & 0xc0) !== 0x80) {
248
+ return {
249
+ codePoint: 0,
250
+ error: { kind: "invalid_continuation", byteOffset: offset },
251
+ };
252
+ }
253
+ }
254
+ let codePoint;
255
+ let minCodePoint;
256
+ if (len === 2) {
257
+ codePoint = ((seq[0] & 0x1f) << 6) | (seq[1] & 0x3f);
258
+ minCodePoint = 0x80;
259
+ }
260
+ else if (len === 3) {
261
+ codePoint =
262
+ ((seq[0] & 0x0f) << 12) |
263
+ ((seq[1] & 0x3f) << 6) |
264
+ (seq[2] & 0x3f);
265
+ minCodePoint = 0x800;
266
+ }
267
+ else {
268
+ // len === 4
269
+ codePoint =
270
+ ((seq[0] & 0x07) << 18) |
271
+ ((seq[1] & 0x3f) << 12) |
272
+ ((seq[2] & 0x3f) << 6) |
273
+ (seq[3] & 0x3f);
274
+ minCodePoint = 0x10000;
275
+ }
276
+ // Check overlong encoding
277
+ if (codePoint < minCodePoint) {
278
+ return {
279
+ codePoint: 0,
280
+ error: { kind: "overlong", byteOffset: offset },
281
+ };
282
+ }
283
+ // Check valid Unicode range
284
+ if (codePoint > 0x10ffff) {
285
+ return {
286
+ codePoint: 0,
287
+ error: { kind: "out_of_range", byteOffset: offset },
288
+ };
289
+ }
290
+ return { codePoint };
291
+ }
292
+ }
293
+ /**
294
+ * Build a string from an array of code points without spreading the whole
295
+ * array as call arguments — a single-call spread hits engine argument-count
296
+ * limits (RangeError: Maximum call stack size exceeded) once codePoints
297
+ * grows past roughly 100k entries, which a single large push() can trigger.
298
+ */
299
+ function codePointsToString(codePoints) {
300
+ const CHUNK_SIZE = 8192;
301
+ if (codePoints.length <= CHUNK_SIZE) {
302
+ return String.fromCodePoint(...codePoints);
303
+ }
304
+ let text = "";
305
+ for (let i = 0; i < codePoints.length; i += CHUNK_SIZE) {
306
+ text += String.fromCodePoint(...codePoints.slice(i, i + CHUNK_SIZE));
307
+ }
308
+ return text;
309
+ }
310
+ /**
311
+ * Convert a string to its UTF-8 byte representation.
312
+ * Utility for tests and string-mode push().
313
+ */
314
+ export function stringToUtf8(str) {
315
+ const encoder = new TextEncoder();
316
+ return encoder.encode(str);
317
+ }
318
+ //# sourceMappingURL=decoder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decoder.js","sourceRoot":"","sources":["../../src/utf8/decoder.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,79 @@
1
+ {
2
+ "name": "prefix-safe-json",
3
+ "version": "0.0.1-alpha.0",
4
+ "description": "Incremental LLM tool-call JSON parser and deterministic repair engine — never reports a value until it's unambiguously complete",
5
+ "keywords": [
6
+ "json",
7
+ "streaming",
8
+ "incremental",
9
+ "llm",
10
+ "tool-calling",
11
+ "function-calling",
12
+ "json-repair",
13
+ "json-parser"
14
+ ],
15
+ "license": "MIT OR Apache-2.0",
16
+ "type": "module",
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/canblmz1/incremental-tool-json.git"
20
+ },
21
+ "homepage": "https://github.com/canblmz1/incremental-tool-json#readme",
22
+ "bugs": {
23
+ "url": "https://github.com/canblmz1/incremental-tool-json/issues"
24
+ },
25
+ "packageManager": "pnpm@10.33.1",
26
+ "exports": {
27
+ ".": {
28
+ "types": "./dist/index.d.ts",
29
+ "import": "./dist/index.js"
30
+ }
31
+ },
32
+ "files": [
33
+ "dist",
34
+ "LICENSE-MIT",
35
+ "LICENSE-APACHE",
36
+ "README.md"
37
+ ],
38
+ "engines": {
39
+ "node": ">=18.0.0"
40
+ },
41
+ "scripts": {
42
+ "build": "tsc -p tsconfig.build.json",
43
+ "typecheck": "tsc --noEmit",
44
+ "lint": "eslint src/ test/ scripts/",
45
+ "test": "vitest run",
46
+ "test:watch": "vitest",
47
+ "test:unit": "vitest run test/unit/",
48
+ "test:corpus": "vitest run test/corpus/",
49
+ "test:invariants": "vitest run test/invariants/",
50
+ "test:providers": "vitest run test/providers/",
51
+ "test:coverage": "vitest run --coverage",
52
+ "test:mutate": "stryker run",
53
+ "test:fuzz": "vitest run test/fuzz/",
54
+ "bench": "vitest bench --run",
55
+ "validate-corpus": "tsx scripts/validate-corpus.ts",
56
+ "clean": "rimraf dist coverage .vitest",
57
+ "pack:check": "pnpm pack --dry-run",
58
+ "example:anthropic": "node examples/anthropic-truncation-safety.mjs"
59
+ },
60
+ "devDependencies": {
61
+ "@eslint/js": "^9.8.0",
62
+ "@stryker-mutator/core": "^9.6.1",
63
+ "@stryker-mutator/vitest-runner": "^9.6.1",
64
+ "@types/clarinet": "^0.12.3",
65
+ "@types/node": "^26.1.2",
66
+ "@vitest/coverage-v8": "^2.1.9",
67
+ "ajv": "^8.20.0",
68
+ "clarinet": "^0.12.6",
69
+ "eslint": "^9.8.0",
70
+ "fast-check": "^4.9.0",
71
+ "jsonrepair": "^3.15.0",
72
+ "partial-json": "^0.1.7",
73
+ "rimraf": "^6.0.1",
74
+ "tsx": "^4.16.0",
75
+ "typescript": "^5.5.0",
76
+ "typescript-eslint": "^8.0.0",
77
+ "vitest": "^2.0.0"
78
+ }
79
+ }