@robzilla1738/agentswarm 0.2.0
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/LICENSE +21 -0
- package/README.md +142 -0
- package/bin/swarm.js +10 -0
- package/dist/agent.js +211 -0
- package/dist/cli.js +667 -0
- package/dist/config.js +289 -0
- package/dist/control.js +96 -0
- package/dist/deepseek.js +321 -0
- package/dist/executor.js +988 -0
- package/dist/hub.js +553 -0
- package/dist/journal.js +152 -0
- package/dist/prompts.js +232 -0
- package/dist/providers.js +151 -0
- package/dist/run.js +309 -0
- package/dist/sandbox.js +505 -0
- package/dist/state.js +230 -0
- package/dist/terminal.js +298 -0
- package/dist/tools.js +491 -0
- package/dist/types.js +26 -0
- package/dist/util.js +209 -0
- package/dist/webtools.js +205 -0
- package/package.json +63 -0
- package/ui/out/404/index.html +1 -0
- package/ui/out/404.html +1 -0
- package/ui/out/_next/static/chunks/255-2aa030c9ba2867e3.js +1 -0
- package/ui/out/_next/static/chunks/383-289a866b246b41cc.js +1 -0
- package/ui/out/_next/static/chunks/4bd1b696-c023c6e3521b1417.js +1 -0
- package/ui/out/_next/static/chunks/619-ba102abea3e3d0e4.js +1 -0
- package/ui/out/_next/static/chunks/677-b37981ba0eca75b2.js +1 -0
- package/ui/out/_next/static/chunks/app/_not-found/page-2d0982e372f7be41.js +1 -0
- package/ui/out/_next/static/chunks/app/layout-37ad32c5fdb26f29.js +1 -0
- package/ui/out/_next/static/chunks/app/page-0c9f35bd4aa8e370.js +1 -0
- package/ui/out/_next/static/chunks/app/run/page-13dc41a57e34da71.js +1 -0
- package/ui/out/_next/static/chunks/app/settings/page-a1763be7f6de888c.js +1 -0
- package/ui/out/_next/static/chunks/framework-2c534e0e662575a2.js +1 -0
- package/ui/out/_next/static/chunks/main-app-889ed884f8bc78e3.js +1 -0
- package/ui/out/_next/static/chunks/main-eb90ae3b35d2fd16.js +1 -0
- package/ui/out/_next/static/chunks/pages/_app-7d307437aca18ad4.js +1 -0
- package/ui/out/_next/static/chunks/pages/_error-cb2a52f75f2162e2.js +1 -0
- package/ui/out/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/ui/out/_next/static/chunks/webpack-38639c05c96dbeca.js +1 -0
- package/ui/out/_next/static/css/82edaa7a5942f894.css +3 -0
- package/ui/out/_next/static/eiQeDU9uBHNsBj0CFkp8M/_buildManifest.js +1 -0
- package/ui/out/_next/static/eiQeDU9uBHNsBj0CFkp8M/_ssgManifest.js +1 -0
- package/ui/out/_next/static/media/0aa834ed78bf6d07-s.woff2 +0 -0
- package/ui/out/_next/static/media/438aa629764e75f3-s.woff2 +0 -0
- package/ui/out/_next/static/media/4c9affa5bc8f420e-s.p.woff2 +0 -0
- package/ui/out/_next/static/media/51251f8b9793cdb3-s.woff2 +0 -0
- package/ui/out/_next/static/media/67957d42bae0796d-s.woff2 +0 -0
- package/ui/out/_next/static/media/875ae681bfde4580-s.woff2 +0 -0
- package/ui/out/_next/static/media/886030b0b59bc5a7-s.woff2 +0 -0
- package/ui/out/_next/static/media/939c4f875ee75fbb-s.woff2 +0 -0
- package/ui/out/_next/static/media/bb3ef058b751a6ad-s.p.woff2 +0 -0
- package/ui/out/_next/static/media/cc978ac5ee68c2b6-s.woff2 +0 -0
- package/ui/out/_next/static/media/e857b654a2caa584-s.woff2 +0 -0
- package/ui/out/_next/static/media/f911b923c6adde36-s.woff2 +0 -0
- package/ui/out/icon.png +0 -0
- package/ui/out/index.html +1 -0
- package/ui/out/index.txt +22 -0
- package/ui/out/run/index.html +1 -0
- package/ui/out/run/index.txt +22 -0
- package/ui/out/settings/index.html +1 -0
- package/ui/out/settings/index.txt +22 -0
- package/ui/out/swarm-mark.png +0 -0
package/dist/util.js
ADDED
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.ansi = exports.sleep = void 0;
|
|
37
|
+
exports.rid = rid;
|
|
38
|
+
exports.truncateMiddle = truncateMiddle;
|
|
39
|
+
exports.clip = clip;
|
|
40
|
+
exports.oneLine = oneLine;
|
|
41
|
+
exports.estTokens = estTokens;
|
|
42
|
+
exports.errMsg = errMsg;
|
|
43
|
+
exports.safeJson = safeJson;
|
|
44
|
+
exports.fmtTokens = fmtTokens;
|
|
45
|
+
exports.fmtMoney = fmtMoney;
|
|
46
|
+
exports.fmtDur = fmtDur;
|
|
47
|
+
exports.ensureDir = ensureDir;
|
|
48
|
+
exports.readJson = readJson;
|
|
49
|
+
exports.writeJson = writeJson;
|
|
50
|
+
exports.pathInside = pathInside;
|
|
51
|
+
exports.decodeEntities = decodeEntities;
|
|
52
|
+
exports.htmlToText = htmlToText;
|
|
53
|
+
const fs = __importStar(require("fs"));
|
|
54
|
+
const path = __importStar(require("path"));
|
|
55
|
+
// ---------- ids / time ----------
|
|
56
|
+
let ridCounter = 0;
|
|
57
|
+
function rid(prefix) {
|
|
58
|
+
ridCounter = (ridCounter + 1) % 1296;
|
|
59
|
+
const t = Date.now().toString(36);
|
|
60
|
+
const r = Math.floor(Math.random() * 1296).toString(36).padStart(2, "0");
|
|
61
|
+
const c = ridCounter.toString(36).padStart(2, "0");
|
|
62
|
+
return `${prefix}_${t}${r}${c}`;
|
|
63
|
+
}
|
|
64
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
65
|
+
exports.sleep = sleep;
|
|
66
|
+
// ---------- strings ----------
|
|
67
|
+
function truncateMiddle(s, max, label = "bytes") {
|
|
68
|
+
if (s.length <= max)
|
|
69
|
+
return s;
|
|
70
|
+
const head = Math.floor(max * 0.6);
|
|
71
|
+
const tail = max - head;
|
|
72
|
+
return (s.slice(0, head) +
|
|
73
|
+
`\n…[truncated ${s.length - max} ${label}]…\n` +
|
|
74
|
+
s.slice(s.length - tail));
|
|
75
|
+
}
|
|
76
|
+
function clip(s, max) {
|
|
77
|
+
if (s.length <= max)
|
|
78
|
+
return s;
|
|
79
|
+
return s.slice(0, Math.max(0, max - 1)) + "…";
|
|
80
|
+
}
|
|
81
|
+
function oneLine(s, max = 140) {
|
|
82
|
+
return clip(s.replace(/\s+/g, " ").trim(), max);
|
|
83
|
+
}
|
|
84
|
+
/** Rough token estimate — good enough for budgets and compaction triggers. */
|
|
85
|
+
function estTokens(s) {
|
|
86
|
+
return Math.ceil(s.length / 3.5);
|
|
87
|
+
}
|
|
88
|
+
function errMsg(e) {
|
|
89
|
+
if (e instanceof Error)
|
|
90
|
+
return e.message;
|
|
91
|
+
return String(e);
|
|
92
|
+
}
|
|
93
|
+
function safeJson(s) {
|
|
94
|
+
try {
|
|
95
|
+
return JSON.parse(s);
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// ---------- formatting ----------
|
|
102
|
+
function fmtTokens(n) {
|
|
103
|
+
if (n >= 1e9)
|
|
104
|
+
return (n / 1e9).toFixed(2) + "B";
|
|
105
|
+
if (n >= 1e6)
|
|
106
|
+
return (n / 1e6).toFixed(2) + "M";
|
|
107
|
+
if (n >= 1e3)
|
|
108
|
+
return (n / 1e3).toFixed(1) + "K";
|
|
109
|
+
return String(n);
|
|
110
|
+
}
|
|
111
|
+
function fmtMoney(n) {
|
|
112
|
+
if (n === 0)
|
|
113
|
+
return "$0.00";
|
|
114
|
+
if (n < 0.01)
|
|
115
|
+
return "<$0.01";
|
|
116
|
+
return "$" + n.toFixed(2);
|
|
117
|
+
}
|
|
118
|
+
function fmtDur(ms) {
|
|
119
|
+
const s = Math.max(0, Math.round(ms / 1000));
|
|
120
|
+
if (s < 60)
|
|
121
|
+
return `${s}s`;
|
|
122
|
+
const m = Math.floor(s / 60);
|
|
123
|
+
if (m < 60)
|
|
124
|
+
return `${m}m${s % 60 ? ` ${s % 60}s` : ""}`;
|
|
125
|
+
const h = Math.floor(m / 60);
|
|
126
|
+
return `${h}h${m % 60 ? ` ${m % 60}m` : ""}`;
|
|
127
|
+
}
|
|
128
|
+
// ---------- fs ----------
|
|
129
|
+
function ensureDir(p) {
|
|
130
|
+
fs.mkdirSync(p, { recursive: true });
|
|
131
|
+
}
|
|
132
|
+
function readJson(file, fallback) {
|
|
133
|
+
try {
|
|
134
|
+
return JSON.parse(fs.readFileSync(file, "utf8"));
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return fallback;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
function writeJson(file, value, mode) {
|
|
141
|
+
ensureDir(path.dirname(file));
|
|
142
|
+
const tmp = file + ".tmp" + process.pid;
|
|
143
|
+
fs.writeFileSync(tmp, JSON.stringify(value, null, 2), mode ? { mode } : undefined);
|
|
144
|
+
fs.renameSync(tmp, file);
|
|
145
|
+
}
|
|
146
|
+
function pathInside(parent, child) {
|
|
147
|
+
const rel = path.relative(path.resolve(parent), path.resolve(child));
|
|
148
|
+
return rel === "" || (!rel.startsWith("..") && !path.isAbsolute(rel));
|
|
149
|
+
}
|
|
150
|
+
// ---------- html ----------
|
|
151
|
+
const ENTITIES = {
|
|
152
|
+
amp: "&", lt: "<", gt: ">", quot: '"', apos: "'", nbsp: " ",
|
|
153
|
+
mdash: "—", ndash: "–", hellip: "…", rsquo: "'", lsquo: "'",
|
|
154
|
+
rdquo: '"', ldquo: '"', copy: "©", trade: "™", reg: "®",
|
|
155
|
+
};
|
|
156
|
+
function decodeEntities(s) {
|
|
157
|
+
return s
|
|
158
|
+
.replace(/&#x([0-9a-f]+);/gi, (_, h) => {
|
|
159
|
+
try {
|
|
160
|
+
return String.fromCodePoint(parseInt(h, 16));
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
return "";
|
|
164
|
+
}
|
|
165
|
+
})
|
|
166
|
+
.replace(/&#(\d+);/g, (_, d) => {
|
|
167
|
+
try {
|
|
168
|
+
return String.fromCodePoint(parseInt(d, 10));
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
return "";
|
|
172
|
+
}
|
|
173
|
+
})
|
|
174
|
+
.replace(/&([a-z]+);/gi, (m, name) => ENTITIES[name.toLowerCase()] ?? m);
|
|
175
|
+
}
|
|
176
|
+
/** Crude but effective HTML → readable text. */
|
|
177
|
+
function htmlToText(html) {
|
|
178
|
+
let s = html;
|
|
179
|
+
s = s.replace(/<script[\s\S]*?<\/script>/gi, " ");
|
|
180
|
+
s = s.replace(/<style[\s\S]*?<\/style>/gi, " ");
|
|
181
|
+
s = s.replace(/<!--[\s\S]*?-->/g, " ");
|
|
182
|
+
s = s.replace(/<\/(p|div|section|article|li|tr|h[1-6]|blockquote|pre)>/gi, "\n");
|
|
183
|
+
s = s.replace(/<(br|hr)\s*\/?>/gi, "\n");
|
|
184
|
+
s = s.replace(/<li[^>]*>/gi, "\n- ");
|
|
185
|
+
s = s.replace(/<[^>]+>/g, " ");
|
|
186
|
+
s = decodeEntities(s);
|
|
187
|
+
s = s.replace(/[ \t]+/g, " ");
|
|
188
|
+
s = s.replace(/\n[ \t]+/g, "\n");
|
|
189
|
+
s = s.replace(/\n{3,}/g, "\n\n");
|
|
190
|
+
return s.trim();
|
|
191
|
+
}
|
|
192
|
+
// ---------- ansi ----------
|
|
193
|
+
const useColor = process.stdout.isTTY && !process.env.NO_COLOR && process.env.TERM !== "dumb";
|
|
194
|
+
function wrap(code, close = "\x1b[0m") {
|
|
195
|
+
return (s) => (useColor ? `\x1b[${code}m${s}${close}` : s);
|
|
196
|
+
}
|
|
197
|
+
exports.ansi = {
|
|
198
|
+
bold: wrap("1"),
|
|
199
|
+
dim: wrap("2"),
|
|
200
|
+
italic: wrap("3"),
|
|
201
|
+
red: wrap("31"),
|
|
202
|
+
green: wrap("32"),
|
|
203
|
+
yellow: wrap("33"),
|
|
204
|
+
blue: wrap("34"),
|
|
205
|
+
magenta: wrap("35"),
|
|
206
|
+
cyan: wrap("36"),
|
|
207
|
+
gray: wrap("90"),
|
|
208
|
+
white: wrap("97"),
|
|
209
|
+
};
|
package/dist/webtools.js
ADDED
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.webSearch = webSearch;
|
|
4
|
+
exports.fetchUrl = fetchUrl;
|
|
5
|
+
const child_process_1 = require("child_process");
|
|
6
|
+
const util_1 = require("./util");
|
|
7
|
+
const UA = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0 Safari/537.36 agentswarm/0.1";
|
|
8
|
+
/**
|
|
9
|
+
* Web search backends, best first:
|
|
10
|
+
* 1. SearchKit CLI (local, multi-engine, ranked + citable; `deep` fetches
|
|
11
|
+
* pages and returns quotable passages) — when installed.
|
|
12
|
+
* 2. TinyFish Search (fast, structured) — when a key is configured.
|
|
13
|
+
* 3. DuckDuckGo HTML scraping — always available, last resort.
|
|
14
|
+
*/
|
|
15
|
+
async function webSearch(cfg, query, count, signal, deep = false, warn) {
|
|
16
|
+
if (cfg.searchBackend === "auto" && searchkitOk !== false) {
|
|
17
|
+
try {
|
|
18
|
+
const hits = await searchkitSearch(cfg, query, count, deep, signal);
|
|
19
|
+
searchkitOk = true;
|
|
20
|
+
if (hits.length)
|
|
21
|
+
return hits;
|
|
22
|
+
}
|
|
23
|
+
catch (e) {
|
|
24
|
+
// Not installed → stop probing for the rest of this process.
|
|
25
|
+
if (e?.code === "ENOENT")
|
|
26
|
+
searchkitOk = false;
|
|
27
|
+
else if (!searchkitWarned) {
|
|
28
|
+
// Installed but failing — say so once instead of silently degrading.
|
|
29
|
+
searchkitWarned = true;
|
|
30
|
+
warn?.(`searchkit failed (${(0, util_1.errMsg)(e)}); falling back to ${cfg.tinyfishApiKey ? "TinyFish" : "DuckDuckGo"}. ` +
|
|
31
|
+
`Set searchBackend=ddg to skip searchkit.`);
|
|
32
|
+
}
|
|
33
|
+
/* fall through */
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (cfg.searchBackend !== "ddg" && cfg.tinyfishApiKey) {
|
|
37
|
+
try {
|
|
38
|
+
return await tinyfishSearch(cfg, query, count, signal);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
/* fall through to DDG */
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return ddgSearch(query, count, signal);
|
|
45
|
+
}
|
|
46
|
+
// ---------------------------------------------------------------- searchkit
|
|
47
|
+
let searchkitOk = null;
|
|
48
|
+
let searchkitWarned = false;
|
|
49
|
+
function runCli(cmd, args, timeoutMs, signal) {
|
|
50
|
+
return new Promise((resolve, reject) => {
|
|
51
|
+
(0, child_process_1.execFile)(cmd, args, { timeout: timeoutMs, maxBuffer: 8 * 1024 * 1024, signal }, (err, stdout) => (err ? reject(err) : resolve(stdout)));
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
async function searchkitSearch(cfg, query, count, deep, signal) {
|
|
55
|
+
const args = ["search", query, "--json", "--max-results", String(count)];
|
|
56
|
+
if (!deep)
|
|
57
|
+
args.push("--no-fetch");
|
|
58
|
+
const out = await runCli(cfg.searchkitCmd, args, deep ? 90_000 : 30_000, signal);
|
|
59
|
+
const start = out.indexOf("{");
|
|
60
|
+
if (start < 0)
|
|
61
|
+
throw new Error("searchkit: no JSON in output");
|
|
62
|
+
const data = JSON.parse(out.slice(start));
|
|
63
|
+
return (data.results || []).slice(0, count).map((r) => ({
|
|
64
|
+
title: r.title || r.url,
|
|
65
|
+
url: r.url,
|
|
66
|
+
snippet: r.snippet || "",
|
|
67
|
+
date: r.published_date || undefined,
|
|
68
|
+
passages: Array.isArray(r.passages)
|
|
69
|
+
? r.passages.slice(0, 2).map((p) => String(p.text || "")).filter(Boolean)
|
|
70
|
+
: undefined,
|
|
71
|
+
}));
|
|
72
|
+
}
|
|
73
|
+
async function tinyfishSearch(cfg, query, count, signal) {
|
|
74
|
+
const url = `https://api.search.tinyfish.ai?query=${encodeURIComponent(query)}`;
|
|
75
|
+
const res = await fetch(url, {
|
|
76
|
+
headers: { "X-API-Key": cfg.tinyfishApiKey },
|
|
77
|
+
signal: signal ?? AbortSignal.timeout(20000),
|
|
78
|
+
});
|
|
79
|
+
if (!res.ok)
|
|
80
|
+
throw new Error(`tinyfish search ${res.status}`);
|
|
81
|
+
const data = await res.json();
|
|
82
|
+
return (data.results || []).slice(0, count).map((r) => ({
|
|
83
|
+
title: r.title || r.site_name || r.url,
|
|
84
|
+
url: r.url,
|
|
85
|
+
snippet: r.snippet || "",
|
|
86
|
+
}));
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* DuckDuckGo serves two scrape-friendly endpoints with different markup.
|
|
90
|
+
* A parse miss on one falls through to the other, so a DDG layout change has
|
|
91
|
+
* to break both before search goes dark. Link regexes tolerate either quote
|
|
92
|
+
* style and either attribute order (groups 1+2 or 3+4).
|
|
93
|
+
*/
|
|
94
|
+
const DDG_ENDPOINTS = [
|
|
95
|
+
{
|
|
96
|
+
url: "https://html.duckduckgo.com/html/?q=",
|
|
97
|
+
linkRe: () => /<a[^>]+class=['"]result__a['"][^>]+href=['"]([^'"]+)['"][^>]*>([\s\S]*?)<\/a>|<a[^>]+href=['"]([^'"]+)['"][^>]+class=['"]result__a['"][^>]*>([\s\S]*?)<\/a>/g,
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
url: "https://lite.duckduckgo.com/lite/?q=",
|
|
101
|
+
linkRe: () => /<a[^>]+class=['"]result-link['"][^>]+href=['"]([^'"]+)['"][^>]*>([\s\S]*?)<\/a>|<a[^>]+href=['"]([^'"]+)['"][^>]+class=['"]result-link['"][^>]*>([\s\S]*?)<\/a>/g,
|
|
102
|
+
},
|
|
103
|
+
];
|
|
104
|
+
async function ddgSearch(query, count, signal) {
|
|
105
|
+
let firstErr = null;
|
|
106
|
+
let reachedAny = false;
|
|
107
|
+
for (const ep of DDG_ENDPOINTS) {
|
|
108
|
+
try {
|
|
109
|
+
const res = await fetch(ep.url + encodeURIComponent(query), {
|
|
110
|
+
headers: { "user-agent": UA },
|
|
111
|
+
signal: signal ?? AbortSignal.timeout(20000),
|
|
112
|
+
});
|
|
113
|
+
if (!res.ok)
|
|
114
|
+
throw new Error(`search failed: HTTP ${res.status}`);
|
|
115
|
+
reachedAny = true;
|
|
116
|
+
const hits = parseDdgHtml(await res.text(), count, ep.linkRe());
|
|
117
|
+
if (hits.length)
|
|
118
|
+
return hits;
|
|
119
|
+
}
|
|
120
|
+
catch (e) {
|
|
121
|
+
firstErr = firstErr ?? e;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Only fail when no endpoint even answered; an endpoint that answered with
|
|
125
|
+
// zero parsed results is a genuine "no results".
|
|
126
|
+
if (!reachedAny && firstErr)
|
|
127
|
+
throw firstErr;
|
|
128
|
+
return [];
|
|
129
|
+
}
|
|
130
|
+
function parseDdgHtml(html, count, linkRe) {
|
|
131
|
+
const hits = [];
|
|
132
|
+
const snippetRe = /<a[^>]+class=['"]result__snippet['"][^>]*>([\s\S]*?)<\/a>|<td[^>]+class=['"]result-snippet['"][^>]*>([\s\S]*?)<\/td>/g;
|
|
133
|
+
const snippets = [];
|
|
134
|
+
let sm;
|
|
135
|
+
while ((sm = snippetRe.exec(html)))
|
|
136
|
+
snippets.push(strip(sm[1] || sm[2] || ""));
|
|
137
|
+
let m;
|
|
138
|
+
while ((m = linkRe.exec(html)) && hits.length < count) {
|
|
139
|
+
let url = m[1] ?? m[3] ?? "";
|
|
140
|
+
const title = strip(m[2] ?? m[4] ?? "");
|
|
141
|
+
const uddg = /[?&]uddg=([^&]+)/.exec(url);
|
|
142
|
+
if (uddg)
|
|
143
|
+
url = decodeURIComponent(uddg[1]);
|
|
144
|
+
if (url.startsWith("//"))
|
|
145
|
+
url = "https:" + url;
|
|
146
|
+
if (!/^https?:\/\//.test(url))
|
|
147
|
+
continue;
|
|
148
|
+
if (url.includes("duckduckgo.com/y.js"))
|
|
149
|
+
continue; // ads
|
|
150
|
+
hits.push({ title, url, snippet: snippets[hits.length] || "" });
|
|
151
|
+
}
|
|
152
|
+
return hits;
|
|
153
|
+
}
|
|
154
|
+
function strip(html) {
|
|
155
|
+
return (0, util_1.decodeEntities)(html.replace(/<[^>]+>/g, "")).replace(/\s+/g, " ").trim();
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Fetch a URL as readable text. Uses TinyFish Fetch (real browser, clean
|
|
159
|
+
* markdown) when a key is configured; falls back to a direct request with
|
|
160
|
+
* HTML→text extraction.
|
|
161
|
+
*/
|
|
162
|
+
async function fetchUrl(cfg, url, raw, maxChars, signal) {
|
|
163
|
+
if (cfg.tinyfishApiKey && !raw) {
|
|
164
|
+
try {
|
|
165
|
+
const text = await tinyfishFetch(cfg, url, signal);
|
|
166
|
+
if (text)
|
|
167
|
+
return (0, util_1.truncateMiddle)(text, maxChars, "chars");
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
/* fall through to direct */
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
const res = await fetch(url, {
|
|
174
|
+
headers: { "user-agent": UA, accept: "text/html,application/json,text/*;q=0.9,*/*;q=0.5" },
|
|
175
|
+
signal: signal ?? AbortSignal.timeout(25000),
|
|
176
|
+
redirect: "follow",
|
|
177
|
+
});
|
|
178
|
+
const ctype = res.headers.get("content-type") || "";
|
|
179
|
+
const body = await res.text();
|
|
180
|
+
if (!res.ok) {
|
|
181
|
+
return `HTTP ${res.status} ${res.statusText}\n${(0, util_1.truncateMiddle)(body, 2000, "chars")}`;
|
|
182
|
+
}
|
|
183
|
+
const text = !raw && /html/i.test(ctype) ? (0, util_1.htmlToText)(body) : body;
|
|
184
|
+
return (0, util_1.truncateMiddle)(text, maxChars, "chars");
|
|
185
|
+
}
|
|
186
|
+
async function tinyfishFetch(cfg, url, signal) {
|
|
187
|
+
const res = await fetch("https://api.fetch.tinyfish.ai", {
|
|
188
|
+
method: "POST",
|
|
189
|
+
headers: {
|
|
190
|
+
"X-API-Key": cfg.tinyfishApiKey,
|
|
191
|
+
"content-type": "application/json",
|
|
192
|
+
},
|
|
193
|
+
body: JSON.stringify({ urls: [url], format: "markdown" }),
|
|
194
|
+
signal: signal ?? AbortSignal.timeout(30000),
|
|
195
|
+
});
|
|
196
|
+
if (!res.ok)
|
|
197
|
+
throw new Error(`tinyfish fetch ${res.status}`);
|
|
198
|
+
const data = await res.json();
|
|
199
|
+
const hit = data.results?.[0];
|
|
200
|
+
if (!hit)
|
|
201
|
+
throw new Error(data.errors?.[0]?.error || "no result");
|
|
202
|
+
const text = typeof hit.text === "string" ? hit.text : JSON.stringify(hit.text);
|
|
203
|
+
const title = hit.title ? `# ${hit.title}\n\n` : "";
|
|
204
|
+
return title + text;
|
|
205
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@robzilla1738/agentswarm",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"publishConfig": {
|
|
5
|
+
"access": "public"
|
|
6
|
+
},
|
|
7
|
+
"description": "Local agent swarm: a conductor model splits missions into parallel sub-agents with real tools, optional sandboxes, and a localhost web UI. Works with DeepSeek, OpenAI, Anthropic, Grok, MiniMax, OpenRouter, Ollama, and LM Studio.",
|
|
8
|
+
"license": "MIT",
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/robzilla1738/agentswarm.git"
|
|
12
|
+
},
|
|
13
|
+
"homepage": "https://github.com/robzilla1738/agentswarm#readme",
|
|
14
|
+
"bugs": {
|
|
15
|
+
"url": "https://github.com/robzilla1738/agentswarm/issues"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"agents",
|
|
19
|
+
"agent-swarm",
|
|
20
|
+
"orchestrator",
|
|
21
|
+
"llm",
|
|
22
|
+
"autonomous",
|
|
23
|
+
"long-horizon",
|
|
24
|
+
"sandbox",
|
|
25
|
+
"deepseek",
|
|
26
|
+
"openai",
|
|
27
|
+
"anthropic",
|
|
28
|
+
"ollama"
|
|
29
|
+
],
|
|
30
|
+
"bin": {
|
|
31
|
+
"swarm": "bin/swarm.js"
|
|
32
|
+
},
|
|
33
|
+
"main": "dist/cli.js",
|
|
34
|
+
"files": [
|
|
35
|
+
"dist",
|
|
36
|
+
"bin",
|
|
37
|
+
"ui/out"
|
|
38
|
+
],
|
|
39
|
+
"scripts": {
|
|
40
|
+
"build": "tsc -p tsconfig.json",
|
|
41
|
+
"prepare": "npm run build",
|
|
42
|
+
"prepublishOnly": "npm run build:all && node test/e2e.js",
|
|
43
|
+
"build:ui": "npm --prefix ui run build",
|
|
44
|
+
"build:all": "npm run build && npm --prefix ui install --no-fund --no-audit && npm run build:ui",
|
|
45
|
+
"setup": "npm install --no-fund --no-audit && npm run build:all",
|
|
46
|
+
"dev:ui": "npm --prefix ui run dev",
|
|
47
|
+
"serve": "node bin/swarm.js serve",
|
|
48
|
+
"demo": "node bin/swarm.js demo",
|
|
49
|
+
"test": "node test/e2e.js"
|
|
50
|
+
},
|
|
51
|
+
"engines": {
|
|
52
|
+
"node": ">=20.10"
|
|
53
|
+
},
|
|
54
|
+
"optionalDependencies": {
|
|
55
|
+
"@vercel/sandbox": "^2.2.0",
|
|
56
|
+
"e2b": "^2.28.0",
|
|
57
|
+
"modal": "^0.7.0"
|
|
58
|
+
},
|
|
59
|
+
"devDependencies": {
|
|
60
|
+
"@types/node": "^22.0.0",
|
|
61
|
+
"typescript": "^5.6.0"
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<!DOCTYPE html><!--eiQeDU9uBHNsBj0CFkp8M--><html lang="en" class="__variable_73ee6c __variable_3c557b"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/4c9affa5bc8f420e-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/bb3ef058b751a6ad-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/82edaa7a5942f894.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-38639c05c96dbeca.js"/><script src="/_next/static/chunks/4bd1b696-c023c6e3521b1417.js" async=""></script><script src="/_next/static/chunks/255-2aa030c9ba2867e3.js" async=""></script><script src="/_next/static/chunks/main-app-889ed884f8bc78e3.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><meta name="theme-color" content="#050505"/><title>agentswarm</title><meta name="description" content="A local agent swarm for long-horizon, autonomous work."/><link rel="icon" href="/icon.png?bdc9175d46e1d0aa" type="image/png" sizes="256x256"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-38639c05c96dbeca.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[9766,[],\"\"]\n3:I[8924,[],\"\"]\n4:I[4431,[],\"OutletBoundary\"]\n6:I[5278,[],\"AsyncMetadataOutlet\"]\n8:I[4431,[],\"ViewportBoundary\"]\na:I[4431,[],\"MetadataBoundary\"]\nb:\"$Sreact.suspense\"\nd:I[7150,[],\"\"]\n:HL[\"/_next/static/media/4c9affa5bc8f420e-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/bb3ef058b751a6ad-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/css/82edaa7a5942f894.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"eiQeDU9uBHNsBj0CFkp8M\",\"p\":\"\",\"c\":[\"\",\"_not-found\",\"\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/82edaa7a5942f894.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"__variable_73ee6c __variable_3c557b\",\"children\":[\"$\",\"body\",null,{\"children\":[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]]}],{\"children\":[\"/_not-found\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L4\",null,{\"children\":[\"$L5\",[\"$\",\"$L6\",null,{\"promise\":\"$@7\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]],[\"$\",\"$La\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$b\",null,{\"fallback\":null,\"children\":\"$Lc\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$d\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"2\",{\"name\":\"theme-color\",\"content\":\"#050505\"}]]\n5:null\n"])</script><script>self.__next_f.push([1,"e:I[622,[],\"IconMark\"]\n7:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"agentswarm\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"A local agent swarm for long-horizon, autonomous work.\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/icon.png?bdc9175d46e1d0aa\",\"type\":\"image/png\",\"sizes\":\"256x256\"}],[\"$\",\"$Le\",\"3\",{}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"c:\"$7:metadata\"\n"])</script></body></html>
|
package/ui/out/404.html
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<!DOCTYPE html><!--eiQeDU9uBHNsBj0CFkp8M--><html lang="en" class="__variable_73ee6c __variable_3c557b"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/4c9affa5bc8f420e-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/bb3ef058b751a6ad-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/82edaa7a5942f894.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-38639c05c96dbeca.js"/><script src="/_next/static/chunks/4bd1b696-c023c6e3521b1417.js" async=""></script><script src="/_next/static/chunks/255-2aa030c9ba2867e3.js" async=""></script><script src="/_next/static/chunks/main-app-889ed884f8bc78e3.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><meta name="theme-color" content="#050505"/><title>agentswarm</title><meta name="description" content="A local agent swarm for long-horizon, autonomous work."/><link rel="icon" href="/icon.png?bdc9175d46e1d0aa" type="image/png" sizes="256x256"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-38639c05c96dbeca.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[9766,[],\"\"]\n3:I[8924,[],\"\"]\n4:I[4431,[],\"OutletBoundary\"]\n6:I[5278,[],\"AsyncMetadataOutlet\"]\n8:I[4431,[],\"ViewportBoundary\"]\na:I[4431,[],\"MetadataBoundary\"]\nb:\"$Sreact.suspense\"\nd:I[7150,[],\"\"]\n:HL[\"/_next/static/media/4c9affa5bc8f420e-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/bb3ef058b751a6ad-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/css/82edaa7a5942f894.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"eiQeDU9uBHNsBj0CFkp8M\",\"p\":\"\",\"c\":[\"\",\"_not-found\",\"\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/82edaa7a5942f894.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"__variable_73ee6c __variable_3c557b\",\"children\":[\"$\",\"body\",null,{\"children\":[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]]}],{\"children\":[\"/_not-found\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L4\",null,{\"children\":[\"$L5\",[\"$\",\"$L6\",null,{\"promise\":\"$@7\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]],[\"$\",\"$La\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$b\",null,{\"fallback\":null,\"children\":\"$Lc\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$d\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"2\",{\"name\":\"theme-color\",\"content\":\"#050505\"}]]\n5:null\n"])</script><script>self.__next_f.push([1,"e:I[622,[],\"IconMark\"]\n7:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"agentswarm\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"A local agent swarm for long-horizon, autonomous work.\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/icon.png?bdc9175d46e1d0aa\",\"type\":\"image/png\",\"sizes\":\"256x256\"}],[\"$\",\"$Le\",\"3\",{}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"c:\"$7:metadata\"\n"])</script></body></html>
|