prefix-safe-json 0.1.0 → 0.2.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 +57 -3
- package/dist/coordinator/coordinator.d.ts +53 -0
- package/dist/coordinator/coordinator.d.ts.map +1 -0
- package/dist/coordinator/coordinator.js +477 -0
- package/dist/coordinator/coordinator.js.map +1 -0
- package/dist/coordinator/diagnostic-codes.d.ts +37 -0
- package/dist/coordinator/diagnostic-codes.d.ts.map +1 -0
- package/dist/coordinator/diagnostic-codes.js +48 -0
- package/dist/coordinator/diagnostic-codes.js.map +1 -0
- package/dist/coordinator/protocol.d.ts +62 -0
- package/dist/coordinator/protocol.d.ts.map +1 -0
- package/dist/coordinator/protocol.js +2 -0
- package/dist/coordinator/protocol.js.map +1 -0
- package/dist/coordinator/types.d.ts +104 -0
- package/dist/coordinator/types.d.ts.map +1 -0
- package/dist/coordinator/types.js +7 -0
- package/dist/coordinator/types.js.map +1 -0
- package/dist/diagnostics/codes.d.ts +24 -0
- package/dist/diagnostics/codes.d.ts.map +1 -0
- package/dist/diagnostics/codes.js +28 -0
- package/dist/diagnostics/codes.js.map +1 -0
- package/dist/diagnostics/factory.d.ts +8 -0
- package/dist/diagnostics/factory.d.ts.map +1 -0
- package/dist/diagnostics/factory.js +17 -0
- package/dist/diagnostics/factory.js.map +1 -0
- package/dist/gate/decide.d.ts +27 -0
- package/dist/gate/decide.d.ts.map +1 -0
- package/dist/gate/decide.js +179 -0
- package/dist/gate/decide.js.map +1 -0
- package/dist/gate/gate.d.ts +25 -0
- package/dist/gate/gate.d.ts.map +1 -0
- package/dist/gate/gate.js +96 -0
- package/dist/gate/gate.js.map +1 -0
- package/dist/gate/types.d.ts +184 -0
- package/dist/gate/types.d.ts.map +1 -0
- package/dist/gate/types.js +2 -0
- package/dist/gate/types.js.map +1 -0
- package/dist/grammar/frame.d.ts +58 -0
- package/dist/grammar/frame.d.ts.map +1 -0
- package/dist/grammar/frame.js +87 -0
- package/dist/grammar/frame.js.map +1 -0
- package/dist/grammar/pointer.d.ts +10 -0
- package/dist/grammar/pointer.d.ts.map +1 -0
- package/dist/grammar/pointer.js +20 -0
- package/dist/grammar/pointer.js.map +1 -0
- package/dist/grammar/stack.d.ts +73 -0
- package/dist/grammar/stack.d.ts.map +1 -0
- package/dist/grammar/stack.js +168 -0
- package/dist/grammar/stack.js.map +1 -0
- package/dist/guard/ai-sdk.d.ts +48 -0
- package/dist/guard/ai-sdk.d.ts.map +1 -0
- package/dist/guard/ai-sdk.js +51 -0
- package/dist/guard/ai-sdk.js.map +1 -0
- package/dist/guard/provider-guard.d.ts +4 -0
- package/dist/guard/provider-guard.d.ts.map +1 -0
- package/dist/guard/provider-guard.js +38 -0
- package/dist/guard/provider-guard.js.map +1 -0
- package/dist/guard/types.d.ts +48 -0
- package/dist/guard/types.d.ts.map +1 -0
- package/dist/guard/types.js +2 -0
- package/dist/guard/types.js.map +1 -0
- package/dist/index.d.ts +85 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +99 -0
- package/dist/index.js.map +1 -0
- package/dist/lexer/scanner.d.ts +106 -0
- package/dist/lexer/scanner.d.ts.map +1 -0
- package/dist/lexer/scanner.js +658 -0
- package/dist/lexer/scanner.js.map +1 -0
- package/dist/lexer/states.d.ts +31 -0
- package/dist/lexer/states.d.ts.map +1 -0
- package/dist/lexer/states.js +35 -0
- package/dist/lexer/states.js.map +1 -0
- package/dist/lexer/tokens.d.ts +22 -0
- package/dist/lexer/tokens.d.ts.map +1 -0
- package/dist/lexer/tokens.js +22 -0
- package/dist/lexer/tokens.js.map +1 -0
- package/dist/limits.d.ts +14 -0
- package/dist/limits.d.ts.map +1 -0
- package/dist/limits.js +23 -0
- package/dist/limits.js.map +1 -0
- package/dist/parser.d.ts +6 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +922 -0
- package/dist/parser.js.map +1 -0
- package/dist/providers/adapter.d.ts +10 -0
- package/dist/providers/adapter.d.ts.map +1 -0
- package/dist/providers/adapter.js +2 -0
- package/dist/providers/adapter.js.map +1 -0
- package/dist/providers/ai-sdk.d.ts +63 -0
- package/dist/providers/ai-sdk.d.ts.map +1 -0
- package/dist/providers/ai-sdk.js +240 -0
- package/dist/providers/ai-sdk.js.map +1 -0
- package/dist/providers/anthropic.d.ts +45 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +112 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/gemini.d.ts +31 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +94 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/openai-compatible.d.ts +33 -0
- package/dist/providers/openai-compatible.d.ts.map +1 -0
- package/dist/providers/openai-compatible.js +160 -0
- package/dist/providers/openai-compatible.js.map +1 -0
- package/dist/providers/openai.d.ts +55 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +263 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/openrouter.d.ts +35 -0
- package/dist/providers/openrouter.d.ts.map +1 -0
- package/dist/providers/openrouter.js +55 -0
- package/dist/providers/openrouter.js.map +1 -0
- package/dist/semantic/builder.d.ts +55 -0
- package/dist/semantic/builder.d.ts.map +1 -0
- package/dist/semantic/builder.js +140 -0
- package/dist/semantic/builder.js.map +1 -0
- package/dist/semantic/events.d.ts +2 -0
- package/dist/semantic/events.d.ts.map +1 -0
- package/dist/semantic/events.js +5 -0
- package/dist/semantic/events.js.map +1 -0
- package/dist/semantic/snapshot.d.ts +56 -0
- package/dist/semantic/snapshot.d.ts.map +1 -0
- package/dist/semantic/snapshot.js +230 -0
- package/dist/semantic/snapshot.js.map +1 -0
- package/dist/types.d.ts +156 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utf8/decoder.d.ts +53 -0
- package/dist/utf8/decoder.d.ts.map +1 -0
- package/dist/utf8/decoder.js +323 -0
- package/dist/utf8/decoder.js.map +1 -0
- package/package.json +2 -1
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/** Standard JSON value type. */
|
|
2
|
+
export type JsonValue = string | number | boolean | null | JsonObject | JsonArray;
|
|
3
|
+
export interface JsonObject {
|
|
4
|
+
[key: string]: JsonValue;
|
|
5
|
+
}
|
|
6
|
+
export type JsonArray = JsonValue[];
|
|
7
|
+
/** Why the LLM stream ended. */
|
|
8
|
+
export type StreamEndReason = "complete" | "length" | "network_error" | "provider_error" | "cancelled" | "unknown";
|
|
9
|
+
/** Returned by `push()` after feeding a chunk. */
|
|
10
|
+
export interface PushResult {
|
|
11
|
+
/** Number of bytes accepted from this chunk. */
|
|
12
|
+
acceptedBytes: number;
|
|
13
|
+
/** Number of semantic events emitted during this push. */
|
|
14
|
+
emittedEvents: number;
|
|
15
|
+
/** Current syntactic status of the document. */
|
|
16
|
+
syntax: SyntaxStatus;
|
|
17
|
+
/** If true, the parser will not accept further input. */
|
|
18
|
+
terminal: boolean;
|
|
19
|
+
}
|
|
20
|
+
export type SyntaxStatus = "empty" | "incomplete" | "root_complete" | "invalid";
|
|
21
|
+
/** Immutable snapshot of parser state. */
|
|
22
|
+
export interface ParserSnapshot {
|
|
23
|
+
/** Whether we are still collecting or the stream is finished. */
|
|
24
|
+
phase: "collecting" | "finished";
|
|
25
|
+
/** Current syntactic status. */
|
|
26
|
+
syntax: SyntaxStatus;
|
|
27
|
+
/** JSON value built from only fully-committed fields. */
|
|
28
|
+
stableValue?: JsonValue;
|
|
29
|
+
/** Whether the root JSON container has been closed. */
|
|
30
|
+
rootComplete: boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Whether the parsed result is safe for tool execution.
|
|
33
|
+
* True only when root is complete, stream finished normally,
|
|
34
|
+
* no pending tokens, no fatal diagnostics, no duplicate keys,
|
|
35
|
+
* and no structural/lossy repairs.
|
|
36
|
+
*/
|
|
37
|
+
executable: boolean;
|
|
38
|
+
/** Tokens still awaiting more data. */
|
|
39
|
+
pending: readonly PendingToken[];
|
|
40
|
+
/** Repairs applied (populated at finish). */
|
|
41
|
+
repairs: readonly RepairAction[];
|
|
42
|
+
/** All diagnostics emitted so far. */
|
|
43
|
+
diagnostics: readonly Diagnostic[];
|
|
44
|
+
/** Total bytes received via push(). */
|
|
45
|
+
receivedBytes: number;
|
|
46
|
+
/** Bytes successfully consumed by the parser. */
|
|
47
|
+
consumedBytes: number;
|
|
48
|
+
}
|
|
49
|
+
/** A value that is in-progress and not yet committed. */
|
|
50
|
+
export interface PendingToken {
|
|
51
|
+
type: "string" | "number" | "literal" | "unicode_escape" | "surrogate" | "object_key";
|
|
52
|
+
path: string;
|
|
53
|
+
buffered: string;
|
|
54
|
+
byteOffset: number;
|
|
55
|
+
}
|
|
56
|
+
/** Describes a deterministic repair applied at stream end. */
|
|
57
|
+
export interface RepairAction {
|
|
58
|
+
code: string;
|
|
59
|
+
byteRange: readonly [number, number];
|
|
60
|
+
impact: "representation_preserving" | "root_preserving" | "structural" | "lossy";
|
|
61
|
+
description: string;
|
|
62
|
+
}
|
|
63
|
+
/** Structured parse diagnostic. */
|
|
64
|
+
export interface Diagnostic {
|
|
65
|
+
code: string;
|
|
66
|
+
severity: "info" | "warning" | "error" | "fatal";
|
|
67
|
+
byteOffset: number;
|
|
68
|
+
path?: string;
|
|
69
|
+
recoverable: boolean;
|
|
70
|
+
message: string;
|
|
71
|
+
}
|
|
72
|
+
export type ParserEvent = ValueCommittedEvent | ContainerClosedEvent | RepairAppliedEvent | DiagnosticEvent | DocumentCompleteEvent | StreamFinishedEvent;
|
|
73
|
+
export interface ValueCommittedEvent {
|
|
74
|
+
type: "value_committed";
|
|
75
|
+
sequence: number;
|
|
76
|
+
path: string;
|
|
77
|
+
operation: "add";
|
|
78
|
+
value: JsonValue;
|
|
79
|
+
byteRange: readonly [number, number];
|
|
80
|
+
}
|
|
81
|
+
export interface ContainerClosedEvent {
|
|
82
|
+
type: "container_closed";
|
|
83
|
+
sequence: number;
|
|
84
|
+
path: string;
|
|
85
|
+
container: "object" | "array";
|
|
86
|
+
}
|
|
87
|
+
export interface RepairAppliedEvent {
|
|
88
|
+
type: "repair_applied";
|
|
89
|
+
sequence: number;
|
|
90
|
+
repair: RepairAction;
|
|
91
|
+
}
|
|
92
|
+
export interface DiagnosticEvent {
|
|
93
|
+
type: "diagnostic";
|
|
94
|
+
sequence: number;
|
|
95
|
+
diagnostic: Diagnostic;
|
|
96
|
+
}
|
|
97
|
+
export interface DocumentCompleteEvent {
|
|
98
|
+
type: "document_complete";
|
|
99
|
+
sequence: number;
|
|
100
|
+
executable: boolean;
|
|
101
|
+
}
|
|
102
|
+
export interface StreamFinishedEvent {
|
|
103
|
+
type: "stream_finished";
|
|
104
|
+
sequence: number;
|
|
105
|
+
outcome: "valid" | "truncated" | "salvaged" | "invalid";
|
|
106
|
+
}
|
|
107
|
+
/** Returned by `finish()`. */
|
|
108
|
+
export interface FinalResult {
|
|
109
|
+
/** Final syntactic status. */
|
|
110
|
+
syntax: SyntaxStatus;
|
|
111
|
+
/** Overall parse outcome. */
|
|
112
|
+
outcome: "valid" | "truncated" | "salvaged" | "invalid";
|
|
113
|
+
/** JSON value from committed fields only. */
|
|
114
|
+
stableValue?: JsonValue;
|
|
115
|
+
/** Whether the result is safe for tool execution. */
|
|
116
|
+
executable: boolean;
|
|
117
|
+
/** All repairs applied during finalization. */
|
|
118
|
+
repairs: readonly RepairAction[];
|
|
119
|
+
/** All diagnostics. */
|
|
120
|
+
diagnostics: readonly Diagnostic[];
|
|
121
|
+
/** Total received bytes. */
|
|
122
|
+
receivedBytes: number;
|
|
123
|
+
/** Consumed bytes. */
|
|
124
|
+
consumedBytes: number;
|
|
125
|
+
}
|
|
126
|
+
/** The incremental parser API. */
|
|
127
|
+
export interface IncrementalJsonParser {
|
|
128
|
+
/** Feed a chunk of data. */
|
|
129
|
+
push(chunk: string | Uint8Array): PushResult;
|
|
130
|
+
/** Get a snapshot of the current parser state. */
|
|
131
|
+
snapshot(): ParserSnapshot;
|
|
132
|
+
/** Drain and return all unconsumed events, clearing the queue. */
|
|
133
|
+
drainEvents(): readonly ParserEvent[];
|
|
134
|
+
/** Signal stream completion. Must be called exactly once. */
|
|
135
|
+
finish(meta?: {
|
|
136
|
+
reason?: StreamEndReason;
|
|
137
|
+
providerReason?: string;
|
|
138
|
+
}): FinalResult;
|
|
139
|
+
}
|
|
140
|
+
export interface RepairOptions {
|
|
141
|
+
readonly rawControlCharacters: "reject" | "escape";
|
|
142
|
+
readonly trailingData: "reject" | "isolate";
|
|
143
|
+
readonly closeContainersAtFinish: "disabled" | "safe-only";
|
|
144
|
+
}
|
|
145
|
+
export interface ParserOptions {
|
|
146
|
+
limits?: Partial<ParserLimits>;
|
|
147
|
+
repairs?: Partial<RepairOptions>;
|
|
148
|
+
}
|
|
149
|
+
export interface ParserLimits {
|
|
150
|
+
maxInputBytes: number;
|
|
151
|
+
maxDepth: number;
|
|
152
|
+
maxStringBytes: number;
|
|
153
|
+
maxQueuedEvents: number;
|
|
154
|
+
maxTrailingDataBytes: number;
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,oCAAoC;AACpC,8EAA8E"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/** Result of decoding a chunk of bytes. */
|
|
2
|
+
export interface DecodeResult {
|
|
3
|
+
/** Decoded code points as a string. */
|
|
4
|
+
text: string;
|
|
5
|
+
/** Number of bytes consumed (may be less than input if trailing incomplete sequence). */
|
|
6
|
+
consumed: number;
|
|
7
|
+
/** Errors encountered during decoding. */
|
|
8
|
+
errors: Utf8Error[];
|
|
9
|
+
/** True if BOM was detected and stripped during this chunk. */
|
|
10
|
+
strippedBom: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface Utf8Error {
|
|
13
|
+
kind: "invalid_start_byte" | "invalid_continuation" | "overlong" | "out_of_range";
|
|
14
|
+
byteOffset: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Incremental UTF-8 decoder that handles multi-byte characters
|
|
18
|
+
* split across chunk boundaries.
|
|
19
|
+
*/
|
|
20
|
+
export declare class Utf8Decoder {
|
|
21
|
+
/** Pending bytes from an incomplete multi-byte sequence. */
|
|
22
|
+
private pending;
|
|
23
|
+
/** Expected total length of the current multi-byte sequence. */
|
|
24
|
+
private pendingExpected;
|
|
25
|
+
/** Total bytes processed across all push() calls. */
|
|
26
|
+
private totalOffset;
|
|
27
|
+
private bomBuffer;
|
|
28
|
+
private checkedForBom;
|
|
29
|
+
/**
|
|
30
|
+
* Decode a chunk of bytes, returning decoded text and any errors.
|
|
31
|
+
* Incomplete trailing multi-byte sequences are buffered for the next call.
|
|
32
|
+
*/
|
|
33
|
+
decode(bytes: Uint8Array): DecodeResult;
|
|
34
|
+
/**
|
|
35
|
+
* Check if there are buffered incomplete bytes.
|
|
36
|
+
*/
|
|
37
|
+
hasIncomplete(): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Get the byte offset where the incomplete sequence started.
|
|
40
|
+
*/
|
|
41
|
+
incompleteByteOffset(): number;
|
|
42
|
+
/**
|
|
43
|
+
* Decode a complete multi-byte UTF-8 sequence into a code point.
|
|
44
|
+
* Returns an error for invalid continuation, overlong, or out-of-range sequences.
|
|
45
|
+
*/
|
|
46
|
+
private decodeSequence;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Convert a string to its UTF-8 byte representation.
|
|
50
|
+
* Utility for tests and string-mode push().
|
|
51
|
+
*/
|
|
52
|
+
export declare function stringToUtf8(str: string): Uint8Array;
|
|
53
|
+
//# sourceMappingURL=decoder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decoder.d.ts","sourceRoot":"","sources":["../../src/utf8/decoder.ts"],"names":[],"mappings":"AAeA,2CAA2C;AAC3C,MAAM,WAAW,YAAY;IAC3B,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,yFAAyF;IACzF,QAAQ,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,+DAA+D;IAC/D,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EACA,oBAAoB,GACpB,sBAAsB,GACtB,UAAU,GACV,cAAc,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,qBAAa,WAAW;IACtB,4DAA4D;IAC5D,OAAO,CAAC,OAAO,CAAgB;IAC/B,gEAAgE;IAChE,OAAO,CAAC,eAAe,CAAK;IAC5B,qDAAqD;IACrD,OAAO,CAAC,WAAW,CAAK;IAExB,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,aAAa,CAAS;IAE9B;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,YAAY;IAyMvC;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACH,oBAAoB,IAAI,MAAM;IAK9B;;;OAGG;IACH,OAAO,CAAC,cAAc;CA6DvB;AAoBD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAGpD"}
|
|
@@ -0,0 +1,323 @@
|
|
|
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. Surrogate halves (U+D800-U+DFFF) are not
|
|
284
|
+
// valid Unicode scalar values and must never appear directly encoded in
|
|
285
|
+
// UTF-8 (RFC 3629) - they exist only as a UTF-16 encoding artifact. A
|
|
286
|
+
// 3-byte sequence can arithmetically land in this range (e.g. ED A0 80
|
|
287
|
+
// decodes to U+D800) without tripping the overlong or >0x10FFFF checks,
|
|
288
|
+
// so it needs its own check.
|
|
289
|
+
if (codePoint > 0x10ffff || (codePoint >= 0xd800 && codePoint <= 0xdfff)) {
|
|
290
|
+
return {
|
|
291
|
+
codePoint: 0,
|
|
292
|
+
error: { kind: "out_of_range", byteOffset: offset },
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
return { codePoint };
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Build a string from an array of code points without spreading the whole
|
|
300
|
+
* array as call arguments — a single-call spread hits engine argument-count
|
|
301
|
+
* limits (RangeError: Maximum call stack size exceeded) once codePoints
|
|
302
|
+
* grows past roughly 100k entries, which a single large push() can trigger.
|
|
303
|
+
*/
|
|
304
|
+
function codePointsToString(codePoints) {
|
|
305
|
+
const CHUNK_SIZE = 8192;
|
|
306
|
+
if (codePoints.length <= CHUNK_SIZE) {
|
|
307
|
+
return String.fromCodePoint(...codePoints);
|
|
308
|
+
}
|
|
309
|
+
let text = "";
|
|
310
|
+
for (let i = 0; i < codePoints.length; i += CHUNK_SIZE) {
|
|
311
|
+
text += String.fromCodePoint(...codePoints.slice(i, i + CHUNK_SIZE));
|
|
312
|
+
}
|
|
313
|
+
return text;
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Convert a string to its UTF-8 byte representation.
|
|
317
|
+
* Utility for tests and string-mode push().
|
|
318
|
+
*/
|
|
319
|
+
export function stringToUtf8(str) {
|
|
320
|
+
const encoder = new TextEncoder();
|
|
321
|
+
return encoder.encode(str);
|
|
322
|
+
}
|
|
323
|
+
//# 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
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "prefix-safe-json",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Fail-closed execution integrity for streamed LLM tool calls — reject truncated or unconfirmed arguments before side effects",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"json",
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
],
|
|
18
18
|
"license": "MIT OR Apache-2.0",
|
|
19
19
|
"type": "module",
|
|
20
|
+
"sideEffects": false,
|
|
20
21
|
"repository": {
|
|
21
22
|
"type": "git",
|
|
22
23
|
"url": "git+https://github.com/canblmz1/prefix-safe-json.git"
|