@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
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
import { lookup as dnsLookup } from "node:dns/promises";
|
|
2
|
+
import { isIP } from "node:net";
|
|
3
|
+
import { Defuddle } from "defuddle/node";
|
|
4
|
+
import { parseHTML } from "linkedom";
|
|
5
|
+
import { extractPdfDocument } from "./document-reader.js";
|
|
6
|
+
const HTML_LIMIT_BYTES = 5 * 1024 * 1024;
|
|
7
|
+
const PDF_LIMIT_BYTES = 25 * 1024 * 1024;
|
|
8
|
+
const DEFAULT_CHUNK_SIZE = 12_000;
|
|
9
|
+
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
10
|
+
const MAX_REDIRECTS = 5;
|
|
11
|
+
const MAX_CACHE_ENTRIES = 16;
|
|
12
|
+
const REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);
|
|
13
|
+
function errorMessage(error) {
|
|
14
|
+
return error instanceof Error ? error.message : String(error);
|
|
15
|
+
}
|
|
16
|
+
function abortError(signal) {
|
|
17
|
+
return signal.reason instanceof Error
|
|
18
|
+
? signal.reason
|
|
19
|
+
: new Error("operation cancelled");
|
|
20
|
+
}
|
|
21
|
+
function normalizeIpAddress(address) {
|
|
22
|
+
return address.replace(/^\[|\]$/g, "").split("%")[0]?.toLowerCase() || "";
|
|
23
|
+
}
|
|
24
|
+
function isPrivateIpv4(address) {
|
|
25
|
+
const octets = address.split(".").map(Number);
|
|
26
|
+
if (octets.length !== 4 ||
|
|
27
|
+
octets.some((octet) => !Number.isInteger(octet) || octet < 0 || octet > 255)) {
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
const [first = 0, second = 0] = octets;
|
|
31
|
+
return (first === 0 ||
|
|
32
|
+
first === 10 ||
|
|
33
|
+
first === 127 ||
|
|
34
|
+
(first === 100 && second >= 64 && second <= 127) ||
|
|
35
|
+
(first === 169 && second === 254) ||
|
|
36
|
+
(first === 172 && second >= 16 && second <= 31) ||
|
|
37
|
+
(first === 192 && second === 168) ||
|
|
38
|
+
first >= 224);
|
|
39
|
+
}
|
|
40
|
+
function isPrivateIpv6(address) {
|
|
41
|
+
const normalized = normalizeIpAddress(address);
|
|
42
|
+
if (normalized === "::" ||
|
|
43
|
+
normalized === "::1" ||
|
|
44
|
+
normalized.startsWith("fc") ||
|
|
45
|
+
normalized.startsWith("fd") ||
|
|
46
|
+
/^fe[89ab]/.test(normalized) ||
|
|
47
|
+
normalized.startsWith("ff")) {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
const mapped = normalized.match(/::ffff:(\d+\.\d+\.\d+\.\d+)$/)?.[1];
|
|
51
|
+
return mapped ? isPrivateIpv4(mapped) : false;
|
|
52
|
+
}
|
|
53
|
+
function isPrivateAddress(address) {
|
|
54
|
+
const normalized = normalizeIpAddress(address);
|
|
55
|
+
const family = isIP(normalized);
|
|
56
|
+
if (family === 4)
|
|
57
|
+
return isPrivateIpv4(normalized);
|
|
58
|
+
if (family === 6)
|
|
59
|
+
return isPrivateIpv6(normalized);
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
async function defaultLookup(hostname) {
|
|
63
|
+
return dnsLookup(hostname, { all: true, verbatim: true });
|
|
64
|
+
}
|
|
65
|
+
function validateUrlShape(value) {
|
|
66
|
+
let url;
|
|
67
|
+
try {
|
|
68
|
+
url = new URL(value);
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
throw new Error(`fetch_page requires a valid URL: ${value}`);
|
|
72
|
+
}
|
|
73
|
+
if (!["http:", "https:"].includes(url.protocol)) {
|
|
74
|
+
throw new Error("fetch_page only supports http and https URLs");
|
|
75
|
+
}
|
|
76
|
+
if (url.username || url.password) {
|
|
77
|
+
throw new Error("fetch_page does not allow credentials in URLs");
|
|
78
|
+
}
|
|
79
|
+
const hostname = url.hostname.toLowerCase().replace(/\.$/, "");
|
|
80
|
+
if (hostname === "localhost" ||
|
|
81
|
+
hostname.endsWith(".localhost") ||
|
|
82
|
+
hostname.endsWith(".local") ||
|
|
83
|
+
hostname.endsWith(".internal") ||
|
|
84
|
+
hostname.endsWith(".home.arpa")) {
|
|
85
|
+
throw new Error(`fetch_page blocks private host: ${hostname}`);
|
|
86
|
+
}
|
|
87
|
+
return url;
|
|
88
|
+
}
|
|
89
|
+
async function validateRemoteUrl(value, lookupImpl) {
|
|
90
|
+
const url = validateUrlShape(value);
|
|
91
|
+
const literalFamily = isIP(normalizeIpAddress(url.hostname));
|
|
92
|
+
const addresses = literalFamily
|
|
93
|
+
? [{ address: normalizeIpAddress(url.hostname), family: literalFamily }]
|
|
94
|
+
: await lookupImpl(url.hostname);
|
|
95
|
+
if (!addresses.length) {
|
|
96
|
+
throw new Error(`fetch_page could not resolve host: ${url.hostname}`);
|
|
97
|
+
}
|
|
98
|
+
const blocked = addresses.find((item) => isPrivateAddress(item.address));
|
|
99
|
+
if (blocked) {
|
|
100
|
+
throw new Error(`fetch_page blocks private network address: ${blocked.address}`);
|
|
101
|
+
}
|
|
102
|
+
return url;
|
|
103
|
+
}
|
|
104
|
+
function responseLimit(contentType) {
|
|
105
|
+
const normalized = contentType.toLowerCase();
|
|
106
|
+
return normalized.includes("html") || normalized.startsWith("text/")
|
|
107
|
+
? HTML_LIMIT_BYTES
|
|
108
|
+
: PDF_LIMIT_BYTES;
|
|
109
|
+
}
|
|
110
|
+
async function readLimitedBody(response, limit) {
|
|
111
|
+
const declaredLength = Number(response.headers.get("content-length") || 0);
|
|
112
|
+
if (declaredLength > limit) {
|
|
113
|
+
throw new Error(`fetch_page response exceeds ${limit} bytes`);
|
|
114
|
+
}
|
|
115
|
+
if (!response.body)
|
|
116
|
+
return new Uint8Array();
|
|
117
|
+
const reader = response.body.getReader();
|
|
118
|
+
const chunks = [];
|
|
119
|
+
let total = 0;
|
|
120
|
+
while (true) {
|
|
121
|
+
const { done, value } = await reader.read();
|
|
122
|
+
if (done)
|
|
123
|
+
break;
|
|
124
|
+
total += value.byteLength;
|
|
125
|
+
if (total > limit) {
|
|
126
|
+
await reader.cancel("fetch_page response is too large");
|
|
127
|
+
throw new Error(`fetch_page response exceeds ${limit} bytes`);
|
|
128
|
+
}
|
|
129
|
+
chunks.push(value);
|
|
130
|
+
}
|
|
131
|
+
const joined = new Uint8Array(total);
|
|
132
|
+
let offset = 0;
|
|
133
|
+
for (const chunk of chunks) {
|
|
134
|
+
joined.set(chunk, offset);
|
|
135
|
+
offset += chunk.byteLength;
|
|
136
|
+
}
|
|
137
|
+
return joined;
|
|
138
|
+
}
|
|
139
|
+
function mimeType(contentType) {
|
|
140
|
+
return contentType.split(";")[0]?.trim().toLowerCase() || "";
|
|
141
|
+
}
|
|
142
|
+
function containsPdfMagic(bytes) {
|
|
143
|
+
return Buffer.from(bytes.subarray(0, 1024))
|
|
144
|
+
.toString("latin1")
|
|
145
|
+
.includes("%PDF-");
|
|
146
|
+
}
|
|
147
|
+
function looksLikeHtml(bytes) {
|
|
148
|
+
const prefix = Buffer.from(bytes.subarray(0, 2048))
|
|
149
|
+
.toString("utf8")
|
|
150
|
+
.trimStart()
|
|
151
|
+
.toLowerCase();
|
|
152
|
+
return (prefix.startsWith("<!doctype html") ||
|
|
153
|
+
prefix.startsWith("<html") ||
|
|
154
|
+
prefix.startsWith("<head") ||
|
|
155
|
+
prefix.startsWith("<body") ||
|
|
156
|
+
prefix.startsWith("<main") ||
|
|
157
|
+
prefix.startsWith("<article"));
|
|
158
|
+
}
|
|
159
|
+
function documentKind(contentType, bytes) {
|
|
160
|
+
const type = mimeType(contentType);
|
|
161
|
+
if (type === "application/pdf" || containsPdfMagic(bytes))
|
|
162
|
+
return "pdf";
|
|
163
|
+
if (type === "text/html" ||
|
|
164
|
+
type === "application/xhtml+xml" ||
|
|
165
|
+
looksLikeHtml(bytes)) {
|
|
166
|
+
return "html";
|
|
167
|
+
}
|
|
168
|
+
if (!type ||
|
|
169
|
+
type.startsWith("text/") ||
|
|
170
|
+
type === "application/json" ||
|
|
171
|
+
type.endsWith("+json") ||
|
|
172
|
+
type === "application/xml" ||
|
|
173
|
+
type.endsWith("+xml")) {
|
|
174
|
+
return "text";
|
|
175
|
+
}
|
|
176
|
+
throw new Error(`fetch_page does not support content type: ${type}`);
|
|
177
|
+
}
|
|
178
|
+
function decodeText(bytes, contentType) {
|
|
179
|
+
const charset = contentType.match(/charset\s*=\s*["']?([^;"'\s]+)/i)?.[1];
|
|
180
|
+
try {
|
|
181
|
+
return new TextDecoder(charset || "utf-8").decode(bytes);
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
return new TextDecoder("utf-8").decode(bytes);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
function absolutePageLinks(document, pageUrl) {
|
|
188
|
+
const attributes = [
|
|
189
|
+
["a[href]", "href"],
|
|
190
|
+
["img[src]", "src"],
|
|
191
|
+
["video[src]", "src"],
|
|
192
|
+
["video[poster]", "poster"],
|
|
193
|
+
["audio[src]", "src"],
|
|
194
|
+
["source[src]", "src"],
|
|
195
|
+
];
|
|
196
|
+
for (const [selector, attribute] of attributes) {
|
|
197
|
+
for (const element of document.querySelectorAll(selector)) {
|
|
198
|
+
const value = element.getAttribute(attribute);
|
|
199
|
+
if (!value || value.startsWith("#"))
|
|
200
|
+
continue;
|
|
201
|
+
try {
|
|
202
|
+
const resolved = new URL(value, pageUrl);
|
|
203
|
+
if (["http:", "https:", "mailto:", "tel:"].includes(resolved.protocol)) {
|
|
204
|
+
element.setAttribute(attribute, resolved.href);
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
element.removeAttribute(attribute);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
element.removeAttribute(attribute);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
function normalizeMarkdown(value) {
|
|
217
|
+
return value
|
|
218
|
+
.replace(/\r\n?/g, "\n")
|
|
219
|
+
.replace(/[ \t]+\n/g, "\n")
|
|
220
|
+
.replace(/\n{4,}/g, "\n\n\n")
|
|
221
|
+
.trim();
|
|
222
|
+
}
|
|
223
|
+
async function parseHtml(bytes, contentType, finalUrl) {
|
|
224
|
+
const html = decodeText(bytes, contentType);
|
|
225
|
+
const { document } = parseHTML(html);
|
|
226
|
+
absolutePageLinks(document, finalUrl);
|
|
227
|
+
const result = await Defuddle(document, finalUrl, {
|
|
228
|
+
markdown: true,
|
|
229
|
+
useAsync: false,
|
|
230
|
+
});
|
|
231
|
+
const title = result.title.trim();
|
|
232
|
+
let markdown = normalizeMarkdown(result.content);
|
|
233
|
+
if (!markdown) {
|
|
234
|
+
markdown = normalizeMarkdown(document.body?.textContent || "");
|
|
235
|
+
}
|
|
236
|
+
if (title && !markdown.startsWith(`# ${title}`)) {
|
|
237
|
+
markdown = normalizeMarkdown(`# ${title}\n\n${markdown}`);
|
|
238
|
+
}
|
|
239
|
+
return {
|
|
240
|
+
finalUrl,
|
|
241
|
+
contentType: mimeType(contentType) || "text/html",
|
|
242
|
+
markdown,
|
|
243
|
+
...(title ? { title } : {}),
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
async function parsePdf(bytes, contentType, finalUrl) {
|
|
247
|
+
const result = await extractPdfDocument(bytes);
|
|
248
|
+
return {
|
|
249
|
+
finalUrl,
|
|
250
|
+
contentType: "application/pdf",
|
|
251
|
+
markdown: normalizeMarkdown(result.content),
|
|
252
|
+
totalPages: result.totalPages,
|
|
253
|
+
pagesParsed: result.pagesParsed,
|
|
254
|
+
truncated: result.truncated,
|
|
255
|
+
...(result.warning ? { warning: result.warning } : {}),
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
function safeSliceEnd(value, end) {
|
|
259
|
+
if (end <= 0 || end >= value.length)
|
|
260
|
+
return end;
|
|
261
|
+
const code = value.charCodeAt(end - 1);
|
|
262
|
+
const next = value.charCodeAt(end);
|
|
263
|
+
return code >= 0xd800 &&
|
|
264
|
+
code <= 0xdbff &&
|
|
265
|
+
next >= 0xdc00 &&
|
|
266
|
+
next <= 0xdfff
|
|
267
|
+
? end + 1
|
|
268
|
+
: end;
|
|
269
|
+
}
|
|
270
|
+
function splitMarkdown(value, limit) {
|
|
271
|
+
const markdown = normalizeMarkdown(value);
|
|
272
|
+
if (!markdown)
|
|
273
|
+
return [""];
|
|
274
|
+
const chunks = [];
|
|
275
|
+
let remaining = markdown;
|
|
276
|
+
while (remaining.length > limit) {
|
|
277
|
+
const window = remaining.slice(0, limit + 1);
|
|
278
|
+
const minimumBreak = Math.floor(limit * 0.6);
|
|
279
|
+
let end = window.lastIndexOf("\n\n", limit);
|
|
280
|
+
if (end < minimumBreak)
|
|
281
|
+
end = window.lastIndexOf("\n", limit);
|
|
282
|
+
if (end < minimumBreak)
|
|
283
|
+
end = window.lastIndexOf(" ", limit);
|
|
284
|
+
if (end < minimumBreak)
|
|
285
|
+
end = limit;
|
|
286
|
+
end = safeSliceEnd(remaining, end);
|
|
287
|
+
chunks.push(remaining.slice(0, end).trim());
|
|
288
|
+
remaining = remaining.slice(end).trimStart();
|
|
289
|
+
}
|
|
290
|
+
if (remaining || !chunks.length)
|
|
291
|
+
chunks.push(remaining.trim());
|
|
292
|
+
return chunks;
|
|
293
|
+
}
|
|
294
|
+
export class FetchPageReader {
|
|
295
|
+
fetchImpl;
|
|
296
|
+
lookupImpl;
|
|
297
|
+
chunkSize;
|
|
298
|
+
timeoutMs;
|
|
299
|
+
signal;
|
|
300
|
+
cache = new Map();
|
|
301
|
+
constructor(options = {}) {
|
|
302
|
+
this.fetchImpl = options.fetchImpl || globalThis.fetch;
|
|
303
|
+
this.lookupImpl = options.lookupImpl || defaultLookup;
|
|
304
|
+
this.chunkSize = options.chunkSize || DEFAULT_CHUNK_SIZE;
|
|
305
|
+
this.timeoutMs = options.timeoutMs || DEFAULT_TIMEOUT_MS;
|
|
306
|
+
this.signal = options.signal;
|
|
307
|
+
}
|
|
308
|
+
async read(url, chunkIndex) {
|
|
309
|
+
if (!Number.isSafeInteger(chunkIndex) || chunkIndex < 0) {
|
|
310
|
+
throw new Error("chunkIndex must be a non-negative safe integer");
|
|
311
|
+
}
|
|
312
|
+
const cacheKey = validateUrlShape(url).href;
|
|
313
|
+
let page = this.cache.get(cacheKey);
|
|
314
|
+
if (!page) {
|
|
315
|
+
const parsed = await this.load(cacheKey);
|
|
316
|
+
page = {
|
|
317
|
+
...parsed,
|
|
318
|
+
chunks: splitMarkdown(parsed.markdown, this.chunkSize),
|
|
319
|
+
};
|
|
320
|
+
if (this.cache.size >= MAX_CACHE_ENTRIES) {
|
|
321
|
+
const oldest = this.cache.keys().next().value;
|
|
322
|
+
if (oldest)
|
|
323
|
+
this.cache.delete(oldest);
|
|
324
|
+
}
|
|
325
|
+
this.cache.set(cacheKey, page);
|
|
326
|
+
}
|
|
327
|
+
if (chunkIndex >= page.chunks.length) {
|
|
328
|
+
throw new Error("chunkIndex is past the end of the page");
|
|
329
|
+
}
|
|
330
|
+
const nextChunkIndex = chunkIndex + 1 < page.chunks.length ? chunkIndex + 1 : null;
|
|
331
|
+
return {
|
|
332
|
+
status: "success",
|
|
333
|
+
url,
|
|
334
|
+
finalUrl: page.finalUrl,
|
|
335
|
+
contentType: page.contentType,
|
|
336
|
+
format: "markdown",
|
|
337
|
+
...(page.title ? { title: page.title } : {}),
|
|
338
|
+
...(page.totalPages === undefined
|
|
339
|
+
? {}
|
|
340
|
+
: {
|
|
341
|
+
totalPages: page.totalPages,
|
|
342
|
+
pagesParsed: page.pagesParsed,
|
|
343
|
+
truncated: page.truncated,
|
|
344
|
+
}),
|
|
345
|
+
...(page.warning ? { warning: page.warning } : {}),
|
|
346
|
+
chunkIndex,
|
|
347
|
+
totalChunks: page.chunks.length,
|
|
348
|
+
content: page.chunks[chunkIndex] || "",
|
|
349
|
+
hasMore: nextChunkIndex !== null,
|
|
350
|
+
nextChunkIndex,
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
async load(url) {
|
|
354
|
+
const downloaded = await this.download(url);
|
|
355
|
+
const kind = documentKind(downloaded.contentType, downloaded.bytes);
|
|
356
|
+
if (kind === "html") {
|
|
357
|
+
if (downloaded.bytes.byteLength > HTML_LIMIT_BYTES) {
|
|
358
|
+
throw new Error(`fetch_page HTML response exceeds ${HTML_LIMIT_BYTES} bytes`);
|
|
359
|
+
}
|
|
360
|
+
return parseHtml(downloaded.bytes, downloaded.contentType, downloaded.finalUrl);
|
|
361
|
+
}
|
|
362
|
+
if (kind === "pdf") {
|
|
363
|
+
return parsePdf(downloaded.bytes, downloaded.contentType, downloaded.finalUrl);
|
|
364
|
+
}
|
|
365
|
+
return {
|
|
366
|
+
finalUrl: downloaded.finalUrl,
|
|
367
|
+
contentType: mimeType(downloaded.contentType) || "text/plain",
|
|
368
|
+
markdown: normalizeMarkdown(decodeText(downloaded.bytes, downloaded.contentType)),
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
async download(url) {
|
|
372
|
+
const controller = new AbortController();
|
|
373
|
+
const abort = () => controller.abort(this.signal && abortError(this.signal));
|
|
374
|
+
if (this.signal?.aborted)
|
|
375
|
+
throw abortError(this.signal);
|
|
376
|
+
this.signal?.addEventListener("abort", abort, { once: true });
|
|
377
|
+
const timeout = setTimeout(() => controller.abort(new Error("fetch_page request timed out")), this.timeoutMs);
|
|
378
|
+
let current = url;
|
|
379
|
+
try {
|
|
380
|
+
for (let redirects = 0; redirects <= MAX_REDIRECTS; redirects += 1) {
|
|
381
|
+
const target = await validateRemoteUrl(current, this.lookupImpl);
|
|
382
|
+
const response = await this.fetchImpl(target, {
|
|
383
|
+
method: "GET",
|
|
384
|
+
redirect: "manual",
|
|
385
|
+
headers: {
|
|
386
|
+
accept: "text/html,application/xhtml+xml,application/pdf,text/plain;q=0.9,*/*;q=0.1",
|
|
387
|
+
"user-agent": "arena-codeagent/0.2",
|
|
388
|
+
},
|
|
389
|
+
signal: controller.signal,
|
|
390
|
+
});
|
|
391
|
+
if (REDIRECT_STATUSES.has(response.status)) {
|
|
392
|
+
const location = response.headers.get("location");
|
|
393
|
+
if (!location) {
|
|
394
|
+
throw new Error(`fetch_page redirect ${response.status} has no location`);
|
|
395
|
+
}
|
|
396
|
+
if (redirects === MAX_REDIRECTS) {
|
|
397
|
+
throw new Error(`fetch_page exceeded ${MAX_REDIRECTS} redirects`);
|
|
398
|
+
}
|
|
399
|
+
await response.body?.cancel();
|
|
400
|
+
current = new URL(location, target).href;
|
|
401
|
+
continue;
|
|
402
|
+
}
|
|
403
|
+
if (!response.ok) {
|
|
404
|
+
throw new Error(`fetch_page failed (${response.status} ${response.statusText})`);
|
|
405
|
+
}
|
|
406
|
+
const contentType = response.headers.get("content-type") || "";
|
|
407
|
+
const bytes = await readLimitedBody(response, responseLimit(contentType));
|
|
408
|
+
return {
|
|
409
|
+
bytes,
|
|
410
|
+
contentType,
|
|
411
|
+
finalUrl: target.href,
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
throw new Error(`fetch_page exceeded ${MAX_REDIRECTS} redirects`);
|
|
415
|
+
}
|
|
416
|
+
catch (error) {
|
|
417
|
+
if (controller.signal.aborted) {
|
|
418
|
+
throw abortError(controller.signal);
|
|
419
|
+
}
|
|
420
|
+
throw new Error(errorMessage(error));
|
|
421
|
+
}
|
|
422
|
+
finally {
|
|
423
|
+
clearTimeout(timeout);
|
|
424
|
+
this.signal?.removeEventListener("abort", abort);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
//# sourceMappingURL=fetch-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-page.js","sourceRoot":"","sources":["../src/fetch-page.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Message } from "./types.js";
|
|
2
|
+
export declare function sessionStorageRoot(workspace: string, tenantId: string, sessionId: string): string;
|
|
3
|
+
export declare function storedHistoryPath(workspace: string, tenantId: string, sessionId: string): string;
|
|
4
|
+
export declare function loadStoredHistory(filePath: string): Promise<Message[] | undefined>;
|
|
5
|
+
export declare function saveStoredHistory(filePath: string, messages: readonly Message[]): Promise<void>;
|
package/dist/history.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
export function sessionStorageRoot(workspace, tenantId, sessionId) {
|
|
5
|
+
return path.join(workspace, ".arena", "tenants", tenantId, "sessions", sessionId);
|
|
6
|
+
}
|
|
7
|
+
export function storedHistoryPath(workspace, tenantId, sessionId) {
|
|
8
|
+
return path.join(sessionStorageRoot(workspace, tenantId, sessionId), "history.json");
|
|
9
|
+
}
|
|
10
|
+
export async function loadStoredHistory(filePath) {
|
|
11
|
+
try {
|
|
12
|
+
const stored = JSON.parse(await readFile(filePath, "utf8"));
|
|
13
|
+
const messages = Array.isArray(stored) ? stored : stored.messages;
|
|
14
|
+
if (!Array.isArray(messages)) {
|
|
15
|
+
throw new Error("history file must contain a messages array");
|
|
16
|
+
}
|
|
17
|
+
return messages;
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
if (error.code === "ENOENT")
|
|
21
|
+
return undefined;
|
|
22
|
+
throw error;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export async function saveStoredHistory(filePath, messages) {
|
|
26
|
+
await mkdir(path.dirname(filePath), { recursive: true });
|
|
27
|
+
const temporary = `${filePath}.${crypto.randomUUID()}.tmp`;
|
|
28
|
+
await writeFile(temporary, JSON.stringify({ messages }), "utf8");
|
|
29
|
+
await rename(temporary, filePath);
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,MAAM,UAAU,kBAAkB,CAChC,SAAiB,EACjB,QAAgB,EAChB,SAAiB;IAEjB,OAAO,IAAI,CAAC,IAAI,CACd,SAAS,EACT,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,UAAU,EACV,SAAS,CACV,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,SAAiB,EACjB,QAAgB,EAChB,SAAiB;IAEjB,OAAO,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,cAAc,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAE7C,CAAC;QACd,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;QAClE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QACzE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAgB,EAChB,QAA4B;IAE5B,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,GAAG,QAAQ,IAAI,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC;IAC3D,MAAM,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IACjE,MAAM,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AACpC,CAAC"}
|
package/dist/mock.d.ts
ADDED
package/dist/mock.js
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
function chunk(delta) {
|
|
2
|
+
return { choices: [{ delta }] };
|
|
3
|
+
}
|
|
4
|
+
function toolChunk(callId = "", name = "", argumentsText = "") {
|
|
5
|
+
return chunk({
|
|
6
|
+
tool_calls: [
|
|
7
|
+
{
|
|
8
|
+
index: 0,
|
|
9
|
+
id: callId,
|
|
10
|
+
type: callId ? "function" : "",
|
|
11
|
+
function: { name, arguments: argumentsText },
|
|
12
|
+
},
|
|
13
|
+
],
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
function toolMessages(messages) {
|
|
17
|
+
return messages.filter((message) => message.role === "tool");
|
|
18
|
+
}
|
|
19
|
+
function latestUserText(messages) {
|
|
20
|
+
const message = [...messages].reverse().find((item) => item.role === "user");
|
|
21
|
+
if (!message)
|
|
22
|
+
return "";
|
|
23
|
+
if (typeof message.content === "string")
|
|
24
|
+
return message.content;
|
|
25
|
+
return message.content
|
|
26
|
+
.filter((part) => "text" in part)
|
|
27
|
+
.map((part) => part.text)
|
|
28
|
+
.join("\n");
|
|
29
|
+
}
|
|
30
|
+
async function waitForAbort(signal) {
|
|
31
|
+
if (!signal)
|
|
32
|
+
throw new Error("mock/interruption requires an abort signal");
|
|
33
|
+
if (signal.aborted) {
|
|
34
|
+
throw signal.reason || new Error("operation cancelled");
|
|
35
|
+
}
|
|
36
|
+
return new Promise((_resolve, reject) => {
|
|
37
|
+
signal.addEventListener("abort", () => reject(signal.reason || new Error("operation cancelled")), { once: true });
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
export class MockModelClient {
|
|
41
|
+
async *stream(request) {
|
|
42
|
+
const results = toolMessages(request.messages);
|
|
43
|
+
if (request.model === "mock/present-file") {
|
|
44
|
+
if (results.length === 0) {
|
|
45
|
+
yield toolChunk("call_mock_write", "write_file", JSON.stringify({
|
|
46
|
+
path: "hello.html",
|
|
47
|
+
content: "<!doctype html><html><head><title>Presented file</title>" +
|
|
48
|
+
"<style>body{font-family:system-ui;padding:40px}</style>" +
|
|
49
|
+
"</head><body><h1>Presented file</h1></body></html>",
|
|
50
|
+
}));
|
|
51
|
+
}
|
|
52
|
+
else if (results.length === 1) {
|
|
53
|
+
yield toolChunk("call_mock_present", "present_file", '{"path":"hello.html"}');
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
yield chunk({ content: "Created and presented `hello.html`." });
|
|
57
|
+
}
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
if (request.model === "mock/ask-user") {
|
|
61
|
+
if (results.length === 0) {
|
|
62
|
+
const questions = [
|
|
63
|
+
{
|
|
64
|
+
id: "style",
|
|
65
|
+
question: "Which visual style should I use?",
|
|
66
|
+
options: [
|
|
67
|
+
{
|
|
68
|
+
id: "minimal",
|
|
69
|
+
label: "Minimal",
|
|
70
|
+
description: "Quiet and spacious.",
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
id: "bold",
|
|
74
|
+
label: "Bold",
|
|
75
|
+
description: "Vivid and expressive.",
|
|
76
|
+
},
|
|
77
|
+
],
|
|
78
|
+
allowCustomResponse: true,
|
|
79
|
+
},
|
|
80
|
+
];
|
|
81
|
+
yield chunk({
|
|
82
|
+
reasoning_content: "I need one design choice before continuing.",
|
|
83
|
+
});
|
|
84
|
+
yield toolChunk("call_mock_ask", "ask_user", JSON.stringify({ questions }));
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
const result = JSON.parse(results.at(-1)?.content || "{}");
|
|
88
|
+
yield chunk({
|
|
89
|
+
content: `Continuing with the ${result.answers?.[0]?.answer || "selected"} style.`,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (request.model === "mock/image-search") {
|
|
95
|
+
if (results.length === 0) {
|
|
96
|
+
yield toolChunk("call_mock_image_search", "image_search", '{"query":"two sample images","count":2}');
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
yield chunk({ content: "The image search results are ready." });
|
|
100
|
+
}
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (request.model === "mock/interruption") {
|
|
104
|
+
if (latestUserText(request.messages).includes("The previous assistant response was stopped by the user")) {
|
|
105
|
+
yield chunk({ content: "Continued after the interruption notice." });
|
|
106
|
+
}
|
|
107
|
+
else if (results.length === 0) {
|
|
108
|
+
yield toolChunk("call_mock_interruption_write", "write_file", '{"path":"before-cancel.txt","content":"completed before cancellation"}');
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
yield chunk({ content: "Partial assistant response before cancellation." });
|
|
112
|
+
await waitForAbort(request.signal);
|
|
113
|
+
}
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (request.model === "mock/checkpoint-timeout") {
|
|
117
|
+
if (results.length === 0) {
|
|
118
|
+
yield toolChunk("call_mock_checkpoint_write", "write_file", '{"path":"before-timeout.txt","content":"completed before timeout"}');
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
await new Promise((resolve) => setTimeout(resolve, 60_000));
|
|
122
|
+
}
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
if (results.length === 0) {
|
|
126
|
+
const html = '<!doctype html>\n<html lang="en">\n<head>\n' +
|
|
127
|
+
' <meta charset="utf-8">\n' +
|
|
128
|
+
' <meta name="viewport" content="width=device-width, initial-scale=1">\n' +
|
|
129
|
+
" <title>Hello</title>\n" +
|
|
130
|
+
" <style>body{font-family:system-ui;display:grid;place-items:center;" +
|
|
131
|
+
"min-height:100vh;margin:0;background:#f6f8ff;color:#17203a}" +
|
|
132
|
+
"main{text-align:center}h1{font-size:clamp(3rem,10vw,7rem);margin:0}" +
|
|
133
|
+
"</style>\n</head>\n<body><main><h1>Hello.</h1>" +
|
|
134
|
+
"<p>Your landing page is ready.</p></main></body>\n</html>\n";
|
|
135
|
+
const argumentsText = JSON.stringify({ path: "hello.html", content: html });
|
|
136
|
+
yield chunk({
|
|
137
|
+
reasoning_content: "I will create the requested landing page.",
|
|
138
|
+
});
|
|
139
|
+
const split = Math.floor(argumentsText.length / 2);
|
|
140
|
+
yield toolChunk("call_mock_write", "write_file", argumentsText.slice(0, split));
|
|
141
|
+
yield toolChunk("", "", argumentsText.slice(split));
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
yield chunk({
|
|
145
|
+
reasoning_content: "The file write completed successfully.",
|
|
146
|
+
});
|
|
147
|
+
yield chunk({ content: "Created `hello.html`." });
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=mock.js.map
|
package/dist/mock.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock.js","sourceRoot":"","sources":["../src/mock.ts"],"names":[],"mappings":"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"}
|