@qwen-code/arena-agent 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +52 -0
- package/README.md +436 -0
- package/dist/agent.d.ts +33 -0
- package/dist/agent.js +366 -0
- package/dist/agent.js.map +1 -0
- package/dist/attachments.d.ts +29 -0
- package/dist/attachments.js +222 -0
- package/dist/attachments.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +256 -0
- package/dist/cli.js.map +1 -0
- package/dist/compaction.d.ts +15 -0
- package/dist/compaction.js +176 -0
- package/dist/compaction.js.map +1 -0
- package/dist/config.d.ts +23 -0
- package/dist/config.js +61 -0
- package/dist/config.js.map +1 -0
- package/dist/document-reader.d.ts +18 -0
- package/dist/document-reader.js +423 -0
- package/dist/document-reader.js.map +1 -0
- package/dist/fetch-page.d.ts +25 -0
- package/dist/fetch-page.js +428 -0
- package/dist/fetch-page.js.map +1 -0
- package/dist/history.d.ts +5 -0
- package/dist/history.js +31 -0
- package/dist/history.js.map +1 -0
- package/dist/mock.d.ts +4 -0
- package/dist/mock.js +151 -0
- package/dist/mock.js.map +1 -0
- package/dist/protocol.d.ts +23 -0
- package/dist/protocol.js +84 -0
- package/dist/protocol.js.map +1 -0
- package/dist/provider.d.ts +31 -0
- package/dist/provider.js +308 -0
- package/dist/provider.js.map +1 -0
- package/dist/sdk.d.ts +181 -0
- package/dist/sdk.js +674 -0
- package/dist/sdk.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.js +1433 -0
- package/dist/server.js.map +1 -0
- package/dist/spec.d.ts +11 -0
- package/dist/spec.js +198 -0
- package/dist/spec.js.map +1 -0
- package/dist/tools.d.ts +38 -0
- package/dist/tools.js +992 -0
- package/dist/tools.js.map +1 -0
- package/dist/tui.d.ts +10 -0
- package/dist/tui.js +350 -0
- package/dist/tui.js.map +1 -0
- package/dist/types.d.ts +146 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/web/app.d.ts +1 -0
- package/dist/web/app.js +1082 -0
- package/dist/web/app.js.map +1 -0
- package/docs/SDK.md +521 -0
- package/package.json +59 -0
- package/spec/message.json +150 -0
- package/spec/tools.json +418 -0
- package/web/arena-logo.svg +11 -0
- package/web/fonts.css +67 -0
- package/web/index.html +285 -0
- package/web/styles.css +1798 -0
package/dist/agent.js
ADDED
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import { setTimeout as delay } from "node:timers/promises";
|
|
3
|
+
import { compactMessagesIfNeeded } from "./compaction.js";
|
|
4
|
+
import { MockModelClient } from "./mock.js";
|
|
5
|
+
import { HttpModelClient } from "./provider.js";
|
|
6
|
+
import { initialMessages, interruptedUserMessage, isCanonicalSystemMessage, } from "./spec.js";
|
|
7
|
+
import { ToolExecutor } from "./tools.js";
|
|
8
|
+
function parseToolResult(content) {
|
|
9
|
+
try {
|
|
10
|
+
return JSON.parse(content);
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return {};
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
// Network faults that abort an in-flight stream (a dropped socket, a reset, a
|
|
17
|
+
// DNS blip). undici surfaces these mid-stream as `TypeError: fetch failed` or
|
|
18
|
+
// `TypeError: terminated`; some are also reachable via an errno-style code on
|
|
19
|
+
// the error or its cause.
|
|
20
|
+
const retryableStreamCodes = new Set([
|
|
21
|
+
"ECONNRESET",
|
|
22
|
+
"ECONNREFUSED",
|
|
23
|
+
"ECONNABORTED",
|
|
24
|
+
"EPIPE",
|
|
25
|
+
"ETIMEDOUT",
|
|
26
|
+
"ENETUNREACH",
|
|
27
|
+
"ENETDOWN",
|
|
28
|
+
"EHOSTUNREACH",
|
|
29
|
+
"EAI_AGAIN",
|
|
30
|
+
"UND_ERR_SOCKET",
|
|
31
|
+
"UND_ERR_CONNECT_TIMEOUT",
|
|
32
|
+
"UND_ERR_HEADERS_TIMEOUT",
|
|
33
|
+
"UND_ERR_BODY_TIMEOUT",
|
|
34
|
+
]);
|
|
35
|
+
function describeError(error) {
|
|
36
|
+
return error instanceof Error ? error.message : String(error);
|
|
37
|
+
}
|
|
38
|
+
function errorCode(error) {
|
|
39
|
+
const direct = error?.code;
|
|
40
|
+
if (typeof direct === "string")
|
|
41
|
+
return direct;
|
|
42
|
+
const cause = error?.cause?.code;
|
|
43
|
+
return typeof cause === "string" ? cause : undefined;
|
|
44
|
+
}
|
|
45
|
+
function isRetryableStreamError(error) {
|
|
46
|
+
if (error instanceof TypeError)
|
|
47
|
+
return true;
|
|
48
|
+
const code = errorCode(error);
|
|
49
|
+
return code !== undefined && retryableStreamCodes.has(code);
|
|
50
|
+
}
|
|
51
|
+
function completeInterruptedToolCalls(messages) {
|
|
52
|
+
const completed = [];
|
|
53
|
+
let pending = [];
|
|
54
|
+
const flushPending = () => {
|
|
55
|
+
for (const call of pending) {
|
|
56
|
+
completed.push({
|
|
57
|
+
role: "tool",
|
|
58
|
+
tool_call_id: call.id,
|
|
59
|
+
content: JSON.stringify({
|
|
60
|
+
status: "error",
|
|
61
|
+
tool: call.function.name,
|
|
62
|
+
error: "tool result was not recorded because the previous process stopped",
|
|
63
|
+
interrupted: true,
|
|
64
|
+
}),
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
pending = [];
|
|
68
|
+
};
|
|
69
|
+
for (const message of messages) {
|
|
70
|
+
if (pending.length && message.role !== "tool")
|
|
71
|
+
flushPending();
|
|
72
|
+
completed.push(message);
|
|
73
|
+
if (message.role === "assistant") {
|
|
74
|
+
pending = [...(message.tool_calls || [])];
|
|
75
|
+
}
|
|
76
|
+
else if (message.role === "tool") {
|
|
77
|
+
const index = pending.findIndex((call) => call.id === message.tool_call_id);
|
|
78
|
+
if (index !== -1)
|
|
79
|
+
pending.splice(index, 1);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
flushPending();
|
|
83
|
+
return completed;
|
|
84
|
+
}
|
|
85
|
+
class PartialAssistantTurnError extends Error {
|
|
86
|
+
cause;
|
|
87
|
+
assistant;
|
|
88
|
+
constructor(cause, assistant) {
|
|
89
|
+
super(cause instanceof Error ? cause.message : String(cause));
|
|
90
|
+
this.cause = cause;
|
|
91
|
+
this.assistant = assistant;
|
|
92
|
+
this.name = "PartialAssistantTurnError";
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
export class Agent {
|
|
96
|
+
config;
|
|
97
|
+
sink;
|
|
98
|
+
options;
|
|
99
|
+
client;
|
|
100
|
+
tools;
|
|
101
|
+
sessionId;
|
|
102
|
+
constructor(config, sink, options = {}) {
|
|
103
|
+
this.config = config;
|
|
104
|
+
this.sink = sink;
|
|
105
|
+
this.options = options;
|
|
106
|
+
this.client =
|
|
107
|
+
options.client ||
|
|
108
|
+
(config.model.startsWith("mock/")
|
|
109
|
+
? new MockModelClient()
|
|
110
|
+
: new HttpModelClient(config));
|
|
111
|
+
this.tools =
|
|
112
|
+
options.tools ||
|
|
113
|
+
new ToolExecutor(config, {
|
|
114
|
+
signal: options.signal,
|
|
115
|
+
workspaceContext: options.workspaceContext,
|
|
116
|
+
});
|
|
117
|
+
this.sessionId =
|
|
118
|
+
options.sessionId || crypto.randomUUID().replaceAll("-", "");
|
|
119
|
+
}
|
|
120
|
+
async run(prompt, history, runOptions = {}) {
|
|
121
|
+
const baseUserMessage = runOptions.userMessage ||
|
|
122
|
+
{ role: "user", content: prompt };
|
|
123
|
+
const userMessage = runOptions.interrupted
|
|
124
|
+
? interruptedUserMessage(baseUserMessage)
|
|
125
|
+
: structuredClone(baseUserMessage);
|
|
126
|
+
const messages = history?.length
|
|
127
|
+
? completeInterruptedToolCalls(structuredClone(history))
|
|
128
|
+
: initialMessages(prompt, this.options.clientContext, this.options.workspaceContext);
|
|
129
|
+
if (history?.length) {
|
|
130
|
+
if (!isCanonicalSystemMessage(messages[0], this.options.workspaceContext)) {
|
|
131
|
+
if (this.options.workspaceContext &&
|
|
132
|
+
isCanonicalSystemMessage(messages[0])) {
|
|
133
|
+
messages[0] = initialMessages("", this.options.clientContext, this.options.workspaceContext)[0];
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
throw new Error("history does not match the current workspace runtime context");
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
messages.push(userMessage);
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
messages[1] = userMessage;
|
|
143
|
+
}
|
|
144
|
+
await this.maybeCompact(messages);
|
|
145
|
+
this.sink.start(this.sessionId, messages);
|
|
146
|
+
try {
|
|
147
|
+
await this.checkpoint(messages);
|
|
148
|
+
for (let step = 1;; step += 1) {
|
|
149
|
+
if (this.options.signal?.aborted) {
|
|
150
|
+
throw this.options.signal.reason || new Error("operation cancelled");
|
|
151
|
+
}
|
|
152
|
+
if (step > 1 && (await this.maybeCompact(messages))) {
|
|
153
|
+
await this.checkpoint(messages);
|
|
154
|
+
}
|
|
155
|
+
this.sink.modelStart(this.sessionId, step);
|
|
156
|
+
let assistant;
|
|
157
|
+
try {
|
|
158
|
+
assistant = await this.assistantTurn(messages);
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
if (error instanceof PartialAssistantTurnError) {
|
|
162
|
+
if (error.assistant) {
|
|
163
|
+
messages.push(error.assistant);
|
|
164
|
+
this.sink.message(this.sessionId, error.assistant, messages);
|
|
165
|
+
await this.checkpoint(messages);
|
|
166
|
+
}
|
|
167
|
+
throw error.cause;
|
|
168
|
+
}
|
|
169
|
+
throw error;
|
|
170
|
+
}
|
|
171
|
+
const finishReason = assistant.tool_calls?.length ? "tool_calls" : "stop";
|
|
172
|
+
this.sink.modelComplete(this.sessionId, step, finishReason);
|
|
173
|
+
messages.push(assistant);
|
|
174
|
+
this.sink.message(this.sessionId, assistant, messages);
|
|
175
|
+
await this.checkpoint(messages);
|
|
176
|
+
if (!assistant.tool_calls?.length) {
|
|
177
|
+
return this.sink.result(this.sessionId, "success", messages);
|
|
178
|
+
}
|
|
179
|
+
const completedToolCallIds = [];
|
|
180
|
+
for (const call of assistant.tool_calls) {
|
|
181
|
+
const toolCallId = String(call.id || "");
|
|
182
|
+
const toolName = String(call.function?.name || "tool");
|
|
183
|
+
this.sink.toolStart(this.sessionId, toolCallId, toolName);
|
|
184
|
+
const toolMessage = await this.tools.execute(call);
|
|
185
|
+
const toolResult = parseToolResult(toolMessage.content);
|
|
186
|
+
const skippedAskUser = toolName === "ask_user" && toolResult.skipped === true;
|
|
187
|
+
if (this.options.signal?.aborted && !skippedAskUser) {
|
|
188
|
+
throw this.options.signal.reason || new Error("operation cancelled");
|
|
189
|
+
}
|
|
190
|
+
messages.push(toolMessage);
|
|
191
|
+
completedToolCallIds.push(toolCallId);
|
|
192
|
+
this.sink.message(this.sessionId, toolMessage, messages);
|
|
193
|
+
await this.checkpoint(messages);
|
|
194
|
+
this.sink.toolComplete(this.sessionId, toolCallId, toolName);
|
|
195
|
+
if (toolName === "ask_user") {
|
|
196
|
+
if (toolResult.status === "needs_input") {
|
|
197
|
+
const visualMessage = this.tools.takeVisualMessage(completedToolCallIds);
|
|
198
|
+
if (visualMessage) {
|
|
199
|
+
messages.push(visualMessage);
|
|
200
|
+
this.sink.message(this.sessionId, visualMessage, messages);
|
|
201
|
+
await this.checkpoint(messages);
|
|
202
|
+
}
|
|
203
|
+
const questions = Array.isArray(toolResult.questions)
|
|
204
|
+
? toolResult.questions
|
|
205
|
+
: [];
|
|
206
|
+
this.sink.inputRequired(this.sessionId, toolCallId, questions);
|
|
207
|
+
return this.sink.result(this.sessionId, "needs_input", messages);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
if (this.options.signal?.aborted) {
|
|
211
|
+
throw this.options.signal.reason || new Error("operation cancelled");
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
const visualMessage = this.tools.takeVisualMessage(completedToolCallIds);
|
|
215
|
+
if (visualMessage) {
|
|
216
|
+
messages.push(visualMessage);
|
|
217
|
+
this.sink.message(this.sessionId, visualMessage, messages);
|
|
218
|
+
await this.checkpoint(messages);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
catch (error) {
|
|
223
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
224
|
+
return this.sink.result(this.sessionId, "error", messages, message);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
async checkpoint(messages) {
|
|
228
|
+
await this.options.onCheckpoint?.(messages);
|
|
229
|
+
}
|
|
230
|
+
async maybeCompact(messages) {
|
|
231
|
+
try {
|
|
232
|
+
const result = await compactMessagesIfNeeded(messages, this.tools.availableTools(), this.client, this.config.model, {
|
|
233
|
+
contextWindow: this.config.contextWindow,
|
|
234
|
+
triggerRatio: this.config.contextCompactionRatio,
|
|
235
|
+
summaryMaxTokens: this.config.compactionSummaryMaxTokens,
|
|
236
|
+
}, this.options.signal);
|
|
237
|
+
return result.compacted;
|
|
238
|
+
}
|
|
239
|
+
catch {
|
|
240
|
+
// Compaction is protective rather than task-critical. If its dedicated
|
|
241
|
+
// summary request fails, keep the original history and let the normal
|
|
242
|
+
// model request (and its retry policy) decide whether it still fits.
|
|
243
|
+
return false;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
async assistantTurn(messages) {
|
|
247
|
+
// A mid-stream network fault loses only the tokens produced so far, not the
|
|
248
|
+
// conversation: the request is idempotent, so the whole turn is re-issued
|
|
249
|
+
// from scratch. Accumulators live inside the loop and reset each attempt, so
|
|
250
|
+
// the assistant message written to history reflects one clean completion.
|
|
251
|
+
const maxRetries = Math.max(0, Math.floor(this.config.modelMaxRetries ?? 5));
|
|
252
|
+
for (let attempt = 0;; attempt += 1) {
|
|
253
|
+
const contentParts = [];
|
|
254
|
+
const reasoningParts = [];
|
|
255
|
+
const calls = new Map();
|
|
256
|
+
try {
|
|
257
|
+
const stream = this.client.stream({
|
|
258
|
+
model: this.config.model,
|
|
259
|
+
messages: structuredClone(messages),
|
|
260
|
+
tools: this.tools.availableTools(),
|
|
261
|
+
toolChoice: this.config.toolChoice,
|
|
262
|
+
temperature: this.config.temperature,
|
|
263
|
+
maxTokens: this.config.maxTokens,
|
|
264
|
+
enableThinking: this.config.enableThinking,
|
|
265
|
+
thinkingBudget: this.config.thinkingBudget,
|
|
266
|
+
signal: this.options.signal,
|
|
267
|
+
});
|
|
268
|
+
for await (const chunk of stream) {
|
|
269
|
+
const delta = chunk.choices?.[0]?.delta || {};
|
|
270
|
+
if (delta.content) {
|
|
271
|
+
const content = String(delta.content);
|
|
272
|
+
contentParts.push(content);
|
|
273
|
+
this.sink.delta(this.sessionId, { content });
|
|
274
|
+
}
|
|
275
|
+
const reasoning = delta.reasoning_content || delta.reasoning;
|
|
276
|
+
if (reasoning) {
|
|
277
|
+
const value = String(reasoning);
|
|
278
|
+
reasoningParts.push(value);
|
|
279
|
+
this.sink.delta(this.sessionId, { reasoning_content: value });
|
|
280
|
+
}
|
|
281
|
+
for (const [position, fragment] of (delta.tool_calls || []).entries()) {
|
|
282
|
+
const index = Number(fragment.index ?? position);
|
|
283
|
+
const call = calls.get(index) ||
|
|
284
|
+
{
|
|
285
|
+
id: "",
|
|
286
|
+
type: "function",
|
|
287
|
+
function: { name: "", arguments: "" },
|
|
288
|
+
};
|
|
289
|
+
if (fragment.id)
|
|
290
|
+
call.id += String(fragment.id);
|
|
291
|
+
if (fragment.function?.name) {
|
|
292
|
+
call.function.name += String(fragment.function.name);
|
|
293
|
+
}
|
|
294
|
+
if (fragment.function?.arguments) {
|
|
295
|
+
call.function.arguments += String(fragment.function.arguments);
|
|
296
|
+
}
|
|
297
|
+
calls.set(index, call);
|
|
298
|
+
this.sink.delta(this.sessionId, {
|
|
299
|
+
tool_calls: [
|
|
300
|
+
{
|
|
301
|
+
index,
|
|
302
|
+
id: String(fragment.id || ""),
|
|
303
|
+
type: String(fragment.type || ""),
|
|
304
|
+
function: {
|
|
305
|
+
name: String(fragment.function?.name || ""),
|
|
306
|
+
arguments: String(fragment.function?.arguments || ""),
|
|
307
|
+
},
|
|
308
|
+
},
|
|
309
|
+
],
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
catch (error) {
|
|
315
|
+
// A user cancellation is not a transient fault: skip the retry, but
|
|
316
|
+
// still fall through so any partial output is preserved in history.
|
|
317
|
+
const aborted = Boolean(this.options.signal?.aborted);
|
|
318
|
+
if (!aborted && isRetryableStreamError(error) && attempt < maxRetries) {
|
|
319
|
+
this.sink.modelRetry(this.sessionId, attempt + 1, describeError(error));
|
|
320
|
+
await this.retryBackoff(attempt);
|
|
321
|
+
continue;
|
|
322
|
+
}
|
|
323
|
+
const content = contentParts.join("");
|
|
324
|
+
const reasoningContent = reasoningParts.join("");
|
|
325
|
+
const partial = content || reasoningContent
|
|
326
|
+
? {
|
|
327
|
+
role: "assistant",
|
|
328
|
+
content,
|
|
329
|
+
reasoning_content: reasoningContent,
|
|
330
|
+
}
|
|
331
|
+
: undefined;
|
|
332
|
+
throw new PartialAssistantTurnError(error, partial);
|
|
333
|
+
}
|
|
334
|
+
const assistant = {
|
|
335
|
+
role: "assistant",
|
|
336
|
+
content: contentParts.join(""),
|
|
337
|
+
reasoning_content: reasoningParts.join(""),
|
|
338
|
+
};
|
|
339
|
+
if (calls.size) {
|
|
340
|
+
assistant.tool_calls = [...calls.entries()]
|
|
341
|
+
.sort(([left], [right]) => left - right)
|
|
342
|
+
.map(([, call]) => call);
|
|
343
|
+
}
|
|
344
|
+
return assistant;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
async retryBackoff(attempt) {
|
|
348
|
+
const base = Math.max(0, this.config.modelRetryBaseMs ?? 1000);
|
|
349
|
+
const maximum = Math.max(0, this.config.modelRetryMaxMs ?? 30000);
|
|
350
|
+
const exponential = Math.min(maximum, base * 2 ** Math.min(attempt, 30));
|
|
351
|
+
const wait = Math.floor(exponential * Math.random());
|
|
352
|
+
if (wait <= 0)
|
|
353
|
+
return;
|
|
354
|
+
await delay(wait, undefined, { signal: this.options.signal });
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
export function finalText(result) {
|
|
358
|
+
for (const message of [...result.messages].reverse()) {
|
|
359
|
+
if (message.role === "assistant" &&
|
|
360
|
+
!message.tool_calls?.length) {
|
|
361
|
+
return message.content;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
return "";
|
|
365
|
+
}
|
|
366
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { MultimodalUserMessage } from "./types.js";
|
|
2
|
+
export interface Attachment {
|
|
3
|
+
name: string;
|
|
4
|
+
path: string;
|
|
5
|
+
mimeType: string;
|
|
6
|
+
size: number;
|
|
7
|
+
imageMimeType?: string;
|
|
8
|
+
bytes?: Buffer;
|
|
9
|
+
sourceUrl?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface StageAttachmentOptions {
|
|
12
|
+
fetch?: typeof globalThis.fetch;
|
|
13
|
+
signal?: AbortSignal;
|
|
14
|
+
}
|
|
15
|
+
export declare const maxUploadBytes: number;
|
|
16
|
+
export declare const maxAttachmentsPerMessage = 10;
|
|
17
|
+
export declare const maxAttachmentBytesPerMessage: number;
|
|
18
|
+
export declare const mimeTypes: Record<string, string>;
|
|
19
|
+
export declare function sanitizeAttachmentName(value: string): string;
|
|
20
|
+
export declare function normalizedMediaType(value: string): string;
|
|
21
|
+
export declare function detectedImageMimeType(bytes: Buffer): string | undefined;
|
|
22
|
+
export declare function attachmentMimeType(name: string, bytes: Buffer, declaredType?: string): {
|
|
23
|
+
mimeType: string;
|
|
24
|
+
imageMimeType?: string;
|
|
25
|
+
};
|
|
26
|
+
export declare function uploadsDirectory(workspace: string, create: boolean): Promise<string>;
|
|
27
|
+
export declare function saveAttachment(workspace: string, requestedName: string, bytes: Buffer, declaredType?: string): Promise<Attachment>;
|
|
28
|
+
export declare function stageAttachment(workspace: string, source: string, options?: StageAttachmentOptions): Promise<Attachment>;
|
|
29
|
+
export declare function attachmentUserMessage(prompt: string, attachments: Attachment[]): MultimodalUserMessage;
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { lstat, mkdir, readFile, realpath, writeFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
export const maxUploadBytes = 20 * 1024 * 1024;
|
|
4
|
+
export const maxAttachmentsPerMessage = 10;
|
|
5
|
+
export const maxAttachmentBytesPerMessage = 50 * 1024 * 1024;
|
|
6
|
+
export const mimeTypes = {
|
|
7
|
+
".aac": "audio/aac",
|
|
8
|
+
".avi": "video/x-msvideo",
|
|
9
|
+
".bmp": "image/bmp",
|
|
10
|
+
".csv": "text/csv; charset=utf-8",
|
|
11
|
+
".css": "text/css; charset=utf-8",
|
|
12
|
+
".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
|
|
13
|
+
".gif": "image/gif",
|
|
14
|
+
".html": "text/html; charset=utf-8",
|
|
15
|
+
".ico": "image/x-icon",
|
|
16
|
+
".jpeg": "image/jpeg",
|
|
17
|
+
".js": "text/javascript; charset=utf-8",
|
|
18
|
+
".jpg": "image/jpeg",
|
|
19
|
+
".json": "application/json; charset=utf-8",
|
|
20
|
+
".m4a": "audio/mp4",
|
|
21
|
+
".md": "text/markdown; charset=utf-8",
|
|
22
|
+
".mjs": "text/javascript; charset=utf-8",
|
|
23
|
+
".mov": "video/quicktime",
|
|
24
|
+
".mp3": "audio/mpeg",
|
|
25
|
+
".mp4": "video/mp4",
|
|
26
|
+
".ogg": "audio/ogg",
|
|
27
|
+
".ogv": "video/ogg",
|
|
28
|
+
".pdf": "application/pdf",
|
|
29
|
+
".png": "image/png",
|
|
30
|
+
".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
|
|
31
|
+
".py": "text/plain; charset=utf-8",
|
|
32
|
+
".svg": "image/svg+xml",
|
|
33
|
+
".toml": "text/plain; charset=utf-8",
|
|
34
|
+
".ts": "text/plain; charset=utf-8",
|
|
35
|
+
".tsx": "text/plain; charset=utf-8",
|
|
36
|
+
".txt": "text/plain; charset=utf-8",
|
|
37
|
+
".wav": "audio/wav",
|
|
38
|
+
".webm": "video/webm",
|
|
39
|
+
".webp": "image/webp",
|
|
40
|
+
".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
|
41
|
+
".xml": "application/xml; charset=utf-8",
|
|
42
|
+
".yaml": "text/plain; charset=utf-8",
|
|
43
|
+
".yml": "text/plain; charset=utf-8",
|
|
44
|
+
};
|
|
45
|
+
const imageExtensions = {
|
|
46
|
+
"image/bmp": ".bmp",
|
|
47
|
+
"image/gif": ".gif",
|
|
48
|
+
"image/jpeg": ".jpg",
|
|
49
|
+
"image/png": ".png",
|
|
50
|
+
"image/webp": ".webp",
|
|
51
|
+
};
|
|
52
|
+
export function sanitizeAttachmentName(value) {
|
|
53
|
+
const cleaned = value
|
|
54
|
+
.normalize("NFC")
|
|
55
|
+
.replace(/[\u0000-\u001f\u007f]+/g, " ")
|
|
56
|
+
.replaceAll("/", "_")
|
|
57
|
+
.replaceAll("\\", "_")
|
|
58
|
+
.replace(/[<>]/g, "_")
|
|
59
|
+
.replace(/\s+/g, " ")
|
|
60
|
+
.replace(/^\.+/, "")
|
|
61
|
+
.trim();
|
|
62
|
+
if (!cleaned || cleaned === "." || cleaned === "..") {
|
|
63
|
+
throw new Error("attachment filename is empty");
|
|
64
|
+
}
|
|
65
|
+
const extension = path.extname(cleaned);
|
|
66
|
+
const stem = cleaned.slice(0, cleaned.length - extension.length);
|
|
67
|
+
const maximumStemLength = Math.max(1, 180 - Array.from(extension).length);
|
|
68
|
+
return `${Array.from(stem).slice(0, maximumStemLength).join("")}${extension}`;
|
|
69
|
+
}
|
|
70
|
+
export function normalizedMediaType(value) {
|
|
71
|
+
const mediaType = value.split(";")[0]?.trim().toLowerCase() || "";
|
|
72
|
+
return /^[a-z0-9!#$&^_.+-]+\/[a-z0-9!#$&^_.+-]+$/.test(mediaType)
|
|
73
|
+
? mediaType
|
|
74
|
+
: "";
|
|
75
|
+
}
|
|
76
|
+
export function detectedImageMimeType(bytes) {
|
|
77
|
+
if (bytes.length >= 8 &&
|
|
78
|
+
bytes.subarray(0, 8).equals(Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]))) {
|
|
79
|
+
return "image/png";
|
|
80
|
+
}
|
|
81
|
+
if (bytes.length >= 3 &&
|
|
82
|
+
bytes[0] === 0xff &&
|
|
83
|
+
bytes[1] === 0xd8 &&
|
|
84
|
+
bytes[2] === 0xff) {
|
|
85
|
+
return "image/jpeg";
|
|
86
|
+
}
|
|
87
|
+
const prefix = bytes.subarray(0, 12).toString("ascii");
|
|
88
|
+
if (prefix.startsWith("GIF87a") || prefix.startsWith("GIF89a")) {
|
|
89
|
+
return "image/gif";
|
|
90
|
+
}
|
|
91
|
+
if (prefix.startsWith("RIFF") && prefix.slice(8, 12) === "WEBP") {
|
|
92
|
+
return "image/webp";
|
|
93
|
+
}
|
|
94
|
+
if (bytes.length >= 2 && bytes[0] === 0x42 && bytes[1] === 0x4d) {
|
|
95
|
+
return "image/bmp";
|
|
96
|
+
}
|
|
97
|
+
return undefined;
|
|
98
|
+
}
|
|
99
|
+
export function attachmentMimeType(name, bytes, declaredType = "") {
|
|
100
|
+
const imageMimeType = detectedImageMimeType(bytes);
|
|
101
|
+
if (imageMimeType)
|
|
102
|
+
return { mimeType: imageMimeType, imageMimeType };
|
|
103
|
+
const extensionType = mimeTypes[path.extname(name).toLowerCase()]?.split(";")[0];
|
|
104
|
+
return {
|
|
105
|
+
mimeType: normalizedMediaType(extensionType || "") ||
|
|
106
|
+
normalizedMediaType(declaredType) ||
|
|
107
|
+
"application/octet-stream",
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
export async function uploadsDirectory(workspace, create) {
|
|
111
|
+
const uploads = path.join(workspace, "uploads");
|
|
112
|
+
if (create)
|
|
113
|
+
await mkdir(uploads, { recursive: true });
|
|
114
|
+
const [workspaceReal, uploadsReal, info] = await Promise.all([
|
|
115
|
+
realpath(workspace),
|
|
116
|
+
realpath(uploads),
|
|
117
|
+
lstat(uploads),
|
|
118
|
+
]);
|
|
119
|
+
const relative = path.relative(workspaceReal, uploadsReal);
|
|
120
|
+
if (!info.isDirectory() ||
|
|
121
|
+
info.isSymbolicLink() ||
|
|
122
|
+
relative.startsWith("..") ||
|
|
123
|
+
path.isAbsolute(relative)) {
|
|
124
|
+
throw new Error("/home/user/uploads/ is not a safe session directory");
|
|
125
|
+
}
|
|
126
|
+
return uploadsReal;
|
|
127
|
+
}
|
|
128
|
+
export async function saveAttachment(workspace, requestedName, bytes, declaredType = "") {
|
|
129
|
+
const uploads = await uploadsDirectory(workspace, true);
|
|
130
|
+
const originalName = sanitizeAttachmentName(requestedName);
|
|
131
|
+
const extension = path.extname(originalName);
|
|
132
|
+
const stem = originalName.slice(0, originalName.length - extension.length);
|
|
133
|
+
for (let suffix = 0; suffix < 10_000; suffix += 1) {
|
|
134
|
+
const name = suffix === 0 ? originalName : `${stem}-${suffix + 1}${extension}`;
|
|
135
|
+
const absolutePath = path.join(uploads, name);
|
|
136
|
+
try {
|
|
137
|
+
await writeFile(absolutePath, bytes, { flag: "wx" });
|
|
138
|
+
const type = attachmentMimeType(name, bytes, declaredType);
|
|
139
|
+
return {
|
|
140
|
+
name,
|
|
141
|
+
path: `uploads/${name}`,
|
|
142
|
+
size: bytes.length,
|
|
143
|
+
bytes,
|
|
144
|
+
...type,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
if (error.code !== "EEXIST")
|
|
149
|
+
throw error;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
throw new Error("could not allocate a unique attachment filename");
|
|
153
|
+
}
|
|
154
|
+
function withDetectedImageExtension(name, bytes) {
|
|
155
|
+
if (path.extname(name))
|
|
156
|
+
return name;
|
|
157
|
+
const extension = imageExtensions[detectedImageMimeType(bytes) || ""];
|
|
158
|
+
return extension ? `${name}${extension}` : name;
|
|
159
|
+
}
|
|
160
|
+
export async function stageAttachment(workspace, source, options = {}) {
|
|
161
|
+
if (/^https?:\/\//i.test(source)) {
|
|
162
|
+
const fetchImpl = options.fetch || globalThis.fetch.bind(globalThis);
|
|
163
|
+
let response;
|
|
164
|
+
try {
|
|
165
|
+
response = await fetchImpl(source, { signal: options.signal });
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
if (options.signal?.aborted)
|
|
169
|
+
throw error;
|
|
170
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
171
|
+
throw new Error(`attachment download failed (${detail}): ${source}`);
|
|
172
|
+
}
|
|
173
|
+
if (!response.ok) {
|
|
174
|
+
throw new Error(`attachment download failed (${response.status} ${response.statusText}): ${source}`);
|
|
175
|
+
}
|
|
176
|
+
const bytes = Buffer.from(await response.arrayBuffer());
|
|
177
|
+
if (bytes.length > maxUploadBytes) {
|
|
178
|
+
throw new Error(`attachment exceeds ${maxUploadBytes} bytes: ${source}`);
|
|
179
|
+
}
|
|
180
|
+
let name = path.posix.basename(new URL(source).pathname) || "attachment";
|
|
181
|
+
try {
|
|
182
|
+
name = decodeURIComponent(name);
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
// Keep the raw basename when it is not URI encoded.
|
|
186
|
+
}
|
|
187
|
+
const attachment = await saveAttachment(workspace, withDetectedImageExtension(name, bytes), bytes, response.headers.get("content-type") || "");
|
|
188
|
+
attachment.sourceUrl = source;
|
|
189
|
+
return attachment;
|
|
190
|
+
}
|
|
191
|
+
const absolute = path.resolve(source);
|
|
192
|
+
const bytes = await readFile(absolute);
|
|
193
|
+
if (bytes.length > maxUploadBytes) {
|
|
194
|
+
throw new Error(`attachment exceeds ${maxUploadBytes} bytes: ${source}`);
|
|
195
|
+
}
|
|
196
|
+
return saveAttachment(workspace, withDetectedImageExtension(path.basename(absolute), bytes), bytes);
|
|
197
|
+
}
|
|
198
|
+
export function attachmentUserMessage(prompt, attachments) {
|
|
199
|
+
const content = [];
|
|
200
|
+
for (const attachment of attachments) {
|
|
201
|
+
if (attachment.imageMimeType && attachment.bytes) {
|
|
202
|
+
// URL-sourced images keep the original URL, matching how baseline
|
|
203
|
+
// traces reference attachments; local files have no URL to cite and
|
|
204
|
+
// embed the bytes instead.
|
|
205
|
+
content.push({
|
|
206
|
+
image: attachment.sourceUrl ||
|
|
207
|
+
`data:${attachment.imageMimeType};base64,` +
|
|
208
|
+
attachment.bytes.toString("base64"),
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
if (prompt)
|
|
213
|
+
content.push({ text: prompt });
|
|
214
|
+
content.push({
|
|
215
|
+
text: "\n\n<arena-system-message>\n" +
|
|
216
|
+
"The user attached the following files (saved to /home/user/uploads/):\n" +
|
|
217
|
+
attachments.map((attachment) => attachment.name).join(",\n") +
|
|
218
|
+
"\n</arena-system-message>",
|
|
219
|
+
});
|
|
220
|
+
return { role: "user", content };
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=attachments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachments.js","sourceRoot":"","sources":["../src/attachments.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED