@code-yeongyu/senpi 2026.7.17-4 → 2026.7.17-5

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 (113) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/core/extensions/builtin/compaction/repair-tool-pairs.d.ts +1 -0
  3. package/dist/core/extensions/builtin/compaction/repair-tool-pairs.d.ts.map +1 -1
  4. package/dist/core/extensions/builtin/compaction/repair-tool-pairs.js +20 -2
  5. package/dist/core/extensions/builtin/compaction/repair-tool-pairs.js.map +1 -1
  6. package/dist/core/extensions/builtin/mcp/config-schema.d.ts +8 -1
  7. package/dist/core/extensions/builtin/mcp/config-schema.d.ts.map +1 -1
  8. package/dist/core/extensions/builtin/mcp/config-schema.js +23 -0
  9. package/dist/core/extensions/builtin/mcp/config-schema.js.map +1 -1
  10. package/dist/core/extensions/builtin/mcp/config.d.ts +13 -0
  11. package/dist/core/extensions/builtin/mcp/config.d.ts.map +1 -1
  12. package/dist/core/extensions/builtin/mcp/config.js +36 -0
  13. package/dist/core/extensions/builtin/mcp/config.js.map +1 -1
  14. package/dist/core/extensions/builtin/mcp/service-snapshot.d.ts.map +1 -1
  15. package/dist/core/extensions/builtin/mcp/service-snapshot.js +1 -0
  16. package/dist/core/extensions/builtin/mcp/service-snapshot.js.map +1 -1
  17. package/dist/core/extensions/builtin/mcp/service-types.d.ts +12 -0
  18. package/dist/core/extensions/builtin/mcp/service-types.d.ts.map +1 -1
  19. package/dist/core/extensions/builtin/mcp/service-types.js.map +1 -1
  20. package/dist/core/extensions/builtin/mcp/service.d.ts.map +1 -1
  21. package/dist/core/extensions/builtin/mcp/service.js +2 -1
  22. package/dist/core/extensions/builtin/mcp/service.js.map +1 -1
  23. package/dist/core/extensions/builtin/mcp/status.js +1 -0
  24. package/dist/core/extensions/builtin/mcp/status.js.map +1 -1
  25. package/dist/core/extensions/index.d.ts +1 -0
  26. package/dist/core/extensions/index.d.ts.map +1 -1
  27. package/dist/core/extensions/index.js.map +1 -1
  28. package/dist/core/extensions/loader.d.ts.map +1 -1
  29. package/dist/core/extensions/loader.js +20 -4
  30. package/dist/core/extensions/loader.js.map +1 -1
  31. package/dist/core/extensions/runner.d.ts +3 -1
  32. package/dist/core/extensions/runner.d.ts.map +1 -1
  33. package/dist/core/extensions/runner.js +20 -0
  34. package/dist/core/extensions/runner.js.map +1 -1
  35. package/dist/core/extensions/types.d.ts +13 -0
  36. package/dist/core/extensions/types.d.ts.map +1 -1
  37. package/dist/core/extensions/types.js.map +1 -1
  38. package/dist/core/provider-composer.d.ts.map +1 -1
  39. package/dist/core/provider-composer.js +8 -1
  40. package/dist/core/provider-composer.js.map +1 -1
  41. package/dist/index.d.ts +1 -1
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js.map +1 -1
  44. package/docs/extensions.md +46 -0
  45. package/docs/mcp.md +16 -0
  46. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +13 -0
  47. package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
  48. package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +8 -7
  49. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  50. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +19 -4
  51. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  52. package/node_modules/@earendil-works/pi-agent-core/dist/proxy.d.ts +3 -1
  53. package/node_modules/@earendil-works/pi-agent-core/dist/proxy.d.ts.map +1 -1
  54. package/node_modules/@earendil-works/pi-agent-core/dist/proxy.js +4 -2
  55. package/node_modules/@earendil-works/pi-agent-core/dist/proxy.js.map +1 -1
  56. package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
  57. package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts +1 -0
  58. package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts.map +1 -1
  59. package/node_modules/@earendil-works/pi-ai/dist/compat.js +1 -0
  60. package/node_modules/@earendil-works/pi-ai/dist/compat.js.map +1 -1
  61. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +31 -0
  62. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
  63. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.js +3 -3
  64. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.js.map +1 -1
  65. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js +5 -5
  66. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js.map +1 -1
  67. package/node_modules/@earendil-works/pi-ai/dist/providers/together.models.d.ts +31 -0
  68. package/node_modules/@earendil-works/pi-ai/dist/providers/together.models.d.ts.map +1 -1
  69. package/node_modules/@earendil-works/pi-ai/dist/providers/together.models.js +19 -0
  70. package/node_modules/@earendil-works/pi-ai/dist/providers/together.models.js.map +1 -1
  71. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/context-transformer.d.ts.map +1 -1
  72. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/context-transformer.js +3 -0
  73. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/context-transformer.js.map +1 -1
  74. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.d.ts +1 -1
  75. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.d.ts.map +1 -1
  76. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.js +2 -1
  77. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.js.map +1 -1
  78. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.d.ts +11 -0
  79. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.d.ts.map +1 -1
  80. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.js +40 -1
  81. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.js.map +1 -1
  82. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.d.ts.map +1 -1
  83. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.js +92 -7
  84. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.js.map +1 -1
  85. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/gemma4.d.ts +8 -1
  86. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/gemma4.d.ts.map +1 -1
  87. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/gemma4.js +129 -27
  88. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/gemma4.js.map +1 -1
  89. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/json-mix.d.ts.map +1 -1
  90. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/json-mix.js +140 -6
  91. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/json-mix.js.map +1 -1
  92. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/morph-xml.d.ts.map +1 -1
  93. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/morph-xml.js +28 -6
  94. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/morph-xml.js.map +1 -1
  95. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/yaml-xml.d.ts.map +1 -1
  96. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/yaml-xml.js +51 -18
  97. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/yaml-xml.js.map +1 -1
  98. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper.d.ts.map +1 -1
  99. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper.js +70 -9
  100. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper.js.map +1 -1
  101. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/types.d.ts +5 -2
  102. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/types.d.ts.map +1 -1
  103. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/types.js.map +1 -1
  104. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +8 -2
  105. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  106. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  107. package/node_modules/@earendil-works/pi-ai/dist/utils/tool-pair-repair.d.ts.map +1 -1
  108. package/node_modules/@earendil-works/pi-ai/dist/utils/tool-pair-repair.js +19 -2
  109. package/node_modules/@earendil-works/pi-ai/dist/utils/tool-pair-repair.js.map +1 -1
  110. package/node_modules/@earendil-works/pi-ai/package.json +1 -1
  111. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  112. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  113. package/package.json +6 -6
@@ -1,9 +1,11 @@
1
+ import { validateToolArguments } from "../../../utils/validation.js";
1
2
  import { coerceParameters } from "./coerce-parameters.js";
2
3
  import { findNextInvokeMatch } from "./invoke-match.js";
