@qwen-code/arena-agent 0.0.9-dev.0 → 0.0.9-dev.11

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 (94) hide show
  1. package/.env.example +30 -0
  2. package/README.md +126 -25
  3. package/dist/agent.d.ts +4 -2
  4. package/dist/agent.js +116 -15
  5. package/dist/agent.js.map +1 -1
  6. package/dist/anthropic.d.ts +1 -1
  7. package/dist/anthropic.js +68 -7
  8. package/dist/anthropic.js.map +1 -1
  9. package/dist/ask-user.d.ts +20 -0
  10. package/dist/ask-user.js +388 -0
  11. package/dist/ask-user.js.map +1 -0
  12. package/dist/canonical-data.d.ts +1 -0
  13. package/dist/canonical-data.js +1 -0
  14. package/dist/canonical-data.js.map +1 -1
  15. package/dist/cli.js +26 -9
  16. package/dist/cli.js.map +1 -1
  17. package/dist/code-cli.d.ts +2 -0
  18. package/dist/code-cli.js +12 -0
  19. package/dist/code-cli.js.map +1 -0
  20. package/dist/code-tools.d.ts +73 -0
  21. package/dist/code-tools.js +2106 -0
  22. package/dist/code-tools.js.map +1 -0
  23. package/dist/config.d.ts +12 -1
  24. package/dist/config.js +66 -3
  25. package/dist/config.js.map +1 -1
  26. package/dist/fetch-page.d.ts +2 -0
  27. package/dist/fetch-page.js +50 -21
  28. package/dist/fetch-page.js.map +1 -1
  29. package/dist/history.d.ts +3 -0
  30. package/dist/history.js +4 -0
  31. package/dist/history.js.map +1 -1
  32. package/dist/mode.d.ts +6 -0
  33. package/dist/mode.js +33 -0
  34. package/dist/mode.js.map +1 -0
  35. package/dist/model-capabilities.d.ts +20 -0
  36. package/dist/model-capabilities.js +98 -0
  37. package/dist/model-capabilities.js.map +1 -0
  38. package/dist/model-diagnostics.d.ts +32 -0
  39. package/dist/model-diagnostics.js +365 -0
  40. package/dist/model-diagnostics.js.map +1 -0
  41. package/dist/provider.d.ts +16 -0
  42. package/dist/provider.js +328 -37
  43. package/dist/provider.js.map +1 -1
  44. package/dist/sdk.d.ts +26 -1
  45. package/dist/sdk.js +1 -0
  46. package/dist/sdk.js.map +1 -1
  47. package/dist/server.d.ts +2 -0
  48. package/dist/server.js +11 -2
  49. package/dist/server.js.map +1 -1
  50. package/dist/spec.d.ts +11 -8
  51. package/dist/spec.js +101 -12
  52. package/dist/spec.js.map +1 -1
  53. package/dist/tools.d.ts +11 -28
  54. package/dist/tools.js +60 -11
  55. package/dist/tools.js.map +1 -1
  56. package/dist/tui.d.ts +2 -0
  57. package/dist/tui.js +8 -2
  58. package/dist/tui.js.map +1 -1
  59. package/dist/types.d.ts +6 -1
  60. package/dist/workspace.d.ts +12 -0
  61. package/dist/workspace.js +165 -0
  62. package/dist/workspace.js.map +1 -0
  63. package/docs/BINARY_DISTRIBUTION.md +225 -0
  64. package/docs/MODES_AND_RELEASES.md +119 -0
  65. package/modes/code-arena/full-stack/system-prompt.txt +77 -0
  66. package/modes/code-arena/full-stack/template/.env +1 -0
  67. package/modes/code-arena/full-stack/template/drizzle.config.json +7 -0
  68. package/modes/code-arena/full-stack/template/eslint.config.mjs +9 -0
  69. package/modes/code-arena/full-stack/template/next.config.ts +5 -0
  70. package/modes/code-arena/full-stack/template/package.json +32 -0
  71. package/modes/code-arena/full-stack/template/postcss.config.mjs +7 -0
  72. package/modes/code-arena/full-stack/template/src/app/api/health/route.ts +13 -0
  73. package/modes/code-arena/full-stack/template/src/app/globals.css +1 -0
  74. package/modes/code-arena/full-stack/template/src/app/layout.tsx +16 -0
  75. package/modes/code-arena/full-stack/template/src/app/page.tsx +22 -0
  76. package/modes/code-arena/full-stack/template/src/db/index.ts +24 -0
  77. package/modes/code-arena/full-stack/template/src/db/schema.ts +3 -0
  78. package/modes/code-arena/full-stack/template/tsconfig.json +24 -0
  79. package/modes/code-arena/full-stack/tools.json +446 -0
  80. package/modes/code-arena/html/system-prompt.txt +36 -0
  81. package/modes/code-arena/html/tools.json +284 -0
  82. package/modes/code-arena/model.json +10 -0
  83. package/modes/code-arena/react/system-prompt.txt +33 -0
  84. package/modes/code-arena/react/template/index.html +12 -0
  85. package/modes/code-arena/react/template/package.json +28 -0
  86. package/modes/code-arena/react/template/src/App.tsx +28 -0
  87. package/modes/code-arena/react/template/src/index.css +1 -0
  88. package/modes/code-arena/react/template/src/main.tsx +10 -0
  89. package/modes/code-arena/react/template/src/utils/cn.ts +6 -0
  90. package/modes/code-arena/react/template/tsconfig.json +25 -0
  91. package/modes/code-arena/react/template/vite.config.ts +18 -0
  92. package/modes/code-arena/react/tools.json +410 -0
  93. package/package.json +15 -3
  94. package/dist/web/app.d.ts +0 -1
