prefix-safe-json 0.1.0 → 0.1.1

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 (133) hide show
  1. package/dist/coordinator/coordinator.d.ts +53 -0
  2. package/dist/coordinator/coordinator.d.ts.map +1 -0
  3. package/dist/coordinator/coordinator.js +448 -0
  4. package/dist/coordinator/coordinator.js.map +1 -0
  5. package/dist/coordinator/diagnostic-codes.d.ts +11 -0
  6. package/dist/coordinator/diagnostic-codes.d.ts.map +1 -0
  7. package/dist/coordinator/diagnostic-codes.js +22 -0
  8. package/dist/coordinator/diagnostic-codes.js.map +1 -0
  9. package/dist/coordinator/protocol.d.ts +61 -0
  10. package/dist/coordinator/protocol.d.ts.map +1 -0
  11. package/dist/coordinator/protocol.js +2 -0
  12. package/dist/coordinator/protocol.js.map +1 -0
  13. package/dist/coordinator/types.d.ts +104 -0
  14. package/dist/coordinator/types.d.ts.map +1 -0
  15. package/dist/coordinator/types.js +7 -0
  16. package/dist/coordinator/types.js.map +1 -0
  17. package/dist/diagnostics/codes.d.ts +24 -0
  18. package/dist/diagnostics/codes.d.ts.map +1 -0
  19. package/dist/diagnostics/codes.js +28 -0
  20. package/dist/diagnostics/codes.js.map +1 -0
  21. package/dist/diagnostics/factory.d.ts +8 -0
  22. package/dist/diagnostics/factory.d.ts.map +1 -0
  23. package/dist/diagnostics/factory.js +17 -0
  24. package/dist/diagnostics/factory.js.map +1 -0
  25. package/dist/gate/decide.d.ts +27 -0
  26. package/dist/gate/decide.d.ts.map +1 -0
  27. package/dist/gate/decide.js +138 -0
  28. package/dist/gate/decide.js.map +1 -0
  29. package/dist/gate/gate.d.ts +25 -0
  30. package/dist/gate/gate.d.ts.map +1 -0
  31. package/dist/gate/gate.js +96 -0
  32. package/dist/gate/gate.js.map +1 -0
  33. package/dist/gate/types.d.ts +184 -0
  34. package/dist/gate/types.d.ts.map +1 -0
  35. package/dist/gate/types.js +2 -0
  36. package/dist/gate/types.js.map +1 -0
  37. package/dist/grammar/frame.d.ts +58 -0
  38. package/dist/grammar/frame.d.ts.map +1 -0
  39. package/dist/grammar/frame.js +87 -0
  40. package/dist/grammar/frame.js.map +1 -0
  41. package/dist/grammar/pointer.d.ts +10 -0
  42. package/dist/grammar/pointer.d.ts.map +1 -0
  43. package/dist/grammar/pointer.js +20 -0
  44. package/dist/grammar/pointer.js.map +1 -0
  45. package/dist/grammar/stack.d.ts +73 -0
  46. package/dist/grammar/stack.d.ts.map +1 -0
  47. package/dist/grammar/stack.js +168 -0
  48. package/dist/grammar/stack.js.map +1 -0
  49. package/dist/guard/ai-sdk.d.ts +48 -0
  50. package/dist/guard/ai-sdk.d.ts.map +1 -0
  51. package/dist/guard/ai-sdk.js +51 -0
  52. package/dist/guard/ai-sdk.js.map +1 -0
  53. package/dist/guard/provider-guard.d.ts +4 -0
  54. package/dist/guard/provider-guard.d.ts.map +1 -0
  55. package/dist/guard/provider-guard.js +38 -0
  56. package/dist/guard/provider-guard.js.map +1 -0
  57. package/dist/guard/types.d.ts +48 -0
  58. package/dist/guard/types.d.ts.map +1 -0
  59. package/dist/guard/types.js +2 -0
  60. package/dist/guard/types.js.map +1 -0
  61. package/dist/index.d.ts +45 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +45 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/lexer/scanner.d.ts +106 -0
  66. package/dist/lexer/scanner.d.ts.map +1 -0
  67. package/dist/lexer/scanner.js +658 -0
  68. package/dist/lexer/scanner.js.map +1 -0
  69. package/dist/lexer/states.d.ts +31 -0
  70. package/dist/lexer/states.d.ts.map +1 -0
  71. package/dist/lexer/states.js +35 -0
  72. package/dist/lexer/states.js.map +1 -0
  73. package/dist/lexer/tokens.d.ts +22 -0
  74. package/dist/lexer/tokens.d.ts.map +1 -0
  75. package/dist/lexer/tokens.js +22 -0
  76. package/dist/lexer/tokens.js.map +1 -0
  77. package/dist/limits.d.ts +14 -0
  78. package/dist/limits.d.ts.map +1 -0
  79. package/dist/limits.js +23 -0
  80. package/dist/limits.js.map +1 -0
  81. package/dist/parser.d.ts +6 -0
  82. package/dist/parser.d.ts.map +1 -0
  83. package/dist/parser.js +922 -0
  84. package/dist/parser.js.map +1 -0
  85. package/dist/providers/adapter.d.ts +10 -0
  86. package/dist/providers/adapter.d.ts.map +1 -0
  87. package/dist/providers/adapter.js +2 -0
  88. package/dist/providers/adapter.js.map +1 -0
  89. package/dist/providers/ai-sdk.d.ts +58 -0
  90. package/dist/providers/ai-sdk.d.ts.map +1 -0
  91. package/dist/providers/ai-sdk.js +212 -0
  92. package/dist/providers/ai-sdk.js.map +1 -0
  93. package/dist/providers/anthropic.d.ts +45 -0
  94. package/dist/providers/anthropic.d.ts.map +1 -0
  95. package/dist/providers/anthropic.js +112 -0
  96. package/dist/providers/anthropic.js.map +1 -0
  97. package/dist/providers/gemini.d.ts +31 -0
  98. package/dist/providers/gemini.d.ts.map +1 -0
  99. package/dist/providers/gemini.js +94 -0
  100. package/dist/providers/gemini.js.map +1 -0
  101. package/dist/providers/openai-compatible.d.ts +33 -0
  102. package/dist/providers/openai-compatible.d.ts.map +1 -0
  103. package/dist/providers/openai-compatible.js +160 -0
  104. package/dist/providers/openai-compatible.js.map +1 -0
  105. package/dist/providers/openai.d.ts +55 -0
  106. package/dist/providers/openai.d.ts.map +1 -0
  107. package/dist/providers/openai.js +263 -0
  108. package/dist/providers/openai.js.map +1 -0
  109. package/dist/providers/openrouter.d.ts +35 -0
  110. package/dist/providers/openrouter.d.ts.map +1 -0
  111. package/dist/providers/openrouter.js +55 -0
  112. package/dist/providers/openrouter.js.map +1 -0
  113. package/dist/semantic/builder.d.ts +55 -0
  114. package/dist/semantic/builder.d.ts.map +1 -0
  115. package/dist/semantic/builder.js +140 -0
  116. package/dist/semantic/builder.js.map +1 -0
  117. package/dist/semantic/events.d.ts +2 -0
  118. package/dist/semantic/events.d.ts.map +1 -0
  119. package/dist/semantic/events.js +5 -0
  120. package/dist/semantic/events.js.map +1 -0
  121. package/dist/semantic/snapshot.d.ts +56 -0
  122. package/dist/semantic/snapshot.d.ts.map +1 -0
  123. package/dist/semantic/snapshot.js +230 -0
  124. package/dist/semantic/snapshot.js.map +1 -0
  125. package/dist/types.d.ts +156 -0
  126. package/dist/types.d.ts.map +1 -0
  127. package/dist/types.js +5 -0
  128. package/dist/types.js.map +1 -0
  129. package/dist/utf8/decoder.d.ts +53 -0
  130. package/dist/utf8/decoder.d.ts.map +1 -0
  131. package/dist/utf8/decoder.js +323 -0
  132. package/dist/utf8/decoder.js.map +1 -0
  133. package/package.json +1 -1