3
- import { findIncompleteInvokeOpenTag, findInvokeOpenTag, getSafeInvokeTextLength, scanInvokeBlock, } from "./invoke-tag-scanner.js";
4
+ import { findIncompleteInvokeOpenTag, findInvokeOpenTag, getSafeInvokeTextLength, isPotentialProtocolStart, scanInvokeBlock, scanTruncatedInvokeBlock, } from "./invoke-tag-scanner.js";
4
5
  import { parseAnthropicXmlGeneratedText } from "./parse.js";
5
6
  import { ANTHROPIC_XML_MAX_RETAINED_FRAGMENT_LENGTH, createPendingFragment, } from "./stream-boundary.js";
6
7
  import { createToolResolver } from "./tool-resolver.js";
8
+ import { decodeXmlEntities } from "./xml-entities.js";
7
9
  export { ANTHROPIC_XML_MAX_RETAINED_FRAGMENT_LENGTH } from "./stream-boundary.js";
8
10
  const FUNCTION_CALLS_OPEN_TAG = /<\s*function_calls\s*>/;
9
11
  const FUNCTION_CALLS_CLOSE_TAG = /<\s*\/\s*function_calls\s*>/;
@@ -35,6 +37,11 @@ function isPotentialFunctionCallsTag(candidate) {
35
37
  return (FUNCTION_CALLS_OPEN_PREFIX.startsWith(compactCandidate) ||
36
38
  FUNCTION_CALLS_CLOSE_PREFIX.startsWith(compactCandidate));
37
39
  }
