@code-yeongyu/senpi 2026.7.14-3 → 2026.7.14

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 (171) hide show
  1. package/CHANGELOG.md +0 -38
  2. package/dist/core/agent-session.js +1 -1
  3. package/dist/core/agent-session.js.map +1 -1
  4. package/dist/core/compaction/branch-summarization.d.ts +1 -1
  5. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  6. package/dist/core/compaction/branch-summarization.js.map +1 -1
  7. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts.map +1 -1
  8. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +5 -14
  9. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js.map +1 -1
  10. package/dist/core/extensions/builtin/terminal/runtime-session.d.ts +1 -1
  11. package/dist/core/extensions/builtin/terminal/runtime-session.d.ts.map +1 -1
  12. package/dist/core/extensions/builtin/terminal/runtime-session.js +2 -3
  13. package/dist/core/extensions/builtin/terminal/runtime-session.js.map +1 -1
  14. package/dist/core/model-registry.d.ts.map +1 -1
  15. package/dist/core/model-registry.js +3 -18
  16. package/dist/core/model-registry.js.map +1 -1
  17. package/dist/core/model-resolver.d.ts.map +1 -1
  18. package/dist/core/model-resolver.js +0 -1
  19. package/dist/core/model-resolver.js.map +1 -1
  20. package/dist/core/package-manager.d.ts.map +1 -1
  21. package/dist/core/package-manager.js +2 -7
  22. package/dist/core/package-manager.js.map +1 -1
  23. package/dist/core/provider-display-names.d.ts.map +1 -1
  24. package/dist/core/provider-display-names.js +0 -1
  25. package/dist/core/provider-display-names.js.map +1 -1
  26. package/dist/core/system-prompt.d.ts.map +1 -1
  27. package/dist/core/system-prompt.js +11 -1
  28. package/dist/core/system-prompt.js.map +1 -1
  29. package/dist/modes/interactive/interactive-mode.js +2 -2
  30. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  31. package/docs/custom-provider.md +0 -2
  32. package/docs/models.md +0 -2
  33. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  34. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  35. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  36. package/examples/extensions/gondolin/package-lock.json +2 -2
  37. package/examples/extensions/gondolin/package.json +1 -1
  38. package/examples/extensions/sandbox/package-lock.json +2 -2
  39. package/examples/extensions/sandbox/package.json +1 -1
  40. package/examples/extensions/with-deps/package-lock.json +2 -2
  41. package/examples/extensions/with-deps/package.json +1 -1
  42. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +0 -16
  43. package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
  44. package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
  45. package/node_modules/@earendil-works/pi-ai/README.md +2 -3
  46. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
  47. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +42 -23
  48. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
  49. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.d.ts.map +1 -1
  50. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js +6 -10
  51. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js.map +1 -1
  52. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts +0 -1
  53. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts.map +1 -1
  54. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js +1 -1
  55. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -1
  56. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts.map +1 -1
  57. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +3 -12
  58. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
  59. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts.map +1 -1
  60. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js +0 -23
  61. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js.map +1 -1
  62. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts +0 -1
  63. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts.map +1 -1
  64. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +6 -22
  65. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
  66. package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts +0 -2
  67. package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts.map +1 -1
  68. package/node_modules/@earendil-works/pi-ai/dist/compat.js +0 -3
  69. package/node_modules/@earendil-works/pi-ai/dist/compat.js.map +1 -1
  70. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.d.ts.map +1 -1
  71. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js +0 -1
  72. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js.map +1 -1
  73. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +0 -1
  74. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
  75. package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
  76. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +6 -58
  77. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
  78. package/node_modules/@earendil-works/pi-ai/dist/providers/all.d.ts +5 -9
  79. package/node_modules/@earendil-works/pi-ai/dist/providers/all.d.ts.map +1 -1
  80. package/node_modules/@earendil-works/pi-ai/dist/providers/all.js.map +1 -1
  81. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.d.ts +6 -1
  82. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.d.ts.map +1 -1
  83. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.js +2 -1
  84. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.js.map +1 -1
  85. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.d.ts +0 -57
  86. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.d.ts.map +1 -1
  87. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.js +0 -19
  88. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.js.map +1 -1
  89. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js +10 -10
  90. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js.map +1 -1
  91. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.js +2 -2
  92. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.js.map +1 -1
  93. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/context-transformer.d.ts.map +1 -1
  94. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/context-transformer.js +0 -9
  95. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/context-transformer.js.map +1 -1
  96. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.d.ts +1 -1
  97. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.d.ts.map +1 -1
  98. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.js +2 -6
  99. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.js.map +1 -1
  100. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/types.d.ts +1 -3
  101. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/types.d.ts.map +1 -1
  102. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/types.js.map +1 -1
  103. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +5 -10
  104. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  105. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  106. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.d.ts +0 -1
  107. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.d.ts.map +1 -1
  108. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.js +0 -9
  109. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.js.map +1 -1
  110. package/node_modules/@earendil-works/pi-ai/package.json +1 -1
  111. package/node_modules/@earendil-works/pi-pty/native/prebuilds/darwin-arm64/senpi_pty.darwin-arm64.node +0 -0
  112. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  113. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  114. package/package.json +6 -6
  115. package/dist/core/radius.d.ts +0 -21
  116. package/dist/core/radius.d.ts.map +0 -1
  117. package/dist/core/radius.js +0 -30
  118. package/dist/core/radius.js.map +0 -1
  119. package/examples/AGENTS.md +0 -34
  120. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.d.ts +0 -97
  121. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.d.ts.map +0 -1
  122. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.js +0 -307
  123. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.js.map +0 -1
  124. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.lazy.d.ts +0 -3
  125. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.lazy.d.ts.map +0 -1
  126. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.lazy.js +0 -3
  127. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.lazy.js.map +0 -1
  128. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/coerce-parameters.d.ts +0 -8
  129. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/coerce-parameters.d.ts.map +0 -1
  130. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/coerce-parameters.js +0 -92
  131. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/coerce-parameters.js.map +0 -1
  132. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/format.d.ts +0 -6
  133. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/format.d.ts.map +0 -1
  134. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/format.js +0 -54
  135. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/format.js.map +0 -1
  136. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/index.d.ts +0 -4
  137. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/index.d.ts.map +0 -1
  138. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/index.js +0 -4
  139. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/index.js.map +0 -1
  140. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-match.d.ts +0 -7
  141. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-match.d.ts.map +0 -1
  142. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-match.js +0 -16
  143. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-match.js.map +0 -1
  144. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.d.ts +0 -19
  145. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.d.ts.map +0 -1
  146. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.js +0 -217
  147. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.js.map +0 -1
  148. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/parse.d.ts +0 -4
  149. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/parse.d.ts.map +0 -1
  150. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/parse.js +0 -46
  151. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/parse.js.map +0 -1
  152. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.d.ts +0 -13
  153. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.d.ts.map +0 -1
  154. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.js +0 -144
  155. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.js.map +0 -1
  156. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.d.ts +0 -5
  157. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.d.ts.map +0 -1
  158. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.js +0 -208
  159. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.js.map +0 -1
  160. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/tool-resolver.d.ts +0 -4
  161. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/tool-resolver.d.ts.map +0 -1
  162. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/tool-resolver.js +0 -17
  163. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/tool-resolver.js.map +0 -1
  164. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/xml-entities.d.ts +0 -5
  165. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/xml-entities.d.ts.map +0 -1
  166. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/xml-entities.js +0 -34
  167. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/xml-entities.js.map +0 -1
  168. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/radius.d.ts +0 -39
  169. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/radius.d.ts.map +0 -1
  170. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/radius.js +0 -413
  171. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/radius.js.map +0 -1