package/dist/mode.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ export declare const harnessModes: readonly ["arena", "react", "html", "full-stack"];
2
+ export type HarnessMode = (typeof harnessModes)[number];
3
+ export type CodeArenaMode = Exclude<HarnessMode, "arena">;
4
+ export declare function parseHarnessMode(value: string | undefined, fallback?: HarnessMode): HarnessMode;
5
+ export declare function isCodeArenaMode(mode: HarnessMode | undefined): mode is CodeArenaMode;
6
+ export declare function defaultStepLimit(mode: HarnessMode): number | undefined;
package/dist/mode.js ADDED
@@ -0,0 +1,33 @@
1
+ export const harnessModes = ["arena", "react", "html", "full-stack"];
2
+ const aliases = new Map([
3
+ ["arena", "arena"],
4
+ ["arena-harness", "arena"],
5
+ ["react", "react"],
6
+ ["html", "html"],
7
+ ["single-html", "html"],
8
+ ["single_html", "html"],
9
+ ["full-stack", "full-stack"],
10
+ ["full_stack", "full-stack"],
11
+ ["fullstack", "full-stack"],
12
+ ]);
13
+ export function parseHarnessMode(value, fallback = "arena") {
14
+ const normalized = value?.trim().toLowerCase();
15
+ if (!normalized)
16
+ return fallback;
17
+ const mode = aliases.get(normalized);
18
+ if (!mode) {
19
+ throw new Error(`Invalid harness mode '${value}'. Expected arena, react, html, or full-stack.`);
20
+ }
21
+ return mode;
22
+ }
23
+ export function isCodeArenaMode(mode) {
24
+ return mode !== undefined && mode !== "arena";
25
+ }
26
+ export function defaultStepLimit(mode) {
27
+ if (mode === "html")
28
+ return 25;
29
+ if (mode === "react" || mode === "full-stack")
30
+ return 50;
31
+ return undefined;
32
+ }
33
+ //# sourceMappingURL=mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode.js","sourceRoot":"","sources":["../src/mode.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,CAAU,CAAC;AAK9E,MAAM,OAAO,GAAG,IAAI,GAAG,CAAsB;IAC3C,CAAC,OAAO,EAAE,OAAO,CAAC;IAClB,CAAC,eAAe,EAAE,OAAO,CAAC;IAC1B,CAAC,OAAO,EAAE,OAAO,CAAC;IAClB,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,aAAa,EAAE,MAAM,CAAC;IACvB,CAAC,aAAa,EAAE,MAAM,CAAC;IACvB,CAAC,YAAY,EAAE,YAAY,CAAC;IAC5B,CAAC,YAAY,EAAE,YAAY,CAAC;IAC5B,CAAC,WAAW,EAAE,YAAY,CAAC;CAC5B,CAAC,CAAC;AAEH,MAAM,UAAU,gBAAgB,CAC9B,KAAyB,EACzB,QAAQ,GAAgB,OAAO;IAE/B,MAAM,UAAU,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC/C,IAAI,CAAC,UAAU;QAAE,OAAO,QAAQ,CAAC;IACjC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACrC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CACb,yBAAyB,KAAK,gDAAgD,CAC/E,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,IAA6B;IAE7B,OAAO,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,OAAO,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAiB;IAChD,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,EAAE,CAAC;IAC/B,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,YAAY;QAAE,OAAO,EAAE,CAAC;IACzD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,20 @@
1
+ export type ModelInputModality = "image" | "video" | "audio";
2
+ export interface ModelInputCapabilityOverrides {
3
+ model: string;
4
+ modelSupportsImageInput?: boolean;
5
+ modelSupportsVideoInput?: boolean;
6
+ modelSupportsAudioInput?: boolean;
7
+ }
8
+ export interface ModelInputCapabilities {
9
+ model: string;
10
+ normalizedModel: string;
11
+ known: boolean;
12
+ rule?: string;
13
+ image?: boolean;
14
+ video?: boolean;
15
+ audio?: boolean;
16
+ }
17
+ export declare function normalizeModelId(model: string): string;
18
+ export declare function modelInputCapabilities(model: string): ModelInputCapabilities;
19
+ export declare function supportsModelInput(config: ModelInputCapabilityOverrides, modality: ModelInputModality): boolean;
20
+ export declare function supportsImageInput(config: ModelInputCapabilityOverrides): boolean;
@@ -0,0 +1,98 @@
1
+ const allModalities = [
2
+ "image",
3
+ "video",
4
+ "audio",
5
+ ];
6
+ function rule(id, pattern, modalities) {
7
+ return { id, pattern, modalities };
8
+ }
9
+ // Ordered from the most specific model/version to broader families. These are
10
+ // input capabilities for the chat model, not image/audio/video generation
11
+ // capabilities. A provider route can still expose fewer modalities than the
12
+ // underlying model, so server-side media rejection remains the final fallback.
13
+ const capabilityRules = [
14
+ // Qwen: Max aliases and dated snapshots do not always share capabilities.
15
+ rule("qwen3.7-max-2026-06-08", /^qwen3\.7-max-2026-06-08(?:[-.:]|$)/, ["image"]),
16
+ rule("qwen3.8-max", /^qwen3\.8-max(?:[-.:]|$)/, ["image"]),
17
+ rule("qwen3.7-max-text", /^qwen3\.7-max(?:[-.:]|$)/, []),
18
+ rule("qwen3.6-27b-text", /^qwen3\.6-27b(?:[-.:]|$)/, []),
19
+ rule("qwen-omni", /^(?:qwen(?:\d+(?:\.\d+)?)?-omni|qwen3\.5-omni)(?:[-.:]|$)/, ["image", "video", "audio"]),
20
+ rule("qwen-vl-qvq", /^(?:qwen(?:\d+(?:\.\d+)?)?-vl|qwen-vl|qvq)(?:[-.:]|$)/, ["image", "video"]),
21
+ rule("qwen-plus-flash-multimodal", /^(?:qwen-plus|qwen3\.(?:5|6|7)-plus|qwen3\.(?:5|6)-flash)(?:[-.:]|$)/, ["image", "video"]),
22
+ rule("qwen3.5-3.6-open-multimodal", /^qwen3\.(?:5|6)-(?:\d+b|\d+-?b)(?:[-.:]|$)/, ["image", "video"]),
23
+ rule("qwen-audio", /^(?:qwen(?:\d+(?:\.\d+)?)?-audio|qwen-audio)(?:[-.:]|$)/, ["audio"]),
24
+ rule("qwen-known-text", /^(?:qwen(?:\d+(?:\.\d+)?)?-(?:max|turbo|coder|long)|qwq)(?:[-.:]|$)/, []),
25
+ // Claude 3 and later accept image blocks. Claude Messages does not accept
26
+ // native audio/video blocks; those require preprocessing or another model.
27
+ rule("claude-3-plus-vision", /(?:^|[._-])claude-(?:(?:3|[4-9]|[1-9]\d)(?:[._:-]|$)|(?:opus|sonnet|haiku)-(?:3|[4-9]|[1-9]\d)(?:[._:-]|$))/, ["image"]),
28
+ rule("claude-legacy-text", /(?:^|[._-])claude-(?:instant|v?[12])(?:[._:-]|$)/, []),
29
+ // Audio chat models are intentionally checked before the broader GPT-4o
30
+ // vision rule: their documented Chat Completions inputs are text + audio.
31
+ rule("gpt-realtime-multimodal", /^(?:gpt-realtime|gpt-4o(?:-mini)?-realtime)(?:[-.:]|$)/, ["image", "audio"]),
32
+ rule("gpt-audio", /^(?:gpt-audio|gpt-4o-audio)(?:[-.:]|$)/, ["audio"]),
33
+ rule("gpt-5-vision", /^gpt-5(?:[-.:]|$)/, ["image"]),
34
+ rule("gpt-4o-4.1-4.5-vision", /^(?:chatgpt-4o|gpt-4o|gpt-4\.1|gpt-4\.5)(?:[-.:]|$)/, ["image"]),
35
+ rule("gpt-4-turbo-vision", /^gpt-4-(?:turbo|vision)(?:[-.:]|$)/, ["image"]),
36
+ rule("openai-reasoning-vision", /^(?:o1(?:-pro)?|o3(?:-pro)?|o4-mini)(?:-\d{4}-\d{2}-\d{2})?$/, ["image"]),
37
+ rule("openai-computer-use-vision", /^computer-use-preview(?:[-.:]|$)/, ["image"]),
38
+ rule("openai-known-text", /^(?:gpt-3\.5|gpt-4|gpt-oss|o1-(?:mini|preview)|o3-mini)(?:[-.:]|$)/, []),
39
+ // The hosted DeepSeek chat API currently documents string message content.
40
+ // Keep separately deployed VL/OCR families usable when routed through an
41
+ // OpenAI-compatible third-party endpoint.
42
+ rule("deepseek-vl-ocr", /^deepseek-(?:vl|ocr)(?:[-.:\d]|$)/, ["image"]),
43
+ rule("deepseek-hosted-text", /^deepseek-(?:chat|reasoner|coder|r1|v[234])(?:[-.:]|$)/, []),
44
+ // Kimi's current K2 family and managed coding model advertise both image
45
+ // and video input. Older moonshot-v1 vision-preview models accept images.
46
+ rule("kimi-k2-multimodal", /^(?:kimi-k2(?:[-.:]|$)|kimi-for-coding$|kimi-code$)/, ["image", "video"]),
47
+ rule("moonshot-v1-vision", /^moonshot-v1-.*vision(?:[-.:]|$)/, ["image"]),
48
+ rule("moonshot-v1-text", /^moonshot-v1(?:[-.:]|$)/, []),
49
+ // Gemini general-purpose models accept image, video, and audio inputs. TTS,
50
+ // image-generation, and realtime/live variants use different API contracts
51
+ // and deliberately fall through to route probing instead of being guessed.
52
+ rule("gemini-general-multimodal", /^gemini-(?:1\.5|2(?:\.\d+)?|3(?:\.\d+)?)(?:-(?!.*(?:tts|image|live|realtime))[^:]*)?$/, ["image", "video", "audio"]),
53
+ ];
54
+ export function normalizeModelId(model) {
55
+ const normalized = model.trim().toLowerCase();
56
+ const separator = normalized.lastIndexOf("/");
57
+ return separator === -1 ? normalized : normalized.slice(separator + 1);
58
+ }
59
+ export function modelInputCapabilities(model) {
60
+ const normalizedModel = normalizeModelId(model);
61
+ const matched = capabilityRules.find((candidate) => candidate.pattern.test(normalizedModel));
62
+ if (!matched) {
63
+ return {
64
+ model,
65
+ normalizedModel,
66
+ known: false,
67
+ };
68
+ }
69
+ const supported = new Set(matched.modalities);
70
+ return {
71
+ model,
72
+ normalizedModel,
73
+ known: true,
74
+ rule: matched.id,
75
+ ...Object.fromEntries(allModalities.map((modality) => [modality, supported.has(modality)])),
76
+ };
77
+ }
78
+ function modalityOverride(config, modality) {
79
+ if (modality === "image")
80
+ return config.modelSupportsImageInput;
81
+ if (modality === "video")
82
+ return config.modelSupportsVideoInput;
83
+ return config.modelSupportsAudioInput;
84
+ }
85
+ export function supportsModelInput(config, modality) {
86
+ const override = modalityOverride(config, modality);
87
+ if (override !== undefined)
88
+ return override;
89
+ const detected = modelInputCapabilities(config.model)[modality];
90
+ // Unknown model names remain optimistic. This is important for private
91
+ // deployments and new snapshots; a precise server rejection is still
92
+ // converted into the existing text-only recovery path.
93
+ return detected ?? true;
94
+ }
95
+ export function supportsImageInput(config) {
96
+ return supportsModelInput(config, "image");
97
+ }
98
+ //# sourceMappingURL=model-capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-capabilities.js","sourceRoot":"","sources":["../src/model-capabilities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export interface ModelCallDiagnosticSink {
2
+ record(event: Record<string, unknown>): Promise<void> | void;
3
+ }
4
+ export declare class JsonlModelCallDiagnostics implements ModelCallDiagnosticSink {
5
+ readonly filePath: string;
6
+ private pending;
7
+ constructor(filePath: string);
8
+ record(event: Record<string, unknown>): Promise<void>;
9
+ }
10
+ export declare function redactSensitiveText(value: string): string;
11
+ export declare function rawDiagnosticValue(value: unknown, _key?: string, _depth?: number): unknown;
12
+ export declare function diagnosticValue(value: unknown, key?: string, depth?: number): unknown;
13
+ export interface ModelRequestDiagnosticSummary {
14
+ body_keys: string[];
15
+ parameters: Record<string, unknown>;
16
+ messages: Record<string, unknown>[];
17
+ messages_sha256: string;
18
+ tools: {
19
+ count: number;
20
+ names: unknown[];
21
+ sha256: string;
22
+ };
23
+ contains_image: boolean;
24
+ media_types: string[];
25
+ }
26
+ export declare function contentPartMediaTypes(value: unknown): string[];
27
+ export declare function requestMediaTypes(body: Record<string, unknown>): string[];
28
+ export declare function requestContainsImage(body: Record<string, unknown>): boolean;
29
+ export declare function requestDiagnosticSummary(body: Record<string, unknown>): ModelRequestDiagnosticSummary;
30
+ export declare function safeEndpoint(value: string): string;
31
+ export declare function responseRequestIds(response: Response): Record<string, string>;
32
+ export declare function diagnosticError(error: unknown): Record<string, unknown>;
@@ -0,0 +1,365 @@
1
+ import crypto from "node:crypto";
2
+ import { appendFile, mkdir } from "node:fs/promises";
3
+ import path from "node:path";
4
+ export class JsonlModelCallDiagnostics {
5
+ filePath;
6
+ pending = Promise.resolve();
7
+ constructor(filePath) {
8
+ this.filePath = filePath;
9
+ }
10
+ record(event) {
11
+ const line = `${JSON.stringify(event)}\n`;
12
+ const write = this.pending.then(async () => {
13
+ await mkdir(path.dirname(this.filePath), { recursive: true });
14
+ await appendFile(this.filePath, line, { encoding: "utf8", mode: 0o600 });
15
+ });
16
+ // Diagnostics must never turn a successful model call into an agent
17
+ // failure. Keep writes ordered, but make a filesystem failure best-effort.
18
+ this.pending = write.catch(() => undefined);
19
+ return this.pending;
20
+ }
21
+ }
22
+ function sha256(value) {
23
+ return crypto.createHash("sha256").update(value).digest("hex");
24
+ }
25
+ function stableJson(value) {
26
+ if (Array.isArray(value)) {
27
+ return `[${value.map((item) => stableJson(item)).join(",")}]`;
28
+ }
29
+ if (value && typeof value === "object") {
30
+ const record = value;
31
+ return `{${Object.keys(record)
32
+ .sort()
33
+ .map((key) => `${JSON.stringify(key)}:${stableJson(record[key])}`)
34
+ .join(",")}}`;
35
+ }
36
+ return JSON.stringify(value);
37
+ }
38
+ function stringSummary(value) {
39
+ return { chars: value.length, sha256: sha256(value) };
40
+ }
41
+ export function redactSensitiveText(value) {
42
+ return value
43
+ .replace(/\bsk-[A-Za-z0-9_-]{8,}\b/g, "sk-***")
44
+ .replace(/(authorization\s*["']?\s*[:=]\s*["']?)(?:bearer\s+)?[^\s,;"'}]+/gi, "$1***")
45
+ .replace(/((?:api[_-]?key|access[_-]?token|refresh[_-]?token|password|secret)\s*["']?\s*[:=]\s*["']?)[^\s,;"'}]+/gi, "$1***");
46
+ }
47
+ export function rawDiagnosticValue(value, _key = "", _depth = 0) {
48
+ // Request bodies and aggregated response values are already JSON-compatible.
49
+ // Raw mode deliberately preserves them byte-for-byte at the string/value
50
+ // level, including prompts, tool output, and media Base64. HTTP auth headers
51
+ // are never passed to this function and therefore never enter the log.
52
+ return value;
53
+ }
54
+ function loggedTextSummary(value) {
55
+ const maximumChars = 16_384;
56
+ const redacted = redactSensitiveText(value);
57
+ return {
58
+ ...stringSummary(value),
59
+ text: redacted.slice(0, maximumChars),
60
+ ...(redacted.length > maximumChars ? { truncated: true } : {}),
61
+ };
62
+ }
63
+ function dataUrlSummary(value) {
64
+ const match = value.match(/^data:([^;,]+)?(?:;[^,]*)?,(.*)$/s);
65
+ if (!match)
66
+ return undefined;
67
+ return {
68
+ kind: "data_url",
69
+ media_type: match[1] || "application/octet-stream",
70
+ encoded_chars: match[2]?.length || 0,
71
+ sha256: sha256(value),
72
+ };
73
+ }
74
+ function mediaReferenceSummary(value) {
75
+ if (typeof value === "string") {
76
+ const data = dataUrlSummary(value);
77
+ if (data)
78
+ return data;
79
+ try {
80
+ const url = new URL(value);
81
+ return {
82
+ kind: "url",
83
+ protocol: url.protocol,
84
+ host: url.host,
85
+ path_chars: url.pathname.length,
86
+ has_query: Boolean(url.search),
87
+ sha256: sha256(value),
88
+ };
89
+ }
90
+ catch {
91
+ return { kind: "string", ...stringSummary(value) };
92
+ }
93
+ }
94
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
95
+ return diagnosticValue(value);
96
+ }
97
+ const record = value;
98
+ return {
99
+ keys: Object.keys(record).sort(),
100
+ ...(record.url !== undefined
101
+ ? { url: mediaReferenceSummary(record.url) }
102
+ : {}),
103
+ ...(record.data !== undefined
104
+ ? { data: mediaReferenceSummary(record.data) }
105
+ : {}),
106
+ ...Object.fromEntries(Object.entries(record)
107
+ .filter(([key]) => key !== "url" && key !== "data")
108
+ .map(([key, item]) => [key, diagnosticValue(item, key)])),
109
+ };
110
+ }
111
+ const sensitiveKey = /(?:api.?key|authorization|bearer|credential|password|secret|token)$/i;
112
+ export function diagnosticValue(value, key = "", depth = 0) {
113
+ if (sensitiveKey.test(key))
114
+ return "***";
115
+ if (depth >= 8)
116
+ return { truncated: true, type: typeof value };
117
+ if (typeof value === "string") {
118
+ const data = dataUrlSummary(value);
119
+ if (data)
120
+ return data;
121
+ if (value.length > 4096)
122
+ return stringSummary(value);
123
+ return value;
124
+ }
125
+ if (value === null ||
126
+ value === undefined ||
127
+ typeof value === "number" ||
128
+ typeof value === "boolean") {
129
+ return value;
130
+ }
131
+ if (Array.isArray(value)) {
132
+ return value
133
+ .slice(0, 256)
134
+ .map((item) => diagnosticValue(item, "", depth + 1));
135
+ }
136
+ if (typeof value === "object") {
137
+ return Object.fromEntries(Object.entries(value).map(([name, item]) => [
138
+ name,
139
+ diagnosticValue(item, name, depth + 1),
140
+ ]));
141
+ }
142
+ return String(value);
143
+ }
144
+ function contentPartSummary(value, index, includeText) {
145
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
146
+ return { index, value: diagnosticValue(value) };
147
+ }
148
+ const part = value;
149
+ const omitted = new Set([
150
+ "text",
151
+ "image",
152
+ "image_url",
153
+ "video",
154
+ "video_url",
155
+ "source",
156
+ ]);
157
+ return {
158
+ index,
159
+ keys: Object.keys(part).sort(),
160
+ type: typeof part.type === "string" ? part.type : null,
161
+ ...(typeof part.text === "string"
162
+ ? {
163
+ text: includeText
164
+ ? loggedTextSummary(part.text)
165
+ : stringSummary(part.text),
166
+ }
167
+ : {}),
168
+ ...(part.image !== undefined
169
+ ? { image: mediaReferenceSummary(part.image) }
170
+ : {}),
171
+ ...(part.image_url !== undefined
172
+ ? { image_url: mediaReferenceSummary(part.image_url) }
173
+ : {}),
174
+ ...(part.video !== undefined
175
+ ? { video: mediaReferenceSummary(part.video) }
176
+ : {}),
177
+ ...(part.video_url !== undefined
178
+ ? { video_url: mediaReferenceSummary(part.video_url) }
179
+ : {}),
180
+ ...(part.source !== undefined
181
+ ? { source: mediaReferenceSummary(part.source) }
182
+ : {}),
183
+ ...Object.fromEntries(Object.entries(part)
184
+ .filter(([name]) => name !== "type" && !omitted.has(name))
185
+ .map(([name, item]) => [name, diagnosticValue(item, name)])),
186
+ };
187
+ }
188
+ function messageSummary(value, index) {
189
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
190
+ return { index, value: diagnosticValue(value) };
191
+ }
192
+ const message = value;
193
+ const role = typeof message.role === "string" ? message.role : null;
194
+ const includeText = role === "system" || role === "user";
195
+ const content = message.content;
196
+ return {
197
+ index,
198
+ role,
199
+ keys: Object.keys(message).sort(),
200
+ content: typeof content === "string"
201
+ ? {
202
+ kind: "string",
203
+ ...(includeText
204
+ ? loggedTextSummary(content)
205
+ : stringSummary(content)),
206
+ }
207
+ : Array.isArray(content)
208
+ ? {
209
+ kind: "array",
210
+ parts: content.map((part, partIndex) => contentPartSummary(part, partIndex, includeText)),
211
+ }
212
+ : { kind: typeof content, value: diagnosticValue(content) },
213
+ ...(typeof message.tool_call_id === "string"
214
+ ? { tool_call_id: message.tool_call_id }
215
+ : {}),
216
+ ...(Array.isArray(message.tool_calls)
217
+ ? {
218
+ tool_calls: message.tool_calls.map((call) => {
219
+ const record = call && typeof call === "object"
220
+ ? call
221
+ : {};
222
+ const fn = record.function && typeof record.function === "object"
223
+ ? record.function
224
+ : {};
225
+ return {
226
+ id: record.id,
227
+ type: record.type,
228
+ function: {
229
+ name: fn.name,
230
+ arguments: typeof fn.arguments === "string"
231
+ ? stringSummary(fn.arguments)
232
+ : diagnosticValue(fn.arguments),
233
+ },
234
+ };
235
+ }),
236
+ }
237
+ : {}),
238
+ ...(typeof message.reasoning_content === "string"
239
+ ? { reasoning_content: stringSummary(message.reasoning_content) }
240
+ : {}),
241
+ };
242
+ }
243
+ export function contentPartMediaTypes(value) {
244
+ if (!value || typeof value !== "object" || Array.isArray(value))
245
+ return [];
246
+ const record = value;
247
+ const type = String(record.type || "").toLowerCase();
248
+ const result = new Set();
249
+ if (["image", "image_url", "input_image"].includes(type) ||
250
+ record.image !== undefined ||
251
+ record.image_url !== undefined) {
252
+ result.add("image");
253
+ }
254
+ if (["video", "video_url", "input_video"].includes(type) ||
255
+ record.video !== undefined ||
256
+ record.video_url !== undefined) {
257
+ result.add("video");
258
+ }
259
+ if (["audio", "audio_url", "input_audio"].includes(type) ||
260
+ record.audio !== undefined ||
261
+ record.audio_url !== undefined ||
262
+ record.input_audio !== undefined) {
263
+ result.add("audio");
264
+ }
265
+ if (["file", "file_url", "input_file"].includes(type) ||
266
+ record.file !== undefined ||
267
+ record.file_url !== undefined) {
268
+ result.add("file");
269
+ }
270
+ return [...result];
271
+ }
272
+ export function requestMediaTypes(body) {
273
+ const messages = Array.isArray(body.messages) ? body.messages : [];
274
+ const result = new Set();
275
+ for (const message of messages) {
276
+ if (!message || typeof message !== "object" || Array.isArray(message)) {
277
+ continue;
278
+ }
279
+ const content = message.content;
280
+ if (!Array.isArray(content))
281
+ continue;
282
+ for (const part of content) {
283
+ for (const mediaType of contentPartMediaTypes(part))
284
+ result.add(mediaType);
285
+ }
286
+ }
287
+ return [...result];
288
+ }
289
+ export function requestContainsImage(body) {
290
+ return requestMediaTypes(body).includes("image");
291
+ }
292
+ export function requestDiagnosticSummary(body) {
293
+ const messages = Array.isArray(body.messages) ? body.messages : [];
294
+ const tools = Array.isArray(body.tools) ? body.tools : [];
295
+ const summarizedMessages = messages.map((message, index) => messageSummary(message, index));
296
+ const parameters = Object.fromEntries(Object.entries(body)
297
+ .filter(([key]) => key !== "messages" && key !== "tools" && key !== "model")
298
+ .map(([key, value]) => [key, diagnosticValue(value, key)]));
299
+ return {
300
+ body_keys: Object.keys(body).sort(),
301
+ parameters,
302
+ messages: summarizedMessages,
303
+ messages_sha256: sha256(stableJson(messages)),
304
+ tools: {
305
+ count: tools.length,
306
+ names: tools.map((tool) => {
307
+ const record = tool && typeof tool === "object"
308
+ ? tool
309
+ : {};
310
+ const fn = record.function && typeof record.function === "object"
311
+ ? record.function
312
+ : {};
313
+ return fn.name ?? record.name ?? null;
314
+ }),
315
+ sha256: sha256(stableJson(tools)),
316
+ },
317
+ contains_image: requestContainsImage(body),
318
+ media_types: requestMediaTypes(body),
319
+ };
320
+ }
321
+ export function safeEndpoint(value) {
322
+ try {
323
+ const url = new URL(value);
324
+ url.username = "";
325
+ url.password = "";
326
+ url.search = "";
327
+ url.hash = "";
328
+ return url.toString();
329
+ }
330
+ catch {
331
+ return value.split(/[?#]/, 1)[0] || value;
332
+ }
333
+ }
334
+ export function responseRequestIds(response) {
335
+ const result = {};
336
+ for (const name of [
337
+ "x-request-id",
338
+ "request-id",
339
+ "x-dashscope-request-id",
340
+ "x-litellm-call-id",
341
+ ]) {
342
+ const value = response.headers.get(name);
343
+ if (value)
344
+ result[name] = value;
345
+ }
346
+ return result;
347
+ }
348
+ export function diagnosticError(error) {
349
+ const direct = error;
350
+ const cause = direct?.cause && typeof direct.cause === "object"
351
+ ? direct.cause
352
+ : undefined;
353
+ return {
354
+ name: typeof direct?.name === "string" ? direct.name : typeof error,
355
+ message: typeof direct?.message === "string"
356
+ ? redactSensitiveText(direct.message.slice(0, 4000))
357
+ : redactSensitiveText(String(error)),
358
+ ...((typeof direct?.code === "string" || typeof direct?.code === "number")
359
+ ? { code: direct.code }
360
+ : typeof cause?.code === "string"
361
+ ? { code: cause.code }
362
+ : {}),
363
+ };
364
+ }
365
+ //# sourceMappingURL=model-diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-diagnostics.js","sourceRoot":"","sources":["../src/model-diagnostics.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,18 @@
1
1
  import type { ArenaConfig } from "./config.js";
2
+ import { type ModelCallDiagnosticSink } from "./model-diagnostics.js";
2
3
  import type { ModelChunk, ModelClient, ModelRequest } from "./types.js";
3
4
  interface HttpModelClientOptions {
4
5
  fetch?: typeof globalThis.fetch;
5
6
  sleep?: (milliseconds: number, signal?: AbortSignal) => Promise<void>;
6
7
  random?: () => number;
7
8
  now?: () => number;
9
+ diagnostics?: ModelCallDiagnosticSink;
10
+ }
11
+ export declare class ModelCapabilityError extends Error {
12
+ readonly capabilityHint: string;
13
+ readonly mediaTypes: string[];
14
+ readonly code = "ARENA_MULTIMODAL_CONTENT_UNSUPPORTED";
15
+ constructor(capabilityHint: string, cause: Error, mediaTypes?: string[]);
8
16
  }
9
17
  export interface ApiConnection {
10
18
  baseUrl: string;
@@ -23,8 +31,16 @@ export declare class HttpModelClient implements ModelClient {
23
31
  private readonly sleep;
24
32
  private readonly random;
25
33
  private readonly now;
34
+ private readonly diagnostics?;
35
+ private readonly recordedToolSchemas;
26
36
  private anthropicBearerAuth;
27
37
  constructor(config: ArenaConfig, options?: HttpModelClientOptions);
38
+ private recordDiagnostic;
39
+ private recordRequest;
40
+ private recordResponseHeaders;
41
+ private recordCompletion;
42
+ private recordCallError;
43
+ private recordAggregatedResponse;
28
44
  private retryDelay;
29
45
  private fetchWithHeadersTimeout;
30
46
  private completionResponse;