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.
- package/LICENSE-APACHE +114 -0
- package/LICENSE-MIT +21 -0
- package/README.md +169 -0
- package/dist/coordinator/coordinator.d.ts +43 -0
- package/dist/coordinator/coordinator.d.ts.map +1 -0
- package/dist/coordinator/coordinator.js +407 -0
- package/dist/coordinator/coordinator.js.map +1 -0
- package/dist/coordinator/protocol.d.ts +61 -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 +84 -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/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/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/lexer/scanner.d.ts +108 -0
- package/dist/lexer/scanner.d.ts.map +1 -0
- package/dist/lexer/scanner.js +676 -0
- package/dist/lexer/scanner.js.map +1 -0
- package/dist/lexer/states.d.ts +35 -0
- package/dist/lexer/states.d.ts.map +1 -0
- package/dist/lexer/states.js +39 -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 +949 -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/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 +48 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +205 -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 +49 -0
- package/dist/semantic/snapshot.d.ts.map +1 -0
- package/dist/semantic/snapshot.js +228 -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 +318 -0
- package/dist/utf8/decoder.js.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { ProviderName, NormalizedToolStreamEvent, StreamEndReason } from "../coordinator/protocol.js";
|
|
2
|
+
import { ProviderStreamAdapter } from "./adapter.js";
|
|
3
|
+
interface OpenAIFunctionCallDelta {
|
|
4
|
+
name?: string;
|
|
5
|
+
arguments?: string;
|
|
6
|
+
}
|
|
7
|
+
interface OpenAIChoice {
|
|
8
|
+
delta?: {
|
|
9
|
+
function_call?: OpenAIFunctionCallDelta;
|
|
10
|
+
tool_calls?: unknown;
|
|
11
|
+
};
|
|
12
|
+
finish_reason?: string | null;
|
|
13
|
+
}
|
|
14
|
+
export interface OpenAIEvent {
|
|
15
|
+
choices?: OpenAIChoice[];
|
|
16
|
+
type?: string;
|
|
17
|
+
output_index?: number;
|
|
18
|
+
item?: {
|
|
19
|
+
type?: string;
|
|
20
|
+
id?: string;
|
|
21
|
+
call_id?: string;
|
|
22
|
+
name?: string;
|
|
23
|
+
arguments?: string;
|
|
24
|
+
};
|
|
25
|
+
item_id?: string;
|
|
26
|
+
delta?: string;
|
|
27
|
+
arguments?: string;
|
|
28
|
+
response?: {
|
|
29
|
+
status?: string;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export declare class OpenAIStreamAdapter implements ProviderStreamAdapter<unknown> {
|
|
33
|
+
readonly provider: ProviderName;
|
|
34
|
+
private sequence;
|
|
35
|
+
private compatibleAdapter;
|
|
36
|
+
private hasLegacyFunctionCall;
|
|
37
|
+
private legacySourceKey;
|
|
38
|
+
private accumulatedArguments;
|
|
39
|
+
private receivedDeltas;
|
|
40
|
+
private finished;
|
|
41
|
+
push(rawEvent: unknown): readonly NormalizedToolStreamEvent[];
|
|
42
|
+
finish(meta?: {
|
|
43
|
+
reason?: StreamEndReason;
|
|
44
|
+
providerReason?: string;
|
|
45
|
+
}): readonly NormalizedToolStreamEvent[];
|
|
46
|
+
}
|
|
47
|
+
export {};
|
|
48
|
+
//# sourceMappingURL=openai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,yBAAyB,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AACtG,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAGrD,UAAU,uBAAuB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,YAAY;IACpB,KAAK,CAAC,EAAE;QACN,aAAa,CAAC,EAAE,uBAAuB,CAAC;QACxC,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE;QACL,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE;QACT,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,qBAAa,mBAAoB,YAAW,qBAAqB,CAAC,OAAO,CAAC;IACxE,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAY;IAC3C,OAAO,CAAC,QAAQ,CAAK;IAGrB,OAAO,CAAC,iBAAiB,CAAuC;IAGhE,OAAO,CAAC,qBAAqB,CAAS;IACtC,OAAO,CAAC,eAAe,CAA0B;IAGjD,OAAO,CAAC,oBAAoB,CAA6B;IACzD,OAAO,CAAC,cAAc,CAAqB;IAE3C,OAAO,CAAC,QAAQ,CAAS;IAEzB,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,yBAAyB,EAAE;IAkL7D,MAAM,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,eAAe,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,yBAAyB,EAAE;CAiB3G"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { OpenAICompatibleStreamAdapter } from "./openai-compatible.js";
|
|
2
|
+
export class OpenAIStreamAdapter {
|
|
3
|
+
provider = "openai";
|
|
4
|
+
sequence = 0;
|
|
5
|
+
// Delegating tool_calls format to compatible adapter
|
|
6
|
+
compatibleAdapter = new OpenAICompatibleStreamAdapter();
|
|
7
|
+
// For function_call (legacy)
|
|
8
|
+
hasLegacyFunctionCall = false;
|
|
9
|
+
legacySourceKey = "legacy-function-call";
|
|
10
|
+
// For Responses API
|
|
11
|
+
accumulatedArguments = new Map();
|
|
12
|
+
receivedDeltas = new Set();
|
|
13
|
+
finished = false;
|
|
14
|
+
push(rawEvent) {
|
|
15
|
+
if (this.finished)
|
|
16
|
+
return [];
|
|
17
|
+
const events = [];
|
|
18
|
+
if (!rawEvent || typeof rawEvent !== "object") {
|
|
19
|
+
events.push({
|
|
20
|
+
type: "provider_diagnostic",
|
|
21
|
+
sequence: ++this.sequence,
|
|
22
|
+
provider: this.provider,
|
|
23
|
+
code: "E_PROVIDER_EVENT_MALFORMED",
|
|
24
|
+
severity: "error",
|
|
25
|
+
message: "Raw event is not an object",
|
|
26
|
+
});
|
|
27
|
+
return events;
|
|
28
|
+
}
|
|
29
|
+
const chunk = rawEvent;
|
|
30
|
+
// Handle Responses API
|
|
31
|
+
if (chunk.type?.startsWith("response.") || chunk.type === "error") {
|
|
32
|
+
if (chunk.type === "error") {
|
|
33
|
+
events.push({
|
|
34
|
+
type: "provider_stream_end",
|
|
35
|
+
sequence: ++this.sequence,
|
|
36
|
+
provider: this.provider,
|
|
37
|
+
reason: "provider_error",
|
|
38
|
+
providerReason: "error",
|
|
39
|
+
});
|
|
40
|
+
this.finished = true;
|
|
41
|
+
return events;
|
|
42
|
+
}
|
|
43
|
+
if (chunk.type === "response.output_item.added" && chunk.item?.type === "function_call" && chunk.item.id) {
|
|
44
|
+
events.push({
|
|
45
|
+
type: "tool_call_start",
|
|
46
|
+
sequence: ++this.sequence,
|
|
47
|
+
provider: this.provider,
|
|
48
|
+
callRef: { sourceKey: `output-item:${chunk.item.id}` },
|
|
49
|
+
toolCallId: chunk.item.call_id,
|
|
50
|
+
name: chunk.item.name,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
else if (chunk.type === "response.function_call_arguments.delta" && chunk.item_id && chunk.delta) {
|
|
54
|
+
this.receivedDeltas.add(chunk.item_id);
|
|
55
|
+
const acc = this.accumulatedArguments.get(chunk.item_id) ?? "";
|
|
56
|
+
this.accumulatedArguments.set(chunk.item_id, acc + chunk.delta);
|
|
57
|
+
events.push({
|
|
58
|
+
type: "tool_call_arguments_delta",
|
|
59
|
+
sequence: ++this.sequence,
|
|
60
|
+
provider: this.provider,
|
|
61
|
+
callRef: { sourceKey: `output-item:${chunk.item_id}` },
|
|
62
|
+
delta: chunk.delta,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
else if (chunk.type === "response.function_call_arguments.done" && chunk.item_id && chunk.arguments !== undefined) {
|
|
66
|
+
const acc = this.accumulatedArguments.get(chunk.item_id) ?? "";
|
|
67
|
+
const hasDeltas = this.receivedDeltas.has(chunk.item_id);
|
|
68
|
+
if (!hasDeltas && chunk.arguments.length > 0) {
|
|
69
|
+
// No deltas, just final arguments.
|
|
70
|
+
events.push({
|
|
71
|
+
type: "tool_call_arguments_delta",
|
|
72
|
+
sequence: ++this.sequence,
|
|
73
|
+
provider: this.provider,
|
|
74
|
+
callRef: { sourceKey: `output-item:${chunk.item_id}` },
|
|
75
|
+
delta: chunk.arguments,
|
|
76
|
+
});
|
|
77
|
+
this.accumulatedArguments.set(chunk.item_id, chunk.arguments);
|
|
78
|
+
}
|
|
79
|
+
else if (hasDeltas && chunk.arguments !== acc) {
|
|
80
|
+
events.push({
|
|
81
|
+
type: "provider_diagnostic",
|
|
82
|
+
sequence: ++this.sequence,
|
|
83
|
+
provider: this.provider,
|
|
84
|
+
callRef: { sourceKey: `output-item:${chunk.item_id}` },
|
|
85
|
+
code: "E_FINAL_ARGUMENTS_CONFLICT",
|
|
86
|
+
severity: "error",
|
|
87
|
+
message: "Final arguments do not match accumulated deltas",
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else if (chunk.type === "response.output_item.done" && chunk.item?.id) {
|
|
92
|
+
events.push({
|
|
93
|
+
type: "tool_call_end",
|
|
94
|
+
sequence: ++this.sequence,
|
|
95
|
+
provider: this.provider,
|
|
96
|
+
callRef: { sourceKey: `output-item:${chunk.item.id}` },
|
|
97
|
+
reason: "complete", // Default complete for item done
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
else if (chunk.type === "response.completed") {
|
|
101
|
+
events.push({
|
|
102
|
+
type: "provider_stream_end",
|
|
103
|
+
sequence: ++this.sequence,
|
|
104
|
+
provider: this.provider,
|
|
105
|
+
reason: "complete",
|
|
106
|
+
providerReason: chunk.response?.status,
|
|
107
|
+
});
|
|
108
|
+
this.finished = true;
|
|
109
|
+
}
|
|
110
|
+
else if (chunk.type === "response.incomplete") {
|
|
111
|
+
events.push({
|
|
112
|
+
type: "provider_stream_end",
|
|
113
|
+
sequence: ++this.sequence,
|
|
114
|
+
provider: this.provider,
|
|
115
|
+
reason: "cancelled", // Incomplete treated as cancelled
|
|
116
|
+
providerReason: chunk.response?.status,
|
|
117
|
+
});
|
|
118
|
+
this.finished = true;
|
|
119
|
+
}
|
|
120
|
+
return events;
|
|
121
|
+
}
|
|
122
|
+
// Check if it's the standard tool_calls format
|
|
123
|
+
if (chunk.choices?.[0]?.delta?.tool_calls !== undefined) {
|
|
124
|
+
// Delegate to OpenAICompatibleStreamAdapter
|
|
125
|
+
const compatibleEvents = this.compatibleAdapter.push(rawEvent);
|
|
126
|
+
// Map provider name to "openai"
|
|
127
|
+
return compatibleEvents.map(e => ({ ...e, provider: this.provider, sequence: ++this.sequence }));
|
|
128
|
+
}
|
|
129
|
+
// Handle legacy function_call format
|
|
130
|
+
if (Array.isArray(chunk.choices)) {
|
|
131
|
+
for (const choice of chunk.choices) {
|
|
132
|
+
if (choice.delta?.function_call) {
|
|
133
|
+
const fc = choice.delta.function_call;
|
|
134
|
+
if (!this.hasLegacyFunctionCall) {
|
|
135
|
+
this.hasLegacyFunctionCall = true;
|
|
136
|
+
events.push({
|
|
137
|
+
type: "tool_call_start",
|
|
138
|
+
sequence: ++this.sequence,
|
|
139
|
+
provider: this.provider,
|
|
140
|
+
callRef: { sourceKey: this.legacySourceKey },
|
|
141
|
+
toolIndex: 0,
|
|
142
|
+
name: fc.name,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
else if (fc.name) {
|
|
146
|
+
events.push({
|
|
147
|
+
type: "tool_call_name_delta",
|
|
148
|
+
sequence: ++this.sequence,
|
|
149
|
+
provider: this.provider,
|
|
150
|
+
callRef: { sourceKey: this.legacySourceKey },
|
|
151
|
+
delta: fc.name,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
if (fc.arguments) {
|
|
155
|
+
events.push({
|
|
156
|
+
type: "tool_call_arguments_delta",
|
|
157
|
+
sequence: ++this.sequence,
|
|
158
|
+
provider: this.provider,
|
|
159
|
+
callRef: { sourceKey: this.legacySourceKey },
|
|
160
|
+
delta: fc.arguments,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (choice.finish_reason != null) {
|
|
165
|
+
let reason = "unknown";
|
|
166
|
+
if (choice.finish_reason === "stop" || choice.finish_reason === "function_call" || choice.finish_reason === "tool_calls") {
|
|
167
|
+
reason = "complete";
|
|
168
|
+
}
|
|
169
|
+
else if (choice.finish_reason === "length") {
|
|
170
|
+
reason = "length";
|
|
171
|
+
}
|
|
172
|
+
else if (choice.finish_reason === "cancelled") {
|
|
173
|
+
reason = "cancelled";
|
|
174
|
+
}
|
|
175
|
+
events.push({
|
|
176
|
+
type: "provider_stream_end",
|
|
177
|
+
sequence: ++this.sequence,
|
|
178
|
+
provider: this.provider,
|
|
179
|
+
reason,
|
|
180
|
+
providerReason: choice.finish_reason,
|
|
181
|
+
});
|
|
182
|
+
this.finished = true;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return events;
|
|
187
|
+
}
|
|
188
|
+
finish(meta) {
|
|
189
|
+
if (this.finished)
|
|
190
|
+
return [];
|
|
191
|
+
this.finished = true;
|
|
192
|
+
const compatibleEvents = this.compatibleAdapter.finish(meta);
|
|
193
|
+
if (compatibleEvents.length > 0 && !this.hasLegacyFunctionCall) {
|
|
194
|
+
return compatibleEvents.map(e => ({ ...e, provider: this.provider, sequence: ++this.sequence }));
|
|
195
|
+
}
|
|
196
|
+
return [{
|
|
197
|
+
type: "provider_stream_end",
|
|
198
|
+
sequence: ++this.sequence,
|
|
199
|
+
provider: this.provider,
|
|
200
|
+
reason: meta?.reason ?? "unknown",
|
|
201
|
+
providerReason: meta?.providerReason,
|
|
202
|
+
}];
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ProviderName, NormalizedToolStreamEvent, StreamEndReason } from "../coordinator/protocol.js";
|
|
2
|
+
import { ProviderStreamAdapter } from "./adapter.js";
|
|
3
|
+
export interface OpenRouterChoice {
|
|
4
|
+
index?: number;
|
|
5
|
+
delta?: {
|
|
6
|
+
tool_calls?: Array<{
|
|
7
|
+
index?: number;
|
|
8
|
+
id?: string;
|
|
9
|
+
type?: string;
|
|
10
|
+
function?: {
|
|
11
|
+
name?: string;
|
|
12
|
+
arguments?: string;
|
|
13
|
+
};
|
|
14
|
+
}>;
|
|
15
|
+
reasoning?: string;
|
|
16
|
+
};
|
|
17
|
+
finish_reason?: string | null;
|
|
18
|
+
error?: unknown;
|
|
19
|
+
}
|
|
20
|
+
export interface OpenRouterEvent {
|
|
21
|
+
choices?: OpenRouterChoice[];
|
|
22
|
+
error?: unknown;
|
|
23
|
+
}
|
|
24
|
+
export declare class OpenRouterStreamAdapter implements ProviderStreamAdapter<unknown> {
|
|
25
|
+
readonly provider: ProviderName;
|
|
26
|
+
private sequence;
|
|
27
|
+
private compatibleAdapter;
|
|
28
|
+
private finished;
|
|
29
|
+
push(rawEvent: unknown): readonly NormalizedToolStreamEvent[];
|
|
30
|
+
finish(meta?: {
|
|
31
|
+
reason?: StreamEndReason;
|
|
32
|
+
providerReason?: string;
|
|
33
|
+
}): readonly NormalizedToolStreamEvent[];
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=openrouter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openrouter.d.ts","sourceRoot":"","sources":["../../src/providers/openrouter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,yBAAyB,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AACtG,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAGrD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE;QACN,UAAU,CAAC,EAAE,KAAK,CAAC;YACjB,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,EAAE,CAAC,EAAE,MAAM,CAAC;YACZ,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,QAAQ,CAAC,EAAE;gBAAE,IAAI,CAAC,EAAE,MAAM,CAAC;gBAAC,SAAS,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC;SAClD,CAAC,CAAC;QACH,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,qBAAa,uBAAwB,YAAW,qBAAqB,CAAC,OAAO,CAAC;IAC5E,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAgB;IAC/C,OAAO,CAAC,QAAQ,CAAK;IAGrB,OAAO,CAAC,iBAAiB,CAAuC;IAChE,OAAO,CAAC,QAAQ,CAAS;IAEzB,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,yBAAyB,EAAE;IA4C7D,MAAM,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,eAAe,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,yBAAyB,EAAE;CAO3G"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { OpenAICompatibleStreamAdapter } from "./openai-compatible.js";
|
|
2
|
+
export class OpenRouterStreamAdapter {
|
|
3
|
+
provider = "openrouter";
|
|
4
|
+
sequence = 0;
|
|
5
|
+
// Delegate standard tool_call formats to compatible adapter
|
|
6
|
+
compatibleAdapter = new OpenAICompatibleStreamAdapter();
|
|
7
|
+
finished = false;
|
|
8
|
+
push(rawEvent) {
|
|
9
|
+
if (this.finished)
|
|
10
|
+
return [];
|
|
11
|
+
const events = [];
|
|
12
|
+
if (!rawEvent || typeof rawEvent !== "object") {
|
|
13
|
+
events.push({
|
|
14
|
+
type: "provider_diagnostic",
|
|
15
|
+
sequence: ++this.sequence,
|
|
16
|
+
provider: this.provider,
|
|
17
|
+
code: "E_PROVIDER_EVENT_MALFORMED",
|
|
18
|
+
severity: "error",
|
|
19
|
+
message: "Raw event is not an object",
|
|
20
|
+
});
|
|
21
|
+
return events;
|
|
22
|
+
}
|
|
23
|
+
const chunk = rawEvent;
|
|
24
|
+
// Check for provider-level errors
|
|
25
|
+
if (chunk.error) {
|
|
26
|
+
events.push({
|
|
27
|
+
type: "provider_diagnostic",
|
|
28
|
+
sequence: ++this.sequence,
|
|
29
|
+
provider: this.provider,
|
|
30
|
+
code: "E_PROVIDER_ERROR",
|
|
31
|
+
severity: "error",
|
|
32
|
+
message: typeof chunk.error === "string" ? chunk.error : JSON.stringify(chunk.error)
|
|
33
|
+
});
|
|
34
|
+
const compatibleEvents = this.compatibleAdapter.finish({ reason: "provider_error", providerReason: "error" });
|
|
35
|
+
for (const e of compatibleEvents) {
|
|
36
|
+
events.push({ ...e, provider: this.provider, sequence: ++this.sequence });
|
|
37
|
+
}
|
|
38
|
+
this.finished = true;
|
|
39
|
+
return events;
|
|
40
|
+
}
|
|
41
|
+
const compatibleEvents = this.compatibleAdapter.push(chunk);
|
|
42
|
+
for (const e of compatibleEvents) {
|
|
43
|
+
events.push({ ...e, provider: this.provider, sequence: ++this.sequence });
|
|
44
|
+
}
|
|
45
|
+
return events;
|
|
46
|
+
}
|
|
47
|
+
finish(meta) {
|
|
48
|
+
if (this.finished)
|
|
49
|
+
return [];
|
|
50
|
+
this.finished = true;
|
|
51
|
+
const compatibleEvents = this.compatibleAdapter.finish(meta);
|
|
52
|
+
return compatibleEvents.map(e => ({ ...e, provider: this.provider, sequence: ++this.sequence }));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=openrouter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openrouter.js","sourceRoot":"","sources":["../../src/providers/openrouter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AAsBvE,MAAM,OAAO,uBAAuB;IACzB,QAAQ,GAAiB,YAAY,CAAC;IACvC,QAAQ,GAAG,CAAC,CAAC;IAErB,4DAA4D;IACpD,iBAAiB,GAAG,IAAI,6BAA6B,EAAE,CAAC;IACxD,QAAQ,GAAG,KAAK,CAAC;IAEzB,IAAI,CAAC,QAAiB;QACpB,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,EAAE,CAAC;QAE7B,MAAM,MAAM,GAAgC,EAAE,CAAC;QAE/C,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC9C,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,qBAAqB;gBAC3B,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ;gBACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,IAAI,EAAE,4BAA4B;gBAClC,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,4BAA4B;aACtC,CAAC,CAAC;YACH,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,KAAK,GAAG,QAA2B,CAAC;QAE1C,kCAAkC;QAClC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,qBAAqB;gBAC3B,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ;gBACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,IAAI,EAAE,kBAAkB;gBACxB,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;aACrF,CAAC,CAAC;YACH,MAAM,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,CAAC;YAC9G,KAAK,MAAM,CAAC,IAAI,gBAAgB,EAAE,CAAC;gBAChC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC7E,CAAC;YACD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,OAAO,MAAM,CAAC;QACjB,CAAC;QAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5D,KAAK,MAAM,CAAC,IAAI,gBAAgB,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,IAA4D;QACjE,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QAErB,MAAM,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7D,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACnG,CAAC;CACF"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { ParserEvent, JsonValue, Diagnostic, RepairAction } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Manages the monotonic event queue.
|
|
4
|
+
* Events are never retracted once emitted.
|
|
5
|
+
*/
|
|
6
|
+
export declare class EventBuilder {
|
|
7
|
+
private queue;
|
|
8
|
+
private sequence;
|
|
9
|
+
private maxQueued;
|
|
10
|
+
private terminal;
|
|
11
|
+
constructor(maxQueuedEvents: number);
|
|
12
|
+
/** Current sequence number. */
|
|
13
|
+
get currentSequence(): number;
|
|
14
|
+
get isTerminal(): boolean;
|
|
15
|
+
/** Number of events in the queue. */
|
|
16
|
+
get queueLength(): number;
|
|
17
|
+
/**
|
|
18
|
+
* Emit a value_committed event.
|
|
19
|
+
*/
|
|
20
|
+
emitValueCommitted(path: string, value: JsonValue, byteRange: readonly [number, number]): void;
|
|
21
|
+
/**
|
|
22
|
+
* Emit a container_closed event.
|
|
23
|
+
*/
|
|
24
|
+
emitContainerClosed(path: string, container: "object" | "array"): void;
|
|
25
|
+
/**
|
|
26
|
+
* Emit a repair_applied event.
|
|
27
|
+
*/
|
|
28
|
+
emitRepairApplied(repair: RepairAction): void;
|
|
29
|
+
/**
|
|
30
|
+
* Emit a diagnostic event.
|
|
31
|
+
*/
|
|
32
|
+
emitDiagnostic(diagnostic: Diagnostic): void;
|
|
33
|
+
/**
|
|
34
|
+
* Emit a document_complete event.
|
|
35
|
+
*/
|
|
36
|
+
emitDocumentComplete(executable: boolean): void;
|
|
37
|
+
/**
|
|
38
|
+
* Emit a stream_finished event.
|
|
39
|
+
*/
|
|
40
|
+
emitStreamFinished(outcome: "valid" | "truncated" | "salvaged" | "invalid"): void;
|
|
41
|
+
/**
|
|
42
|
+
* Drain all pending events and clear the queue.
|
|
43
|
+
* Returns a frozen array.
|
|
44
|
+
*/
|
|
45
|
+
drain(): readonly ParserEvent[];
|
|
46
|
+
/**
|
|
47
|
+
* Get the number of events emitted during the current push cycle.
|
|
48
|
+
* Call resetPushCount() before push processing.
|
|
49
|
+
*/
|
|
50
|
+
private pushEmitCount;
|
|
51
|
+
resetPushCount(): void;
|
|
52
|
+
get emittedDuringPush(): number;
|
|
53
|
+
private enqueue;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/semantic/builder.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACT,UAAU,EACV,YAAY,EACb,MAAM,aAAa,CAAC;AAErB;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAS;gBAEb,eAAe,EAAE,MAAM;IAInC,+BAA+B;IAC/B,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,qCAAqC;IACrC,IAAI,WAAW,IAAI,MAAM,CAExB;IAED;;OAEG;IACH,kBAAkB,CAChB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,SAAS,EAChB,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,IAAI;IAWP;;OAEG;IACH,mBAAmB,CACjB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,QAAQ,GAAG,OAAO,GAC5B,IAAI;IASP;;OAEG;IACH,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAQ7C;;OAEG;IACH,cAAc,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI;IAQ5C;;OAEG;IACH,oBAAoB,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI;IAQ/C;;OAEG;IACH,kBAAkB,CAChB,OAAO,EAAE,OAAO,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,GACtD,IAAI;IAQP;;;OAGG;IACH,KAAK,IAAI,SAAS,WAAW,EAAE;IAM/B;;;OAGG;IACH,OAAO,CAAC,aAAa,CAAK;IAE1B,cAAc,IAAI,IAAI;IAItB,IAAI,iBAAiB,IAAI,MAAM,CAE9B;IAED,OAAO,CAAC,OAAO;CAwBhB"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Semantic Event Builder
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
//
|
|
5
|
+
// Accumulates parser events and manages the event queue.
|
|
6
|
+
// Events are emitted monotonically with increasing sequence numbers.
|
|
7
|
+
// drainEvents() returns pending events and clears the queue.
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
/**
|
|
10
|
+
* Manages the monotonic event queue.
|
|
11
|
+
* Events are never retracted once emitted.
|
|
12
|
+
*/
|
|
13
|
+
export class EventBuilder {
|
|
14
|
+
queue = [];
|
|
15
|
+
sequence = 0;
|
|
16
|
+
maxQueued;
|
|
17
|
+
terminal = false;
|
|
18
|
+
constructor(maxQueuedEvents) {
|
|
19
|
+
this.maxQueued = maxQueuedEvents;
|
|
20
|
+
}
|
|
21
|
+
/** Current sequence number. */
|
|
22
|
+
get currentSequence() {
|
|
23
|
+
return this.sequence;
|
|
24
|
+
}
|
|
25
|
+
get isTerminal() {
|
|
26
|
+
return this.terminal;
|
|
27
|
+
}
|
|
28
|
+
/** Number of events in the queue. */
|
|
29
|
+
get queueLength() {
|
|
30
|
+
return this.queue.length;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Emit a value_committed event.
|
|
34
|
+
*/
|
|
35
|
+
emitValueCommitted(path, value, byteRange) {
|
|
36
|
+
this.enqueue({
|
|
37
|
+
type: "value_committed",
|
|
38
|
+
sequence: this.sequence++,
|
|
39
|
+
path,
|
|
40
|
+
operation: "add",
|
|
41
|
+
value,
|
|
42
|
+
byteRange,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Emit a container_closed event.
|
|
47
|
+
*/
|
|
48
|
+
emitContainerClosed(path, container) {
|
|
49
|
+
this.enqueue({
|
|
50
|
+
type: "container_closed",
|
|
51
|
+
sequence: this.sequence++,
|
|
52
|
+
path,
|
|
53
|
+
container,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Emit a repair_applied event.
|
|
58
|
+
*/
|
|
59
|
+
emitRepairApplied(repair) {
|
|
60
|
+
this.enqueue({
|
|
61
|
+
type: "repair_applied",
|
|
62
|
+
sequence: this.sequence++,
|
|
63
|
+
repair,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Emit a diagnostic event.
|
|
68
|
+
*/
|
|
69
|
+
emitDiagnostic(diagnostic) {
|
|
70
|
+
this.enqueue({
|
|
71
|
+
type: "diagnostic",
|
|
72
|
+
sequence: this.sequence++,
|
|
73
|
+
diagnostic,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Emit a document_complete event.
|
|
78
|
+
*/
|
|
79
|
+
emitDocumentComplete(executable) {
|
|
80
|
+
this.enqueue({
|
|
81
|
+
type: "document_complete",
|
|
82
|
+
sequence: this.sequence++,
|
|
83
|
+
executable,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Emit a stream_finished event.
|
|
88
|
+
*/
|
|
89
|
+
emitStreamFinished(outcome) {
|
|
90
|
+
this.enqueue({
|
|
91
|
+
type: "stream_finished",
|
|
92
|
+
sequence: this.sequence++,
|
|
93
|
+
outcome,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Drain all pending events and clear the queue.
|
|
98
|
+
* Returns a frozen array.
|
|
99
|
+
*/
|
|
100
|
+
drain() {
|
|
101
|
+
const events = this.queue;
|
|
102
|
+
this.queue = [];
|
|
103
|
+
return Object.freeze(events);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Get the number of events emitted during the current push cycle.
|
|
107
|
+
* Call resetPushCount() before push processing.
|
|
108
|
+
*/
|
|
109
|
+
pushEmitCount = 0;
|
|
110
|
+
resetPushCount() {
|
|
111
|
+
this.pushEmitCount = 0;
|
|
112
|
+
}
|
|
113
|
+
get emittedDuringPush() {
|
|
114
|
+
return this.pushEmitCount;
|
|
115
|
+
}
|
|
116
|
+
enqueue(event) {
|
|
117
|
+
if (this.terminal)
|
|
118
|
+
return; // Stop accepting semantic progress, don't report as emitted
|
|
119
|
+
if (this.queue.length >= this.maxQueued) {
|
|
120
|
+
this.terminal = true;
|
|
121
|
+
// Emit terminal diagnostic if capacity theoretically permitted (i.e. we just push one more)
|
|
122
|
+
this.queue.push({
|
|
123
|
+
type: "diagnostic",
|
|
124
|
+
sequence: this.sequence++,
|
|
125
|
+
diagnostic: {
|
|
126
|
+
code: "E_LIMIT_EVENT_QUEUE",
|
|
127
|
+
severity: "fatal",
|
|
128
|
+
byteOffset: 0, // Event builder doesn't track exact byte offset
|
|
129
|
+
recoverable: false,
|
|
130
|
+
message: "Event queue capacity exceeded",
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
this.pushEmitCount++;
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
this.queue.push(event);
|
|
137
|
+
this.pushEmitCount++;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/semantic/builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/semantic/events.ts"],"names":[],"mappings":"AAIA,YAAY,EACV,WAAW,EACX,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/semantic/events.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,qDAAqD;AACrD,8EAA8E"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { JsonValue, ParserEvent } from "../types.js";
|
|
2
|
+
import type { GrammarFrame } from "../grammar/frame.js";
|
|
3
|
+
/**
|
|
4
|
+
* Maintains the stable value by processing committed events.
|
|
5
|
+
* Only committed values appear in the stable value.
|
|
6
|
+
*/
|
|
7
|
+
export declare class SnapshotBuilder {
|
|
8
|
+
private root;
|
|
9
|
+
private hasRoot;
|
|
10
|
+
/**
|
|
11
|
+
* Maps each open container's grammar frame to its corresponding node in
|
|
12
|
+
* the stable-value tree, so a newly-opened child container can attach
|
|
13
|
+
* directly to its parent in O(1) via initContainerForFrame() instead of
|
|
14
|
+
* re-parsing a JSON Pointer path string and re-walking from the root on
|
|
15
|
+
* every single container open (see initContainerForFrame).
|
|
16
|
+
*/
|
|
17
|
+
private frameNodes;
|
|
18
|
+
/**
|
|
19
|
+
* Process a value_committed event and integrate it into the stable value.
|
|
20
|
+
*/
|
|
21
|
+
processEvent(event: ParserEvent): void;
|
|
22
|
+
/**
|
|
23
|
+
* Initialize the root as an object container.
|
|
24
|
+
* `frame` is registered so child containers can find it in O(1).
|
|
25
|
+
*/
|
|
26
|
+
initRootObject(frame?: GrammarFrame): void;
|
|
27
|
+
/**
|
|
28
|
+
* Initialize the root as an array container.
|
|
29
|
+
* `frame` is registered so child containers can find it in O(1).
|
|
30
|
+
*/
|
|
31
|
+
initRootArray(frame?: GrammarFrame): void;
|
|
32
|
+
/**
|
|
33
|
+
* Initialize a nested container for the given (already-pushed) grammar
|
|
34
|
+
* frame, attaching it directly to its parent's node.
|
|
35
|
+
*
|
|
36
|
+
* Uses frame._parent/_segment (see grammar/frame.ts) plus the frameNodes
|
|
37
|
+
* map instead of re-parsing frame.path and walking the tree from the
|
|
38
|
+
* root on every call — that walk is O(depth), and calling it once for
|
|
39
|
+
* every one of N nested containers made opening N levels cost O(N^2)
|
|
40
|
+
* total, independent of the grammar-stack path-string fix.
|
|
41
|
+
*/
|
|
42
|
+
initContainerForFrame(frame: GrammarFrame, type: "object" | "array"): void;
|
|
43
|
+
/**
|
|
44
|
+
* Get a deep clone of the current stable value.
|
|
45
|
+
*/
|
|
46
|
+
getStableValue(): JsonValue | undefined;
|
|
47
|
+
get hasRootValue(): boolean;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/semantic/snapshot.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAyB,WAAW,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,IAAI,CAAoC;IAChD,OAAO,CAAC,OAAO,CAAS;IAExB;;;;;;OAMG;IACH,OAAO,CAAC,UAAU,CAA0C;IAE5D;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IA+CtC;;;OAGG;IACH,cAAc,CAAC,KAAK,CAAC,EAAE,YAAY,GAAG,IAAI;IAQ1C;;;OAGG;IACH,aAAa,CAAC,KAAK,CAAC,EAAE,YAAY,GAAG,IAAI;IAQzC;;;;;;;;;OASG;IACH,qBAAqB,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,IAAI;IA2B1E;;OAEG;IACH,cAAc,IAAI,SAAS,GAAG,SAAS;IAKvC,IAAI,YAAY,IAAI,OAAO,CAE1B;CACF"}
|