@@ -1,8 +0,0 @@
1
- import type { Tool } from "../../../types.ts";
2
- type RawParameter = {
3
- readonly name: string;
4
- readonly rawValue: string;
5
- };
6
- export declare function coerceParameters(rawParams: readonly RawParameter[], tool: Tool): Record<string, unknown> | null;
7
- export {};
8
- //# sourceMappingURL=coerce-parameters.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"coerce-parameters.d.ts","sourceRoot":"","sources":["../../../../src/tool-call-middleware/protocols/anthropic-xml/coerce-parameters.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAG9C,KAAK,YAAY,GAAG;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC1B,CAAC;AAYF,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,SAAS,YAAY,EAAE,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CA6B/G"}
@@ -1,92 +0,0 @@
1
- import { IsArray, IsBoolean, IsInteger, IsNumber, IsObject, IsString } from "typebox";
2
- import { Value } from "typebox/value";
3
- import { decodeXmlEntities } from "./xml-entities.js";
4
- const INVALID = { ok: false };
5
- const LEADING_RAW_NEWLINE = /^(?:\r\n|\r|\n)/;
6
- const TRAILING_RAW_NEWLINE = /(?:\r\n|\r|\n)$/;
7
- function trimRawBoundaryNewlines(value) {
8
- return value.replace(LEADING_RAW_NEWLINE, "").replace(TRAILING_RAW_NEWLINE, "");
9
- }
10
- export function coerceParameters(rawParams, tool) {
11
- if (!IsObject(tool.parameters)) {
12
- return null;
13
- }
14
- const argumentsRecord = {};
15
- for (const rawParam of rawParams) {
16
- if (Object.hasOwn(argumentsRecord, rawParam.name)) {
17
- return null;
18
- }
19
- const propertySchema = tool.parameters.properties[rawParam.name];
20
- const rawValue = trimRawBoundaryNewlines(rawParam.rawValue);
21
- const result = propertySchema
22
- ? coerceKnownValue(rawValue, propertySchema)
23
- : { ok: true, value: coerceUnknownValue(rawValue) };
24
- if (!result.ok) {
25
- return null;
26
- }
27
- Object.defineProperty(argumentsRecord, rawParam.name, {
28
- configurable: true,
29
- enumerable: true,
30
- value: result.value,
31
- writable: true,
32
- });
33
- }
34
- return passesToolValidation(tool, argumentsRecord) ? argumentsRecord : null;
35
- }
36
- function coerceKnownValue(rawValue, schema) {
37
- const value = decodeXmlEntities(rawValue);
38
- if (IsString(schema)) {
39
- return { ok: true, value };
40
- }
41
- if (IsNumber(schema) || IsInteger(schema)) {
42
- if (value.trim().length === 0) {
43
- return INVALID;
44
- }
45
- const parsed = Number(value);
46
- if (!Number.isFinite(parsed) || (IsInteger(schema) && !Number.isInteger(parsed))) {
47
- return INVALID;
48
- }
49
- return { ok: true, value: parsed };
50
- }
51
- if (IsBoolean(schema)) {
52
- if (value === "true") {
53
- return { ok: true, value: true };
54
- }
55
- if (value === "false") {
56
- return { ok: true, value: false };
57
- }
58
- return INVALID;
59
- }
60
- if (IsArray(schema)) {
61
- const parsed = tryParseJson(value);
62
- return parsed.ok && Array.isArray(parsed.value) ? parsed : INVALID;
63
- }
64
- if (IsObject(schema)) {
65
- const parsed = tryParseJson(value);
66
- return parsed.ok && isJsonObject(parsed.value) ? parsed : INVALID;
67
- }
68
- return { ok: true, value: coerceUnknownValue(rawValue) };
69
- }
70
- function coerceUnknownValue(rawValue) {
71
- const value = decodeXmlEntities(rawValue);
72
- const parsed = tryParseJson(value);
73
- return parsed.ok ? parsed.value : value;
74
- }
75
- function tryParseJson(value) {
76
- try {
77
- return { ok: true, value: JSON.parse(value) };
78
- }
79
- catch (error) {
80
- if (error instanceof SyntaxError) {
81
- return INVALID;
82
- }
83
- throw error;
84
- }
85
- }
86
- function isJsonObject(value) {
87
- return typeof value === "object" && value !== null && !Array.isArray(value);
88
- }
89
- function passesToolValidation(tool, argumentsRecord) {
90
- return Value.Check(tool.parameters, argumentsRecord);
91
- }
92
- //# sourceMappingURL=coerce-parameters.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"coerce-parameters.js","sourceRoot":"","sources":["../../../../src/tool-call-middleware/protocols/anthropic-xml/coerce-parameters.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TSchema } from \"typebox\";\nimport { IsArray, IsBoolean, IsInteger, IsNumber, IsObject, IsString } from \"typebox\";\nimport { Value } from \"typebox/value\";\nimport type { Tool } from \"../../../types.ts\";\nimport { decodeXmlEntities } from \"./xml-entities.ts\";\n\ntype RawParameter = {\n\treadonly name: string;\n\treadonly rawValue: string;\n};\n\ntype CoercionResult = { readonly ok: true; readonly value: unknown } | { readonly ok: false };\n\nconst INVALID: CoercionResult = { ok: false };\nconst LEADING_RAW_NEWLINE = /^(?:\\r\\n|\\r|\\n)/;\nconst TRAILING_RAW_NEWLINE = /(?:\\r\\n|\\r|\\n)$/;\n\nfunction trimRawBoundaryNewlines(value: string): string {\n\treturn value.replace(LEADING_RAW_NEWLINE, \"\").replace(TRAILING_RAW_NEWLINE, \"\");\n}\n\nexport function coerceParameters(rawParams: readonly RawParameter[], tool: Tool): Record<string, unknown> | null {\n\tif (!IsObject(tool.parameters)) {\n\t\treturn null;\n\t}\n\n\tconst argumentsRecord: Record<string, unknown> = {};\n\tfor (const rawParam of rawParams) {\n\t\tif (Object.hasOwn(argumentsRecord, rawParam.name)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst propertySchema = tool.parameters.properties[rawParam.name];\n\t\tconst rawValue = trimRawBoundaryNewlines(rawParam.rawValue);\n\t\tconst result = propertySchema\n\t\t\t? coerceKnownValue(rawValue, propertySchema)\n\t\t\t: { ok: true, value: coerceUnknownValue(rawValue) };\n\t\tif (!result.ok) {\n\t\t\treturn null;\n\t\t}\n\n\t\tObject.defineProperty(argumentsRecord, rawParam.name, {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: true,\n\t\t\tvalue: result.value,\n\t\t\twritable: true,\n\t\t});\n\t}\n\n\treturn passesToolValidation(tool, argumentsRecord) ? argumentsRecord : null;\n}\n\nfunction coerceKnownValue(rawValue: string, schema: TSchema): CoercionResult {\n\tconst value = decodeXmlEntities(rawValue);\n\n\tif (IsString(schema)) {\n\t\treturn { ok: true, value };\n\t}\n\n\tif (IsNumber(schema) || IsInteger(schema)) {\n\t\tif (value.trim().length === 0) {\n\t\t\treturn INVALID;\n\t\t}\n\t\tconst parsed = Number(value);\n\t\tif (!Number.isFinite(parsed) || (IsInteger(schema) && !Number.isInteger(parsed))) {\n\t\t\treturn INVALID;\n\t\t}\n\t\treturn { ok: true, value: parsed };\n\t}\n\n\tif (IsBoolean(schema)) {\n\t\tif (value === \"true\") {\n\t\t\treturn { ok: true, value: true };\n\t\t}\n\t\tif (value === \"false\") {\n\t\t\treturn { ok: true, value: false };\n\t\t}\n\t\treturn INVALID;\n\t}\n\n\tif (IsArray(schema)) {\n\t\tconst parsed = tryParseJson(value);\n\t\treturn parsed.ok && Array.isArray(parsed.value) ? parsed : INVALID;\n\t}\n\n\tif (IsObject(schema)) {\n\t\tconst parsed = tryParseJson(value);\n\t\treturn parsed.ok && isJsonObject(parsed.value) ? parsed : INVALID;\n\t}\n\n\treturn { ok: true, value: coerceUnknownValue(rawValue) };\n}\n\nfunction coerceUnknownValue(rawValue: string): unknown {\n\tconst value = decodeXmlEntities(rawValue);\n\tconst parsed = tryParseJson(value);\n\treturn parsed.ok ? parsed.value : value;\n}\n\nfunction tryParseJson(value: string): CoercionResult {\n\ttry {\n\t\treturn { ok: true, value: JSON.parse(value) };\n\t} catch (error) {\n\t\tif (error instanceof SyntaxError) {\n\t\t\treturn INVALID;\n\t\t}\n\t\tthrow error;\n\t}\n}\n\nfunction isJsonObject(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction passesToolValidation(tool: Tool, argumentsRecord: Record<string, unknown>): boolean {\n\treturn Value.Check(tool.parameters, argumentsRecord);\n}\n"]}
@@ -1,6 +0,0 @@
1
- import type { Tool } from "../../../types.ts";
2
- import type { ToolResultContent } from "../../types.ts";
3
- export declare function anthropicXmlFormatToolsSystemPrompt(tools: Tool[]): string;
4
- export declare function anthropicXmlFormatToolCall(name: string, args: Record<string, unknown>): string;
5
- export declare function anthropicXmlFormatToolResponse(toolName: string, _toolCallId: string, content: ToolResultContent[]): string;
6
- //# sourceMappingURL=format.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../../src/tool-call-middleware/protocols/anthropic-xml/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAuBxD,wBAAgB,mCAAmC,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CAoBzE;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAO9F;AAED,wBAAgB,8BAA8B,CAC7C,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,iBAAiB,EAAE,GAC1B,MAAM,CAcR"}
@@ -1,54 +0,0 @@
1
- import { encodeXmlAttribute, encodeXmlParameterText, encodeXmlText } from "./xml-entities.js";
2
- function serializeToolValue(value) {
3
- if (typeof value === "object" && value !== null) {
4
- return JSON.stringify(value) ?? "null";
5
- }
6
- return String(value);
7
- }
8
- function renderToolDefinitions(tools) {
9
- const json = JSON.stringify(tools.map((tool) => ({
10
- name: tool.name,
11
- description: tool.description,
12
- parameters: tool.parameters,
13
- })));
14
- return json.replace(/</g, "\\u003c").replace(/>/g, "\\u003e").replace(/&/g, "\\u0026");
15
- }
16
- export function anthropicXmlFormatToolsSystemPrompt(tools) {
17
- if (tools.length === 0) {
18
- return "";
19
- }
20
- return `# Tools
21
-
22
- You may call one or more functions to assist with the user query.
23
-
24
- You are provided with function signatures as JSON within <tools></tools> XML tags:
25
- <tools>${renderToolDefinitions(tools)}</tools>
26
-
27
- # Format
28
-
29
- For each function call, emit exactly one bare <invoke> element with the tool name in its name attribute.
30
- Put each argument in one <parameter> element with its name in the name attribute.
31
- Do not wrap the invoke element in another XML element.
32
-
33
- # Example
34
- <invoke name="get_weather"><parameter name="city">Seoul</parameter></invoke>`;
35
- }
36
- export function anthropicXmlFormatToolCall(name, args) {
37
- const parameters = Object.entries(args).map(([parameterName, value]) => `<parameter name="${encodeXmlAttribute(parameterName)}">${encodeXmlParameterText(serializeToolValue(value))}</parameter>`);
38
- return [`<invoke name="${encodeXmlAttribute(name)}">`, ...parameters, "</invoke>"].join("\n");
39
- }
40
- export function anthropicXmlFormatToolResponse(toolName, _toolCallId, content) {
41
- const textContent = content
42
- .filter((entry) => entry.type === "text")
43
- .map((entry) => entry.text)
44
- .join("\n");
45
- return [
46
- "<function_results>",
47
- "<result>",
48
- `<tool_name>${encodeXmlText(toolName)}</tool_name>`,
49
- `<stdout>${encodeXmlText(textContent)}</stdout>`,
50
- "</result>",
51
- "</function_results>",
52
- ].join("\n");
53
- }
54
- //# sourceMappingURL=format.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"format.js","sourceRoot":"","sources":["../../../../src/tool-call-middleware/protocols/anthropic-xml/format.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAE9F,SAAS,kBAAkB,CAAC,KAAc;IACzC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC;IACxC,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACtB,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAa;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAC1B,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACpB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;KAC3B,CAAC,CAAC,CACH,CAAC;IAEF,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AACxF,CAAC;AAED,MAAM,UAAU,mCAAmC,CAAC,KAAa;IAChE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACX,CAAC;IAED,OAAO;;;;;SAKC,qBAAqB,CAAC,KAAK,CAAC;;;;;;;;;6EASwC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,IAAY,EAAE,IAA6B;IACrF,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAC1C,CAAC,CAAC,aAAa,EAAE,KAAK,CAAC,EAAE,EAAE,CAC1B,oBAAoB,kBAAkB,CAAC,aAAa,CAAC,KAAK,sBAAsB,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,cAAc,CAC1H,CAAC;IAEF,OAAO,CAAC,iBAAiB,kBAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,UAAU,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/F,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC7C,QAAgB,EAChB,WAAmB,EACnB,OAA4B;IAE5B,MAAM,WAAW,GAAG,OAAO;SACzB,MAAM,CAAC,CAAC,KAAK,EAAyD,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;SAC/F,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;SAC1B,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,OAAO;QACN,oBAAoB;QACpB,UAAU;QACV,cAAc,aAAa,CAAC,QAAQ,CAAC,cAAc;QACnD,WAAW,aAAa,CAAC,WAAW,CAAC,WAAW;QAChD,WAAW;QACX,qBAAqB;KACrB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACd,CAAC","sourcesContent":["import type { Tool } from \"../../../types.ts\";\nimport type { ToolResultContent } from \"../../types.ts\";\nimport { encodeXmlAttribute, encodeXmlParameterText, encodeXmlText } from \"./xml-entities.ts\";\n\nfunction serializeToolValue(value: unknown): string {\n\tif (typeof value === \"object\" && value !== null) {\n\t\treturn JSON.stringify(value) ?? \"null\";\n\t}\n\n\treturn String(value);\n}\n\nfunction renderToolDefinitions(tools: Tool[]): string {\n\tconst json = JSON.stringify(\n\t\ttools.map((tool) => ({\n\t\t\tname: tool.name,\n\t\t\tdescription: tool.description,\n\t\t\tparameters: tool.parameters,\n\t\t})),\n\t);\n\n\treturn json.replace(/</g, \"\\\\u003c\").replace(/>/g, \"\\\\u003e\").replace(/&/g, \"\\\\u0026\");\n}\n\nexport function anthropicXmlFormatToolsSystemPrompt(tools: Tool[]): string {\n\tif (tools.length === 0) {\n\t\treturn \"\";\n\t}\n\n\treturn `# Tools\n\nYou may call one or more functions to assist with the user query.\n\nYou are provided with function signatures as JSON within <tools></tools> XML tags:\n<tools>${renderToolDefinitions(tools)}</tools>\n\n# Format\n\nFor each function call, emit exactly one bare <invoke> element with the tool name in its name attribute.\nPut each argument in one <parameter> element with its name in the name attribute.\nDo not wrap the invoke element in another XML element.\n\n# Example\n<invoke name=\"get_weather\"><parameter name=\"city\">Seoul</parameter></invoke>`;\n}\n\nexport function anthropicXmlFormatToolCall(name: string, args: Record<string, unknown>): string {\n\tconst parameters = Object.entries(args).map(\n\t\t([parameterName, value]) =>\n\t\t\t`<parameter name=\"${encodeXmlAttribute(parameterName)}\">${encodeXmlParameterText(serializeToolValue(value))}</parameter>`,\n\t);\n\n\treturn [`<invoke name=\"${encodeXmlAttribute(name)}\">`, ...parameters, \"</invoke>\"].join(\"\\n\");\n}\n\nexport function anthropicXmlFormatToolResponse(\n\ttoolName: string,\n\t_toolCallId: string,\n\tcontent: ToolResultContent[],\n): string {\n\tconst textContent = content\n\t\t.filter((entry): entry is Extract<ToolResultContent, { type: \"text\" }> => entry.type === \"text\")\n\t\t.map((entry) => entry.text)\n\t\t.join(\"\\n\");\n\n\treturn [\n\t\t\"<function_results>\",\n\t\t\"<result>\",\n\t\t`<tool_name>${encodeXmlText(toolName)}</tool_name>`,\n\t\t`<stdout>${encodeXmlText(textContent)}</stdout>`,\n\t\t\"</result>\",\n\t\t\"</function_results>\",\n\t].join(\"\\n\");\n}\n"]}
@@ -1,4 +0,0 @@
1
- export { anthropicXmlFormatToolCall, anthropicXmlFormatToolResponse, anthropicXmlFormatToolsSystemPrompt, } from "./format.ts";
2
- export { parseAnthropicXmlGeneratedText } from "./parse.ts";
3
- export { createAnthropicXmlStreamParser } from "./stream.ts";
4
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/tool-call-middleware/protocols/anthropic-xml/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,0BAA0B,EAC1B,8BAA8B,EAC9B,mCAAmC,GACnC,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,8BAA8B,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC"}
@@ -1,4 +0,0 @@
1
- export { anthropicXmlFormatToolCall, anthropicXmlFormatToolResponse, anthropicXmlFormatToolsSystemPrompt, } from "./format.js";
2
- export { parseAnthropicXmlGeneratedText } from "./parse.js";
3
- export { createAnthropicXmlStreamParser } from "./stream.js";
4
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/tool-call-middleware/protocols/anthropic-xml/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,0BAA0B,EAC1B,8BAA8B,EAC9B,mCAAmC,GACnC,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,8BAA8B,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC","sourcesContent":["export {\n\tanthropicXmlFormatToolCall,\n\tanthropicXmlFormatToolResponse,\n\tanthropicXmlFormatToolsSystemPrompt,\n} from \"./format.ts\";\nexport { parseAnthropicXmlGeneratedText } from \"./parse.ts\";\nexport { createAnthropicXmlStreamParser } from \"./stream.ts\";\n"]}
@@ -1,7 +0,0 @@
1
- import type { InvokeBlockMatch, InvokeOpenTagMatch } from "./invoke-tag-scanner.ts";
2
- export type InvokeMatch = {
3
- readonly openingTag: InvokeOpenTagMatch;
4
- readonly block: InvokeBlockMatch | null;
5
- };
6
- export declare function findNextInvokeMatch(text: string, fromIndex: number, matchesToolName: (toolName: string) => boolean): InvokeMatch | null;
7
- //# sourceMappingURL=invoke-match.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"invoke-match.d.ts","sourceRoot":"","sources":["../../../../src/tool-call-middleware/protocols/anthropic-xml/invoke-match.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAGpF,MAAM,MAAM,WAAW,GAAG;IACzB,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACxC,CAAC;AAEF,wBAAgB,mBAAmB,CAClC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,GAC5C,WAAW,GAAG,IAAI,CAapB"}
@@ -1,16 +0,0 @@
1
- import { findInvokeOpenTag, scanInvokeBlock } from "./invoke-tag-scanner.js";
2
- export function findNextInvokeMatch(text, fromIndex, matchesToolName) {
3
- let cursor = Math.max(0, fromIndex);
4
- while (cursor < text.length) {
5
- const openingTag = findInvokeOpenTag(text, cursor);
6
- if (!openingTag) {
7
- return null;
8
- }
9
- if (matchesToolName(openingTag.toolName)) {
10
- return { openingTag, block: scanInvokeBlock(text, openingTag) };
11
- }
12
- cursor = openingTag.index + openingTag.length;
13
- }
14
- return null;
15
- }
16
- //# sourceMappingURL=invoke-match.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"invoke-match.js","sourceRoot":"","sources":["../../../../src/tool-call-middleware/protocols/anthropic-xml/invoke-match.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAO7E,MAAM,UAAU,mBAAmB,CAClC,IAAY,EACZ,SAAiB,EACjB,eAA8C;IAE9C,IAAI,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IACpC,OAAO,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACnD,IAAI,CAAC,UAAU,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACb,CAAC;QACD,IAAI,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1C,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,eAAe,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC;QACjE,CAAC;QACD,MAAM,GAAG,UAAU,CAAC,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC;IAC/C,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC","sourcesContent":["import type { InvokeBlockMatch, InvokeOpenTagMatch } from \"./invoke-tag-scanner.ts\";\nimport { findInvokeOpenTag, scanInvokeBlock } from \"./invoke-tag-scanner.ts\";\n\nexport type InvokeMatch = {\n\treadonly openingTag: InvokeOpenTagMatch;\n\treadonly block: InvokeBlockMatch | null;\n};\n\nexport function findNextInvokeMatch(\n\ttext: string,\n\tfromIndex: number,\n\tmatchesToolName: (toolName: string) => boolean,\n): InvokeMatch | null {\n\tlet cursor = Math.max(0, fromIndex);\n\twhile (cursor < text.length) {\n\t\tconst openingTag = findInvokeOpenTag(text, cursor);\n\t\tif (!openingTag) {\n\t\t\treturn null;\n\t\t}\n\t\tif (matchesToolName(openingTag.toolName)) {\n\t\t\treturn { openingTag, block: scanInvokeBlock(text, openingTag) };\n\t\t}\n\t\tcursor = openingTag.index + openingTag.length;\n\t}\n\treturn null;\n}\n"]}
@@ -1,19 +0,0 @@
1
- export type InvokeOpenTagMatch = {
2
- readonly index: number;
3
- readonly length: number;
4
- readonly toolName: string;
5
- };
6
- export type InvokeParameter = {
7
- readonly name: string;
8
- readonly rawValue: string;
9
- };
10
- export type InvokeBlockMatch = {
11
- readonly contentEnd: number;
12
- readonly end: number;
13
- readonly parameters: InvokeParameter[] | null;
14
- };
15
- export declare function findInvokeOpenTag(text: string, fromIndex: number): InvokeOpenTagMatch | null;
16
- export declare function findIncompleteInvokeOpenTag(text: string, fromIndex: number): InvokeOpenTagMatch | null;
17
- export declare function scanInvokeBlock(text: string, openingTag: InvokeOpenTagMatch): InvokeBlockMatch | null;
18
- export declare function getSafeInvokeTextLength(text: string): number;
19
- //# sourceMappingURL=invoke-tag-scanner.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"invoke-tag-scanner.d.ts","sourceRoot":"","sources":["../../../../src/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.ts"],"names":[],"mappings":"AAyBA,MAAM,MAAM,kBAAkB,GAAG;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC;CAC9C,CAAC;AAwEF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAS5F;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CA2BtG;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,kBAAkB,GAAG,gBAAgB,GAAG,IAAI,CA4DrG;AAqED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO5D"}
@@ -1,217 +0,0 @@
1
- import { decodeXmlEntities } from "./xml-entities.js";
2
- const PROTOCOL_TAG_NAMES = ["invoke", "parameter", "function_calls"];
3
- const INVOKE_OPEN_TAG_BODY = String.raw `<\s*invoke\b\s+name\s*=\s*(?:"([^"]+)"|'([^']+)')`;
4
- const INVOKE_OPEN_TAG = new RegExp(`${INVOKE_OPEN_TAG_BODY}\\s*>`, "g");
5
- const INVOKE_CLOSE_TAG = /<\s*\/\s*invoke\s*>/g;
6
- const NESTED_INVOKE_OPEN_TAG = /<\s*invoke\b[^>]*>/g;
7
- const PARAMETER_MARKUP = /<\s*\/?\s*parameter\b/g;
8
- const PARAMETER_OPEN_TAG = /<\s*parameter\b\s+name\s*=\s*(?:"([^"]+)"|'([^']+)')\s*>/g;
9
- const PARAMETER_CLOSE_TAG = /<\s*\/\s*parameter\s*>/g;
10
- function findTag(pattern, text, fromIndex) {
11
- pattern.lastIndex = Math.max(0, fromIndex);
12
- const match = pattern.exec(text);
13
- return match ? { index: match.index, length: match[0].length } : null;
14
- }
15
- function findParameterOpenTagAt(text, index) {
16
- PARAMETER_OPEN_TAG.lastIndex = index;
17
- const match = PARAMETER_OPEN_TAG.exec(text);
18
- if (!match || match.index !== index) {
19
- return null;
20
- }
21
- const name = match[1] ?? match[2];
22
- return name ? { index, length: match[0].length, name: decodeXmlEntities(name) } : null;
23
- }
24
- function findParameterBoundary(text, fromIndex) {
25
- let cursor = fromIndex;
26
- let nestedInvokeDepth = 0;
27
- while (cursor < text.length) {
28
- const parameterClose = findTag(PARAMETER_CLOSE_TAG, text, cursor);
29
- const invokeOpen = findTag(NESTED_INVOKE_OPEN_TAG, text, cursor);
30
- const invokeClose = findTag(INVOKE_CLOSE_TAG, text, cursor);
31
- const nextIndex = Math.min(parameterClose?.index ?? Number.POSITIVE_INFINITY, invokeOpen?.index ?? Number.POSITIVE_INFINITY, invokeClose?.index ?? Number.POSITIVE_INFINITY);
32
- if (!Number.isFinite(nextIndex)) {
33
- return null;
34
- }
35
- if (invokeOpen && invokeOpen.index === nextIndex) {
36
- const nextParameterClose = findTag(PARAMETER_CLOSE_TAG, text, invokeOpen.index + invokeOpen.length);
37
- const nestedParameterOpen = findTag(PARAMETER_OPEN_TAG, text, invokeOpen.index + invokeOpen.length);
38
- const nestedInvokeClose = findTag(INVOKE_CLOSE_TAG, text, invokeOpen.index + invokeOpen.length);
39
- if (nestedInvokeClose === null ||
40
- ((nestedParameterOpen === null || nestedParameterOpen.index > nestedInvokeClose.index) &&
41
- nextParameterClose !== null &&
42
- nestedInvokeClose.index > nextParameterClose.index)) {
43
- cursor = invokeOpen.index + invokeOpen.length;
44
- continue;
45
- }
46
- nestedInvokeDepth += 1;
47
- cursor = invokeOpen.index + invokeOpen.length;
48
- continue;
49
- }
50
- if (invokeClose && invokeClose.index === nextIndex) {
51
- if (nestedInvokeDepth === 0) {
52
- return { kind: "invoke-close", match: invokeClose };
53
- }
54
- nestedInvokeDepth -= 1;
55
- cursor = invokeClose.index + invokeClose.length;
56
- continue;
57
- }
58
- if (parameterClose) {
59
- if (nestedInvokeDepth === 0) {
60
- return { kind: "parameter-close", match: parameterClose };
61
- }
62
- cursor = parameterClose.index + parameterClose.length;
63
- }
64
- }
65
- return null;
66
- }
67
- export function findInvokeOpenTag(text, fromIndex) {
68
- INVOKE_OPEN_TAG.lastIndex = Math.max(0, fromIndex);
69
- const match = INVOKE_OPEN_TAG.exec(text);
70
- if (!match || match.index === undefined) {
71
- return null;
72
- }
73
- const toolName = match[1] ?? match[2];
74
- return toolName ? { index: match.index, length: match[0].length, toolName: decodeXmlEntities(toolName) } : null;
75
- }
76
- export function findIncompleteInvokeOpenTag(text, fromIndex) {
77
- const index = Math.max(0, fromIndex);
78
- const candidate = text.slice(index);
79
- const match = /^<\s*invoke\b\s+name\s*=\s*/.exec(candidate);
80
- if (!match) {
81
- return null;
82
- }
83
- const quoteIndex = match[0].length;
84
- const quote = candidate[quoteIndex];
85
- if (quote !== '"' && quote !== "'") {
86
- return null;
87
- }
88
- const toolNameStart = quoteIndex + 1;
89
- const closingQuoteIndex = candidate.indexOf(quote, toolNameStart);
90
- if (closingQuoteIndex === -1) {
91
- const toolName = decodeXmlEntities(candidate.slice(toolNameStart));
92
- return toolName.length > 0 ? { index, length: candidate.length, toolName } : null;
93
- }
94
- const toolName = decodeXmlEntities(candidate.slice(toolNameStart, closingQuoteIndex));
95
- if (toolName.length === 0 || candidate.slice(closingQuoteIndex + 1).trim().length > 0) {
96
- return null;
97
- }
98
- return { index, length: candidate.length, toolName };
99
- }
100
- export function scanInvokeBlock(text, openingTag) {
101
- const parameters = [];
102
- let cursor = Math.max(0, openingTag.index + openingTag.length);
103
- while (cursor <= text.length) {
104
- const invokeClose = findTag(INVOKE_CLOSE_TAG, text, cursor);
105
- if (!invokeClose) {
106
- return null;
107
- }
108
- const parameterMarkup = findTag(PARAMETER_MARKUP, text, cursor);
109
- const nestedInvokeOpen = findTag(NESTED_INVOKE_OPEN_TAG, text, cursor);
110
- if (nestedInvokeOpen &&
111
- nestedInvokeOpen.index < invokeClose.index &&
112
- (!parameterMarkup || nestedInvokeOpen.index < parameterMarkup.index)) {
113
- return null;
114
- }
115
- if (!parameterMarkup || invokeClose.index < parameterMarkup.index) {
116
- return {
117
- contentEnd: invokeClose.index,
118
- end: invokeClose.index + invokeClose.length,
119
- parameters,
120
- };
121
- }
122
- const parameterOpen = findParameterOpenTagAt(text, parameterMarkup.index);
123
- if (!parameterOpen) {
124
- return {
125
- contentEnd: invokeClose.index,
126
- end: invokeClose.index + invokeClose.length,
127
- parameters: null,
128
- };
129
- }
130
- const valueStart = parameterOpen.index + parameterOpen.length;
131
- const boundary = findParameterBoundary(text, valueStart);
132
- if (!boundary) {
133
- return null;
134
- }
135
- switch (boundary.kind) {
136
- case "invoke-close":
137
- return {
138
- contentEnd: boundary.match.index,
139
- end: boundary.match.index + boundary.match.length,
140
- parameters: null,
141
- };
142
- case "parameter-close":
143
- parameters.push({
144
- name: parameterOpen.name,
145
- rawValue: text.slice(valueStart, boundary.match.index),
146
- });
147
- cursor = boundary.match.index + boundary.match.length;
148
- break;
149
- }
150
- }
151
- return null;
152
- }
153
- function isAttributePrefix(remainder) {
154
- const attributeMatch = /^(\s*)([A-Za-z]*)/.exec(remainder);
155
- if (!attributeMatch) {
156
- return false;
157
- }
158
- const attributeName = attributeMatch[2] ?? "";
159
- const afterAttributeName = remainder.slice(attributeMatch[0].length);
160
- if (attributeName.length < "name".length) {
161
- return "name".startsWith(attributeName) && afterAttributeName.trim().length === 0;
162
- }
163
- if (attributeName !== "name") {
164
- return false;
165
- }
166
- if (afterAttributeName.trim().length === 0) {
167
- return true;
168
- }
169
- const equalsMatch = /^\s*=\s*(.*)$/.exec(afterAttributeName);
170
- if (!equalsMatch) {
171
- return false;
172
- }
173
- const valuePrefix = equalsMatch[1] ?? "";
174
- if (valuePrefix.length === 0) {
175
- return true;
176
- }
177
- const quote = valuePrefix[0];
178
- if (quote !== '"' && quote !== "'") {
179
- return false;
180
- }
181
- const closingQuoteIndex = valuePrefix.indexOf(quote, 1);
182
- return closingQuoteIndex === -1 || valuePrefix.slice(closingQuoteIndex + 1).trim().length === 0;
183
- }
184
- function isPotentialProtocolStart(candidate) {
185
- if (!candidate.startsWith("<")) {
186
- return false;
187
- }
188
- const body = candidate.slice(1);
189
- const leadingWhitespace = /^\s*/.exec(body)?.[0] ?? "";
190
- const namePart = body.slice(leadingWhitespace.length);
191
- if (namePart.length === 0) {
192
- return true;
193
- }
194
- const tagName = PROTOCOL_TAG_NAMES.find((name) => name.startsWith(namePart) || namePart.startsWith(name));
195
- if (!tagName) {
196
- return false;
197
- }
198
- if (namePart.length < tagName.length) {
199
- return true;
200
- }
201
- const remainder = namePart.slice(tagName.length);
202
- if (remainder.includes(">")) {
203
- return false;
204
- }
205
- if (tagName === "function_calls") {
206
- return /^\s*$/.test(remainder);
207
- }
208
- return isAttributePrefix(remainder);
209
- }
210
- export function getSafeInvokeTextLength(text) {
211
- const lastTagIndex = text.lastIndexOf("<");
212
- if (lastTagIndex === -1) {
213
- return text.length;
214
- }
215
- return isPotentialProtocolStart(text.slice(lastTagIndex)) ? lastTagIndex : text.length;
216
- }
217
- //# sourceMappingURL=invoke-tag-scanner.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"invoke-tag-scanner.js","sourceRoot":"","sources":["../../../../src/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.ts"],"names":[],"mappings":"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","sourcesContent":["import { decodeXmlEntities } from \"./xml-entities.ts\";\n\nconst PROTOCOL_TAG_NAMES = [\"invoke\", \"parameter\", \"function_calls\"] as const;\n\nconst INVOKE_OPEN_TAG_BODY = String.raw`<\\s*invoke\\b\\s+name\\s*=\\s*(?:\"([^\"]+)\"|'([^']+)')`;\nconst INVOKE_OPEN_TAG = new RegExp(`${INVOKE_OPEN_TAG_BODY}\\\\s*>`, \"g\");\nconst INVOKE_CLOSE_TAG = /<\\s*\\/\\s*invoke\\s*>/g;\nconst NESTED_INVOKE_OPEN_TAG = /<\\s*invoke\\b[^>]*>/g;\nconst PARAMETER_MARKUP = /<\\s*\\/?\\s*parameter\\b/g;\nconst PARAMETER_OPEN_TAG = /<\\s*parameter\\b\\s+name\\s*=\\s*(?:\"([^\"]+)\"|'([^']+)')\\s*>/g;\nconst PARAMETER_CLOSE_TAG = /<\\s*\\/\\s*parameter\\s*>/g;\n\ntype TagMatch = {\n\treadonly index: number;\n\treadonly length: number;\n};\n\ntype ParameterOpenTagMatch = TagMatch & {\n\treadonly name: string;\n};\n\ntype ParameterBoundary =\n\t| { readonly kind: \"parameter-close\"; readonly match: TagMatch }\n\t| { readonly kind: \"invoke-close\"; readonly match: TagMatch };\n\nexport type InvokeOpenTagMatch = {\n\treadonly index: number;\n\treadonly length: number;\n\treadonly toolName: string;\n};\n\nexport type InvokeParameter = {\n\treadonly name: string;\n\treadonly rawValue: string;\n};\n\nexport type InvokeBlockMatch = {\n\treadonly contentEnd: number;\n\treadonly end: number;\n\treadonly parameters: InvokeParameter[] | null;\n};\n\nfunction findTag(pattern: RegExp, text: string, fromIndex: number): TagMatch | null {\n\tpattern.lastIndex = Math.max(0, fromIndex);\n\tconst match = pattern.exec(text);\n\treturn match ? { index: match.index, length: match[0].length } : null;\n}\n\nfunction findParameterOpenTagAt(text: string, index: number): ParameterOpenTagMatch | null {\n\tPARAMETER_OPEN_TAG.lastIndex = index;\n\tconst match = PARAMETER_OPEN_TAG.exec(text);\n\tif (!match || match.index !== index) {\n\t\treturn null;\n\t}\n\n\tconst name = match[1] ?? match[2];\n\treturn name ? { index, length: match[0].length, name: decodeXmlEntities(name) } : null;\n}\n\nfunction findParameterBoundary(text: string, fromIndex: number): ParameterBoundary | null {\n\tlet cursor = fromIndex;\n\tlet nestedInvokeDepth = 0;\n\n\twhile (cursor < text.length) {\n\t\tconst parameterClose = findTag(PARAMETER_CLOSE_TAG, text, cursor);\n\t\tconst invokeOpen = findTag(NESTED_INVOKE_OPEN_TAG, text, cursor);\n\t\tconst invokeClose = findTag(INVOKE_CLOSE_TAG, text, cursor);\n\t\tconst nextIndex = Math.min(\n\t\t\tparameterClose?.index ?? Number.POSITIVE_INFINITY,\n\t\t\tinvokeOpen?.index ?? Number.POSITIVE_INFINITY,\n\t\t\tinvokeClose?.index ?? Number.POSITIVE_INFINITY,\n\t\t);\n\n\t\tif (!Number.isFinite(nextIndex)) {\n\t\t\treturn null;\n\t\t}\n\t\tif (invokeOpen && invokeOpen.index === nextIndex) {\n\t\t\tconst nextParameterClose = findTag(PARAMETER_CLOSE_TAG, text, invokeOpen.index + invokeOpen.length);\n\t\t\tconst nestedParameterOpen = findTag(PARAMETER_OPEN_TAG, text, invokeOpen.index + invokeOpen.length);\n\t\t\tconst nestedInvokeClose = findTag(INVOKE_CLOSE_TAG, text, invokeOpen.index + invokeOpen.length);\n\t\t\tif (\n\t\t\t\tnestedInvokeClose === null ||\n\t\t\t\t((nestedParameterOpen === null || nestedParameterOpen.index > nestedInvokeClose.index) &&\n\t\t\t\t\tnextParameterClose !== null &&\n\t\t\t\t\tnestedInvokeClose.index > nextParameterClose.index)\n\t\t\t) {\n\t\t\t\tcursor = invokeOpen.index + invokeOpen.length;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tnestedInvokeDepth += 1;\n\t\t\tcursor = invokeOpen.index + invokeOpen.length;\n\t\t\tcontinue;\n\t\t}\n\t\tif (invokeClose && invokeClose.index === nextIndex) {\n\t\t\tif (nestedInvokeDepth === 0) {\n\t\t\t\treturn { kind: \"invoke-close\", match: invokeClose };\n\t\t\t}\n\t\t\tnestedInvokeDepth -= 1;\n\t\t\tcursor = invokeClose.index + invokeClose.length;\n\t\t\tcontinue;\n\t\t}\n\t\tif (parameterClose) {\n\t\t\tif (nestedInvokeDepth === 0) {\n\t\t\t\treturn { kind: \"parameter-close\", match: parameterClose };\n\t\t\t}\n\t\t\tcursor = parameterClose.index + parameterClose.length;\n\t\t}\n\t}\n\n\treturn null;\n}\n\nexport function findInvokeOpenTag(text: string, fromIndex: number): InvokeOpenTagMatch | null {\n\tINVOKE_OPEN_TAG.lastIndex = Math.max(0, fromIndex);\n\tconst match = INVOKE_OPEN_TAG.exec(text);\n\tif (!match || match.index === undefined) {\n\t\treturn null;\n\t}\n\n\tconst toolName = match[1] ?? match[2];\n\treturn toolName ? { index: match.index, length: match[0].length, toolName: decodeXmlEntities(toolName) } : null;\n}\n\nexport function findIncompleteInvokeOpenTag(text: string, fromIndex: number): InvokeOpenTagMatch | null {\n\tconst index = Math.max(0, fromIndex);\n\tconst candidate = text.slice(index);\n\tconst match = /^<\\s*invoke\\b\\s+name\\s*=\\s*/.exec(candidate);\n\tif (!match) {\n\t\treturn null;\n\t}\n\n\tconst quoteIndex = match[0].length;\n\tconst quote = candidate[quoteIndex];\n\tif (quote !== '\"' && quote !== \"'\") {\n\t\treturn null;\n\t}\n\n\tconst toolNameStart = quoteIndex + 1;\n\tconst closingQuoteIndex = candidate.indexOf(quote, toolNameStart);\n\tif (closingQuoteIndex === -1) {\n\t\tconst toolName = decodeXmlEntities(candidate.slice(toolNameStart));\n\t\treturn toolName.length > 0 ? { index, length: candidate.length, toolName } : null;\n\t}\n\n\tconst toolName = decodeXmlEntities(candidate.slice(toolNameStart, closingQuoteIndex));\n\tif (toolName.length === 0 || candidate.slice(closingQuoteIndex + 1).trim().length > 0) {\n\t\treturn null;\n\t}\n\n\treturn { index, length: candidate.length, toolName };\n}\n\nexport function scanInvokeBlock(text: string, openingTag: InvokeOpenTagMatch): InvokeBlockMatch | null {\n\tconst parameters: InvokeParameter[] = [];\n\tlet cursor = Math.max(0, openingTag.index + openingTag.length);\n\n\twhile (cursor <= text.length) {\n\t\tconst invokeClose = findTag(INVOKE_CLOSE_TAG, text, cursor);\n\t\tif (!invokeClose) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst parameterMarkup = findTag(PARAMETER_MARKUP, text, cursor);\n\t\tconst nestedInvokeOpen = findTag(NESTED_INVOKE_OPEN_TAG, text, cursor);\n\t\tif (\n\t\t\tnestedInvokeOpen &&\n\t\t\tnestedInvokeOpen.index < invokeClose.index &&\n\t\t\t(!parameterMarkup || nestedInvokeOpen.index < parameterMarkup.index)\n\t\t) {\n\t\t\treturn null;\n\t\t}\n\t\tif (!parameterMarkup || invokeClose.index < parameterMarkup.index) {\n\t\t\treturn {\n\t\t\t\tcontentEnd: invokeClose.index,\n\t\t\t\tend: invokeClose.index + invokeClose.length,\n\t\t\t\tparameters,\n\t\t\t};\n\t\t}\n\n\t\tconst parameterOpen = findParameterOpenTagAt(text, parameterMarkup.index);\n\t\tif (!parameterOpen) {\n\t\t\treturn {\n\t\t\t\tcontentEnd: invokeClose.index,\n\t\t\t\tend: invokeClose.index + invokeClose.length,\n\t\t\t\tparameters: null,\n\t\t\t};\n\t\t}\n\n\t\tconst valueStart = parameterOpen.index + parameterOpen.length;\n\t\tconst boundary = findParameterBoundary(text, valueStart);\n\t\tif (!boundary) {\n\t\t\treturn null;\n\t\t}\n\n\t\tswitch (boundary.kind) {\n\t\t\tcase \"invoke-close\":\n\t\t\t\treturn {\n\t\t\t\t\tcontentEnd: boundary.match.index,\n\t\t\t\t\tend: boundary.match.index + boundary.match.length,\n\t\t\t\t\tparameters: null,\n\t\t\t\t};\n\t\t\tcase \"parameter-close\":\n\t\t\t\tparameters.push({\n\t\t\t\t\tname: parameterOpen.name,\n\t\t\t\t\trawValue: text.slice(valueStart, boundary.match.index),\n\t\t\t\t});\n\t\t\t\tcursor = boundary.match.index + boundary.match.length;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn null;\n}\n\nfunction isAttributePrefix(remainder: string): boolean {\n\tconst attributeMatch = /^(\\s*)([A-Za-z]*)/.exec(remainder);\n\tif (!attributeMatch) {\n\t\treturn false;\n\t}\n\n\tconst attributeName = attributeMatch[2] ?? \"\";\n\tconst afterAttributeName = remainder.slice(attributeMatch[0].length);\n\tif (attributeName.length < \"name\".length) {\n\t\treturn \"name\".startsWith(attributeName) && afterAttributeName.trim().length === 0;\n\t}\n\tif (attributeName !== \"name\") {\n\t\treturn false;\n\t}\n\tif (afterAttributeName.trim().length === 0) {\n\t\treturn true;\n\t}\n\n\tconst equalsMatch = /^\\s*=\\s*(.*)$/.exec(afterAttributeName);\n\tif (!equalsMatch) {\n\t\treturn false;\n\t}\n\n\tconst valuePrefix = equalsMatch[1] ?? \"\";\n\tif (valuePrefix.length === 0) {\n\t\treturn true;\n\t}\n\n\tconst quote = valuePrefix[0];\n\tif (quote !== '\"' && quote !== \"'\") {\n\t\treturn false;\n\t}\n\n\tconst closingQuoteIndex = valuePrefix.indexOf(quote, 1);\n\treturn closingQuoteIndex === -1 || valuePrefix.slice(closingQuoteIndex + 1).trim().length === 0;\n}\n\nfunction isPotentialProtocolStart(candidate: string): boolean {\n\tif (!candidate.startsWith(\"<\")) {\n\t\treturn false;\n\t}\n\n\tconst body = candidate.slice(1);\n\tconst leadingWhitespace = /^\\s*/.exec(body)?.[0] ?? \"\";\n\tconst namePart = body.slice(leadingWhitespace.length);\n\tif (namePart.length === 0) {\n\t\treturn true;\n\t}\n\n\tconst tagName = PROTOCOL_TAG_NAMES.find((name) => name.startsWith(namePart) || namePart.startsWith(name));\n\tif (!tagName) {\n\t\treturn false;\n\t}\n\tif (namePart.length < tagName.length) {\n\t\treturn true;\n\t}\n\n\tconst remainder = namePart.slice(tagName.length);\n\tif (remainder.includes(\">\")) {\n\t\treturn false;\n\t}\n\tif (tagName === \"function_calls\") {\n\t\treturn /^\\s*$/.test(remainder);\n\t}\n\treturn isAttributePrefix(remainder);\n}\n\nexport function getSafeInvokeTextLength(text: string): number {\n\tconst lastTagIndex = text.lastIndexOf(\"<\");\n\tif (lastTagIndex === -1) {\n\t\treturn text.length;\n\t}\n\n\treturn isPotentialProtocolStart(text.slice(lastTagIndex)) ? lastTagIndex : text.length;\n}\n"]}
@@ -1,4 +0,0 @@
1
- import type { Tool } from "../../../types.ts";
2
- import type { ParsedToolCall, ParserOptions } from "../../types.ts";
3
- export declare function parseAnthropicXmlGeneratedText(text: string, tools: Tool[], options?: ParserOptions): ParsedToolCall[];
4
- //# sourceMappingURL=parse.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../../../src/tool-call-middleware/protocols/anthropic-xml/parse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAMpE,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,cAAc,EAAE,CAsDrH"}
@@ -1,46 +0,0 @@
1
- import { coerceParameters } from "./coerce-parameters.js";
2
- import { findNextInvokeMatch } from "./invoke-match.js";
3
- import { findInvokeOpenTag, scanInvokeBlock } from "./invoke-tag-scanner.js";
4
- import { createToolResolver } from "./tool-resolver.js";
5
- export function parseAnthropicXmlGeneratedText(text, tools, options) {
6
- if (text.length === 0 || tools.length === 0) {
7
- return [];
8
- }
9
- const resolveTool = createToolResolver(tools);
10
- const parsedToolCalls = [];
11
- let cursor = 0;
12
- while (cursor < text.length) {
13
- const openingTag = findInvokeOpenTag(text, cursor);
14
- if (!openingTag) {
15
- break;
16
- }
17
- const tool = resolveTool(openingTag.toolName);
18
- const block = scanInvokeBlock(text, openingTag);
19
- if (!tool) {
20
- const nextKnownInvoke = findNextInvokeMatch(text, openingTag.index + openingTag.length, (toolName) => resolveTool(toolName) !== undefined);
21
- if (nextKnownInvoke &&
22
- (block === null || (nextKnownInvoke.block !== null && nextKnownInvoke.block.end === block.end))) {
23
- cursor = nextKnownInvoke.openingTag.index;
24
- continue;
25
- }
26
- }
27
- if (!block) {
28
- break;
29
- }
30
- const originalCallText = text.slice(openingTag.index, block.end);
31
- cursor = block.end;
32
- if (!tool) {
33
- continue;
34
- }
35
- const argumentsRecord = block.parameters ? coerceParameters(block.parameters, tool) : null;
36
- if (!argumentsRecord) {
37
- options?.onError?.("Could not process anthropic-xml tool call, keeping original text.", {
38
- toolCall: originalCallText,
39
- });
40
- continue;
41
- }
42
- parsedToolCalls.push({ name: tool.name, arguments: argumentsRecord });
43
- }
44
- return parsedToolCalls;
45
- }
46
- //# sourceMappingURL=parse.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../../../src/tool-call-middleware/protocols/anthropic-xml/parse.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,UAAU,8BAA8B,CAAC,IAAY,EAAE,KAAa,EAAE,OAAuB;IAClG,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7C,OAAO,EAAE,CAAC;IACX,CAAC;IAED,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,eAAe,GAAqB,EAAE,CAAC;IAC7C,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,OAAO,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACnD,IAAI,CAAC,UAAU,EAAE,CAAC;YACjB,MAAM;QACP,CAAC;QAED,MAAM,IAAI,GAAG,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,EAAE,CAAC;YACX,MAAM,eAAe,GAAG,mBAAmB,CAC1C,IAAI,EACJ,UAAU,CAAC,KAAK,GAAG,UAAU,CAAC,MAAM,EACpC,CAAC,QAAQ,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,SAAS,CACjD,CAAC;YACF,IACC,eAAe;gBACf,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,KAAK,IAAI,IAAI,eAAe,CAAC,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC,EAC9F,CAAC;gBACF,MAAM,GAAG,eAAe,CAAC,UAAU,CAAC,KAAK,CAAC;gBAC1C,SAAS;YACV,CAAC;QACF,CAAC;QACD,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,MAAM;QACP,CAAC;QAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QACjE,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC;QAEnB,IAAI,CAAC,IAAI,EAAE,CAAC;YACX,SAAS;QACV,CAAC;QAED,MAAM,eAAe,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3F,IAAI,CAAC,eAAe,EAAE,CAAC;YACtB,OAAO,EAAE,OAAO,EAAE,CAAC,mEAAmE,EAAE;gBACvF,QAAQ,EAAE,gBAAgB;aAC1B,CAAC,CAAC;YACH,SAAS;QACV,CAAC;QAED,eAAe,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,OAAO,eAAe,CAAC;AACxB,CAAC","sourcesContent":["import type { Tool } from \"../../../types.ts\";\nimport type { ParsedToolCall, ParserOptions } from \"../../types.ts\";\nimport { coerceParameters } from \"./coerce-parameters.ts\";\nimport { findNextInvokeMatch } from \"./invoke-match.ts\";\nimport { findInvokeOpenTag, scanInvokeBlock } from \"./invoke-tag-scanner.ts\";\nimport { createToolResolver } from \"./tool-resolver.ts\";\n\nexport function parseAnthropicXmlGeneratedText(text: string, tools: Tool[], options?: ParserOptions): ParsedToolCall[] {\n\tif (text.length === 0 || tools.length === 0) {\n\t\treturn [];\n\t}\n\n\tconst resolveTool = createToolResolver(tools);\n\tconst parsedToolCalls: ParsedToolCall[] = [];\n\tlet cursor = 0;\n\n\twhile (cursor < text.length) {\n\t\tconst openingTag = findInvokeOpenTag(text, cursor);\n\t\tif (!openingTag) {\n\t\t\tbreak;\n\t\t}\n\n\t\tconst tool = resolveTool(openingTag.toolName);\n\t\tconst block = scanInvokeBlock(text, openingTag);\n\t\tif (!tool) {\n\t\t\tconst nextKnownInvoke = findNextInvokeMatch(\n\t\t\t\ttext,\n\t\t\t\topeningTag.index + openingTag.length,\n\t\t\t\t(toolName) => resolveTool(toolName) !== undefined,\n\t\t\t);\n\t\t\tif (\n\t\t\t\tnextKnownInvoke &&\n\t\t\t\t(block === null || (nextKnownInvoke.block !== null && nextKnownInvoke.block.end === block.end))\n\t\t\t) {\n\t\t\t\tcursor = nextKnownInvoke.openingTag.index;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\tif (!block) {\n\t\t\tbreak;\n\t\t}\n\n\t\tconst originalCallText = text.slice(openingTag.index, block.end);\n\t\tcursor = block.end;\n\n\t\tif (!tool) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst argumentsRecord = block.parameters ? coerceParameters(block.parameters, tool) : null;\n\t\tif (!argumentsRecord) {\n\t\t\toptions?.onError?.(\"Could not process anthropic-xml tool call, keeping original text.\", {\n\t\t\t\ttoolCall: originalCallText,\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tparsedToolCalls.push({ name: tool.name, arguments: argumentsRecord });\n\t}\n\n\treturn parsedToolCalls;\n}\n"]}
@@ -1,13 +0,0 @@
1
- /** Incomplete protocol fragments are rejected before retained input can exceed this many UTF-16 code units. */
2
- export declare const ANTHROPIC_XML_MAX_RETAINED_FRAGMENT_LENGTH: number;
3
- export type StreamBoundaryMatcher = {
4
- feed(text: string): boolean;
5
- };
6
- export type PendingFragment = {
7
- readonly kind: "invoke" | "function-calls" | "open-tag";
8
- readonly matcher: StreamBoundaryMatcher;
9
- };
10
- export declare function createClosingTagMatcher(tagName: "invoke" | "function_calls"): StreamBoundaryMatcher;
11
- export declare function createTagEndMatcher(): StreamBoundaryMatcher;
12
- export declare function createPendingFragment(kind: PendingFragment["kind"], text: string): PendingFragment;
13
- //# sourceMappingURL=stream-boundary.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stream-boundary.d.ts","sourceRoot":"","sources":["../../../../src/tool-call-middleware/protocols/anthropic-xml/stream-boundary.ts"],"names":[],"mappings":"AAMA,+GAA+G;AAC/G,eAAO,MAAM,0CAA0C,QAAY,CAAC;AAEpE,MAAM,MAAM,qBAAqB,GAAG;IACnC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC7B,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,gBAAgB,GAAG,UAAU,CAAC;IACxD,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC;CACxC,CAAC;AAsEF,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,QAAQ,GAAG,gBAAgB,GAAG,qBAAqB,CA0DnG;AAED,wBAAgB,mBAAmB,IAAI,qBAAqB,CAM3D;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe,CASlG"}