@@ -0,0 +1,53 @@
1
+ import { ParserOptions } from "../types.js";
2
+ import { NormalizedToolStreamEvent, StreamEndReason } from "./protocol.js";
3
+ import { ToolCallStreamCoordinator, ToolCallCoordinatorSnapshot, ToolCallCoordinatorEvent, ToolCallCoordinatorFinalResult, CoordinatorPushResult, CoordinatorLimits, JsonSchemaLike } from "./types.js";
4
+ export declare class DefaultToolCallStreamCoordinator implements ToolCallStreamCoordinator {
5
+ private readonly limits;
6
+ private readonly parserOptions;
7
+ private readonly toolValidators;
8
+ private calls;
9
+ private sourceKeyToInternalId;
10
+ private callCounter;
11
+ private eventQueue;
12
+ private diagnostics;
13
+ private eventsProcessed;
14
+ private globalSequence;
15
+ private isFinished;
16
+ /**
17
+ * @param limits Coordinator-level limits (concurrent tool calls, tool name
18
+ * size, etc.) — distinct from `parserOptions`, which configures each
19
+ * underlying per-call IncrementalJsonParser (limits, repairs). Previously
20
+ * there was no way to pass the latter through at all; every parser the
21
+ * coordinator created was hardcoded to library defaults.
22
+ * @param toolSchemas Optional JSON Schema (draft-07) per tool name. When a
23
+ * call for a registered tool reaches outcome "complete", its
24
+ * `stableValue` is validated against the schema. Structural
25
+ * prefix-safety (no truncated/fabricated values) and schema validity
26
+ * are independent concerns — a value can be genuinely complete and
27
+ * still not match what the tool declared it needs (wrong type, missing
28
+ * required field the model never provided at all). Both must hold for
29
+ * `executable` to be true. Schemas are compiled eagerly here so a
30
+ * malformed schema fails fast at construction, not mid-stream.
31
+ */
32
+ constructor(limits?: Partial<CoordinatorLimits>, parserOptions?: ParserOptions, toolSchemas?: Record<string, JsonSchemaLike>);
33
+ push(event: NormalizedToolStreamEvent): CoordinatorPushResult;
34
+ private handleStart;
35
+ private handleIdentity;
36
+ private handleNameDelta;
37
+ private handleArgumentsDelta;
38
+ private handleCallEnd;
39
+ private finishCall;
40
+ private hasCallConflict;
41
+ private handleProviderDiagnostic;
42
+ private handleStreamEnd;
43
+ private getCall;
44
+ private addDiagnostic;
45
+ snapshot(): ToolCallCoordinatorSnapshot;
46
+ drainEvents(): readonly ToolCallCoordinatorEvent[];
47
+ finish(meta?: {
48
+ reason?: StreamEndReason;
49
+ providerReason?: string;
50
+ }): ToolCallCoordinatorFinalResult;
51
+ }
52
+ export declare function createToolCallStreamCoordinator(limits?: Partial<CoordinatorLimits>, parserOptions?: ParserOptions, toolSchemas?: Record<string, JsonSchemaLike>): ToolCallStreamCoordinator;
53
+ //# sourceMappingURL=coordinator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coordinator.d.ts","sourceRoot":"","sources":["../../src/coordinator/coordinator.ts"],"names":[],"mappings":"AACA,OAAO,EAAyB,aAAa,EAAE,MAAM,aAAa,CAAC;AAEnE,OAAO,EAAE,yBAAyB,EAAgB,eAAe,EAAE,MAAM,eAAe,CAAC;AACzF,OAAO,EACL,yBAAyB,EACzB,2BAA2B,EAC3B,wBAAwB,EACxB,8BAA8B,EAC9B,qBAAqB,EACrB,iBAAiB,EAIjB,cAAc,EACf,MAAM,YAAY,CAAC;AAyBpB,qBAAa,gCAAiC,YAAW,yBAAyB;IAChF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA4B;IAC1D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgC;IAC/D,OAAO,CAAC,KAAK,CAAgD;IAC7D,OAAO,CAAC,qBAAqB,CAAkC;IAC/D,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,UAAU,CAAkC;IACpD,OAAO,CAAC,WAAW,CAA+B;IAClD,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,UAAU,CAAS;IAE3B;;;;;;;;;;;;;;;OAeG;gBAED,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,EACnC,aAAa,CAAC,EAAE,aAAa,EAC7B,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC;IAa9C,IAAI,CAAC,KAAK,EAAE,yBAAyB,GAAG,qBAAqB;IAgD7D,OAAO,CAAC,WAAW;IAqDnB,OAAO,CAAC,cAAc;IAgDtB,OAAO,CAAC,eAAe;IAqCvB,OAAO,CAAC,oBAAoB;IA8B5B,OAAO,CAAC,aAAa;IA6BrB,OAAO,CAAC,UAAU;IAoElB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,wBAAwB;IAUhC,OAAO,CAAC,eAAe;IAyBvB,OAAO,CAAC,OAAO;IAcf,OAAO,CAAC,aAAa;IASrB,QAAQ,IAAI,2BAA2B;IAmBvC,WAAW,IAAI,SAAS,wBAAwB,EAAE;IAMlD,MAAM,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,eAAe,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,8BAA8B;CAcrG;AAED,wBAAgB,+BAA+B,CAC7C,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,EACnC,aAAa,CAAC,EAAE,aAAa,EAC7B,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,GAC3C,yBAAyB,CAE3B"}
@@ -0,0 +1,448 @@
1
+ import { Ajv } from "ajv";
2
+ import { createParser } from "../parser.js";
3
+ import { DEFAULT_COORDINATOR_LIMITS } from "./types.js";
4
+ class CoordinatorCallState {
5
+ internalId;
6
+ provider;
7
+ toolCallId;
8
+ toolIndex;
9
+ name;
10
+ nameComplete = false;
11
+ argumentStreamClosed = false;
12
+ parser;
13
+ status = "collecting";
14
+ schemaValid;
15
+ constructor(internalId, provider, parser) {
16
+ this.internalId = internalId;
17
+ this.provider = provider;
18
+ this.parser = parser;
19
+ }
20
+ }
21
+ export class DefaultToolCallStreamCoordinator {
22
+ limits;
23
+ parserOptions;
24
+ toolValidators;
25
+ calls = new Map();
26
+ sourceKeyToInternalId = new Map();
27
+ callCounter = 0;
28
+ eventQueue = [];
29
+ diagnostics = [];
30
+ eventsProcessed = 0;
31
+ globalSequence = 0;
32
+ isFinished = false;
33
+ /**
34
+ * @param limits Coordinator-level limits (concurrent tool calls, tool name
35
+ * size, etc.) — distinct from `parserOptions`, which configures each
36
+ * underlying per-call IncrementalJsonParser (limits, repairs). Previously
37
+ * there was no way to pass the latter through at all; every parser the
38
+ * coordinator created was hardcoded to library defaults.
39
+ * @param toolSchemas Optional JSON Schema (draft-07) per tool name. When a
40
+ * call for a registered tool reaches outcome "complete", its
41
+ * `stableValue` is validated against the schema. Structural
42
+ * prefix-safety (no truncated/fabricated values) and schema validity
43
+ * are independent concerns — a value can be genuinely complete and
44
+ * still not match what the tool declared it needs (wrong type, missing
45
+ * required field the model never provided at all). Both must hold for
46
+ * `executable` to be true. Schemas are compiled eagerly here so a
47
+ * malformed schema fails fast at construction, not mid-stream.
48
+ */
49
+ constructor(limits, parserOptions, toolSchemas) {
50
+ this.limits = { ...DEFAULT_COORDINATOR_LIMITS, ...limits };
51
+ this.parserOptions = parserOptions;
52
+ this.toolValidators = new Map();
53
+ if (toolSchemas) {
54
+ const ajv = new Ajv({ allErrors: true, strict: false });
55
+ for (const [toolName, schema] of Object.entries(toolSchemas)) {
56
+ this.toolValidators.set(toolName, ajv.compile(schema));
57
+ }
58
+ }
59
+ }
60
+ push(event) {
61
+ if (this.isFinished) {
62
+ this.addDiagnostic({
63
+ code: "E_EVENT_AFTER_STREAM_END",
64
+ severity: "error",
65
+ message: "Event pushed after stream end",
66
+ });
67
+ return { accepted: false };
68
+ }
69
+ if (this.eventsProcessed >= this.limits.maxNormalizedEvents) {
70
+ this.addDiagnostic({
71
+ code: "E_COORDINATOR_LIMIT_EVENTS",
72
+ severity: "fatal",
73
+ message: "Maximum normalized events exceeded",
74
+ });
75
+ return { accepted: false };
76
+ }
77
+ this.eventsProcessed++;
78
+ switch (event.type) {
79
+ case "tool_call_start":
80
+ this.handleStart(event);
81
+ break;
82
+ case "tool_call_identity":
83
+ this.handleIdentity(event);
84
+ break;
85
+ case "tool_call_name_delta":
86
+ this.handleNameDelta(event);
87
+ break;
88
+ case "tool_call_arguments_delta":
89
+ this.handleArgumentsDelta(event);
90
+ break;
91
+ case "tool_call_end":
92
+ this.handleCallEnd(event);
93
+ break;
94
+ case "provider_diagnostic":
95
+ this.handleProviderDiagnostic(event);
96
+ break;
97
+ case "provider_stream_end":
98
+ this.handleStreamEnd(event);
99
+ break;
100
+ }
101
+ return { accepted: true };
102
+ }
103
+ handleStart(event) {
104
+ const sourceKey = event.callRef.sourceKey;
105
+ const existingId = this.sourceKeyToInternalId.get(sourceKey);
106
+ if (existingId !== undefined) {
107
+ this.addDiagnostic({
108
+ code: "E_DUPLICATE_TOOL_CALL_START",
109
+ severity: "error",
110
+ internalId: existingId,
111
+ message: `Duplicate start for tool call sourceKey: ${sourceKey}`,
112
+ });
113
+ return;
114
+ }
115
+ if (this.calls.size >= this.limits.maxToolCalls) {
116
+ this.addDiagnostic({
117
+ code: "E_COORDINATOR_LIMIT_CALLS",
118
+ severity: "error",
119
+ message: "Maximum tool calls exceeded",
120
+ });
121
+ return;
122
+ }
123
+ const internalId = `call-${this.callCounter++}`;
124
+ this.sourceKeyToInternalId.set(sourceKey, internalId);
125
+ const parser = createParser(this.parserOptions);
126
+ const call = new CoordinatorCallState(internalId, event.provider, parser);
127
+ if (event.toolCallId !== undefined)
128
+ call.toolCallId = event.toolCallId;
129
+ if (event.toolIndex !== undefined)
130
+ call.toolIndex = event.toolIndex;
131
+ if (event.name !== undefined)
132
+ call.name = event.name;
133
+ this.calls.set(internalId, call);
134
+ this.eventQueue.push({
135
+ type: "tool_call_discovered",
136
+ sequence: this.globalSequence++,
137
+ internalId,
138
+ provider: event.provider,
139
+ });
140
+ if (event.toolCallId !== undefined || event.toolIndex !== undefined) {
141
+ this.eventQueue.push({
142
+ type: "tool_call_identity_updated",
143
+ sequence: this.globalSequence++,
144
+ internalId,
145
+ toolCallId: event.toolCallId,
146
+ toolIndex: event.toolIndex,
147
+ });
148
+ }
149
+ }
150
+ handleIdentity(event) {
151
+ const internalId = this.sourceKeyToInternalId.get(event.callRef.sourceKey);
152
+ if (!internalId)
153
+ return;
154
+ const call = this.getCall(internalId);
155
+ if (!call)
156
+ return;
157
+ let changed = false;
158
+ if (event.toolCallId !== undefined) {
159
+ if (call.toolCallId !== undefined && call.toolCallId !== event.toolCallId) {
160
+ this.addDiagnostic({
161
+ code: "E_PROVIDER_IDENTITY_CONFLICT",
162
+ severity: "error",
163
+ internalId: call.internalId,
164
+ message: `Conflicting ID: had ${call.toolCallId}, got ${event.toolCallId}`,
165
+ });
166
+ call.status = "invalid";
167
+ }
168
+ else if (call.toolCallId === undefined) {
169
+ call.toolCallId = event.toolCallId;
170
+ changed = true;
171
+ }
172
+ }
173
+ if (event.toolIndex !== undefined) {
174
+ if (call.toolIndex !== undefined && call.toolIndex !== event.toolIndex) {
175
+ this.addDiagnostic({
176
+ code: "E_PROVIDER_INDEX_CONFLICT",
177
+ severity: "error",
178
+ internalId: call.internalId,
179
+ message: `Conflicting index: had ${call.toolIndex}, got ${event.toolIndex}`,
180
+ });
181
+ call.status = "invalid";
182
+ }
183
+ else if (call.toolIndex === undefined) {
184
+ call.toolIndex = event.toolIndex;
185
+ changed = true;
186
+ }
187
+ }
188
+ if (changed) {
189
+ this.eventQueue.push({
190
+ type: "tool_call_identity_updated",
191
+ sequence: this.globalSequence++,
192
+ internalId: call.internalId,
193
+ toolCallId: call.toolCallId,
194
+ toolIndex: call.toolIndex,
195
+ });
196
+ }
197
+ }
198
+ handleNameDelta(event) {
199
+ const internalId = this.sourceKeyToInternalId.get(event.callRef.sourceKey);
200
+ if (!internalId)
201
+ return;
202
+ const call = this.getCall(internalId);
203
+ if (!call)
204
+ return;
205
+ if (call.status !== "collecting") {
206
+ this.addDiagnostic({
207
+ code: "E_NAME_DELTA_AFTER_END",
208
+ severity: "error",
209
+ internalId: call.internalId,
210
+ message: "Name delta after call ended",
211
+ });
212
+ return;
213
+ }
214
+ call.name = (call.name ?? "") + event.delta;
215
+ if (call.name.length > this.limits.maxToolNameBytes) {
216
+ this.addDiagnostic({
217
+ code: "E_TOOL_NAME_LIMIT",
218
+ severity: "error",
219
+ internalId: call.internalId,
220
+ message: "Tool name exceeded maximum length",
221
+ });
222
+ call.status = "invalid";
223
+ }
224
+ this.eventQueue.push({
225
+ type: "tool_name_updated",
226
+ sequence: event.sequence,
227
+ internalId: call.internalId,
228
+ name: call.name,
229
+ complete: false,
230
+ });
231
+ }
232
+ handleArgumentsDelta(event) {
233
+ const internalId = this.sourceKeyToInternalId.get(event.callRef.sourceKey);
234
+ if (!internalId)
235
+ return;
236
+ const call = this.getCall(internalId);
237
+ if (!call)
238
+ return;
239
+ if (call.status !== "collecting") {
240
+ this.addDiagnostic({
241
+ code: "E_ARGUMENT_DELTA_AFTER_END",
242
+ severity: "error",
243
+ internalId: call.internalId,
244
+ message: "Argument delta after call ended",
245
+ });
246
+ return;
247
+ }
248
+ call.parser.push(event.delta);
249
+ // Drain parser events and map them to coordinator events
250
+ const parserEvents = call.parser.drainEvents();
251
+ for (const pe of parserEvents) {
252
+ this.eventQueue.push({
253
+ type: "tool_argument_event",
254
+ sequence: this.globalSequence++,
255
+ internalId: call.internalId,
256
+ event: pe,
257
+ });
258
+ }
259
+ }
260
+ handleCallEnd(event) {
261
+ const internalId = this.sourceKeyToInternalId.get(event.callRef.sourceKey);
262
+ if (!internalId)
263
+ return;
264
+ const call = this.getCall(internalId);
265
+ if (!call)
266
+ return;
267
+ if (call.status !== "collecting")
268
+ return;
269
+ call.nameComplete = true;
270
+ call.argumentStreamClosed = true;
271
+ if (call.name !== undefined) {
272
+ this.eventQueue.push({
273
+ type: "tool_name_updated",
274
+ sequence: this.globalSequence++,
275
+ internalId: call.internalId,
276
+ name: call.name,
277
+ complete: true,
278
+ });
279
+ }
280
+ else {
281
+ this.addDiagnostic({
282
+ code: "E_TOOL_NAME_MISSING",
283
+ severity: "error",
284
+ internalId: call.internalId,
285
+ message: "Tool name missing at end",
286
+ });
287
+ }
288
+ }
289
+ finishCall(call, reason) {
290
+ if (call.status !== "collecting")
291
+ return;
292
+ // For individual call end, we pass reason to the internal parser
293
+ const res = call.parser.finish({ reason });
294
+ // Determine the mapped coordinator outcome
295
+ let outcome = "invalid";
296
+ if (res.outcome === "valid") {
297
+ outcome = "complete";
298
+ if (call.name === undefined || this.hasCallConflict(call)) {
299
+ outcome = "invalid";
300
+ }
301
+ }
302
+ else if (res.outcome === "truncated") {
303
+ outcome = "truncated";
304
+ }
305
+ else if (res.outcome === "salvaged") {
306
+ outcome = "salvaged";
307
+ }
308
+ if (reason === "cancelled")
309
+ outcome = "cancelled";
310
+ call.status = outcome;
311
+ // Drain remaining parser events
312
+ const parserEvents = call.parser.drainEvents();
313
+ for (const pe of parserEvents) {
314
+ this.eventQueue.push({
315
+ type: "tool_argument_event",
316
+ sequence: this.globalSequence++,
317
+ internalId: call.internalId,
318
+ event: pe,
319
+ });
320
+ }
321
+ // Schema validation is a separate concern from structural
322
+ // prefix-safety: only meaningful once the value is genuinely complete,
323
+ // and only for tools with a registered schema.
324
+ if (outcome === "complete" && call.name !== undefined) {
325
+ const validator = this.toolValidators.get(call.name);
326
+ if (validator) {
327
+ call.schemaValid = validator(res.stableValue) === true;
328
+ if (!call.schemaValid) {
329
+ const errors = (validator.errors ?? [])
330
+ .map((e) => `${e.instancePath || "<root>"} ${e.message ?? ""}`.trim())
331
+ .join("; ");
332
+ this.addDiagnostic({
333
+ code: "E_SCHEMA_VALIDATION_FAILED",
334
+ severity: "error",
335
+ internalId: call.internalId,
336
+ message: `Tool call arguments for "${call.name}" do not match its schema: ${errors || "unknown validation error"}`,
337
+ });
338
+ }
339
+ }
340
+ }
341
+ // Determine executable according to Executable Policy — structural
342
+ // completeness AND (if a schema is registered) schema validity.
343
+ const executable = outcome === "complete" && res.executable && call.schemaValid !== false;
344
+ this.eventQueue.push({
345
+ type: "tool_call_finished",
346
+ sequence: this.globalSequence++,
347
+ internalId: call.internalId,
348
+ outcome,
349
+ executable,
350
+ });
351
+ }
352
+ hasCallConflict(call) {
353
+ return this.diagnostics.some(d => d.internalId === call.internalId && (d.severity === "error" || d.severity === "fatal"));
354
+ }
355
+ handleProviderDiagnostic(event) {
356
+ const internalId = event.callRef ? this.sourceKeyToInternalId.get(event.callRef.sourceKey) : undefined;
357
+ this.addDiagnostic({
358
+ code: event.code,
359
+ severity: event.severity,
360
+ message: event.message,
361
+ internalId,
362
+ });
363
+ }
364
+ handleStreamEnd(event) {
365
+ this.isFinished = true;
366
+ // Close all open calls
367
+ for (const call of this.calls.values()) {
368
+ if (call.status === "collecting") {
369
+ if (!call.argumentStreamClosed) {
370
+ this.addDiagnostic({
371
+ code: "E_STREAM_ENDED_WITH_OPEN_CALL",
372
+ severity: "error",
373
+ internalId: call.internalId,
374
+ message: "Stream ended with open call",
375
+ });
376
+ }
377
+ this.finishCall(call, event.reason);
378
+ }
379
+ }
380
+ this.eventQueue.push({
381
+ type: "provider_stream_finished",
382
+ sequence: this.globalSequence++,
383
+ reason: event.reason,
384
+ });
385
+ }
386
+ getCall(internalId) {
387
+ const call = this.calls.get(internalId);
388
+ if (!call) {
389
+ this.addDiagnostic({
390
+ code: "E_TOOL_CALL_NOT_FOUND",
391
+ severity: "error",
392
+ internalId,
393
+ message: `Tool call ${internalId} not found`,
394
+ });
395
+ return undefined;
396
+ }
397
+ return call;
398
+ }
399
+ addDiagnostic(diag) {
400
+ this.diagnostics.push(diag);
401
+ this.eventQueue.push({
402
+ type: "coordinator_diagnostic",
403
+ sequence: this.globalSequence++,
404
+ diagnostic: diag,
405
+ });
406
+ }
407
+ snapshot() {
408
+ return {
409
+ calls: Array.from(this.calls.values()).map((c) => ({
410
+ internalId: c.internalId,
411
+ provider: c.provider,
412
+ toolCallId: c.toolCallId,
413
+ toolIndex: c.toolIndex,
414
+ name: c.name,
415
+ nameComplete: c.nameComplete,
416
+ parser: c.parser.snapshot(),
417
+ status: c.status,
418
+ schemaValid: c.schemaValid,
419
+ })),
420
+ diagnostics: [...this.diagnostics],
421
+ eventsProcessed: this.eventsProcessed,
422
+ isFinished: this.isFinished,
423
+ };
424
+ }
425
+ drainEvents() {
426
+ const events = this.eventQueue;
427
+ this.eventQueue = [];
428
+ return events;
429
+ }
430
+ finish(meta) {
431
+ if (!this.isFinished) {
432
+ this.handleStreamEnd({
433
+ type: "provider_stream_end",
434
+ sequence: this.eventsProcessed + 1,
435
+ provider: "unknown",
436
+ reason: meta?.reason ?? "unknown",
437
+ providerReason: meta?.providerReason,
438
+ });
439
+ }
440
+ return {
441
+ calls: this.snapshot().calls,
442
+ };
443
+ }
444
+ }
445
+ export function createToolCallStreamCoordinator(limits, parserOptions, toolSchemas) {
446
+ return new DefaultToolCallStreamCoordinator(limits, parserOptions, toolSchemas);
447
+ }
448
+ //# sourceMappingURL=coordinator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../src/coordinator/coordinator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Emitted (as a stream-wide `provider_diagnostic`, no `callRef`) by a
3
+ * provider adapter when the underlying provider reports that generation was
4
+ * stopped by a content-safety/policy filter, as opposed to a generic
5
+ * cancellation. The execution gate matches on this to return a distinct
6
+ * `reason: "content_filtered"` rather than lumping it in with ordinary
7
+ * incomplete-stream retries - a policy termination should not be retried
8
+ * blindly.
9
+ */
10
+ export declare const CONTENT_FILTERED_DIAGNOSTIC_CODE = "E_CONTENT_FILTERED";
11
+ //# sourceMappingURL=diagnostic-codes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostic-codes.d.ts","sourceRoot":"","sources":["../../src/coordinator/diagnostic-codes.ts"],"names":[],"mappings":"AAYA;;;;;;;;GAQG;AACH,eAAO,MAAM,gCAAgC,uBAAuB,CAAC"}
@@ -0,0 +1,22 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Cross-module coordinator-level diagnostic codes.
3
+ //
4
+ // Most coordinator diagnostics (see coordinator.ts) are inline string
5
+ // literals local to wherever they're raised - there's no central registry,
6
+ // unlike the parser-level `DiagnosticCode` in diagnostics/codes.ts. This
7
+ // file exists only for the handful of codes that a provider adapter raises
8
+ // and something *outside* that adapter (e.g. the execution gate) needs to
9
+ // recognize by exact code, where a shared constant is safer than either
10
+ // module guessing the other's string literal.
11
+ // ---------------------------------------------------------------------------
12
+ /**
13
+ * Emitted (as a stream-wide `provider_diagnostic`, no `callRef`) by a
14
+ * provider adapter when the underlying provider reports that generation was
15
+ * stopped by a content-safety/policy filter, as opposed to a generic
16
+ * cancellation. The execution gate matches on this to return a distinct
17
+ * `reason: "content_filtered"` rather than lumping it in with ordinary
18
+ * incomplete-stream retries - a policy termination should not be retried
19
+ * blindly.
20
+ */
21
+ export const CONTENT_FILTERED_DIAGNOSTIC_CODE = "E_CONTENT_FILTERED";
22
+ //# sourceMappingURL=diagnostic-codes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostic-codes.js","sourceRoot":"","sources":["../../src/coordinator/diagnostic-codes.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,mDAAmD;AACnD,EAAE;AACF,sEAAsE;AACtE,2EAA2E;AAC3E,yEAAyE;AACzE,2EAA2E;AAC3E,0EAA0E;AAC1E,wEAAwE;AACxE,8CAA8C;AAC9C,8EAA8E;AAE9E;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,oBAAoB,CAAC"}
@@ -0,0 +1,61 @@
1
+ export type ProviderName = "openai" | "anthropic" | "gemini" | "openrouter" | "openai-compatible" | "ai-sdk" | "unknown";
2
+ export interface NormalizedEventBase {
3
+ /**
4
+ * Deterministic sequence number assigned by the stream coordinator.
5
+ */
6
+ readonly sequence: number;
7
+ readonly provider: ProviderName;
8
+ readonly rawEventType?: string;
9
+ readonly providerRequestId?: string;
10
+ }
11
+ export type NormalizedToolStreamEvent = ToolCallStartEvent | ToolCallIdentityEvent | ToolCallNameDeltaEvent | ToolCallArgumentsDeltaEvent | ToolCallEndEvent | ProviderDiagnosticEvent | ProviderStreamEndEvent;
12
+ export interface ToolCallStartEvent extends NormalizedEventBase {
13
+ readonly type: "tool_call_start";
14
+ readonly callRef: ProviderCallRef;
15
+ readonly toolCallId?: string;
16
+ readonly toolIndex?: number;
17
+ readonly name?: string;
18
+ }
19
+ export interface ToolCallIdentityEvent extends NormalizedEventBase {
20
+ readonly type: "tool_call_identity";
21
+ readonly callRef: ProviderCallRef;
22
+ readonly toolCallId?: string;
23
+ readonly toolIndex?: number;
24
+ }
25
+ export interface ToolCallNameDeltaEvent extends NormalizedEventBase {
26
+ readonly type: "tool_call_name_delta";
27
+ readonly callRef: ProviderCallRef;
28
+ readonly delta: string;
29
+ }
30
+ export interface ToolCallArgumentsDeltaEvent extends NormalizedEventBase {
31
+ readonly type: "tool_call_arguments_delta";
32
+ readonly callRef: ProviderCallRef;
33
+ readonly delta: string | Uint8Array;
34
+ }
35
+ export type StreamEndReason = "complete" | "length" | "cancelled" | "provider_error" | "network_error" | "unknown";
36
+ export interface ToolCallEndEvent extends NormalizedEventBase {
37
+ readonly type: "tool_call_end";
38
+ readonly callRef: ProviderCallRef;
39
+ readonly reason: StreamEndReason;
40
+ readonly providerReason?: string;
41
+ }
42
+ export interface ProviderDiagnosticEvent extends NormalizedEventBase {
43
+ readonly type: "provider_diagnostic";
44
+ readonly code: string;
45
+ readonly severity: "info" | "warning" | "error" | "fatal";
46
+ readonly message: string;
47
+ readonly callRef?: ProviderCallRef;
48
+ }
49
+ export interface ProviderStreamEndEvent extends NormalizedEventBase {
50
+ readonly type: "provider_stream_end";
51
+ readonly reason: StreamEndReason;
52
+ readonly providerReason?: string;
53
+ }
54
+ export interface ProviderCallRef {
55
+ /**
56
+ * Deterministic provider-local identity.
57
+ * e.g. "content-block:0"
58
+ */
59
+ readonly sourceKey: string;
60
+ }
61
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/coordinator/protocol.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GACpB,QAAQ,GACR,WAAW,GACX,QAAQ,GACR,YAAY,GACZ,mBAAmB,GACnB,QAAQ,GACR,SAAS,CAAC;AAEd,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CACrC;AAED,MAAM,MAAM,yBAAyB,GACjC,kBAAkB,GAClB,qBAAqB,GACrB,sBAAsB,GACtB,2BAA2B,GAC3B,gBAAgB,GAChB,uBAAuB,GACvB,sBAAsB,CAAC;AAE3B,MAAM,WAAW,kBAAmB,SAAQ,mBAAmB;IAC7D,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAElC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,qBAAsB,SAAQ,mBAAmB;IAChE,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAElC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,sBAAuB,SAAQ,mBAAmB;IACjE,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,2BAA4B,SAAQ,mBAAmB;IACtE,QAAQ,CAAC,IAAI,EAAE,2BAA2B,CAAC;IAC3C,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAAC;CACrC;AAED,MAAM,MAAM,eAAe,GACvB,UAAU,GACV,QAAQ,GACR,WAAW,GACX,gBAAgB,GAChB,eAAe,GACf,SAAS,CAAC;AAEd,MAAM,WAAW,gBAAiB,SAAQ,mBAAmB;IAC3D,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,uBAAwB,SAAQ,mBAAmB;IAClE,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;IAC1D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,CAAC;CACpC;AAED,MAAM,WAAW,sBAAuB,SAAQ,mBAAmB;IACjE,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/coordinator/protocol.ts"],"names":[],"mappings":""}