agentroam 0.2.0-preview.1 → 0.2.0-preview.2
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/README.md +4 -4
- package/dist/cli.js +15 -4
- package/dist/cloudflared/installer.js +19 -4
- package/dist/cloudflared/installer.test.js +15 -0
- package/dist/native-runtime.js +15 -0
- package/dist/native-runtime.test.js +19 -0
- package/dist/network.js +17 -0
- package/dist/network.test.js +20 -0
- package/dist/runtime-manager.js +2 -1
- package/package.json +2 -2
- package/runtime/.next/BUILD_ID +1 -1
- package/runtime/.next/app-build-manifest.json +3 -3
- package/runtime/.next/app-path-routes-manifest.json +1 -1
- package/runtime/.next/build-manifest.json +5 -5
- package/runtime/.next/prerender-manifest.json +1 -1
- package/runtime/.next/react-loadable-manifest.json +1 -1
- package/runtime/.next/server/app/_not-found.html +1 -1
- package/runtime/.next/server/app/_not-found.rsc +1 -1
- package/runtime/.next/server/app/web.html +1 -1
- package/runtime/.next/server/app/web.rsc +1 -1
- package/runtime/.next/server/app-paths-manifest.json +2 -2
- package/runtime/.next/server/chunks/322.js +31 -31
- package/runtime/.next/server/middleware-build-manifest.js +1 -1
- package/runtime/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/runtime/.next/server/pages/404.html +1 -1
- package/runtime/.next/server/pages/500.html +1 -1
- package/runtime/.next/server/server-reference-manifest.json +1 -1
- package/runtime/.next/static/chunks/804.0e20fa702013ffef.js +1 -0
- package/runtime/.next/static/chunks/{webpack-3a28d671c5a42bf1.js → webpack-e56f3a1950168597.js} +1 -1
- package/runtime/node_modules/@agent/core/dist/domain/agent/AgentBuilder.d.ts +3 -0
- package/runtime/node_modules/@agent/core/dist/domain/agent/AgentBuilder.d.ts.map +1 -1
- package/runtime/node_modules/@agent/core/dist/domain/context/ContextLoader.d.ts +1 -0
- package/runtime/node_modules/@agent/core/dist/domain/context/ContextLoader.d.ts.map +1 -1
- package/runtime/node_modules/@agent/core/dist/domain/skill/SkillRegistry.d.ts +4 -0
- package/runtime/node_modules/@agent/core/dist/domain/skill/SkillRegistry.d.ts.map +1 -1
- package/runtime/node_modules/@agent/core/dist/domain/tool/builtin/WebSearchTool.d.ts +5 -2
- package/runtime/node_modules/@agent/core/dist/domain/tool/builtin/WebSearchTool.d.ts.map +1 -1
- package/runtime/node_modules/@agent/core/dist/index.js +206 -67
- package/runtime/node_modules/@agent/core/dist/index.js.map +8 -8
- package/runtime/node_modules/@agent/core/dist/infrastructure/SQLiteSessionStore.d.ts +4 -0
- package/runtime/node_modules/@agent/core/dist/infrastructure/SQLiteSessionStore.d.ts.map +1 -1
- package/runtime/node_modules/node-pty/prebuilds/darwin-arm64/spawn-helper +0 -0
- package/runtime/.next/static/chunks/804.33d400571801aa9e.js +0 -1
- /package/runtime/.next/static/{DmJe8rRLl3EQW0weZvItS → 47UkTmBGxP5qz2mnMbNEp}/_buildManifest.js +0 -0
- /package/runtime/.next/static/{DmJe8rRLl3EQW0weZvItS → 47UkTmBGxP5qz2mnMbNEp}/_ssgManifest.js +0 -0
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@ Zero-install mobile remote terminal and file console. **No desktop app, no VPN**
|
|
|
7
7
|
- **Node.js 22** (required)
|
|
8
8
|
- macOS arm64
|
|
9
9
|
|
|
10
|
-
> Preview status: `0.2.0-preview.
|
|
10
|
+
> Preview status: `0.2.0-preview.2` is intentionally limited to macOS arm64.
|
|
11
11
|
> macOS x64 and Windows x64 remain future formal-release targets.
|
|
12
12
|
|
|
13
13
|
## Quick start
|
|
@@ -19,7 +19,7 @@ npx agentroam@preview
|
|
|
19
19
|
Or install from tarball:
|
|
20
20
|
|
|
21
21
|
```bash
|
|
22
|
-
npm install ./agentroam-0.2.0-preview.
|
|
22
|
+
npm install ./agentroam-0.2.0-preview.2.tgz
|
|
23
23
|
npx agentroam
|
|
24
24
|
```
|
|
25
25
|
|
|
@@ -50,7 +50,7 @@ agentroam version
|
|
|
50
50
|
| `--port <n>` | Fixed local port |
|
|
51
51
|
| `--data-dir <path>` | State directory (default: `~/.agentroam`) |
|
|
52
52
|
|
|
53
|
-
If Cloudflare is blocked on your network, use `--local-only
|
|
53
|
+
If Cloudflare or GitHub is blocked on your network, AgentRoam reuses a `cloudflared` executable already on `PATH`; otherwise use the LAN QR code, `--local-only`, or `--relay custom`.
|
|
54
54
|
|
|
55
55
|
## What's included
|
|
56
56
|
|
|
@@ -66,7 +66,7 @@ Not included: Electron desktop app, SDK, dev `.env`, session caches.
|
|
|
66
66
|
```bash
|
|
67
67
|
bun run build:cli
|
|
68
68
|
cd packages/cli && npm pack
|
|
69
|
-
node ../../scripts/audit-cli-tarball.mjs agentroam-0.2.0-preview.
|
|
69
|
+
node ../../scripts/audit-cli-tarball.mjs agentroam-0.2.0-preview.2.tgz
|
|
70
70
|
node ../../scripts/verify-cli-install.mjs --node /opt/homebrew/opt/node@22/bin/node
|
|
71
71
|
node ../../scripts/verify-cli-tunnel.mjs --node /opt/homebrew/opt/node@22/bin/node
|
|
72
72
|
```
|
package/dist/cli.js
CHANGED
|
@@ -6,15 +6,17 @@ import { renderQr } from "./qr.js";
|
|
|
6
6
|
import { ensureCloudflared } from "./cloudflared/installer.js";
|
|
7
7
|
import { CloudflareTunnelProvider } from "./tunnel/cloudflare-provider.js";
|
|
8
8
|
import { CustomCommandTunnelProvider } from "./tunnel/custom-command-provider.js";
|
|
9
|
+
import { findLanUrl } from "./network.js";
|
|
10
|
+
import { repairNativeRuntimePermissions } from "./native-runtime.js";
|
|
9
11
|
import { createRequire } from "node:module";
|
|
10
12
|
import { fileURLToPath } from "node:url";
|
|
11
13
|
export async function main(argv) { const options = parseArgs(argv); const target = detectPlatform(); if (options.command === "version") {
|
|
12
|
-
console.log("agentroam 0.2.0-preview.
|
|
14
|
+
console.log("agentroam 0.2.0-preview.2");
|
|
13
15
|
return;
|
|
14
16
|
} if (options.command === "doctor") {
|
|
15
17
|
await doctor(target, options.dataDir);
|
|
16
18
|
return;
|
|
17
|
-
} console.log(`AgentRoam 0.2.0-preview.
|
|
19
|
+
} console.log(`AgentRoam 0.2.0-preview.2\n✓ Node ${process.versions.node} · ${target}`); const pairing = createPairingSecret(); const controller = new AbortController(); const runtime = await new RuntimeManager().start(options, pairing); console.log(`✓ Local server: ${runtime.localUrl}/web`); const lanUrl = findLanUrl(runtime.port) ?? runtime.localUrl; let tunnel = null; let publicUrl = options.localOnly ? lanUrl : runtime.localUrl; try {
|
|
18
20
|
if (!options.localOnly) {
|
|
19
21
|
if (options.relay === "cloudflare") {
|
|
20
22
|
const executable = await ensureCloudflared(target, options.dataDir);
|
|
@@ -27,13 +29,22 @@ export async function main(argv) { const options = parseArgs(argv); const target
|
|
|
27
29
|
}
|
|
28
30
|
}
|
|
29
31
|
catch (error) {
|
|
32
|
+
publicUrl = lanUrl;
|
|
30
33
|
console.error(`⚠ Tunnel unavailable: ${error instanceof Error ? error.message : error}`);
|
|
31
|
-
console.error(
|
|
34
|
+
console.error(` Continuing with local network access: ${publicUrl}/web`);
|
|
35
|
+
console.error(" Use --relay custom when Cloudflare is blocked.");
|
|
32
36
|
} const accessUrl = `${publicUrl}/web${runtime.needsSetup ? `?pair=${encodeURIComponent(pairing.token)}` : ""}`; console.log(`\nOpen: ${accessUrl}`); if (options.qr)
|
|
33
37
|
console.log(`\n${await renderQr(accessUrl)}`); if (runtime.needsSetup)
|
|
34
38
|
console.log("First pairing link expires in 5 minutes."); console.log("Ctrl+C stops the tunnel and local server."); let closing = false; const close = async () => { if (closing)
|
|
35
39
|
return; closing = true; controller.abort(); await tunnel?.close().catch(() => { }); await runtime.close(); }; process.once("SIGINT", () => void close()); process.once("SIGTERM", () => void close()); await Promise.race([runtime.exited, tunnel?.exited ?? new Promise(() => { })]); await close(); }
|
|
36
|
-
async function doctor(target, dataDir) { console.log(`✓ Node ${process.versions.node}`); console.log(`✓ Platform ${target}`); const
|
|
40
|
+
async function doctor(target, dataDir) { console.log(`✓ Node ${process.versions.node}`); console.log(`✓ Platform ${target}`); const runtimeRoot = fileURLToPath(new URL("../runtime/", import.meta.url)); const runtimeRequire = createRequire(fileURLToPath(new URL("../runtime/package.json", import.meta.url))); try {
|
|
41
|
+
await repairNativeRuntimePermissions(runtimeRoot);
|
|
42
|
+
console.log("✓ node-pty spawn-helper executable");
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
console.log(`✗ ${error instanceof Error ? error.message : error}`);
|
|
46
|
+
process.exitCode = 1;
|
|
47
|
+
} for (const module of ["node-pty", "better-sqlite3"]) {
|
|
37
48
|
try {
|
|
38
49
|
runtimeRequire(module);
|
|
39
50
|
console.log(`✓ ${module}`);
|
|
@@ -1,12 +1,18 @@
|
|
|
1
|
-
import { chmod, mkdir, readFile, rename, rm, stat, writeFile } from "node:fs/promises";
|
|
2
|
-
import { createWriteStream } from "node:fs";
|
|
3
|
-
import { resolve } from "node:path";
|
|
1
|
+
import { chmod, mkdir, readFile, rename, rm, stat, writeFile, access } from "node:fs/promises";
|
|
2
|
+
import { constants, createWriteStream } from "node:fs";
|
|
3
|
+
import { resolve, delimiter } from "node:path";
|
|
4
4
|
import { pipeline } from "node:stream/promises";
|
|
5
5
|
import { spawn } from "node:child_process";
|
|
6
6
|
import { CLOUDFLARED_ASSETS } from "./manifest.js";
|
|
7
7
|
import { sha256File } from "./checksum.js";
|
|
8
8
|
export async function ensureCloudflared(target, dataDir) { const asset = CLOUDFLARED_ASSETS[target]; const binDir = resolve(dataDir, "bin"); const finalPath = resolve(binDir, asset.fileName); const marker = `${finalPath}.source.sha256`; await mkdir(binDir, { recursive: true }); if (await cached(finalPath, marker, asset.sha256))
|
|
9
|
-
return finalPath; const
|
|
9
|
+
return finalPath; const systemBinary = await findSystemCloudflared(); if (systemBinary)
|
|
10
|
+
return systemBinary; const temp = resolve(binDir, `.cloudflared-${Date.now()}.download`); await rm(temp, { force: true }); let response; try {
|
|
11
|
+
response = await fetch(asset.url, { redirect: "follow" });
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
throw new Error(`cloudflared download failed from github.com: ${describeError(error)}`);
|
|
15
|
+
} if (!response.ok || !response.body)
|
|
10
16
|
throw new Error(`cloudflared download failed: HTTP ${response.status}`); await pipeline(response.body, createWriteStream(temp)); const info = await stat(temp); if (info.size !== asset.size || await sha256File(temp) !== asset.sha256) {
|
|
11
17
|
await rm(temp, { force: true });
|
|
12
18
|
throw new Error("cloudflared checksum mismatch");
|
|
@@ -18,6 +24,14 @@ else
|
|
|
18
24
|
await rename(temp, finalPath); if (process.platform !== "win32")
|
|
19
25
|
await chmod(finalPath, 0o755); if (!await exists(finalPath))
|
|
20
26
|
throw new Error("cloudflared binary missing after install"); await writeFile(marker, asset.sha256); return finalPath; }
|
|
27
|
+
export async function findSystemCloudflared(pathValue = process.env.PATH ?? "", platform = process.platform) { const name = platform === "win32" ? "cloudflared.exe" : "cloudflared"; for (const directory of pathValue.split(delimiter).filter(Boolean)) {
|
|
28
|
+
const candidate = resolve(directory, name);
|
|
29
|
+
try {
|
|
30
|
+
await access(candidate, platform === "win32" ? constants.F_OK : constants.X_OK);
|
|
31
|
+
return candidate;
|
|
32
|
+
}
|
|
33
|
+
catch { }
|
|
34
|
+
} return null; }
|
|
21
35
|
async function cached(path, marker, hash) { try {
|
|
22
36
|
return await exists(path) && (await readFile(marker, "utf8")).trim() === hash;
|
|
23
37
|
}
|
|
@@ -30,4 +44,5 @@ async function exists(path) { try {
|
|
|
30
44
|
catch {
|
|
31
45
|
return false;
|
|
32
46
|
} }
|
|
47
|
+
function describeError(error) { const value = error; const cause = value?.cause; return [cause?.code, value?.message, cause?.message].filter(Boolean).join(": ") || String(error); }
|
|
33
48
|
function extractTgz(archive, dir) { return new Promise((resolve, reject) => { const child = spawn("tar", ["-xzf", archive, "-C", dir], { stdio: "ignore" }); child.once("exit", code => code === 0 ? resolve() : reject(new Error(`tar exited ${code}`))); child.once("error", reject); }); }
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { chmod, mkdtemp, writeFile } from "node:fs/promises";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { resolve } from "node:path";
|
|
4
|
+
import { describe, expect, it } from "vitest";
|
|
5
|
+
import { findSystemCloudflared } from "./installer.js";
|
|
6
|
+
describe("findSystemCloudflared", () => {
|
|
7
|
+
it("reuses an executable cloudflared already installed on PATH", async () => {
|
|
8
|
+
const directory = await mkdtemp(resolve(tmpdir(), "agentroam-cloudflared-"));
|
|
9
|
+
const executable = resolve(directory, "cloudflared");
|
|
10
|
+
await writeFile(executable, "#!/bin/sh\n", { mode: 0o644 });
|
|
11
|
+
expect(await findSystemCloudflared(directory, "darwin")).toBeNull();
|
|
12
|
+
await chmod(executable, 0o755);
|
|
13
|
+
expect(await findSystemCloudflared(directory, "darwin")).toBe(executable);
|
|
14
|
+
});
|
|
15
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { chmod } from "node:fs/promises";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
export async function repairNativeRuntimePermissions(runtimeRoot, platform = process.platform, arch = process.arch) {
|
|
4
|
+
if (platform === "win32")
|
|
5
|
+
return;
|
|
6
|
+
const helper = resolve(runtimeRoot, "node_modules/node-pty/prebuilds", `${platform}-${arch}`, "spawn-helper");
|
|
7
|
+
try {
|
|
8
|
+
await chmod(helper, 0o755);
|
|
9
|
+
}
|
|
10
|
+
catch (error) {
|
|
11
|
+
if (error?.code === "ENOENT")
|
|
12
|
+
throw new Error(`node-pty spawn-helper missing: ${helper}`);
|
|
13
|
+
throw new Error(`node-pty spawn-helper permission repair failed: ${error?.message ?? error}`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { mkdtemp, mkdir, stat, writeFile } from "node:fs/promises";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { resolve } from "node:path";
|
|
4
|
+
import { describe, expect, it } from "vitest";
|
|
5
|
+
import { repairNativeRuntimePermissions } from "./native-runtime.js";
|
|
6
|
+
describe("repairNativeRuntimePermissions", () => {
|
|
7
|
+
it("restores the node-pty helper execute bits stripped by npm pack", async () => {
|
|
8
|
+
const root = await mkdtemp(resolve(tmpdir(), "agentroam-native-"));
|
|
9
|
+
const helper = resolve(root, "node_modules/node-pty/prebuilds/darwin-arm64/spawn-helper");
|
|
10
|
+
await mkdir(resolve(helper, ".."), { recursive: true });
|
|
11
|
+
await writeFile(helper, "helper", { mode: 0o644 });
|
|
12
|
+
await repairNativeRuntimePermissions(root, "darwin", "arm64");
|
|
13
|
+
expect((await stat(helper)).mode & 0o111).toBe(0o111);
|
|
14
|
+
});
|
|
15
|
+
it("fails before gateway startup when the helper is missing", async () => {
|
|
16
|
+
const root = await mkdtemp(resolve(tmpdir(), "agentroam-native-missing-"));
|
|
17
|
+
await expect(repairNativeRuntimePermissions(root, "darwin", "arm64")).rejects.toThrow("spawn-helper missing");
|
|
18
|
+
});
|
|
19
|
+
});
|
package/dist/network.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { networkInterfaces } from "node:os";
|
|
2
|
+
export function findLanUrl(port, interfaces = networkInterfaces()) {
|
|
3
|
+
const addresses = Object.values(interfaces)
|
|
4
|
+
.flatMap((entries) => entries ?? [])
|
|
5
|
+
.filter((entry) => entry.family === "IPv4" && !entry.internal)
|
|
6
|
+
.map((entry) => entry.address);
|
|
7
|
+
const address = addresses.find(isPrivateIpv4) ?? addresses[0];
|
|
8
|
+
return address ? `http://${address}:${port}` : null;
|
|
9
|
+
}
|
|
10
|
+
function isPrivateIpv4(address) {
|
|
11
|
+
const parts = address.split(".").map(Number);
|
|
12
|
+
if (parts.length !== 4 || parts.some((part) => !Number.isInteger(part) || part < 0 || part > 255))
|
|
13
|
+
return false;
|
|
14
|
+
return parts[0] === 10 ||
|
|
15
|
+
(parts[0] === 172 && parts[1] >= 16 && parts[1] <= 31) ||
|
|
16
|
+
(parts[0] === 192 && parts[1] === 168);
|
|
17
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { findLanUrl } from "./network.js";
|
|
3
|
+
describe("findLanUrl", () => {
|
|
4
|
+
it("prefers an RFC1918 address over VPN and public interfaces", () => {
|
|
5
|
+
expect(findLanUrl(52032, {
|
|
6
|
+
utun7: [{ address: "100.121.10.115", netmask: "255.255.255.255", family: "IPv4", mac: "", internal: false, cidr: null }],
|
|
7
|
+
en0: [{ address: "10.22.34.143", netmask: "255.255.252.0", family: "IPv4", mac: "", internal: false, cidr: null }],
|
|
8
|
+
})).toBe("http://10.22.34.143:52032");
|
|
9
|
+
});
|
|
10
|
+
it("falls back to the first external IPv4 address", () => {
|
|
11
|
+
expect(findLanUrl(4100, {
|
|
12
|
+
utun7: [{ address: "100.121.10.115", netmask: "255.255.255.255", family: "IPv4", mac: "", internal: false, cidr: null }],
|
|
13
|
+
})).toBe("http://100.121.10.115:4100");
|
|
14
|
+
});
|
|
15
|
+
it("returns null when only loopback is available", () => {
|
|
16
|
+
expect(findLanUrl(4100, {
|
|
17
|
+
lo0: [{ address: "127.0.0.1", netmask: "255.0.0.0", family: "IPv4", mac: "", internal: true, cidr: null }],
|
|
18
|
+
})).toBeNull();
|
|
19
|
+
});
|
|
20
|
+
});
|
package/dist/runtime-manager.js
CHANGED
|
@@ -3,12 +3,13 @@ import { resolve, delimiter } from "node:path";
|
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
4
|
import { findAvailablePort } from "./port.js";
|
|
5
5
|
import { ProcessSupervisor } from "./process-supervisor.js";
|
|
6
|
+
import { repairNativeRuntimePermissions } from "./native-runtime.js";
|
|
6
7
|
export class RuntimeManager {
|
|
7
8
|
supervisor;
|
|
8
9
|
constructor(supervisor = new ProcessSupervisor()) {
|
|
9
10
|
this.supervisor = supervisor;
|
|
10
11
|
}
|
|
11
|
-
async start(options, pairing) { const port = await findAvailablePort(options.port); const dataDir = resolve(options.dataDir); await Promise.all(["data", "bin", "cache", "logs"].map(name => mkdir(resolve(dataDir, name), { recursive: true }))); const runtimeRoot = fileURLToPath(new URL("../runtime/", import.meta.url)); const gateway = resolve(runtimeRoot, "ws-server.mjs"); const child = this.supervisor.spawn(process.execPath, [gateway], { cwd: runtimeRoot, env: { ...process.env, NODE_ENV: "production", NEXT_DIST_DIR: ".next", PORT: String(port), HOST: "127.0.0.1", AGENT_DATA_DIR: resolve(dataDir, "data"), AGENT_WEB_ROOTS: options.roots.join(delimiter), AGENT_TRUST_TUNNEL_PROXY: "1", AGENT_PAIRING_HASH: pairing?.hashHex || "", AGENT_PAIRING_EXPIRES_AT: pairing?.expiresAt || "" } }); const log = (stream) => stream?.on("data", chunk => process.stderr.write(chunk)); log(child.stdout); log(child.stderr); const exited = new Promise(resolve => child.once("exit", (code, signal) => resolve({ code, signal }))); const localUrl = `http://127.0.0.1:${port}`; const status = await waitForHealth(`${localUrl}/api/web-auth/status`, child, 20000); return { port, localUrl, dataDir, needsSetup: !!status.needsSetup, process: child, exited, close: () => this.supervisor.stopAll() }; }
|
|
12
|
+
async start(options, pairing) { const port = await findAvailablePort(options.port); const dataDir = resolve(options.dataDir); await Promise.all(["data", "bin", "cache", "logs"].map(name => mkdir(resolve(dataDir, name), { recursive: true }))); const runtimeRoot = fileURLToPath(new URL("../runtime/", import.meta.url)); await repairNativeRuntimePermissions(runtimeRoot); const gateway = resolve(runtimeRoot, "ws-server.mjs"); const child = this.supervisor.spawn(process.execPath, [gateway], { cwd: runtimeRoot, env: { ...process.env, NODE_ENV: "production", NEXT_DIST_DIR: ".next", PORT: String(port), HOST: "127.0.0.1", AGENT_DATA_DIR: resolve(dataDir, "data"), AGENT_WEB_ROOTS: options.roots.join(delimiter), AGENT_TRUST_TUNNEL_PROXY: "1", AGENT_PAIRING_HASH: pairing?.hashHex || "", AGENT_PAIRING_EXPIRES_AT: pairing?.expiresAt || "" } }); const log = (stream) => stream?.on("data", chunk => process.stderr.write(chunk)); log(child.stdout); log(child.stderr); const exited = new Promise(resolve => child.once("exit", (code, signal) => resolve({ code, signal }))); const localUrl = `http://127.0.0.1:${port}`; const status = await waitForHealth(`${localUrl}/api/web-auth/status`, child, 20000); return { port, localUrl, dataDir, needsSetup: !!status.needsSetup, process: child, exited, close: () => this.supervisor.stopAll() }; }
|
|
12
13
|
}
|
|
13
14
|
async function waitForHealth(url, child, timeoutMs) { const end = Date.now() + timeoutMs; while (Date.now() < end) {
|
|
14
15
|
if (child.exitCode !== null)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentroam",
|
|
3
|
-
"version": "0.2.0-preview.
|
|
3
|
+
"version": "0.2.0-preview.2",
|
|
4
4
|
"description": "Zero-install mobile remote terminal and file console",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": { "agentroam": "./bin/agentroam.mjs" },
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"files": ["bin", "dist", "runtime", "README.md"],
|
|
11
11
|
"scripts": {
|
|
12
12
|
"build": "tsc -p tsconfig.json",
|
|
13
|
-
"test": "vitest run src",
|
|
13
|
+
"test": "vitest run --root ../.. packages/cli/src",
|
|
14
14
|
"prepack": "node ../../scripts/stage-cli-runtime.mjs && npm run build"
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
package/runtime/.next/BUILD_ID
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
47UkTmBGxP5qz2mnMbNEp
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"pages": {
|
|
3
3
|
"/_not-found/page": [
|
|
4
|
-
"static/chunks/webpack-
|
|
4
|
+
"static/chunks/webpack-e56f3a1950168597.js",
|
|
5
5
|
"static/chunks/3cc391f0-17a90b8b534c353f.js",
|
|
6
6
|
"static/chunks/183-9c8ca0c781655214.js",
|
|
7
7
|
"static/chunks/main-app-07d67f2d4e96ecb8.js",
|
|
8
8
|
"static/chunks/app/_not-found/page-e98edbffee24e843.js"
|
|
9
9
|
],
|
|
10
10
|
"/layout": [
|
|
11
|
-
"static/chunks/webpack-
|
|
11
|
+
"static/chunks/webpack-e56f3a1950168597.js",
|
|
12
12
|
"static/chunks/3cc391f0-17a90b8b534c353f.js",
|
|
13
13
|
"static/chunks/183-9c8ca0c781655214.js",
|
|
14
14
|
"static/chunks/main-app-07d67f2d4e96ecb8.js",
|
|
15
15
|
"static/chunks/app/layout-9176f750902030b5.js"
|
|
16
16
|
],
|
|
17
17
|
"/web/page": [
|
|
18
|
-
"static/chunks/webpack-
|
|
18
|
+
"static/chunks/webpack-e56f3a1950168597.js",
|
|
19
19
|
"static/chunks/3cc391f0-17a90b8b534c353f.js",
|
|
20
20
|
"static/chunks/183-9c8ca0c781655214.js",
|
|
21
21
|
"static/chunks/main-app-07d67f2d4e96ecb8.js",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"/_not-found/page":"/_not-found","/api/agent/abort/route":"/api/agent/abort","/api/agent/answer/route":"/api/agent/answer","/api/agent/run/route":"/api/agent/run","/api/agent/stream/route":"/api/agent/stream","/api/auth/verify/route":"/api/auth/verify","/api/mcp/connect/route":"/api/mcp/connect","/api/mcp/disconnect/route":"/api/mcp/disconnect","/api/mcp/servers/route":"/api/mcp/servers","/api/memory/[key]/route":"/api/memory/[key]","/api/memory/route":"/api/memory","/api/plugins/load/route":"/api/plugins/load","/api/remote-tools/register/route":"/api/remote-tools/register","/api/sessions/[id]/route":"/api/sessions/[id]","/api/sessions/route":"/api/sessions","/api/skills/route":"/api/skills","/api/tools/route":"/api/tools","/api/web-auth/login/route":"/api/web-auth/login","/api/web-auth/logout/route":"/api/web-auth/logout","/api/web-auth/revoke-all/route":"/api/web-auth/revoke-all","/api/web-auth/setup/route":"/api/web-auth/setup","/api/web-auth/status/route":"/api/web-auth/status","/api/web-console/bootstrap/route":"/api/web-console/bootstrap","/api/web-console/device-state/route":"/api/web-console/device-state","/api/web-console/history/route":"/api/web-console/history","/api/web-console/preferences/route":"/api/web-console/preferences"
|
|
1
|
+
{"/_not-found/page":"/_not-found","/api/agent/abort/route":"/api/agent/abort","/api/agent/answer/route":"/api/agent/answer","/api/agent/run/route":"/api/agent/run","/api/agent/stream/route":"/api/agent/stream","/api/auth/verify/route":"/api/auth/verify","/api/mcp/connect/route":"/api/mcp/connect","/api/mcp/disconnect/route":"/api/mcp/disconnect","/api/mcp/servers/route":"/api/mcp/servers","/api/memory/[key]/route":"/api/memory/[key]","/api/memory/route":"/api/memory","/api/plugins/load/route":"/api/plugins/load","/api/remote-tools/register/route":"/api/remote-tools/register","/api/sessions/[id]/route":"/api/sessions/[id]","/api/sessions/route":"/api/sessions","/api/skills/route":"/api/skills","/api/tools/route":"/api/tools","/api/web-auth/login/route":"/api/web-auth/login","/api/web-auth/logout/route":"/api/web-auth/logout","/api/web-auth/revoke-all/route":"/api/web-auth/revoke-all","/api/web-auth/setup/route":"/api/web-auth/setup","/api/web-auth/status/route":"/api/web-auth/status","/api/web-console/bootstrap/route":"/api/web-console/bootstrap","/api/web-console/device-state/route":"/api/web-console/device-state","/api/web-console/history/route":"/api/web-console/history","/web/page":"/web","/api/web-console/preferences/route":"/api/web-console/preferences"}
|
|
@@ -5,24 +5,24 @@
|
|
|
5
5
|
"devFiles": [],
|
|
6
6
|
"ampDevFiles": [],
|
|
7
7
|
"lowPriorityFiles": [
|
|
8
|
-
"static/
|
|
9
|
-
"static/
|
|
8
|
+
"static/47UkTmBGxP5qz2mnMbNEp/_buildManifest.js",
|
|
9
|
+
"static/47UkTmBGxP5qz2mnMbNEp/_ssgManifest.js"
|
|
10
10
|
],
|
|
11
11
|
"rootMainFiles": [
|
|
12
|
-
"static/chunks/webpack-
|
|
12
|
+
"static/chunks/webpack-e56f3a1950168597.js",
|
|
13
13
|
"static/chunks/3cc391f0-17a90b8b534c353f.js",
|
|
14
14
|
"static/chunks/183-9c8ca0c781655214.js",
|
|
15
15
|
"static/chunks/main-app-07d67f2d4e96ecb8.js"
|
|
16
16
|
],
|
|
17
17
|
"pages": {
|
|
18
18
|
"/_app": [
|
|
19
|
-
"static/chunks/webpack-
|
|
19
|
+
"static/chunks/webpack-e56f3a1950168597.js",
|
|
20
20
|
"static/chunks/framework-7bac12ed8564755e.js",
|
|
21
21
|
"static/chunks/main-a7dd8c98b48af038.js",
|
|
22
22
|
"static/chunks/pages/_app-389e6eb8abb0af2d.js"
|
|
23
23
|
],
|
|
24
24
|
"/_error": [
|
|
25
|
-
"static/chunks/webpack-
|
|
25
|
+
"static/chunks/webpack-e56f3a1950168597.js",
|
|
26
26
|
"static/chunks/framework-7bac12ed8564755e.js",
|
|
27
27
|
"static/chunks/main-a7dd8c98b48af038.js",
|
|
28
28
|
"static/chunks/pages/_error-7cee5565b5ef9bcb.js"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":4,"routes":{"/api/mcp/servers":{"initialHeaders":{"content-type":"application/json","x-next-cache-tags":"_N_T_/layout,_N_T_/api/layout,_N_T_/api/mcp/layout,_N_T_/api/mcp/servers/layout,_N_T_/api/mcp/servers/route,_N_T_/api/mcp/servers"},"experimentalBypassFor":[{"type":"header","key":"Next-Action"},{"type":"header","key":"content-type","value":"multipart/form-data;.*"}],"initialRevalidateSeconds":false,"srcRoute":"/api/mcp/servers","dataRoute":null},"/api/tools":{"initialHeaders":{"content-type":"application/json","x-next-cache-tags":"_N_T_/layout,_N_T_/api/layout,_N_T_/api/tools/layout,_N_T_/api/tools/route,_N_T_/api/tools"},"experimentalBypassFor":[{"type":"header","key":"Next-Action"},{"type":"header","key":"content-type","value":"multipart/form-data;.*"}],"initialRevalidateSeconds":false,"srcRoute":"/api/tools","dataRoute":null},"/web":{"experimentalBypassFor":[{"type":"header","key":"Next-Action"},{"type":"header","key":"content-type","value":"multipart/form-data;.*"}],"initialRevalidateSeconds":false,"srcRoute":"/web","dataRoute":"/web.rsc"}},"dynamicRoutes":{},"notFoundRoutes":[],"preview":{"previewModeId":"
|
|
1
|
+
{"version":4,"routes":{"/api/mcp/servers":{"initialHeaders":{"content-type":"application/json","x-next-cache-tags":"_N_T_/layout,_N_T_/api/layout,_N_T_/api/mcp/layout,_N_T_/api/mcp/servers/layout,_N_T_/api/mcp/servers/route,_N_T_/api/mcp/servers"},"experimentalBypassFor":[{"type":"header","key":"Next-Action"},{"type":"header","key":"content-type","value":"multipart/form-data;.*"}],"initialRevalidateSeconds":false,"srcRoute":"/api/mcp/servers","dataRoute":null},"/api/tools":{"initialHeaders":{"content-type":"application/json","x-next-cache-tags":"_N_T_/layout,_N_T_/api/layout,_N_T_/api/tools/layout,_N_T_/api/tools/route,_N_T_/api/tools"},"experimentalBypassFor":[{"type":"header","key":"Next-Action"},{"type":"header","key":"content-type","value":"multipart/form-data;.*"}],"initialRevalidateSeconds":false,"srcRoute":"/api/tools","dataRoute":null},"/web":{"experimentalBypassFor":[{"type":"header","key":"Next-Action"},{"type":"header","key":"content-type","value":"multipart/form-data;.*"}],"initialRevalidateSeconds":false,"srcRoute":"/web","dataRoute":"/web.rsc"}},"dynamicRoutes":{},"notFoundRoutes":[],"preview":{"previewModeId":"0af636afc19ab68c44e9bd62292fc881","previewModeSigningKey":"caa70e362b360c34d50464aedc11fc9f87188558c2f73db64aa140e202537a99","previewModeEncryptionKey":"cde15007d3b688af515c866e64c77d1c2c48b51c17aea455daf25708b0bf1baa"}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-
|
|
1
|
+
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-e56f3a1950168597.js"/><script src="/_next/static/chunks/3cc391f0-17a90b8b534c353f.js" async=""></script><script src="/_next/static/chunks/183-9c8ca0c781655214.js" async=""></script><script src="/_next/static/chunks/main-app-07d67f2d4e96ecb8.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>AgentRoam</title><meta name="description" content="General-purpose AI agent API server"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><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-e56f3a1950168597.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:I[7709,[],\"\"]\n3:I[1338,[],\"\"]\n4:I[1573,[],\"\"]\na:I[6554,[],\"\"]\n5:{\"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\"}\n6:{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"}\n7:{\"display\":\"inline-block\"}\n8:{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0}\nb:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L1\",null,{\"buildId\":\"47UkTmBGxP5qz2mnMbNEp\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"_not-found\"],\"initialTree\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{},[[\"$L2\",[[\"$\",\"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],null],null]},[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"/_not-found\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[null,[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$5\",\"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\":\"$6\",\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":\"$7\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$8\",\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}]}]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],\"$L9\"],\"globalErrorComponent\":\"$a\",\"missingSlots\":\"$Wb\"}]\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"2\",{\"children\":\"AgentRoam\"}],[\"$\",\"meta\",\"3\",{\"name\":\"description\",\"content\":\"General-purpose AI agent API server\"}]]\n2:null\n"])</script></body></html>
|
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
5:{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"}
|
|
5
5
|
6:{"display":"inline-block"}
|
|
6
6
|
7:{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0}
|
|
7
|
-
0:["
|
|
7
|
+
0:["47UkTmBGxP5qz2mnMbNEp",[[["",{"children":["/_not-found",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",{"children":["/_not-found",{"children":["__PAGE__",{},[["$L1",[["$","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],null],null]},[null,["$","$L2",null,{"parallelRouterKey":"children","segmentPath":["children","/_not-found","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined"}]],null]},[[null,["$","html",null,{"lang":"en","children":["$","body",null,{"children":["$","$L2",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":"$4","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":"$5","children":"404"}],["$","div",null,{"style":"$6","children":["$","h2",null,{"style":"$7","children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[]}]}]}]],null],null],["$L8",["$","meta",null,{"name":"robots","content":"noindex"}]]]]]
|
|
8
8
|
8:[["$","meta","0",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","1",{"charSet":"utf-8"}],["$","title","2",{"children":"AgentRoam"}],["$","meta","3",{"name":"description","content":"General-purpose AI agent API server"}]]
|
|
9
9
|
1:null
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-
|
|
1
|
+
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-e56f3a1950168597.js"/><script src="/_next/static/chunks/3cc391f0-17a90b8b534c353f.js" async=""></script><script src="/_next/static/chunks/183-9c8ca0c781655214.js" async=""></script><script src="/_next/static/chunks/main-app-07d67f2d4e96ecb8.js" async=""></script><script src="/_next/static/chunks/app/web/page-800bcc7d84eb45e4.js" async=""></script><title>AgentRoam</title><meta name="description" content="General-purpose AI agent API server"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><main style="min-height:100dvh;display:grid;place-items:center;padding:20px;box-sizing:border-box;background:#0b0b10;color:#e8e8ee;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif"><div style="width:min(380px,100%);padding:24px;border:1px solid #292c36;border-radius:12px;background:#14161d;box-sizing:border-box;box-shadow:0 18px 50px rgba(0,0,0,.35)">正在加载…</div></main><script src="/_next/static/chunks/webpack-e56f3a1950168597.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:I[7709,[],\"\"]\n3:I[5613,[],\"ClientPageRoot\"]\n4:I[5153,[\"541\",\"static/chunks/app/web/page-800bcc7d84eb45e4.js\"],\"default\",1]\n5:I[1338,[],\"\"]\n6:I[1573,[],\"\"]\n8:I[6554,[],\"\"]\n9:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L1\",null,{\"buildId\":\"47UkTmBGxP5qz2mnMbNEp\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"web\"],\"initialTree\":[\"\",{\"children\":[\"web\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"web\",{\"children\":[\"__PAGE__\",{},[[\"$L2\",[\"$\",\"$L3\",null,{\"props\":{\"params\":{},\"searchParams\":{}},\"Component\":\"$4\"}],null],null],null]},[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"web\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[null,[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"children\":[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"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.\"}]}]]}]}]],\"notFoundStyles\":[]}]}]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[null,\"$L7\"],\"globalErrorComponent\":\"$8\",\"missingSlots\":\"$W9\"}]\n"])</script><script>self.__next_f.push([1,"7:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"2\",{\"children\":\"AgentRoam\"}],[\"$\",\"meta\",\"3\",{\"name\":\"description\",\"content\":\"General-purpose AI agent API server\"}]]\n2:null\n"])</script></body></html>
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
3:I[5153,["541","static/chunks/app/web/page-800bcc7d84eb45e4.js"],"default",1]
|
|
3
3
|
4:I[1338,[],""]
|
|
4
4
|
5:I[1573,[],""]
|
|
5
|
-
0:["
|
|
5
|
+
0:["47UkTmBGxP5qz2mnMbNEp",[[["",{"children":["web",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",{"children":["web",{"children":["__PAGE__",{},[["$L1",["$","$L2",null,{"props":{"params":{},"searchParams":{}},"Component":"$3"}],null],null],null]},[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","web","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined"}]],null]},[[null,["$","html",null,{"lang":"en","children":["$","body",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","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."}]}]]}]}]],"notFoundStyles":[]}]}]}]],null],null],["$L6",null]]]]
|
|
6
6
|
6:[["$","meta","0",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","1",{"charSet":"utf-8"}],["$","title","2",{"children":"AgentRoam"}],["$","meta","3",{"name":"description","content":"General-purpose AI agent API server"}]]
|
|
7
7
|
1:null
|
|
@@ -24,6 +24,6 @@
|
|
|
24
24
|
"/api/web-console/bootstrap/route": "app/api/web-console/bootstrap/route.js",
|
|
25
25
|
"/api/web-console/device-state/route": "app/api/web-console/device-state/route.js",
|
|
26
26
|
"/api/web-console/history/route": "app/api/web-console/history/route.js",
|
|
27
|
-
"/
|
|
28
|
-
"/web/
|
|
27
|
+
"/web/page": "app/web/page.js",
|
|
28
|
+
"/api/web-console/preferences/route": "app/api/web-console/preferences/route.js"
|
|
29
29
|
}
|