40
+ function isWhitespaceOrFunctionCallsClosePrefix(text) {
41
+ const compactText = text.replace(/\s/g, "");
42
+ return (compactText.length === 0 ||
43
+ (FUNCTION_CALLS_CLOSE_PREFIX.startsWith(compactText) && compactText !== FUNCTION_CALLS_CLOSE_PREFIX));
44
+ }
38
45
  function getSafeStreamTextLength(text) {
39
46
  const scannerSafeLength = getSafeInvokeTextLength(text);
40
47
  const lastTagIndex = text.lastIndexOf("<");
@@ -48,6 +55,26 @@ function getSafeStreamTextLength(text) {
48
55
  function reportError(options, message, toolCall) {
49
56
  options?.onError?.(message, { toolCall });
50
57
  }
58
+ function coerceStreamParameters(parameters, tool, allowJsonSchemaFallback = false) {
59
+ const coercedParameters = coerceParameters(parameters, tool);
60
+ if (coercedParameters !== null || !allowJsonSchemaFallback) {
61
+ return coercedParameters;
62
+ }
63
+ const argumentsRecord = {};
64
+ for (const parameter of parameters) {
65
+ if (Object.hasOwn(argumentsRecord, parameter.name)) {
66
+ return null;
67
+ }
68
+ const rawValue = decodeXmlEntities(parameter.rawValue);
69
+ try {
70
+ argumentsRecord[parameter.name] = JSON.parse(rawValue);
71
+ }
72
+ catch {
73
+ argumentsRecord[parameter.name] = rawValue;
74
+ }
75
+ }
76
+ return argumentsRecord;
77
+ }
51
78
  export function createAnthropicXmlStreamParser(tools, options) {
52
79
  const resolveTool = createToolResolver(tools);
53
80
  let buffer = "";
@@ -67,7 +94,7 @@ export function createAnthropicXmlStreamParser(tools, options) {
67
94
  }
68
95
  return events;
69
96
  }
70
- function processBuffer() {
97
+ function processBuffer(consumeFunctionCallsResidue = false, allowJsonSchemaFallback = false) {
71
98
  const events = [];
72
99
  pendingFragment = null;
73
100
  while (buffer.length > 0) {
@@ -125,7 +152,9 @@ export function createAnthropicXmlStreamParser(tools, options) {
125
152
  const index = nextToolCallIndex;
126
153
  nextToolCallIndex += 1;
127
154
  const id = `anthropic-xml-tool-${index}`;
128
- const argumentsRecord = block.parameters ? coerceParameters(block.parameters, tool) : null;
155
+ const argumentsRecord = block.parameters
156
+ ? coerceStreamParameters(block.parameters, tool, allowJsonSchemaFallback)
157
+ : null;
129
158
  if (argumentsRecord === null) {
130
159
  reportError(options, "Could not process streaming Anthropic XML tool call, keeping original text.", originalCallText);
131
160
  if (shouldEmitRawToolCallTextOnError(options)) {
@@ -142,6 +171,10 @@ export function createAnthropicXmlStreamParser(tools, options) {
142
171
  events.push({ type: "toolcall_end", index, name: tool.name, id, arguments: argumentsRecord });
143
172
  continue;
144
173
  }
174
+ if (consumeFunctionCallsResidue && isWhitespaceOrFunctionCallsClosePrefix(buffer)) {
175
+ buffer = "";
176
+ break;
177
+ }
145
178
  const safeLength = getSafeStreamTextLength(buffer);
146
179
  if (safeLength === 0) {
147
180
  if (buffer.length >= EAGER_OPEN_TAG_SCAN_LENGTH) {
@@ -187,15 +220,67 @@ export function createAnthropicXmlStreamParser(tools, options) {
187
220
  },
188
221
  finish() {
189
222
  const events = processBuffer();
223
+ const functionCallsOpenTag = findFunctionCallsTag(FUNCTION_CALLS_OPEN_TAG, buffer, 0);
224
+ if (functionCallsOpenTag?.index === 0 &&
225
+ findFunctionCallsTag(FUNCTION_CALLS_CLOSE_TAG, buffer, functionCallsOpenTag.length) === null) {
226
+ buffer = buffer.slice(functionCallsOpenTag.length);
227
+ events.push(...processBuffer(true, true));
228
+ }
190
229
  if (buffer.length === 0) {
191
230
  return events;
192
231
  }
193
232
  const invokeOpenTag = findInvokeOpenTag(buffer, 0) ?? findIncompleteInvokeOpenTag(buffer, 0);
194
- if (invokeOpenTag && invokeOpenTag.index === 0 && resolveTool(invokeOpenTag.toolName)) {
195
- reportError(options, "Could not complete streaming Anthropic XML tool call at finish.", buffer);
196
- if (shouldEmitRawToolCallTextOnError(options)) {
197
- emitText(events, buffer);
233
+ const tool = invokeOpenTag?.index === 0 ? resolveTool(invokeOpenTag.toolName) : undefined;
234
+ if (invokeOpenTag && tool) {
235
+ const scannedBlock = scanTruncatedInvokeBlock(buffer, invokeOpenTag);
236
+ const coercedArguments = coerceStreamParameters(scannedBlock.parameters, tool, true);
237
+ let recoveredArguments = null;
238
+ if (scannedBlock.isStructurallyComplete && coercedArguments !== null) {
239
+ try {
240
+ recoveredArguments = validateToolArguments(tool, {
241
+ type: "toolCall",
242
+ id: "anthropic-xml-finish-recovery",
243
+ name: tool.name,
244
+ arguments: coercedArguments,
245
+ });
246
+ }
247
+ catch {
248
+ recoveredArguments = null;
249
+ }
250
+ }
251
+ const index = nextToolCallIndex;
252
+ nextToolCallIndex += 1;
253
+ const id = `anthropic-xml-tool-${index}`;
254
+ const argumentsRecord = recoveredArguments ?? coercedArguments ?? {};
255
+ events.push({ type: "toolcall_start", index, name: tool.name, id });
256
+ events.push({ type: "toolcall_delta", index, argumentsDelta: JSON.stringify(argumentsRecord) });
257
+ if (recoveredArguments) {
258
+ events.push({ type: "toolcall_end", index, name: tool.name, id, arguments: argumentsRecord });
198
259
  }
260
+ else {
261
+ events.push({
262
+ type: "toolcall_end",
263
+ index,
264
+ name: tool.name,
265
+ id,
266
+ arguments: argumentsRecord,
267
+ incomplete: true,
268
+ errorMessage: "Tool call was truncated mid-arguments",
269
+ });
270
+ options?.onError?.("Anthropic XML tool call truncated at finish", {
271
+ protocol: "anthropic-xml",
272
+ retainedLength: buffer.length,
273
+ });
274
+ }
275
+ }
276
+ else if (invokeOpenTag?.index === 0) {
277
+ emitText(events, buffer);
278
+ }
279
+ else if (isPotentialProtocolStart(buffer)) {
280
+ options?.onError?.("Anthropic XML tool call truncated at finish", {
281
+ protocol: "anthropic-xml",
282
+ retainedLength: buffer.length,
283
+ });
199
284
  }
200
285
  else {
201
286
  emitText(events, buffer);
@@ -1 +1 @@
1
- {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../../../src/tool-call-middleware/protocols/anthropic-xml/stream.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Tool } from \"../../../types.ts\";\nimport type { ParserOptions, StreamParser, StreamParserEvent } from \"../../types.ts\";\nimport { coerceParameters } from \"./coerce-parameters.ts\";\nimport { findNextInvokeMatch } from \"./invoke-match.ts\";\nimport {\n\tfindIncompleteInvokeOpenTag,\n\tfindInvokeOpenTag,\n\tgetSafeInvokeTextLength,\n\tscanInvokeBlock,\n} from \"./invoke-tag-scanner.ts\";\nimport { parseAnthropicXmlGeneratedText } from \"./parse.ts\";\nimport {\n\tANTHROPIC_XML_MAX_RETAINED_FRAGMENT_LENGTH,\n\tcreatePendingFragment,\n\ttype PendingFragment,\n} from \"./stream-boundary.ts\";\nimport { createToolResolver } from \"./tool-resolver.ts\";\n\nexport { ANTHROPIC_XML_MAX_RETAINED_FRAGMENT_LENGTH } from \"./stream-boundary.ts\";\n\nconst FUNCTION_CALLS_OPEN_TAG = /<\\s*function_calls\\s*>/;\nconst FUNCTION_CALLS_CLOSE_TAG = /<\\s*\\/\\s*function_calls\\s*>/;\nconst FUNCTION_CALLS_COMPLETE_TAG = /^<\\s*\\/?\\s*function_calls\\s*>/;\nconst FUNCTION_CALLS_OPEN_PREFIX = \"<function_calls>\";\nconst FUNCTION_CALLS_CLOSE_PREFIX = \"</function_calls>\";\nconst EAGER_OPEN_TAG_SCAN_LENGTH = 128;\nconst RETAINED_FRAGMENT_OVERFLOW_MESSAGE = `Anthropic XML streaming fragment exceeded the ${ANTHROPIC_XML_MAX_RETAINED_FRAGMENT_LENGTH}-character retained-input limit.`;\n\ntype FunctionCallsTag = {\n\treadonly index: number;\n\treadonly length: number;\n};\n\nfunction shouldEmitRawToolCallTextOnError(options?: ParserOptions): boolean {\n\treturn options?.emitRawToolCallTextOnError === true;\n}\n\nfunction emitText(events: StreamParserEvent[], text: string): void {\n\tif (text.length > 0) {\n\t\tevents.push({ type: \"text\", text });\n\t}\n}\n\nfunction findFunctionCallsTag(pattern: RegExp, text: string, fromIndex: number): FunctionCallsTag | null {\n\tconst match = pattern.exec(text.slice(fromIndex));\n\tif (!match || match.index === undefined) {\n\t\treturn null;\n\t}\n\n\treturn { index: fromIndex + match.index, length: match[0].length };\n}\n\nfunction isPotentialFunctionCallsTag(candidate: string): boolean {\n\tif (FUNCTION_CALLS_COMPLETE_TAG.test(candidate)) {\n\t\treturn false;\n\t}\n\tconst compactCandidate = candidate.replace(/\\s/g, \"\");\n\treturn (\n\t\tFUNCTION_CALLS_OPEN_PREFIX.startsWith(compactCandidate) ||\n\t\tFUNCTION_CALLS_CLOSE_PREFIX.startsWith(compactCandidate)\n\t);\n}\n\nfunction getSafeStreamTextLength(text: string): number {\n\tconst scannerSafeLength = getSafeInvokeTextLength(text);\n\tconst lastTagIndex = text.lastIndexOf(\"<\");\n\tif (lastTagIndex === -1) {\n\t\treturn scannerSafeLength;\n\t}\n\n\treturn isPotentialFunctionCallsTag(text.slice(lastTagIndex))\n\t\t? Math.min(scannerSafeLength, lastTagIndex)\n\t\t: scannerSafeLength;\n}\n\nfunction reportError(options: ParserOptions | undefined, message: string, toolCall: string): void {\n\toptions?.onError?.(message, { toolCall });\n}\n\nexport function createAnthropicXmlStreamParser(tools: Tool[], options?: ParserOptions): StreamParser {\n\tconst resolveTool = createToolResolver(tools);\n\tlet buffer = \"\";\n\tlet nextToolCallIndex = 0;\n\tlet pendingFragment: PendingFragment | null = null;\n\n\tfunction retainPendingFragment(kind: PendingFragment[\"kind\"]): void {\n\t\tpendingFragment = createPendingFragment(kind, buffer);\n\t}\n\n\tfunction overflowPendingFragment(): StreamParserEvent[] {\n\t\tconst retainedFragment = buffer;\n\t\tbuffer = \"\";\n\t\tpendingFragment = null;\n\t\treportError(options, RETAINED_FRAGMENT_OVERFLOW_MESSAGE, retainedFragment);\n\n\t\tconst events: StreamParserEvent[] = [];\n\t\tif (shouldEmitRawToolCallTextOnError(options)) {\n\t\t\temitText(events, retainedFragment);\n\t\t}\n\t\treturn events;\n\t}\n\n\tfunction processBuffer(): StreamParserEvent[] {\n\t\tconst events: StreamParserEvent[] = [];\n\t\tpendingFragment = null;\n\n\t\twhile (buffer.length > 0) {\n\t\t\tconst invokeOpenTag = findInvokeOpenTag(buffer, 0);\n\t\t\tconst functionCallsOpenTag = findFunctionCallsTag(FUNCTION_CALLS_OPEN_TAG, buffer, 0);\n\n\t\t\tif (functionCallsOpenTag && (!invokeOpenTag || functionCallsOpenTag.index <= invokeOpenTag.index)) {\n\t\t\t\tif (functionCallsOpenTag.index > 0) {\n\t\t\t\t\temitText(events, buffer.slice(0, functionCallsOpenTag.index));\n\t\t\t\t\tbuffer = buffer.slice(functionCallsOpenTag.index);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst functionCallsCloseTag = findFunctionCallsTag(\n\t\t\t\t\tFUNCTION_CALLS_CLOSE_TAG,\n\t\t\t\t\tbuffer,\n\t\t\t\t\tfunctionCallsOpenTag.length,\n\t\t\t\t);\n\t\t\t\tif (!functionCallsCloseTag) {\n\t\t\t\t\tretainPendingFragment(\"function-calls\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tconst wrapperEnd = functionCallsCloseTag.index + functionCallsCloseTag.length;\n\t\t\t\tconst wrapperContent = buffer.slice(functionCallsOpenTag.length, functionCallsCloseTag.index);\n\t\t\t\tif (parseAnthropicXmlGeneratedText(wrapperContent, tools).length > 0) {\n\t\t\t\t\tbuffer = wrapperContent + buffer.slice(wrapperEnd);\n\t\t\t\t} else {\n\t\t\t\t\temitText(events, buffer.slice(0, wrapperEnd));\n\t\t\t\t\tbuffer = buffer.slice(wrapperEnd);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (invokeOpenTag) {\n\t\t\t\tif (invokeOpenTag.index > 0) {\n\t\t\t\t\temitText(events, buffer.slice(0, invokeOpenTag.index));\n\t\t\t\t\tbuffer = buffer.slice(invokeOpenTag.index);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst tool = resolveTool(invokeOpenTag.toolName);\n\t\t\t\tconst block = scanInvokeBlock(buffer, invokeOpenTag);\n\t\t\t\tif (!tool) {\n\t\t\t\t\tconst nextKnownInvoke = findNextInvokeMatch(\n\t\t\t\t\t\tbuffer,\n\t\t\t\t\t\tinvokeOpenTag.index + invokeOpenTag.length,\n\t\t\t\t\t\t(toolName) => resolveTool(toolName) !== undefined,\n\t\t\t\t\t);\n\t\t\t\t\tif (\n\t\t\t\t\t\tnextKnownInvoke &&\n\t\t\t\t\t\t(block === null || (nextKnownInvoke.block !== null && nextKnownInvoke.block.end === block.end))\n\t\t\t\t\t) {\n\t\t\t\t\t\temitText(events, buffer.slice(0, nextKnownInvoke.openingTag.index));\n\t\t\t\t\t\tbuffer = buffer.slice(nextKnownInvoke.openingTag.index);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!block) {\n\t\t\t\t\tretainPendingFragment(\"invoke\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tconst originalCallText = buffer.slice(0, block.end);\n\t\t\t\tbuffer = buffer.slice(block.end);\n\n\t\t\t\tif (!tool) {\n\t\t\t\t\temitText(events, originalCallText);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst index = nextToolCallIndex;\n\t\t\t\tnextToolCallIndex += 1;\n\t\t\t\tconst id = `anthropic-xml-tool-${index}`;\n\t\t\t\tconst argumentsRecord = block.parameters ? coerceParameters(block.parameters, tool) : null;\n\t\t\t\tif (argumentsRecord === null) {\n\t\t\t\t\treportError(\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\t\"Could not process streaming Anthropic XML tool call, keeping original text.\",\n\t\t\t\t\t\toriginalCallText,\n\t\t\t\t\t);\n\t\t\t\t\tif (shouldEmitRawToolCallTextOnError(options)) {\n\t\t\t\t\t\temitText(events, originalCallText);\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tevents.push({ type: \"toolcall_start\", index, name: tool.name, id });\n\t\t\t\tevents.push({\n\t\t\t\t\ttype: \"toolcall_delta\",\n\t\t\t\t\tindex,\n\t\t\t\t\targumentsDelta: JSON.stringify(argumentsRecord),\n\t\t\t\t});\n\t\t\t\tevents.push({ type: \"toolcall_end\", index, name: tool.name, id, arguments: argumentsRecord });\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst safeLength = getSafeStreamTextLength(buffer);\n\t\t\tif (safeLength === 0) {\n\t\t\t\tif (buffer.length >= EAGER_OPEN_TAG_SCAN_LENGTH) {\n\t\t\t\t\tretainPendingFragment(\"open-tag\");\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\temitText(events, buffer.slice(0, safeLength));\n\t\t\tbuffer = buffer.slice(safeLength);\n\t\t}\n\n\t\treturn events;\n\t}\n\n\treturn {\n\t\tfeed(textDelta: string): StreamParserEvent[] {\n\t\t\tif (textDelta.length === 0) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tconst events: StreamParserEvent[] = [];\n\t\t\tlet offset = 0;\n\t\t\twhile (offset < textDelta.length) {\n\t\t\t\tconst capacity = ANTHROPIC_XML_MAX_RETAINED_FRAGMENT_LENGTH - buffer.length;\n\t\t\t\tif (capacity === 0) {\n\t\t\t\t\tevents.push(...overflowPendingFragment());\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst nextOffset = Math.min(textDelta.length, offset + capacity);\n\t\t\t\tconst chunk = textDelta.slice(offset, nextOffset);\n\t\t\t\toffset = nextOffset;\n\t\t\t\tbuffer += chunk;\n\n\t\t\t\tif (pendingFragment) {\n\t\t\t\t\tif (pendingFragment.matcher.feed(chunk)) {\n\t\t\t\t\t\tevents.push(...processBuffer());\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tevents.push(...processBuffer());\n\t\t\t\t}\n\n\t\t\t\tif (pendingFragment && buffer.length === ANTHROPIC_XML_MAX_RETAINED_FRAGMENT_LENGTH) {\n\t\t\t\t\tevents.push(...overflowPendingFragment());\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn events;\n\t\t},\n\t\tfinish(): StreamParserEvent[] {\n\t\t\tconst events = processBuffer();\n\t\t\tif (buffer.length === 0) {\n\t\t\t\treturn events;\n\t\t\t}\n\n\t\t\tconst invokeOpenTag = findInvokeOpenTag(buffer, 0) ?? findIncompleteInvokeOpenTag(buffer, 0);\n\t\t\tif (invokeOpenTag && invokeOpenTag.index === 0 && resolveTool(invokeOpenTag.toolName)) {\n\t\t\t\treportError(options, \"Could not complete streaming Anthropic XML tool call at finish.\", buffer);\n\t\t\t\tif (shouldEmitRawToolCallTextOnError(options)) {\n\t\t\t\t\temitText(events, buffer);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\temitText(events, buffer);\n\t\t\t}\n\t\t\tbuffer = \"\";\n\t\t\treturn events;\n\t\t},\n\t};\n}\n"]}
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../../../src/tool-call-middleware/protocols/anthropic-xml/stream.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Tool } from \"../../../types.ts\";\nimport { validateToolArguments } from \"../../../utils/validation.ts\";\nimport type { ParserOptions, StreamParser, StreamParserEvent } from \"../../types.ts\";\nimport { coerceParameters } from \"./coerce-parameters.ts\";\nimport { findNextInvokeMatch } from \"./invoke-match.ts\";\nimport {\n\tfindIncompleteInvokeOpenTag,\n\tfindInvokeOpenTag,\n\tgetSafeInvokeTextLength,\n\tisPotentialProtocolStart,\n\tscanInvokeBlock,\n\tscanTruncatedInvokeBlock,\n} from \"./invoke-tag-scanner.ts\";\nimport { parseAnthropicXmlGeneratedText } from \"./parse.ts\";\nimport {\n\tANTHROPIC_XML_MAX_RETAINED_FRAGMENT_LENGTH,\n\tcreatePendingFragment,\n\ttype PendingFragment,\n} from \"./stream-boundary.ts\";\nimport { createToolResolver } from \"./tool-resolver.ts\";\nimport { decodeXmlEntities } from \"./xml-entities.ts\";\n\nexport { ANTHROPIC_XML_MAX_RETAINED_FRAGMENT_LENGTH } from \"./stream-boundary.ts\";\n\nconst FUNCTION_CALLS_OPEN_TAG = /<\\s*function_calls\\s*>/;\nconst FUNCTION_CALLS_CLOSE_TAG = /<\\s*\\/\\s*function_calls\\s*>/;\nconst FUNCTION_CALLS_COMPLETE_TAG = /^<\\s*\\/?\\s*function_calls\\s*>/;\nconst FUNCTION_CALLS_OPEN_PREFIX = \"<function_calls>\";\nconst FUNCTION_CALLS_CLOSE_PREFIX = \"</function_calls>\";\nconst EAGER_OPEN_TAG_SCAN_LENGTH = 128;\nconst RETAINED_FRAGMENT_OVERFLOW_MESSAGE = `Anthropic XML streaming fragment exceeded the ${ANTHROPIC_XML_MAX_RETAINED_FRAGMENT_LENGTH}-character retained-input limit.`;\n\ntype FunctionCallsTag = {\n\treadonly index: number;\n\treadonly length: number;\n};\n\nfunction shouldEmitRawToolCallTextOnError(options?: ParserOptions): boolean {\n\treturn options?.emitRawToolCallTextOnError === true;\n}\n\nfunction emitText(events: StreamParserEvent[], text: string): void {\n\tif (text.length > 0) {\n\t\tevents.push({ type: \"text\", text });\n\t}\n}\n\nfunction findFunctionCallsTag(pattern: RegExp, text: string, fromIndex: number): FunctionCallsTag | null {\n\tconst match = pattern.exec(text.slice(fromIndex));\n\tif (!match || match.index === undefined) {\n\t\treturn null;\n\t}\n\n\treturn { index: fromIndex + match.index, length: match[0].length };\n}\n\nfunction isPotentialFunctionCallsTag(candidate: string): boolean {\n\tif (FUNCTION_CALLS_COMPLETE_TAG.test(candidate)) {\n\t\treturn false;\n\t}\n\tconst compactCandidate = candidate.replace(/\\s/g, \"\");\n\treturn (\n\t\tFUNCTION_CALLS_OPEN_PREFIX.startsWith(compactCandidate) ||\n\t\tFUNCTION_CALLS_CLOSE_PREFIX.startsWith(compactCandidate)\n\t);\n}\n\nfunction isWhitespaceOrFunctionCallsClosePrefix(text: string): boolean {\n\tconst compactText = text.replace(/\\s/g, \"\");\n\treturn (\n\t\tcompactText.length === 0 ||\n\t\t(FUNCTION_CALLS_CLOSE_PREFIX.startsWith(compactText) && compactText !== FUNCTION_CALLS_CLOSE_PREFIX)\n\t);\n}\n\nfunction getSafeStreamTextLength(text: string): number {\n\tconst scannerSafeLength = getSafeInvokeTextLength(text);\n\tconst lastTagIndex = text.lastIndexOf(\"<\");\n\tif (lastTagIndex === -1) {\n\t\treturn scannerSafeLength;\n\t}\n\n\treturn isPotentialFunctionCallsTag(text.slice(lastTagIndex))\n\t\t? Math.min(scannerSafeLength, lastTagIndex)\n\t\t: scannerSafeLength;\n}\n\nfunction reportError(options: ParserOptions | undefined, message: string, toolCall: string): void {\n\toptions?.onError?.(message, { toolCall });\n}\n\nfunction coerceStreamParameters(\n\tparameters: Parameters<typeof coerceParameters>[0],\n\ttool: Tool,\n\tallowJsonSchemaFallback = false,\n): Record<string, unknown> | null {\n\tconst coercedParameters = coerceParameters(parameters, tool);\n\tif (coercedParameters !== null || !allowJsonSchemaFallback) {\n\t\treturn coercedParameters;\n\t}\n\n\tconst argumentsRecord: Record<string, unknown> = {};\n\tfor (const parameter of parameters) {\n\t\tif (Object.hasOwn(argumentsRecord, parameter.name)) {\n\t\t\treturn null;\n\t\t}\n\t\tconst rawValue = decodeXmlEntities(parameter.rawValue);\n\t\ttry {\n\t\t\targumentsRecord[parameter.name] = JSON.parse(rawValue);\n\t\t} catch {\n\t\t\targumentsRecord[parameter.name] = rawValue;\n\t\t}\n\t}\n\treturn argumentsRecord;\n}\n\nexport function createAnthropicXmlStreamParser(tools: Tool[], options?: ParserOptions): StreamParser {\n\tconst resolveTool = createToolResolver(tools);\n\tlet buffer = \"\";\n\tlet nextToolCallIndex = 0;\n\tlet pendingFragment: PendingFragment | null = null;\n\n\tfunction retainPendingFragment(kind: PendingFragment[\"kind\"]): void {\n\t\tpendingFragment = createPendingFragment(kind, buffer);\n\t}\n\n\tfunction overflowPendingFragment(): StreamParserEvent[] {\n\t\tconst retainedFragment = buffer;\n\t\tbuffer = \"\";\n\t\tpendingFragment = null;\n\t\treportError(options, RETAINED_FRAGMENT_OVERFLOW_MESSAGE, retainedFragment);\n\n\t\tconst events: StreamParserEvent[] = [];\n\t\tif (shouldEmitRawToolCallTextOnError(options)) {\n\t\t\temitText(events, retainedFragment);\n\t\t}\n\t\treturn events;\n\t}\n\n\tfunction processBuffer(consumeFunctionCallsResidue = false, allowJsonSchemaFallback = false): StreamParserEvent[] {\n\t\tconst events: StreamParserEvent[] = [];\n\t\tpendingFragment = null;\n\n\t\twhile (buffer.length > 0) {\n\t\t\tconst invokeOpenTag = findInvokeOpenTag(buffer, 0);\n\t\t\tconst functionCallsOpenTag = findFunctionCallsTag(FUNCTION_CALLS_OPEN_TAG, buffer, 0);\n\n\t\t\tif (functionCallsOpenTag && (!invokeOpenTag || functionCallsOpenTag.index <= invokeOpenTag.index)) {\n\t\t\t\tif (functionCallsOpenTag.index > 0) {\n\t\t\t\t\temitText(events, buffer.slice(0, functionCallsOpenTag.index));\n\t\t\t\t\tbuffer = buffer.slice(functionCallsOpenTag.index);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst functionCallsCloseTag = findFunctionCallsTag(\n\t\t\t\t\tFUNCTION_CALLS_CLOSE_TAG,\n\t\t\t\t\tbuffer,\n\t\t\t\t\tfunctionCallsOpenTag.length,\n\t\t\t\t);\n\t\t\t\tif (!functionCallsCloseTag) {\n\t\t\t\t\tretainPendingFragment(\"function-calls\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tconst wrapperEnd = functionCallsCloseTag.index + functionCallsCloseTag.length;\n\t\t\t\tconst wrapperContent = buffer.slice(functionCallsOpenTag.length, functionCallsCloseTag.index);\n\t\t\t\tif (parseAnthropicXmlGeneratedText(wrapperContent, tools).length > 0) {\n\t\t\t\t\tbuffer = wrapperContent + buffer.slice(wrapperEnd);\n\t\t\t\t} else {\n\t\t\t\t\temitText(events, buffer.slice(0, wrapperEnd));\n\t\t\t\t\tbuffer = buffer.slice(wrapperEnd);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (invokeOpenTag) {\n\t\t\t\tif (invokeOpenTag.index > 0) {\n\t\t\t\t\temitText(events, buffer.slice(0, invokeOpenTag.index));\n\t\t\t\t\tbuffer = buffer.slice(invokeOpenTag.index);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst tool = resolveTool(invokeOpenTag.toolName);\n\t\t\t\tconst block = scanInvokeBlock(buffer, invokeOpenTag);\n\t\t\t\tif (!tool) {\n\t\t\t\t\tconst nextKnownInvoke = findNextInvokeMatch(\n\t\t\t\t\t\tbuffer,\n\t\t\t\t\t\tinvokeOpenTag.index + invokeOpenTag.length,\n\t\t\t\t\t\t(toolName) => resolveTool(toolName) !== undefined,\n\t\t\t\t\t);\n\t\t\t\t\tif (\n\t\t\t\t\t\tnextKnownInvoke &&\n\t\t\t\t\t\t(block === null || (nextKnownInvoke.block !== null && nextKnownInvoke.block.end === block.end))\n\t\t\t\t\t) {\n\t\t\t\t\t\temitText(events, buffer.slice(0, nextKnownInvoke.openingTag.index));\n\t\t\t\t\t\tbuffer = buffer.slice(nextKnownInvoke.openingTag.index);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!block) {\n\t\t\t\t\tretainPendingFragment(\"invoke\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tconst originalCallText = buffer.slice(0, block.end);\n\t\t\t\tbuffer = buffer.slice(block.end);\n\n\t\t\t\tif (!tool) {\n\t\t\t\t\temitText(events, originalCallText);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst index = nextToolCallIndex;\n\t\t\t\tnextToolCallIndex += 1;\n\t\t\t\tconst id = `anthropic-xml-tool-${index}`;\n\t\t\t\tconst argumentsRecord = block.parameters\n\t\t\t\t\t? coerceStreamParameters(block.parameters, tool, allowJsonSchemaFallback)\n\t\t\t\t\t: null;\n\t\t\t\tif (argumentsRecord === null) {\n\t\t\t\t\treportError(\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\t\"Could not process streaming Anthropic XML tool call, keeping original text.\",\n\t\t\t\t\t\toriginalCallText,\n\t\t\t\t\t);\n\t\t\t\t\tif (shouldEmitRawToolCallTextOnError(options)) {\n\t\t\t\t\t\temitText(events, originalCallText);\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tevents.push({ type: \"toolcall_start\", index, name: tool.name, id });\n\t\t\t\tevents.push({\n\t\t\t\t\ttype: \"toolcall_delta\",\n\t\t\t\t\tindex,\n\t\t\t\t\targumentsDelta: JSON.stringify(argumentsRecord),\n\t\t\t\t});\n\t\t\t\tevents.push({ type: \"toolcall_end\", index, name: tool.name, id, arguments: argumentsRecord });\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (consumeFunctionCallsResidue && isWhitespaceOrFunctionCallsClosePrefix(buffer)) {\n\t\t\t\tbuffer = \"\";\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst safeLength = getSafeStreamTextLength(buffer);\n\t\t\tif (safeLength === 0) {\n\t\t\t\tif (buffer.length >= EAGER_OPEN_TAG_SCAN_LENGTH) {\n\t\t\t\t\tretainPendingFragment(\"open-tag\");\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\temitText(events, buffer.slice(0, safeLength));\n\t\t\tbuffer = buffer.slice(safeLength);\n\t\t}\n\n\t\treturn events;\n\t}\n\n\treturn {\n\t\tfeed(textDelta: string): StreamParserEvent[] {\n\t\t\tif (textDelta.length === 0) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tconst events: StreamParserEvent[] = [];\n\t\t\tlet offset = 0;\n\t\t\twhile (offset < textDelta.length) {\n\t\t\t\tconst capacity = ANTHROPIC_XML_MAX_RETAINED_FRAGMENT_LENGTH - buffer.length;\n\t\t\t\tif (capacity === 0) {\n\t\t\t\t\tevents.push(...overflowPendingFragment());\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst nextOffset = Math.min(textDelta.length, offset + capacity);\n\t\t\t\tconst chunk = textDelta.slice(offset, nextOffset);\n\t\t\t\toffset = nextOffset;\n\t\t\t\tbuffer += chunk;\n\n\t\t\t\tif (pendingFragment) {\n\t\t\t\t\tif (pendingFragment.matcher.feed(chunk)) {\n\t\t\t\t\t\tevents.push(...processBuffer());\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tevents.push(...processBuffer());\n\t\t\t\t}\n\n\t\t\t\tif (pendingFragment && buffer.length === ANTHROPIC_XML_MAX_RETAINED_FRAGMENT_LENGTH) {\n\t\t\t\t\tevents.push(...overflowPendingFragment());\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn events;\n\t\t},\n\t\tfinish(): StreamParserEvent[] {\n\t\t\tconst events = processBuffer();\n\t\t\tconst functionCallsOpenTag = findFunctionCallsTag(FUNCTION_CALLS_OPEN_TAG, buffer, 0);\n\t\t\tif (\n\t\t\t\tfunctionCallsOpenTag?.index === 0 &&\n\t\t\t\tfindFunctionCallsTag(FUNCTION_CALLS_CLOSE_TAG, buffer, functionCallsOpenTag.length) === null\n\t\t\t) {\n\t\t\t\tbuffer = buffer.slice(functionCallsOpenTag.length);\n\t\t\t\tevents.push(...processBuffer(true, true));\n\t\t\t}\n\n\t\t\tif (buffer.length === 0) {\n\t\t\t\treturn events;\n\t\t\t}\n\n\t\t\tconst invokeOpenTag = findInvokeOpenTag(buffer, 0) ?? findIncompleteInvokeOpenTag(buffer, 0);\n\t\t\tconst tool = invokeOpenTag?.index === 0 ? resolveTool(invokeOpenTag.toolName) : undefined;\n\t\t\tif (invokeOpenTag && tool) {\n\t\t\t\tconst scannedBlock = scanTruncatedInvokeBlock(buffer, invokeOpenTag);\n\t\t\t\tconst coercedArguments = coerceStreamParameters(scannedBlock.parameters, tool, true);\n\t\t\t\tlet recoveredArguments: Record<string, unknown> | null = null;\n\t\t\t\tif (scannedBlock.isStructurallyComplete && coercedArguments !== null) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\trecoveredArguments = validateToolArguments(tool, {\n\t\t\t\t\t\t\ttype: \"toolCall\",\n\t\t\t\t\t\t\tid: \"anthropic-xml-finish-recovery\",\n\t\t\t\t\t\t\tname: tool.name,\n\t\t\t\t\t\t\targuments: coercedArguments,\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch {\n\t\t\t\t\t\trecoveredArguments = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst index = nextToolCallIndex;\n\t\t\t\tnextToolCallIndex += 1;\n\t\t\t\tconst id = `anthropic-xml-tool-${index}`;\n\t\t\t\tconst argumentsRecord = recoveredArguments ?? coercedArguments ?? {};\n\t\t\t\tevents.push({ type: \"toolcall_start\", index, name: tool.name, id });\n\t\t\t\tevents.push({ type: \"toolcall_delta\", index, argumentsDelta: JSON.stringify(argumentsRecord) });\n\t\t\t\tif (recoveredArguments) {\n\t\t\t\t\tevents.push({ type: \"toolcall_end\", index, name: tool.name, id, arguments: argumentsRecord });\n\t\t\t\t} else {\n\t\t\t\t\tevents.push({\n\t\t\t\t\t\ttype: \"toolcall_end\",\n\t\t\t\t\t\tindex,\n\t\t\t\t\t\tname: tool.name,\n\t\t\t\t\t\tid,\n\t\t\t\t\t\targuments: argumentsRecord,\n\t\t\t\t\t\tincomplete: true,\n\t\t\t\t\t\terrorMessage: \"Tool call was truncated mid-arguments\",\n\t\t\t\t\t});\n\t\t\t\t\toptions?.onError?.(\"Anthropic XML tool call truncated at finish\", {\n\t\t\t\t\t\tprotocol: \"anthropic-xml\",\n\t\t\t\t\t\tretainedLength: buffer.length,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else if (invokeOpenTag?.index === 0) {\n\t\t\t\temitText(events, buffer);\n\t\t\t} else if (isPotentialProtocolStart(buffer)) {\n\t\t\t\toptions?.onError?.(\"Anthropic XML tool call truncated at finish\", {\n\t\t\t\t\tprotocol: \"anthropic-xml\",\n\t\t\t\t\tretainedLength: buffer.length,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\temitText(events, buffer);\n\t\t\t}\n\t\t\tbuffer = \"\";\n\t\t\treturn events;\n\t\t},\n\t};\n}\n"]}
@@ -16,6 +16,13 @@ export declare function gemma4FormatToolResponse(_toolName: string, _toolCallId:
16
16
  */
17
17
  export declare function gemma4FormatToolsSystemPrompt(tools: Tool[]): string;
18
18
  export declare function parseGemma4Args(argsString: string, partial?: boolean): Record<string, unknown>;
19
+ /**
20
+ * Returns the complete Gemma 4 argument body when the outer argument object is
21
+ * closed and is followed only by whitespace or a partial terminator.
22
+ */
23
+ export declare function scanGemma4ArgsComplete(content: string): {
24
+ rawArgs: string;
25
+ } | null;
19
26
  export declare function gemma4ParseGeneratedText(text: string, _tools: Tool[], _options?: ParserOptions): ParsedToolCall[];
20
- export declare function gemma4CreateStreamParser(_tools: Tool[], _options?: ParserOptions): StreamParser;
27
+ export declare function gemma4CreateStreamParser(tools: Tool[], options?: ParserOptions): StreamParser;
21
28
  //# sourceMappingURL=gemma4.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gemma4.d.ts","sourceRoot":"","sources":["../../../src/tool-call-middleware/protocols/gemma4.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAqB,MAAM,aAAa,CAAC;AA0DlG;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAGxF;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACvC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,GACrC,MAAM,CAQR;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CA8BnE;AA0HD,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,UAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAsI5F;AAqFD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC,EAAE,aAAa,GAAG,cAAc,EAAE,CAgBjH;AAsMD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC,EAAE,aAAa,GAAG,YAAY,CAE/F"}
1
+ {"version":3,"file":"gemma4.d.ts","sourceRoot":"","sources":["../../../src/tool-call-middleware/protocols/gemma4.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAEtE,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAqB,MAAM,aAAa,CAAC;AA0DlG;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAGxF;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACvC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,GACrC,MAAM,CAQR;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CA8BnE;AA0HD,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,UAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAsI5F;AAiBD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAiDlF;AAsED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC,EAAE,aAAa,GAAG,cAAc,EAAE,CAgBjH;AAiRD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,YAAY,CAE7F"}
@@ -1,3 +1,4 @@
1
+ import { validateToolArguments } from "../../utils/validation.js";
1
2
  const STRING_DELIM = '<|"|>';
2
3
  const TOOL_CALL_START = "<|tool_call>";
3
4
  const TOOL_CALL_END = "<tool_call|>";
@@ -324,6 +325,51 @@ function findCommonPrefix(left, right) {
324
325
  function extractToolCalls(text) {
325
326
  return Array.from(text.matchAll(TOOL_CALL_REGEX));
326
327
  }
328
+ /**
329
+ * Returns the complete Gemma 4 argument body when the outer argument object is
330
+ * closed and is followed only by whitespace or a partial terminator.
331
+ */
332
+ export function scanGemma4ArgsComplete(content) {
333
+ const outerOpenIndex = content.indexOf("{");
334
+ if (outerOpenIndex === -1) {
335
+ return null;
336
+ }
337
+ const delimiters = [];
338
+ let insideString = false;
339
+ for (let index = outerOpenIndex; index < content.length; index += 1) {
340
+ if (content.startsWith(STRING_DELIM, index)) {
341
+ insideString = !insideString;
342
+ index += STRING_DELIM.length - 1;
343
+ continue;
344
+ }
345
+ if (STRING_DELIM.startsWith(content.slice(index))) {
346
+ return null;
347
+ }
348
+ if (insideString) {
349
+ continue;
350
+ }
351
+ const character = content[index];
352
+ if (character === "{" || character === "[") {
353
+ delimiters.push(character);
354
+ continue;
355
+ }
356
+ if (character !== "}" && character !== "]") {
357
+ continue;
358
+ }
359
+ const opening = delimiters.pop();
360
+ if ((character === "}" && opening !== "{") || (character === "]" && opening !== "[")) {
361
+ return null;
362
+ }
363
+ if (delimiters.length === 0) {
364
+ const residue = content.slice(index + 1).trim();
365
+ if (residue && residue !== getPartialTokenSuffix(residue, [TOOL_CALL_END, TURN_END])) {
366
+ return null;
367
+ }
368
+ return { rawArgs: content.slice(outerOpenIndex + 1, index) };
369
+ }
370
+ }
371
+ return null;
372
+ }
327
373
  function extractPartialToolCall(content) {
328
374
  if (!content.startsWith("call:")) {
329
375
  return { name: null, rawArgs: "" };
@@ -390,7 +436,7 @@ export function gemma4ParseGeneratedText(text, _tools, _options) {
390
436
  return parsedToolCalls;
391
437
  }
392
438
  class Gemma4StreamParser {
393
- constructor() {
439
+ constructor(tools, options) {
394
440
  this.toolCallIds = [];
395
441
  this.plainTextCarry = "";
396
442
  this.toolCallCarry = "";
@@ -399,6 +445,8 @@ class Gemma4StreamParser {
399
445
  this.currentToolIndex = -1;
400
446
  this.currentToolName = null;
401
447
  this.currentArgumentsJson = "";
448
+ this.tools = tools;
449
+ this.options = options;
402
450
  }
403
451
  feed(textDelta) {
404
452
  const events = [];
@@ -465,9 +513,34 @@ class Gemma4StreamParser {
465
513
  events.push({ type: "text", text: this.plainTextCarry });
466
514
  }
467
515
  if (this.insideToolCall) {
468
- const unfinishedToolCall = TOOL_CALL_START + this.toolCallContent + this.toolCallCarry;
469
- if (unfinishedToolCall) {
470
- events.push({ type: "text", text: unfinishedToolCall });
516
+ const content = this.toolCallContent + this.toolCallCarry;
517
+ const { name, rawArgs } = extractPartialToolCall(content);
518
+ const tool = name ? this.resolveTool(name) : undefined;
519
+ if (!tool || !name) {
520
+ this.reportDroppedToolCall(content.length);
521
+ }
522
+ else {
523
+ const complete = scanGemma4ArgsComplete(content);
524
+ if (complete) {
525
+ const argumentsObject = parseGemma4Args(complete.rawArgs);
526
+ try {
527
+ const validatedArguments = validateToolArguments(tool, {
528
+ type: "toolCall",
529
+ id: this.getCurrentToolCallId(),
530
+ name,
531
+ arguments: argumentsObject,
532
+ });
533
+ this.emitFinalToolCall(events, name, validatedArguments);
534
+ }
535
+ catch {
536
+ this.reportIncompleteToolCall(content.length);
537
+ this.emitIncompleteToolCall(events, name, parseGemma4Args(rawArgs, true));
538
+ }
539
+ }
540
+ else {
541
+ this.reportIncompleteToolCall(content.length);
542
+ this.emitIncompleteToolCall(events, name, parseGemma4Args(rawArgs, true));
543
+ }
471
544
  }
472
545
  }
473
546
  this.plainTextCarry = "";
@@ -480,18 +553,10 @@ class Gemma4StreamParser {
480
553
  }
481
554
  emitPartialToolCall(events) {
482
555
  const { name, rawArgs } = extractPartialToolCall(this.toolCallContent);
483
- if (!name) {
556
+ if (!name || !this.resolveTool(name)) {
484
557
  return;
485
558
  }
486
- if (!this.currentToolName) {
487
- this.currentToolName = name;
488
- events.push({
489
- type: "toolcall_start",
490
- index: this.currentToolIndex,
491
- name,
492
- id: this.toolCallIds[this.currentToolIndex] ?? `gemma4-tool-${this.currentToolIndex}`,
493
- });
494
- }
559
+ this.emitToolCallStart(events, name);
495
560
  if (!rawArgs) {
496
561
  return;
497
562
  }
@@ -524,19 +589,26 @@ class Gemma4StreamParser {
524
589
  }
525
590
  emitCompletedToolCall(events) {
526
591
  const { name, rawArgs } = extractPartialToolCall(this.toolCallContent);
527
- if (!name) {
592
+ if (!name || !this.resolveTool(name)) {
593
+ this.reportDroppedToolCall(this.toolCallContent.length);
528
594
  return;
529
595
  }
530
- if (!this.currentToolName) {
531
- this.currentToolName = name;
532
- events.push({
533
- type: "toolcall_start",
534
- index: this.currentToolIndex,
535
- name,
536
- id: this.toolCallIds[this.currentToolIndex] ?? `gemma4-tool-${this.currentToolIndex}`,
537
- });
596
+ this.emitFinalToolCall(events, name, parseGemma4Args(rawArgs));
597
+ }
598
+ emitToolCallStart(events, name) {
599
+ if (this.currentToolName) {
600
+ return;
538
601
  }
539
- const argumentsObject = parseGemma4Args(rawArgs);
602
+ this.currentToolName = name;
603
+ events.push({
604
+ type: "toolcall_start",
605
+ index: this.currentToolIndex,
606
+ name,
607
+ id: this.getCurrentToolCallId(),
608
+ });
609
+ }
610
+ emitFinalToolCall(events, name, argumentsObject) {
611
+ this.emitToolCallStart(events, name);
540
612
  const argumentsJson = JSON.stringify(argumentsObject);
541
613
  const finalDelta = argumentsJson.slice(this.currentArgumentsJson.length);
542
614
  if (finalDelta) {
@@ -550,12 +622,42 @@ class Gemma4StreamParser {
550
622
  type: "toolcall_end",
551
623
  index: this.currentToolIndex,
552
624
  name,
553
- id: this.toolCallIds[this.currentToolIndex] ?? `gemma4-tool-${this.currentToolIndex}`,
625
+ id: this.getCurrentToolCallId(),
554
626
  arguments: argumentsObject,
555
627
  });
556
628
  }
629
+ emitIncompleteToolCall(events, name, argumentsObject) {
630
+ this.emitToolCallStart(events, name);
631
+ events.push({
632
+ type: "toolcall_end",
633
+ index: this.currentToolIndex,
634
+ name,
635
+ id: this.getCurrentToolCallId(),
636
+ arguments: argumentsObject,
637
+ incomplete: true,
638
+ errorMessage: "Tool call was truncated mid-arguments",
639
+ });
640
+ }
641
+ getCurrentToolCallId() {
642
+ return this.toolCallIds[this.currentToolIndex] ?? `gemma4-tool-${this.currentToolIndex}`;
643
+ }
644
+ resolveTool(name) {
645
+ return this.tools.find((tool) => tool.name === name);
646
+ }
647
+ reportIncompleteToolCall(retainedLength) {
648
+ this.options?.onError?.("Could not complete Gemma4 tool call at finish.", {
649
+ protocol: "gemma4-delimiter",
650
+ retainedLength,
651
+ });
652
+ }
653
+ reportDroppedToolCall(retainedLength) {
654
+ this.options?.onError?.("Gemma4 tool call dropped", {
655
+ protocol: "gemma4-delimiter",
656
+ retainedLength,
657
+ });
658
+ }
557
659
  }
558
- export function gemma4CreateStreamParser(_tools, _options) {
559
- return new Gemma4StreamParser();
660
+ export function gemma4CreateStreamParser(tools, options) {
661
+ return new Gemma4StreamParser(tools, options);
560
662
  }
561
663
  //# sourceMappingURL=gemma4.js.map