agentroam 0.2.0-preview.2 → 0.2.0-preview.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/README.md +12 -11
  2. package/dist/args.js +24 -8
  3. package/dist/args.test.js +25 -1
  4. package/dist/cli.js +112 -52
  5. package/dist/cloudflared/bundled-asset.js +37 -0
  6. package/dist/cloudflared/bundled-asset.test.js +50 -0
  7. package/dist/cloudflared/installer.js +83 -40
  8. package/dist/cloudflared/installer.test.js +63 -4
  9. package/dist/cloudflared/manifest.js +3 -5
  10. package/dist/tunnel/child-process.js +23 -0
  11. package/dist/tunnel/cloudflare-provider.js +59 -8
  12. package/dist/tunnel/cloudflare-provider.test.js +33 -0
  13. package/dist/tunnel/custom-command-provider.js +54 -4
  14. package/dist/tunnel/pinggy-provider.js +84 -0
  15. package/dist/tunnel/pinggy-provider.test.js +40 -0
  16. package/dist/tunnel/proxy-settings.js +141 -0
  17. package/dist/tunnel/proxy-settings.test.js +111 -0
  18. package/dist/tunnel/public-readiness.js +82 -0
  19. package/dist/tunnel/public-readiness.test.js +104 -0
  20. package/dist/tunnel/relay-orchestrator.js +43 -0
  21. package/dist/tunnel/relay-orchestrator.test.js +72 -0
  22. package/package.json +29 -8
  23. package/runtime/.next/BUILD_ID +1 -1
  24. package/runtime/.next/app-build-manifest.json +4 -4
  25. package/runtime/.next/app-path-routes-manifest.json +1 -1
  26. package/runtime/.next/build-manifest.json +7 -7
  27. package/runtime/.next/prerender-manifest.json +1 -1
  28. package/runtime/.next/react-loadable-manifest.json +2 -2
  29. package/runtime/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  30. package/runtime/.next/server/app/_not-found.html +1 -1
  31. package/runtime/.next/server/app/_not-found.rsc +1 -1
  32. package/runtime/.next/server/app/api/agent/abort/route.js +1 -1
  33. package/runtime/.next/server/app/api/agent/answer/route.js +1 -1
  34. package/runtime/.next/server/app/api/agent/model/route.js +1 -0
  35. package/runtime/.next/server/app/api/agent/model/route.js.nft.json +1 -0
  36. package/runtime/.next/server/app/api/agent/model.body +1 -0
  37. package/runtime/.next/server/app/api/agent/model.meta +1 -0
  38. package/runtime/.next/server/app/api/agent/run/route.js +1 -1
  39. package/runtime/.next/server/app/api/agent/steer/route.js +1 -0
  40. package/runtime/.next/server/app/api/agent/steer/route.js.nft.json +1 -0
  41. package/runtime/.next/server/app/api/agent/stream/route.js +3 -2
  42. package/runtime/.next/server/app/api/mcp/connect/route.js +1 -1
  43. package/runtime/.next/server/app/api/plugins/load/route.js +1 -1
  44. package/runtime/.next/server/app/api/remote-tools/register/route.js +1 -1
  45. package/runtime/.next/server/app/api/sessions/[id]/route.js +1 -1
  46. package/runtime/.next/server/app/api/sessions/route.js +1 -1
  47. package/runtime/.next/server/app/api/skills/route.js +1 -1
  48. package/runtime/.next/server/app/api/tools/route.js +1 -1
  49. package/runtime/.next/server/app/api/web-auth/login/route.js +1 -1
  50. package/runtime/.next/server/app/api/web-auth/logout/route.js +1 -1
  51. package/runtime/.next/server/app/api/web-auth/revoke-all/route.js +1 -1
  52. package/runtime/.next/server/app/api/web-auth/setup/route.js +1 -1
  53. package/runtime/.next/server/app/api/web-auth/status/route.js +1 -1
  54. package/runtime/.next/server/app/api/web-console/bootstrap/route.js +1 -1
  55. package/runtime/.next/server/app/api/web-console/device-state/route.js +1 -1
  56. package/runtime/.next/server/app/api/web-console/history/route.js +1 -1
  57. package/runtime/.next/server/app/api/web-console/history/route.js.nft.json +1 -1
  58. package/runtime/.next/server/app/api/web-console/preferences/route.js +1 -1
  59. package/runtime/.next/server/app/web/page.js +10 -10
  60. package/runtime/.next/server/app/web/page_client-reference-manifest.js +1 -1
  61. package/runtime/.next/server/app/web.html +1 -1
  62. package/runtime/.next/server/app/web.rsc +2 -2
  63. package/runtime/.next/server/app-paths-manifest.json +15 -13
  64. package/runtime/.next/server/chunks/322.js +28 -12
  65. package/runtime/.next/server/middleware-build-manifest.js +1 -1
  66. package/runtime/.next/server/middleware-react-loadable-manifest.js +1 -1
  67. package/runtime/.next/server/pages/404.html +1 -1
  68. package/runtime/.next/server/pages/500.html +1 -1
  69. package/runtime/.next/server/server-reference-manifest.json +1 -1
  70. package/runtime/.next/static/chunks/982.9e87a5cc0e6b13cf.js +1 -0
  71. package/runtime/.next/static/chunks/app/web/page-02e0df331bb14489.js +1 -0
  72. package/runtime/.next/static/chunks/{main-a7dd8c98b48af038.js → main-30618c50527ce4e9.js} +1 -1
  73. package/runtime/.next/static/chunks/{webpack-e56f3a1950168597.js → webpack-0c872a6ee48cbbdf.js} +1 -1
  74. package/runtime/node_modules/.package-lock.json +3 -3
  75. package/runtime/node_modules/@agent/core/dist/domain/context/ContextLoader.d.ts +2 -0
  76. package/runtime/node_modules/@agent/core/dist/domain/context/ContextLoader.d.ts.map +1 -1
  77. package/runtime/node_modules/@agent/core/dist/index.js +114 -12
  78. package/runtime/node_modules/@agent/core/dist/index.js.map +7 -6
  79. package/runtime/node_modules/@agent/core/dist/infrastructure/SQLiteAnonymousWebStore.d.ts +13 -0
  80. package/runtime/node_modules/@agent/core/dist/infrastructure/SQLiteAnonymousWebStore.d.ts.map +1 -0
  81. package/runtime/node_modules/@agent/core/dist/infrastructure/SQLiteAnonymousWebStore.test.d.ts +2 -0
  82. package/runtime/node_modules/@agent/core/dist/infrastructure/SQLiteAnonymousWebStore.test.d.ts.map +1 -0
  83. package/runtime/node_modules/@agent/core/dist/infrastructure/SQLiteDatabase.d.ts.map +1 -1
  84. package/runtime/node_modules/@agent/core/dist/infrastructure/SQLiteSessionStore.d.ts.map +1 -1
  85. package/runtime/node_modules/@agent/core/dist/infrastructure/index.d.ts +1 -0
  86. package/runtime/node_modules/@agent/core/dist/infrastructure/index.d.ts.map +1 -1
  87. package/runtime/node_modules/node-abi/abi_registry.json +7 -0
  88. package/runtime/node_modules/node-abi/package.json +1 -1
  89. package/runtime/node_modules/node-pty/prebuilds/darwin-arm64/spawn-helper +0 -0
  90. package/runtime/package-lock.json +3 -3
  91. package/runtime/webapp/dist/assets/App-lXIeMH5u.js +52 -0
  92. package/runtime/webapp/dist/assets/index-BAFMhDtY.js +42 -0
  93. package/runtime/webapp/dist/assets/index-Beg9M2xI.css +1 -0
  94. package/runtime/webapp/dist/index.html +17 -0
  95. package/runtime/webapp/dist/pcm-audio-worklet.js +126 -0
  96. package/runtime/ws-server.mjs +148 -18
  97. package/runtime/.next/static/chunks/804.0e20fa702013ffef.js +0 -1
  98. package/runtime/.next/static/chunks/app/web/page-800bcc7d84eb45e4.js +0 -1
  99. /package/runtime/.next/static/{47UkTmBGxP5qz2mnMbNEp → dclalTmecO-HMVQvSKG7g}/_buildManifest.js +0 -0
  100. /package/runtime/.next/static/{47UkTmBGxP5qz2mnMbNEp → dclalTmecO-HMVQvSKG7g}/_ssgManifest.js +0 -0
@@ -0,0 +1,104 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+ import { waitForPublicReadiness } from "./public-readiness.js";
3
+ describe("waitForPublicReadiness", () => {
4
+ it("retries a transient 530 and accepts the expected auth status", async () => {
5
+ const fetchImpl = vi
6
+ .fn()
7
+ .mockResolvedValueOnce(new Response("unavailable", { status: 530 }))
8
+ .mockResolvedValueOnce(Response.json({ authenticated: false, needsSetup: true }, { status: 200 }));
9
+ await waitForPublicReadiness("https://example.test", {
10
+ fetchImpl,
11
+ intervalMs: 1,
12
+ timeoutMs: 100,
13
+ });
14
+ expect(fetchImpl).toHaveBeenCalledTimes(2);
15
+ });
16
+ it("rejects an invalid HTTP 200 payload", async () => {
17
+ const fetchImpl = vi.fn().mockResolvedValue(Response.json({ ok: true }));
18
+ await expect(waitForPublicReadiness("https://example.test", { fetchImpl, intervalMs: 1, timeoutMs: 5 })).rejects.toThrow("invalid auth status JSON");
19
+ });
20
+ it("includes the last HTTP status in timeout diagnostics", async () => {
21
+ const fetchImpl = vi.fn().mockResolvedValue(new Response("bad gateway", { status: 502 }));
22
+ await expect(waitForPublicReadiness("https://example.test", { fetchImpl, intervalMs: 1, timeoutMs: 5 })).rejects.toThrow("HTTP 502");
23
+ });
24
+ it("reuses one proxy handle across retries and closes it after success", async () => {
25
+ const close = vi.fn(async () => { });
26
+ const proxiedFetch = vi
27
+ .fn()
28
+ .mockResolvedValueOnce(new Response("unavailable", { status: 530 }))
29
+ .mockResolvedValueOnce(Response.json({ authenticated: false, needsSetup: true }, { status: 200 }));
30
+ const proxyFetchFactory = vi.fn(() => ({ fetch: proxiedFetch, close }));
31
+ await waitForPublicReadiness("https://example.test", {
32
+ intervalMs: 1,
33
+ timeoutMs: 100,
34
+ proxyResolver: async () => "http://127.0.0.1:7897/",
35
+ proxyFetchFactory,
36
+ });
37
+ expect(proxyFetchFactory).toHaveBeenCalledOnce();
38
+ expect(proxiedFetch).toHaveBeenCalledTimes(2);
39
+ expect(close).toHaveBeenCalledOnce();
40
+ });
41
+ it.each([
42
+ {
43
+ name: "a fatal response",
44
+ fetchImpl: vi.fn().mockResolvedValue(new Response("forbidden", { status: 403 })),
45
+ timeoutMs: 100,
46
+ expected: "HTTP 403",
47
+ },
48
+ {
49
+ name: "a timeout",
50
+ fetchImpl: vi.fn().mockResolvedValue(new Response("unavailable", { status: 530 })),
51
+ timeoutMs: 2,
52
+ expected: "HTTP 530",
53
+ },
54
+ ])("closes the proxy handle after $name", async ({ fetchImpl, timeoutMs, expected }) => {
55
+ const close = vi.fn(async () => { });
56
+ await expect(waitForPublicReadiness("https://example.test", {
57
+ intervalMs: 1,
58
+ timeoutMs,
59
+ proxyResolver: async () => "http://127.0.0.1:7897/",
60
+ proxyFetchFactory: () => ({ fetch: fetchImpl, close }),
61
+ })).rejects.toThrow(expected);
62
+ expect(close).toHaveBeenCalledOnce();
63
+ });
64
+ it("closes the proxy handle when readiness is aborted", async () => {
65
+ const controller = new AbortController();
66
+ const close = vi.fn(async () => { });
67
+ const proxiedFetch = vi.fn().mockImplementation(async () => {
68
+ controller.abort();
69
+ throw new Error("request aborted");
70
+ });
71
+ await expect(waitForPublicReadiness("https://example.test", {
72
+ signal: controller.signal,
73
+ proxyResolver: async () => "http://127.0.0.1:7897/",
74
+ proxyFetchFactory: () => ({ fetch: proxiedFetch, close }),
75
+ })).rejects.toThrow("public tunnel readiness aborted");
76
+ expect(close).toHaveBeenCalledOnce();
77
+ });
78
+ it("does not create a proxy handle in direct mode", async () => {
79
+ const proxyFetchFactory = vi.fn();
80
+ const directFetch = vi.spyOn(globalThis, "fetch").mockResolvedValueOnce(Response.json({ authenticated: false, needsSetup: true }));
81
+ try {
82
+ await waitForPublicReadiness("https://example.test", {
83
+ proxyResolver: async () => null,
84
+ proxyFetchFactory,
85
+ });
86
+ }
87
+ finally {
88
+ directFetch.mockRestore();
89
+ }
90
+ expect(proxyFetchFactory).not.toHaveBeenCalled();
91
+ });
92
+ it("skips proxy discovery when a fetch implementation is injected", async () => {
93
+ const proxyResolver = vi.fn(async () => "http://127.0.0.1:7897/");
94
+ const proxyFetchFactory = vi.fn();
95
+ const fetchImpl = vi.fn().mockResolvedValue(Response.json({ authenticated: false, needsSetup: true }));
96
+ await waitForPublicReadiness("https://example.test", {
97
+ fetchImpl,
98
+ proxyResolver,
99
+ proxyFetchFactory,
100
+ });
101
+ expect(proxyResolver).not.toHaveBeenCalled();
102
+ expect(proxyFetchFactory).not.toHaveBeenCalled();
103
+ });
104
+ });
@@ -0,0 +1,43 @@
1
+ import { ensureCloudflared } from "../cloudflared/installer.js";
2
+ import { CloudflareTunnelProvider } from "./cloudflare-provider.js";
3
+ import { CustomCommandTunnelProvider } from "./custom-command-provider.js";
4
+ import { PinggyTunnelProvider } from "./pinggy-provider.js";
5
+ import { waitForPublicReadiness } from "./public-readiness.js";
6
+ export async function selectRelay(options) {
7
+ if (options.cli.localOnly)
8
+ return { tunnel: null, publicUrl: options.lanUrl, provider: "lan", failures: [] };
9
+ const providers = options.cli.relay === "auto" ? ["cloudflare", "pinggy"] : [options.cli.relay];
10
+ const failures = [];
11
+ const readiness = options.readiness ?? waitForPublicReadiness;
12
+ for (const providerName of providers) {
13
+ options.onAttempt?.(providerName);
14
+ let tunnel = null;
15
+ try {
16
+ const provider = await createProvider(providerName, options);
17
+ tunnel = await provider.start({ localUrl: options.localUrl, signal: options.signal, log: options.log });
18
+ await readiness(tunnel.publicUrl, { signal: options.signal });
19
+ return { tunnel, publicUrl: tunnel.publicUrl, provider: providerName, failures };
20
+ }
21
+ catch (error) {
22
+ await tunnel?.close().catch(() => { });
23
+ const message = error instanceof Error ? error.message : String(error);
24
+ failures.push({ provider: providerName, message });
25
+ options.onFailure?.(providerName, message);
26
+ if (options.signal.aborted)
27
+ break;
28
+ }
29
+ }
30
+ return { tunnel: null, publicUrl: options.lanUrl, provider: "lan", failures };
31
+ }
32
+ async function createProvider(name, options) {
33
+ const override = options.providerFactories?.[name];
34
+ if (override)
35
+ return await override();
36
+ if (name === "cloudflare") {
37
+ const executable = await ensureCloudflared(options.target, options.cli.dataDir);
38
+ return new CloudflareTunnelProvider(executable);
39
+ }
40
+ if (name === "pinggy")
41
+ return new PinggyTunnelProvider(options.port, options.cli.dataDir);
42
+ return new CustomCommandTunnelProvider(options.cli.tunnelCommand, options.port);
43
+ }
@@ -0,0 +1,72 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+ import { selectRelay } from "./relay-orchestrator.js";
3
+ describe("selectRelay", () => {
4
+ it("selects Cloudflare when it becomes ready", async () => {
5
+ const cloudflare = fakeProvider("https://ready.trycloudflare.com");
6
+ const result = await selectRelay(options("auto", { cloudflare }));
7
+ expect(result.provider).toBe("cloudflare");
8
+ expect(result.publicUrl).toContain("trycloudflare.com");
9
+ });
10
+ it("closes failed Cloudflare and selects Pinggy", async () => {
11
+ const cloudflare = fakeProvider("https://bad.trycloudflare.com");
12
+ const pinggy = fakeProvider("https://good.run.pinggy-free.link");
13
+ const readiness = vi.fn(async (url) => {
14
+ if (url.includes("bad"))
15
+ throw new Error("HTTP 530");
16
+ });
17
+ const result = await selectRelay(options("auto", { cloudflare, pinggy }, readiness));
18
+ expect(cloudflare.handle.close).toHaveBeenCalledOnce();
19
+ expect(result.provider).toBe("pinggy");
20
+ expect(result.failures).toEqual([{ provider: "cloudflare", message: "HTTP 530" }]);
21
+ });
22
+ it("falls back to LAN when both public providers fail", async () => {
23
+ const cloudflare = fakeProvider("https://bad.trycloudflare.com");
24
+ const pinggy = fakeProvider("https://bad.run.pinggy-free.link");
25
+ const result = await selectRelay(options("auto", { cloudflare, pinggy }, async () => { throw new Error("blocked"); }));
26
+ expect(result.provider).toBe("lan");
27
+ expect(result.publicUrl).toBe("http://10.0.0.2:43210");
28
+ expect(result.failures).toHaveLength(2);
29
+ });
30
+ it("bypasses every public provider in local-only mode", async () => {
31
+ const cloudflare = fakeProvider("https://unused.trycloudflare.com");
32
+ const result = await selectRelay({ ...options("auto", { cloudflare }), cli: cli("auto", true) });
33
+ expect(result.provider).toBe("lan");
34
+ expect(cloudflare.provider.start).not.toHaveBeenCalled();
35
+ });
36
+ });
37
+ function options(relay, providers, readiness = async () => { }) {
38
+ return {
39
+ cli: cli(relay),
40
+ target: "darwin-arm64",
41
+ localUrl: "http://127.0.0.1:43210",
42
+ lanUrl: "http://10.0.0.2:43210",
43
+ port: 43210,
44
+ signal: new AbortController().signal,
45
+ log: vi.fn(),
46
+ readiness: readiness,
47
+ providerFactories: Object.fromEntries(Object.entries(providers).map(([name, value]) => [name, async () => value.provider])),
48
+ };
49
+ }
50
+ function cli(relay, localOnly = false) {
51
+ return {
52
+ command: "start",
53
+ roots: [process.cwd()],
54
+ port: null,
55
+ relay,
56
+ tunnelCommand: relay === "custom" ? "relay {port}" : null,
57
+ localOnly,
58
+ qr: false,
59
+ dataDir: "/tmp/agentroam-test",
60
+ };
61
+ }
62
+ function fakeProvider(publicUrl) {
63
+ const handle = {
64
+ publicUrl,
65
+ close: vi.fn(async () => { }),
66
+ exited: new Promise(() => { }),
67
+ };
68
+ const provider = {
69
+ start: vi.fn(async () => handle),
70
+ };
71
+ return { provider, handle };
72
+ }
package/package.json CHANGED
@@ -1,20 +1,37 @@
1
1
  {
2
2
  "name": "agentroam",
3
- "version": "0.2.0-preview.2",
3
+ "version": "0.2.0-preview.4",
4
4
  "description": "Zero-install mobile remote terminal and file console",
5
5
  "type": "module",
6
- "bin": { "agentroam": "./bin/agentroam.mjs" },
7
- "engines": { "node": ">=22 <23" },
8
- "os": ["darwin"],
9
- "cpu": ["arm64"],
10
- "files": ["bin", "dist", "runtime", "README.md"],
6
+ "bin": {
7
+ "agentroam": "./bin/agentroam.mjs"
8
+ },
9
+ "engines": {
10
+ "node": ">=22 <23"
11
+ },
12
+ "os": [
13
+ "darwin"
14
+ ],
15
+ "cpu": [
16
+ "arm64"
17
+ ],
18
+ "files": [
19
+ "bin",
20
+ "dist",
21
+ "runtime",
22
+ "README.md"
23
+ ],
11
24
  "scripts": {
12
25
  "build": "tsc -p tsconfig.json",
13
26
  "test": "vitest run --root ../.. packages/cli/src",
14
27
  "prepack": "node ../../scripts/stage-cli-runtime.mjs && npm run build"
15
28
  },
16
29
  "dependencies": {
17
- "qrcode-terminal": "^0.12.0"
30
+ "qrcode-terminal": "^0.12.0",
31
+ "undici": "^6.25.0"
32
+ },
33
+ "optionalDependencies": {
34
+ "agentroam-cloudflared-darwin-arm64": "0.2.0-preview.4"
18
35
  },
19
36
  "devDependencies": {
20
37
  "@types/node": "^22.0.0",
@@ -23,5 +40,9 @@
23
40
  "vitest": "^2.1.0"
24
41
  },
25
42
  "license": "MIT",
26
- "publishConfig": { "access": "public", "provenance": true, "tag": "preview" }
43
+ "publishConfig": {
44
+ "access": "public",
45
+ "provenance": true,
46
+ "tag": "preview"
47
+ }
27
48
  }
@@ -1 +1 @@
1
- 47UkTmBGxP5qz2mnMbNEp
1
+ dclalTmecO-HMVQvSKG7g
@@ -1,25 +1,25 @@
1
1
  {
2
2
  "pages": {
3
3
  "/_not-found/page": [
4
- "static/chunks/webpack-e56f3a1950168597.js",
4
+ "static/chunks/webpack-0c872a6ee48cbbdf.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-e56f3a1950168597.js",
11
+ "static/chunks/webpack-0c872a6ee48cbbdf.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-e56f3a1950168597.js",
18
+ "static/chunks/webpack-0c872a6ee48cbbdf.js",
19
19
  "static/chunks/3cc391f0-17a90b8b534c353f.js",
20
20
  "static/chunks/183-9c8ca0c781655214.js",
21
21
  "static/chunks/main-app-07d67f2d4e96ecb8.js",
22
- "static/chunks/app/web/page-800bcc7d84eb45e4.js"
22
+ "static/chunks/app/web/page-02e0df331bb14489.js"
23
23
  ]
24
24
  }
25
25
  }
@@ -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","/web/page":"/web","/api/web-console/preferences/route":"/api/web-console/preferences"}
1
+ {"/_not-found/page":"/_not-found","/api/agent/answer/route":"/api/agent/answer","/api/agent/steer/route":"/api/agent/steer","/api/agent/model/route":"/api/agent/model","/api/agent/stream/route":"/api/agent/stream","/api/agent/run/route":"/api/agent/run","/api/auth/verify/route":"/api/auth/verify","/api/mcp/servers/route":"/api/mcp/servers","/api/agent/abort/route":"/api/agent/abort","/api/mcp/connect/route":"/api/mcp/connect","/api/mcp/disconnect/route":"/api/mcp/disconnect","/api/memory/route":"/api/memory","/api/plugins/load/route":"/api/plugins/load","/api/memory/[key]/route":"/api/memory/[key]","/api/sessions/[id]/route":"/api/sessions/[id]","/api/sessions/route":"/api/sessions","/api/web-auth/login/route":"/api/web-auth/login","/api/remote-tools/register/route":"/api/remote-tools/register","/api/tools/route":"/api/tools","/api/web-auth/logout/route":"/api/web-auth/logout","/api/skills/route":"/api/skills","/api/web-console/history/route":"/api/web-console/history","/api/web-console/preferences/route":"/api/web-console/preferences","/web/page":"/web","/api/web-auth/status/route":"/api/web-auth/status","/api/web-auth/setup/route":"/api/web-auth/setup","/api/web-auth/revoke-all/route":"/api/web-auth/revoke-all","/api/web-console/bootstrap/route":"/api/web-console/bootstrap","/api/web-console/device-state/route":"/api/web-console/device-state"}
@@ -5,26 +5,26 @@
5
5
  "devFiles": [],
6
6
  "ampDevFiles": [],
7
7
  "lowPriorityFiles": [
8
- "static/47UkTmBGxP5qz2mnMbNEp/_buildManifest.js",
9
- "static/47UkTmBGxP5qz2mnMbNEp/_ssgManifest.js"
8
+ "static/dclalTmecO-HMVQvSKG7g/_buildManifest.js",
9
+ "static/dclalTmecO-HMVQvSKG7g/_ssgManifest.js"
10
10
  ],
11
11
  "rootMainFiles": [
12
- "static/chunks/webpack-e56f3a1950168597.js",
12
+ "static/chunks/webpack-0c872a6ee48cbbdf.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-e56f3a1950168597.js",
19
+ "static/chunks/webpack-0c872a6ee48cbbdf.js",
20
20
  "static/chunks/framework-7bac12ed8564755e.js",
21
- "static/chunks/main-a7dd8c98b48af038.js",
21
+ "static/chunks/main-30618c50527ce4e9.js",
22
22
  "static/chunks/pages/_app-389e6eb8abb0af2d.js"
23
23
  ],
24
24
  "/_error": [
25
- "static/chunks/webpack-e56f3a1950168597.js",
25
+ "static/chunks/webpack-0c872a6ee48cbbdf.js",
26
26
  "static/chunks/framework-7bac12ed8564755e.js",
27
- "static/chunks/main-a7dd8c98b48af038.js",
27
+ "static/chunks/main-30618c50527ce4e9.js",
28
28
  "static/chunks/pages/_error-7cee5565b5ef9bcb.js"
29
29
  ]
30
30
  },
@@ -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":"0af636afc19ab68c44e9bd62292fc881","previewModeSigningKey":"caa70e362b360c34d50464aedc11fc9f87188558c2f73db64aa140e202537a99","previewModeEncryptionKey":"cde15007d3b688af515c866e64c77d1c2c48b51c17aea455daf25708b0bf1baa"}}
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/agent/model":{"initialHeaders":{"content-type":"application/json","x-next-cache-tags":"_N_T_/layout,_N_T_/api/layout,_N_T_/api/agent/layout,_N_T_/api/agent/model/layout,_N_T_/api/agent/model/route,_N_T_/api/agent/model"},"experimentalBypassFor":[{"type":"header","key":"Next-Action"},{"type":"header","key":"content-type","value":"multipart/form-data;.*"}],"initialRevalidateSeconds":false,"srcRoute":"/api/agent/model","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":"553ea2da2b4f8a0af8efd13deb7ec2cd","previewModeSigningKey":"21a93032f898b9b027a6f1e889aa452570c8c16547bf4c84d08ed5ca802271e0","previewModeEncryptionKey":"779860d795124150227be8931b574c90419690ab8ccc016567b7b9f4b5702752"}}
@@ -12,11 +12,11 @@
12
12
  ]
13
13
  },
14
14
  "app/web/page.tsx -> ./TerminalPane": {
15
- "id": 1587,
15
+ "id": 3366,
16
16
  "files": [
17
17
  "static/css/ac3c182a4b5bc5f1.css",
18
18
  "static/chunks/f3dd23f1.b423f4328b6ce988.js",
19
- "static/chunks/804.0e20fa702013ffef.js"
19
+ "static/chunks/982.9e87a5cc0e6b13cf.js"
20
20
  ]
21
21
  }
22
22
  }
@@ -1 +1 @@
1
- globalThis.__RSC_MANIFEST=(globalThis.__RSC_MANIFEST||{});globalThis.__RSC_MANIFEST["/_not-found/page"]={"moduleLoading":{"prefix":"/_next/","crossOrigin":null},"ssrModuleMapping":{"1338":{"*":{"id":"8718","name":"*","chunks":[],"async":false}},"1573":{"*":{"id":"8781","name":"*","chunks":[],"async":false}},"5153":{"*":{"id":"5730","name":"*","chunks":[],"async":false}},"5613":{"*":{"id":"8949","name":"*","chunks":[],"async":false}},"6554":{"*":{"id":"6569","name":"*","chunks":[],"async":false}},"7709":{"*":{"id":"1782","name":"*","chunks":[],"async":false}},"9011":{"*":{"id":"7415","name":"*","chunks":[],"async":false}}},"edgeSSRModuleMapping":{},"clientModules":{"/Users/caoqu/team-agent/customer-agent/node_modules/.bun/next@14.2.35+6dbf9a050bc9aadb/node_modules/next/dist/client/components/app-router.js":{"id":7709,"name":"*","chunks":[],"async":false},"/Users/caoqu/team-agent/customer-agent/node_modules/.bun/next@14.2.35+6dbf9a050bc9aadb/node_modules/next/dist/esm/client/components/app-router.js":{"id":7709,"name":"*","chunks":[],"async":false},"/Users/caoqu/team-agent/customer-agent/node_modules/.bun/next@14.2.35+6dbf9a050bc9aadb/node_modules/next/dist/client/components/client-page.js":{"id":5613,"name":"*","chunks":[],"async":false},"/Users/caoqu/team-agent/customer-agent/node_modules/.bun/next@14.2.35+6dbf9a050bc9aadb/node_modules/next/dist/esm/client/components/client-page.js":{"id":5613,"name":"*","chunks":[],"async":false},"/Users/caoqu/team-agent/customer-agent/node_modules/.bun/next@14.2.35+6dbf9a050bc9aadb/node_modules/next/dist/client/components/error-boundary.js":{"id":6554,"name":"*","chunks":[],"async":false},"/Users/caoqu/team-agent/customer-agent/node_modules/.bun/next@14.2.35+6dbf9a050bc9aadb/node_modules/next/dist/esm/client/components/error-boundary.js":{"id":6554,"name":"*","chunks":[],"async":false},"/Users/caoqu/team-agent/customer-agent/node_modules/.bun/next@14.2.35+6dbf9a050bc9aadb/node_modules/next/dist/client/components/layout-router.js":{"id":1338,"name":"*","chunks":[],"async":false},"/Users/caoqu/team-agent/customer-agent/node_modules/.bun/next@14.2.35+6dbf9a050bc9aadb/node_modules/next/dist/esm/client/components/layout-router.js":{"id":1338,"name":"*","chunks":[],"async":false},"/Users/caoqu/team-agent/customer-agent/node_modules/.bun/next@14.2.35+6dbf9a050bc9aadb/node_modules/next/dist/client/components/not-found-boundary.js":{"id":9011,"name":"*","chunks":[],"async":false},"/Users/caoqu/team-agent/customer-agent/node_modules/.bun/next@14.2.35+6dbf9a050bc9aadb/node_modules/next/dist/esm/client/components/not-found-boundary.js":{"id":9011,"name":"*","chunks":[],"async":false},"/Users/caoqu/team-agent/customer-agent/node_modules/.bun/next@14.2.35+6dbf9a050bc9aadb/node_modules/next/dist/client/components/render-from-template-context.js":{"id":1573,"name":"*","chunks":[],"async":false},"/Users/caoqu/team-agent/customer-agent/node_modules/.bun/next@14.2.35+6dbf9a050bc9aadb/node_modules/next/dist/esm/client/components/render-from-template-context.js":{"id":1573,"name":"*","chunks":[],"async":false},"/Users/caoqu/team-agent/customer-agent/packages/server/app/web/page.tsx":{"id":5153,"name":"*","chunks":[],"async":false}},"entryCSSFiles":{"/Users/caoqu/team-agent/customer-agent/packages/server/":[],"/Users/caoqu/team-agent/customer-agent/packages/server/app/layout":[],"/Users/caoqu/team-agent/customer-agent/packages/server/app/_not-found/page":[]}}
1
+ globalThis.__RSC_MANIFEST=(globalThis.__RSC_MANIFEST||{});globalThis.__RSC_MANIFEST["/_not-found/page"]={"moduleLoading":{"prefix":"/_next/","crossOrigin":null},"ssrModuleMapping":{"1338":{"*":{"id":"8718","name":"*","chunks":[],"async":false}},"1573":{"*":{"id":"8781","name":"*","chunks":[],"async":false}},"1620":{"*":{"id":"4735","name":"*","chunks":[],"async":false}},"5613":{"*":{"id":"8949","name":"*","chunks":[],"async":false}},"6554":{"*":{"id":"6569","name":"*","chunks":[],"async":false}},"7709":{"*":{"id":"1782","name":"*","chunks":[],"async":false}},"9011":{"*":{"id":"7415","name":"*","chunks":[],"async":false}}},"edgeSSRModuleMapping":{},"clientModules":{"/Users/caoqu/team-agent/customer-agent/node_modules/.bun/next@14.2.35+6dbf9a050bc9aadb/node_modules/next/dist/client/components/app-router.js":{"id":7709,"name":"*","chunks":[],"async":false},"/Users/caoqu/team-agent/customer-agent/node_modules/.bun/next@14.2.35+6dbf9a050bc9aadb/node_modules/next/dist/esm/client/components/app-router.js":{"id":7709,"name":"*","chunks":[],"async":false},"/Users/caoqu/team-agent/customer-agent/node_modules/.bun/next@14.2.35+6dbf9a050bc9aadb/node_modules/next/dist/client/components/client-page.js":{"id":5613,"name":"*","chunks":[],"async":false},"/Users/caoqu/team-agent/customer-agent/node_modules/.bun/next@14.2.35+6dbf9a050bc9aadb/node_modules/next/dist/esm/client/components/client-page.js":{"id":5613,"name":"*","chunks":[],"async":false},"/Users/caoqu/team-agent/customer-agent/node_modules/.bun/next@14.2.35+6dbf9a050bc9aadb/node_modules/next/dist/client/components/error-boundary.js":{"id":6554,"name":"*","chunks":[],"async":false},"/Users/caoqu/team-agent/customer-agent/node_modules/.bun/next@14.2.35+6dbf9a050bc9aadb/node_modules/next/dist/esm/client/components/error-boundary.js":{"id":6554,"name":"*","chunks":[],"async":false},"/Users/caoqu/team-agent/customer-agent/node_modules/.bun/next@14.2.35+6dbf9a050bc9aadb/node_modules/next/dist/client/components/layout-router.js":{"id":1338,"name":"*","chunks":[],"async":false},"/Users/caoqu/team-agent/customer-agent/node_modules/.bun/next@14.2.35+6dbf9a050bc9aadb/node_modules/next/dist/esm/client/components/layout-router.js":{"id":1338,"name":"*","chunks":[],"async":false},"/Users/caoqu/team-agent/customer-agent/node_modules/.bun/next@14.2.35+6dbf9a050bc9aadb/node_modules/next/dist/client/components/not-found-boundary.js":{"id":9011,"name":"*","chunks":[],"async":false},"/Users/caoqu/team-agent/customer-agent/node_modules/.bun/next@14.2.35+6dbf9a050bc9aadb/node_modules/next/dist/esm/client/components/not-found-boundary.js":{"id":9011,"name":"*","chunks":[],"async":false},"/Users/caoqu/team-agent/customer-agent/node_modules/.bun/next@14.2.35+6dbf9a050bc9aadb/node_modules/next/dist/client/components/render-from-template-context.js":{"id":1573,"name":"*","chunks":[],"async":false},"/Users/caoqu/team-agent/customer-agent/node_modules/.bun/next@14.2.35+6dbf9a050bc9aadb/node_modules/next/dist/esm/client/components/render-from-template-context.js":{"id":1573,"name":"*","chunks":[],"async":false},"/Users/caoqu/team-agent/customer-agent/packages/server/app/web/page.tsx":{"id":1620,"name":"*","chunks":[],"async":false}},"entryCSSFiles":{"/Users/caoqu/team-agent/customer-agent/packages/server/":[],"/Users/caoqu/team-agent/customer-agent/packages/server/app/layout":[],"/Users/caoqu/team-agent/customer-agent/packages/server/app/_not-found/page":[]}}
@@ -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-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,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;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>
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-0c872a6ee48cbbdf.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,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;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-0c872a6ee48cbbdf.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\":\"dclalTmecO-HMVQvSKG7g\",\"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:["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"}]]]]]
7
+ 0:["dclalTmecO-HMVQvSKG7g",[[["",{"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
- "use strict";(()=>{var e={};e.id=816,e.ids=[816],e.modules={5890:e=>{e.exports=require("better-sqlite3")},399:e=>{e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},517:e=>{e.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},9801:e=>{e.exports=require("os")},7718:e=>{e.exports=require("node:child_process")},6005:e=>{e.exports=require("node:crypto")},5673:e=>{e.exports=require("node:events")},7561:e=>{e.exports=require("node:fs")},3977:e=>{e.exports=require("node:fs/promises")},8849:e=>{e.exports=require("node:http")},2286:e=>{e.exports=require("node:https")},612:e=>{e.exports=require("node:os")},9411:e=>{e.exports=require("node:path")},1747:e=>{e.exports=require("node:readline")},1041:e=>{e.exports=require("node:url")},6276:(e,t,s)=>{s.r(t),s.d(t,{originalPathname:()=>m,patchFetch:()=>g,requestAsyncStorage:()=>p,routeModule:()=>d,serverHooks:()=>h,staticGenerationAsyncStorage:()=>c});var o={};s.r(o),s.d(o,{POST:()=>u});var r=s(7786),i=s(5042),n=s(2184),a=s(1890),l=s(7186);async function u(){return l.f.abort(),a.NextResponse.json({status:"aborted"})}let d=new r.AppRouteRouteModule({definition:{kind:i.x.APP_ROUTE,page:"/api/agent/abort/route",pathname:"/api/agent/abort",filename:"route",bundlePath:"app/api/agent/abort/route"},resolvedPagePath:"/Users/caoqu/team-agent/customer-agent/packages/server/app/api/agent/abort/route.ts",nextConfigOutput:"standalone",userland:o}),{requestAsyncStorage:p,staticGenerationAsyncStorage:c,serverHooks:h}=d,m="/api/agent/abort/route";function g(){return(0,n.patchFetch)({serverHooks:h,staticGenerationAsyncStorage:c})}},7186:(e,t,s)=>{s.d(t,{f:()=>a});var o=s(1322),r=s(785);class i{constructor(){this.baseDir=(0,r.k)(),this.agent=null,this.builder=null,this.sessionStore=new o.m6(this.baseDir),this.projectStore=new o.XW(this.baseDir),this.remoteToolStore=new o.rt((0,o.N8)(this.baseDir).db),this.defaultRemoteToolsProjectId=process.env.AGENT_PROJECT_ID??"default",this.activeRun=null,this.subscribers=new Map,this.pendingQuestions=new Map;let e=process.env.AGENT_API_KEY,t=process.env.AGENT_MODEL_PROVIDER||"openai",s=process.env.AGENT_MODEL_ID||"gpt-4o",i=process.env.AGENT_BASE_URL||void 0,n=new o.Y4().withSessionStore(this.sessionStore);n.withRemoteToolStore(this.remoteToolStore,this.defaultRemoteToolsProjectId),e&&n.withModel(t,{apiKey:e,modelId:s,baseUrl:i}),this.builder=n}getBuilder(){return this.builder||(this.builder=new o.Y4),this.builder}setBuilder(e){e.withRemoteToolStore(this.remoteToolStore,this.defaultRemoteToolsProjectId),this.builder=e}getSessionStore(){return this.sessionStore}registerRemoteTools(e,t){return this.remoteToolStore.upsertTools(e,t)}getRemoteToolStore(){return this.remoteToolStore}async createSession(e,t=""){let s=new Date().toISOString();return t&&!await this.projectStore.get(t)&&await this.projectStore.create({id:t,name:t,description:"",created:s,updated:s}),this.sessionStore.create({id:crypto.randomUUID(),projectId:t,title:e,status:"idle",messages:[],events:[],created:s,updated:s,metadata:{}})}subscribe(e,t){let s=this.subscribers.get(e)??new Set;return s.add(t),this.subscribers.set(e,s),()=>{s.delete(t),0===s.size&&this.subscribers.delete(e)}}emit(e,t){for(let s of this.subscribers.get(e)??[])try{s(t)}catch{}}projectMessagesFromEvents(e){let t=[],s=null;for(let o of e){if("text_chunk"===o.type){s||(s={role:"assistant",content:""},t.push(s)),s.content+=o.text;continue}if("tool_call"===o.type){s&&!s.toolCalls?s.toolCalls=[o.toolCall]:t.push({role:"assistant",content:"",toolCalls:[o.toolCall]}),s=null;continue}if("tool_result"===o.type){t.push({role:"tool",content:o.result.content,toolCallId:o.result.toolCallId});continue}if("ask_user"===o.type){t.push({role:"assistant",content:""}),s=null;continue}"done"===o.type&&(s?s.content=o.finalText||s.content:o.finalText?.trim()&&t.push({role:"assistant",content:o.finalText}),s=null)}return t}async run(e,t){let s;let r=await this.sessionStore.get(t);await this.sessionStore.addMessage(t,{role:"user",content:e});let i=r?.projectId||this.defaultRemoteToolsProjectId;try{s=await this.getBuilder().withRemoteToolStore(this.remoteToolStore,i).withTool(new o.as(async e=>this.createQuestion(e,t))).build()}catch(e){throw this.emit(t,{type:"error",message:e instanceof Error?e.message:"Failed to build agent"}),e}finally{this.builder?.withRemoteToolStore(this.remoteToolStore,this.defaultRemoteToolsProjectId)}this.activeRun=s.run(e,t);let n=!1;for await(let e of this.activeRun)await this.sessionStore.addEvent(t,e),"error"===e.type?(n=!0,await this.sessionStore.update(t,{status:"failed"})):"done"!==e.type||n||(e.finalText.trim()&&await this.sessionStore.addMessage(t,{role:"assistant",content:e.finalText}),await this.sessionStore.update(t,{status:"completed"})),this.emit(t,e);try{let e=await this.sessionStore.get(t),s=(e?.messages??[]).filter(e=>"user"===e.role),o=this.projectMessagesFromEvents(e?.events??[]);await this.sessionStore.replaceMessages(t,[...s,...o])}catch{}}createQuestion(e,t){let s=crypto.randomUUID();return this.emit(t,{type:"ask_user",questionId:s,question:e.question,options:e.options,multiSelect:e.multiSelect}),new Promise((e,t)=>{let o=setTimeout(()=>{this.pendingQuestions.has(s)&&(this.pendingQuestions.delete(s),t(Error("Question timed out after 5 minutes")))},3e5);this.pendingQuestions.set(s,{resolve:e,reject:t,timer:o})})}answerQuestion(e,t,s){let o=this.pendingQuestions.get(e);return!!o&&(clearTimeout(o.timer),this.pendingQuestions.delete(e),o.resolve({answer:t,selectedIndices:s}),!0)}abort(){this.agent?.abort(),this.activeRun=null}}let n=globalThis,a=n.__agentHost??new i;n.__agentHost=a},785:(e,t,s)=>{s.d(t,{k:()=>n});var o=s(1041),r=s(9411);let i=(0,r.resolve)((0,r.dirname)((0,o.fileURLToPath)("file:///Users/caoqu/team-agent/customer-agent/packages/server/lib/server-data-dir.ts")),"..");function n(){return function(e=process.env,t=i){return(0,r.resolve)(e.AGENT_DATA_DIR?.trim()||t)}()}}};var t=require("../../../../webpack-runtime.js");t.C(e);var s=e=>t(t.s=e),o=t.X(0,[375,703,322],()=>s(6276));module.exports=o})();
1
+ "use strict";(()=>{var e={};e.id=816,e.ids=[816],e.modules={5890:e=>{e.exports=require("better-sqlite3")},399:e=>{e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},517:e=>{e.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},9801:e=>{e.exports=require("os")},7718:e=>{e.exports=require("node:child_process")},6005:e=>{e.exports=require("node:crypto")},5673:e=>{e.exports=require("node:events")},7561:e=>{e.exports=require("node:fs")},3977:e=>{e.exports=require("node:fs/promises")},8849:e=>{e.exports=require("node:http")},2286:e=>{e.exports=require("node:https")},612:e=>{e.exports=require("node:os")},9411:e=>{e.exports=require("node:path")},1747:e=>{e.exports=require("node:readline")},1041:e=>{e.exports=require("node:url")},6276:(e,t,s)=>{s.r(t),s.d(t,{originalPathname:()=>g,patchFetch:()=>m,requestAsyncStorage:()=>c,routeModule:()=>d,serverHooks:()=>p,staticGenerationAsyncStorage:()=>h});var o={};s.r(o),s.d(o,{POST:()=>u});var r=s(7786),i=s(5042),n=s(2184),a=s(1890),l=s(7186);async function u(){return l.f.abort(),a.NextResponse.json({status:"aborted"})}let d=new r.AppRouteRouteModule({definition:{kind:i.x.APP_ROUTE,page:"/api/agent/abort/route",pathname:"/api/agent/abort",filename:"route",bundlePath:"app/api/agent/abort/route"},resolvedPagePath:"/Users/caoqu/team-agent/customer-agent/packages/server/app/api/agent/abort/route.ts",nextConfigOutput:"standalone",userland:o}),{requestAsyncStorage:c,staticGenerationAsyncStorage:h,serverHooks:p}=d,g="/api/agent/abort/route";function m(){return(0,n.patchFetch)({serverHooks:p,staticGenerationAsyncStorage:h})}},7186:(e,t,s)=>{s.d(t,{f:()=>a});var o=s(1322),r=s(785);class i{constructor(){this.baseDir=(0,r.k)(),this.builder=null,this.sessionStore=new o.m6(this.baseDir),this.projectStore=new o.XW(this.baseDir),this.remoteToolStore=new o.rt((0,o.N8)(this.baseDir).db),this.defaultRemoteToolsProjectId=process.env.AGENT_PROJECT_ID??"default",this.activeRun=null,this.activeAgent=null,this.activeRunSessionId=null,this.subscribers=new Map,this.recentEvents=new Map,this.eventCounters=new Map,this.pendingQuestions=new Map;let e=process.env.AGENT_API_KEY,t=process.env.AGENT_MODEL_PROVIDER||"openai",s=process.env.AGENT_MODEL_ID||"gpt-4o",i=process.env.AGENT_BASE_URL||void 0,n=new o.Y4().withSessionStore(this.sessionStore);n.withRemoteToolStore(this.remoteToolStore,this.defaultRemoteToolsProjectId),e&&n.withModel(t,{apiKey:e,modelId:s,baseUrl:i}),this.builder=n}getBuilder(){return this.builder||(this.builder=new o.Y4),this.builder}setBuilder(e){e.withRemoteToolStore(this.remoteToolStore,this.defaultRemoteToolsProjectId),this.builder=e}getSessionStore(){return this.sessionStore}getModelConfig(){return{provider:process.env.AGENT_MODEL_PROVIDER||"openai",modelId:process.env.AGENT_MODEL_ID||"gpt-4o",baseUrl:process.env.AGENT_BASE_URL||""}}getWebAppBuildId(){return globalThis.__webAppBuildId??""}registerRemoteTools(e,t){return this.remoteToolStore.upsertTools(e,t)}getRemoteToolStore(){return this.remoteToolStore}async createSession(e,t=""){let s=new Date().toISOString();return t&&!await this.projectStore.get(t)&&await this.projectStore.create({id:t,name:t,description:"",created:s,updated:s}),this.sessionStore.create({id:crypto.randomUUID(),projectId:t,title:e,status:"idle",messages:[],events:[],created:s,updated:s,metadata:{}})}getLatestEventId(e){return this.eventCounters.get(e)??0}subscribe(e,t,s=-1){for(let o of this.recentEvents.get(e)??[])if(!(o.id<=s))try{t(o.event,o.id)}catch{}let o=this.subscribers.get(e)??new Set;return o.add(t),this.subscribers.set(e,o),()=>{o.delete(t),0===o.size&&this.subscribers.delete(e)}}emit(e,t){let s=(this.eventCounters.get(e)??0)+1;this.eventCounters.set(e,s);let o=this.recentEvents.get(e);for(let r of(o&&(o.push({id:s,event:t}),o.length>500&&o.splice(0,o.length-500)),this.subscribers.get(e)??[]))try{r(t,s)}catch{}}projectMessagesFromEvents(e){let t=[],s=null;for(let o of e){if("text_chunk"===o.type){s||(s={role:"assistant",content:""},t.push(s)),s.content+=o.text;continue}if("tool_call"===o.type){s&&!s.toolCalls?s.toolCalls=[o.toolCall]:t.push({role:"assistant",content:"",toolCalls:[o.toolCall]}),s=null;continue}if("tool_result"===o.type){t.push({role:"tool",content:o.result.content,toolCallId:o.result.toolCallId});continue}if("ask_user"===o.type){t.push({role:"assistant",content:""}),s=null;continue}"done"===o.type&&(s?s.content=o.finalText||s.content:o.finalText?.trim()&&t.push({role:"assistant",content:o.finalText}),s=null)}return t}async run(e,t,s){let r;let i=await this.sessionStore.get(t);await this.sessionStore.addMessage(t,{role:"user",content:e}),this.eventCounters.set(t,0),this.recentEvents.set(t,[]);let n=i?.projectId||this.defaultRemoteToolsProjectId;try{r=await this.getBuilder().withRemoteToolStore(this.remoteToolStore,n).withTool(new o.as(async e=>this.createQuestion(e,t))).build()}catch(s){let e={type:"error",message:s instanceof Error?s.message:"Failed to build agent"};try{await this.sessionStore.addEvent(t,e)}catch{}throw this.emit(t,e),s}finally{this.builder?.withRemoteToolStore(this.remoteToolStore,this.defaultRemoteToolsProjectId)}this.activeAgent=r,this.activeRunSessionId=t,this.activeRun=r.run(e,t,s);let a=!1;try{for await(let e of this.activeRun)await this.sessionStore.addEvent(t,e),"error"===e.type?(a=!0,await this.sessionStore.update(t,{status:"failed"})):"done"!==e.type||a||(e.finalText.trim()&&await this.sessionStore.addMessage(t,{role:"assistant",content:e.finalText}),await this.sessionStore.update(t,{status:"completed"})),this.emit(t,e)}catch(s){a=!0;let e={type:"error",message:s instanceof Error?s.message:"Agent run failed"};try{await this.sessionStore.addEvent(t,e),await this.sessionStore.update(t,{status:"failed"})}catch{}this.emit(t,e)}finally{this.activeRunSessionId===t&&(this.activeAgent=null,this.activeRunSessionId=null),this.activeRun=null}try{let e=await this.sessionStore.get(t),s=(e?.messages??[]).filter(e=>"user"===e.role),o=this.projectMessagesFromEvents(e?.events??[]);await this.sessionStore.replaceMessages(t,[...s,...o])}catch{}}createQuestion(e,t){let s=crypto.randomUUID();return this.emit(t,{type:"ask_user",questionId:s,question:e.question,options:e.options,multiSelect:e.multiSelect}),new Promise((e,t)=>{let o=setTimeout(()=>{this.pendingQuestions.has(s)&&(this.pendingQuestions.delete(s),t(Error("Question timed out after 5 minutes")))},3e5);this.pendingQuestions.set(s,{resolve:e,reject:t,timer:o})})}answerQuestion(e,t,s){let o=this.pendingQuestions.get(e);return!!o&&(clearTimeout(o.timer),this.pendingQuestions.delete(e),o.resolve({answer:t,selectedIndices:s}),!0)}async steer(e,t){return await this.sessionStore.addMessage(t,{role:"user",content:e,name:"__steer__"}),this.activeRunSessionId===t&&!!this.activeAgent&&(this.emit(t,{type:"thinking",message:`User added: ${e.slice(0,60)}`}),!0)}abort(){this.activeAgent?.abort()}}let n=globalThis,a=n.__agentHost??new i;n.__agentHost=a},785:(e,t,s)=>{s.d(t,{k:()=>n});var o=s(1041),r=s(9411);let i=(0,r.resolve)((0,r.dirname)((0,o.fileURLToPath)("file:///Users/caoqu/team-agent/customer-agent/packages/server/lib/server-data-dir.ts")),"..");function n(){return function(e=process.env,t=i){return(0,r.resolve)(e.AGENT_DATA_DIR?.trim()||t)}()}}};var t=require("../../../../webpack-runtime.js");t.C(e);var s=e=>t(t.s=e),o=t.X(0,[375,703,322],()=>s(6276));module.exports=o})();
@@ -1 +1 @@
1
- "use strict";(()=>{var e={};e.id=195,e.ids=[195],e.modules={5890:e=>{e.exports=require("better-sqlite3")},399:e=>{e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},517:e=>{e.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},9801:e=>{e.exports=require("os")},7718:e=>{e.exports=require("node:child_process")},6005:e=>{e.exports=require("node:crypto")},5673:e=>{e.exports=require("node:events")},7561:e=>{e.exports=require("node:fs")},3977:e=>{e.exports=require("node:fs/promises")},8849:e=>{e.exports=require("node:http")},2286:e=>{e.exports=require("node:https")},612:e=>{e.exports=require("node:os")},9411:e=>{e.exports=require("node:path")},1747:e=>{e.exports=require("node:readline")},1041:e=>{e.exports=require("node:url")},6304:(e,t,s)=>{s.r(t),s.d(t,{originalPathname:()=>m,patchFetch:()=>g,requestAsyncStorage:()=>c,routeModule:()=>d,serverHooks:()=>h,staticGenerationAsyncStorage:()=>p});var r={};s.r(r),s.d(r,{POST:()=>u});var o=s(7786),i=s(5042),n=s(2184),a=s(1890),l=s(7186);async function u(e){try{let t=await e.json();if(!t.questionId||!t.answer)return a.NextResponse.json({error:"questionId and answer are required"},{status:400});if(!l.f.answerQuestion(t.questionId,t.answer,t.selectedIndices))return a.NextResponse.json({error:"Question not found or already answered"},{status:404});return a.NextResponse.json({ok:!0})}catch(e){return a.NextResponse.json({error:e instanceof Error?e.message:"Internal error"},{status:500})}}let d=new o.AppRouteRouteModule({definition:{kind:i.x.APP_ROUTE,page:"/api/agent/answer/route",pathname:"/api/agent/answer",filename:"route",bundlePath:"app/api/agent/answer/route"},resolvedPagePath:"/Users/caoqu/team-agent/customer-agent/packages/server/app/api/agent/answer/route.ts",nextConfigOutput:"standalone",userland:r}),{requestAsyncStorage:c,staticGenerationAsyncStorage:p,serverHooks:h}=d,m="/api/agent/answer/route";function g(){return(0,n.patchFetch)({serverHooks:h,staticGenerationAsyncStorage:p})}},7186:(e,t,s)=>{s.d(t,{f:()=>a});var r=s(1322),o=s(785);class i{constructor(){this.baseDir=(0,o.k)(),this.agent=null,this.builder=null,this.sessionStore=new r.m6(this.baseDir),this.projectStore=new r.XW(this.baseDir),this.remoteToolStore=new r.rt((0,r.N8)(this.baseDir).db),this.defaultRemoteToolsProjectId=process.env.AGENT_PROJECT_ID??"default",this.activeRun=null,this.subscribers=new Map,this.pendingQuestions=new Map;let e=process.env.AGENT_API_KEY,t=process.env.AGENT_MODEL_PROVIDER||"openai",s=process.env.AGENT_MODEL_ID||"gpt-4o",i=process.env.AGENT_BASE_URL||void 0,n=new r.Y4().withSessionStore(this.sessionStore);n.withRemoteToolStore(this.remoteToolStore,this.defaultRemoteToolsProjectId),e&&n.withModel(t,{apiKey:e,modelId:s,baseUrl:i}),this.builder=n}getBuilder(){return this.builder||(this.builder=new r.Y4),this.builder}setBuilder(e){e.withRemoteToolStore(this.remoteToolStore,this.defaultRemoteToolsProjectId),this.builder=e}getSessionStore(){return this.sessionStore}registerRemoteTools(e,t){return this.remoteToolStore.upsertTools(e,t)}getRemoteToolStore(){return this.remoteToolStore}async createSession(e,t=""){let s=new Date().toISOString();return t&&!await this.projectStore.get(t)&&await this.projectStore.create({id:t,name:t,description:"",created:s,updated:s}),this.sessionStore.create({id:crypto.randomUUID(),projectId:t,title:e,status:"idle",messages:[],events:[],created:s,updated:s,metadata:{}})}subscribe(e,t){let s=this.subscribers.get(e)??new Set;return s.add(t),this.subscribers.set(e,s),()=>{s.delete(t),0===s.size&&this.subscribers.delete(e)}}emit(e,t){for(let s of this.subscribers.get(e)??[])try{s(t)}catch{}}projectMessagesFromEvents(e){let t=[],s=null;for(let r of e){if("text_chunk"===r.type){s||(s={role:"assistant",content:""},t.push(s)),s.content+=r.text;continue}if("tool_call"===r.type){s&&!s.toolCalls?s.toolCalls=[r.toolCall]:t.push({role:"assistant",content:"",toolCalls:[r.toolCall]}),s=null;continue}if("tool_result"===r.type){t.push({role:"tool",content:r.result.content,toolCallId:r.result.toolCallId});continue}if("ask_user"===r.type){t.push({role:"assistant",content:""}),s=null;continue}"done"===r.type&&(s?s.content=r.finalText||s.content:r.finalText?.trim()&&t.push({role:"assistant",content:r.finalText}),s=null)}return t}async run(e,t){let s;let o=await this.sessionStore.get(t);await this.sessionStore.addMessage(t,{role:"user",content:e});let i=o?.projectId||this.defaultRemoteToolsProjectId;try{s=await this.getBuilder().withRemoteToolStore(this.remoteToolStore,i).withTool(new r.as(async e=>this.createQuestion(e,t))).build()}catch(e){throw this.emit(t,{type:"error",message:e instanceof Error?e.message:"Failed to build agent"}),e}finally{this.builder?.withRemoteToolStore(this.remoteToolStore,this.defaultRemoteToolsProjectId)}this.activeRun=s.run(e,t);let n=!1;for await(let e of this.activeRun)await this.sessionStore.addEvent(t,e),"error"===e.type?(n=!0,await this.sessionStore.update(t,{status:"failed"})):"done"!==e.type||n||(e.finalText.trim()&&await this.sessionStore.addMessage(t,{role:"assistant",content:e.finalText}),await this.sessionStore.update(t,{status:"completed"})),this.emit(t,e);try{let e=await this.sessionStore.get(t),s=(e?.messages??[]).filter(e=>"user"===e.role),r=this.projectMessagesFromEvents(e?.events??[]);await this.sessionStore.replaceMessages(t,[...s,...r])}catch{}}createQuestion(e,t){let s=crypto.randomUUID();return this.emit(t,{type:"ask_user",questionId:s,question:e.question,options:e.options,multiSelect:e.multiSelect}),new Promise((e,t)=>{let r=setTimeout(()=>{this.pendingQuestions.has(s)&&(this.pendingQuestions.delete(s),t(Error("Question timed out after 5 minutes")))},3e5);this.pendingQuestions.set(s,{resolve:e,reject:t,timer:r})})}answerQuestion(e,t,s){let r=this.pendingQuestions.get(e);return!!r&&(clearTimeout(r.timer),this.pendingQuestions.delete(e),r.resolve({answer:t,selectedIndices:s}),!0)}abort(){this.agent?.abort(),this.activeRun=null}}let n=globalThis,a=n.__agentHost??new i;n.__agentHost=a},785:(e,t,s)=>{s.d(t,{k:()=>n});var r=s(1041),o=s(9411);let i=(0,o.resolve)((0,o.dirname)((0,r.fileURLToPath)("file:///Users/caoqu/team-agent/customer-agent/packages/server/lib/server-data-dir.ts")),"..");function n(){return function(e=process.env,t=i){return(0,o.resolve)(e.AGENT_DATA_DIR?.trim()||t)}()}}};var t=require("../../../../webpack-runtime.js");t.C(e);var s=e=>t(t.s=e),r=t.X(0,[375,703,322],()=>s(6304));module.exports=r})();
1
+ "use strict";(()=>{var e={};e.id=195,e.ids=[195],e.modules={5890:e=>{e.exports=require("better-sqlite3")},399:e=>{e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},517:e=>{e.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},9801:e=>{e.exports=require("os")},7718:e=>{e.exports=require("node:child_process")},6005:e=>{e.exports=require("node:crypto")},5673:e=>{e.exports=require("node:events")},7561:e=>{e.exports=require("node:fs")},3977:e=>{e.exports=require("node:fs/promises")},8849:e=>{e.exports=require("node:http")},2286:e=>{e.exports=require("node:https")},612:e=>{e.exports=require("node:os")},9411:e=>{e.exports=require("node:path")},1747:e=>{e.exports=require("node:readline")},1041:e=>{e.exports=require("node:url")},6304:(e,t,s)=>{s.r(t),s.d(t,{originalPathname:()=>g,patchFetch:()=>m,requestAsyncStorage:()=>c,routeModule:()=>d,serverHooks:()=>p,staticGenerationAsyncStorage:()=>h});var r={};s.r(r),s.d(r,{POST:()=>u});var o=s(7786),i=s(5042),n=s(2184),a=s(1890),l=s(7186);async function u(e){try{let t=await e.json();if(!t.questionId||!t.answer)return a.NextResponse.json({error:"questionId and answer are required"},{status:400});if(!l.f.answerQuestion(t.questionId,t.answer,t.selectedIndices))return a.NextResponse.json({error:"Question not found or already answered"},{status:404});return a.NextResponse.json({ok:!0})}catch(e){return a.NextResponse.json({error:e instanceof Error?e.message:"Internal error"},{status:500})}}let d=new o.AppRouteRouteModule({definition:{kind:i.x.APP_ROUTE,page:"/api/agent/answer/route",pathname:"/api/agent/answer",filename:"route",bundlePath:"app/api/agent/answer/route"},resolvedPagePath:"/Users/caoqu/team-agent/customer-agent/packages/server/app/api/agent/answer/route.ts",nextConfigOutput:"standalone",userland:r}),{requestAsyncStorage:c,staticGenerationAsyncStorage:h,serverHooks:p}=d,g="/api/agent/answer/route";function m(){return(0,n.patchFetch)({serverHooks:p,staticGenerationAsyncStorage:h})}},7186:(e,t,s)=>{s.d(t,{f:()=>a});var r=s(1322),o=s(785);class i{constructor(){this.baseDir=(0,o.k)(),this.builder=null,this.sessionStore=new r.m6(this.baseDir),this.projectStore=new r.XW(this.baseDir),this.remoteToolStore=new r.rt((0,r.N8)(this.baseDir).db),this.defaultRemoteToolsProjectId=process.env.AGENT_PROJECT_ID??"default",this.activeRun=null,this.activeAgent=null,this.activeRunSessionId=null,this.subscribers=new Map,this.recentEvents=new Map,this.eventCounters=new Map,this.pendingQuestions=new Map;let e=process.env.AGENT_API_KEY,t=process.env.AGENT_MODEL_PROVIDER||"openai",s=process.env.AGENT_MODEL_ID||"gpt-4o",i=process.env.AGENT_BASE_URL||void 0,n=new r.Y4().withSessionStore(this.sessionStore);n.withRemoteToolStore(this.remoteToolStore,this.defaultRemoteToolsProjectId),e&&n.withModel(t,{apiKey:e,modelId:s,baseUrl:i}),this.builder=n}getBuilder(){return this.builder||(this.builder=new r.Y4),this.builder}setBuilder(e){e.withRemoteToolStore(this.remoteToolStore,this.defaultRemoteToolsProjectId),this.builder=e}getSessionStore(){return this.sessionStore}getModelConfig(){return{provider:process.env.AGENT_MODEL_PROVIDER||"openai",modelId:process.env.AGENT_MODEL_ID||"gpt-4o",baseUrl:process.env.AGENT_BASE_URL||""}}getWebAppBuildId(){return globalThis.__webAppBuildId??""}registerRemoteTools(e,t){return this.remoteToolStore.upsertTools(e,t)}getRemoteToolStore(){return this.remoteToolStore}async createSession(e,t=""){let s=new Date().toISOString();return t&&!await this.projectStore.get(t)&&await this.projectStore.create({id:t,name:t,description:"",created:s,updated:s}),this.sessionStore.create({id:crypto.randomUUID(),projectId:t,title:e,status:"idle",messages:[],events:[],created:s,updated:s,metadata:{}})}getLatestEventId(e){return this.eventCounters.get(e)??0}subscribe(e,t,s=-1){for(let r of this.recentEvents.get(e)??[])if(!(r.id<=s))try{t(r.event,r.id)}catch{}let r=this.subscribers.get(e)??new Set;return r.add(t),this.subscribers.set(e,r),()=>{r.delete(t),0===r.size&&this.subscribers.delete(e)}}emit(e,t){let s=(this.eventCounters.get(e)??0)+1;this.eventCounters.set(e,s);let r=this.recentEvents.get(e);for(let o of(r&&(r.push({id:s,event:t}),r.length>500&&r.splice(0,r.length-500)),this.subscribers.get(e)??[]))try{o(t,s)}catch{}}projectMessagesFromEvents(e){let t=[],s=null;for(let r of e){if("text_chunk"===r.type){s||(s={role:"assistant",content:""},t.push(s)),s.content+=r.text;continue}if("tool_call"===r.type){s&&!s.toolCalls?s.toolCalls=[r.toolCall]:t.push({role:"assistant",content:"",toolCalls:[r.toolCall]}),s=null;continue}if("tool_result"===r.type){t.push({role:"tool",content:r.result.content,toolCallId:r.result.toolCallId});continue}if("ask_user"===r.type){t.push({role:"assistant",content:""}),s=null;continue}"done"===r.type&&(s?s.content=r.finalText||s.content:r.finalText?.trim()&&t.push({role:"assistant",content:r.finalText}),s=null)}return t}async run(e,t,s){let o;let i=await this.sessionStore.get(t);await this.sessionStore.addMessage(t,{role:"user",content:e}),this.eventCounters.set(t,0),this.recentEvents.set(t,[]);let n=i?.projectId||this.defaultRemoteToolsProjectId;try{o=await this.getBuilder().withRemoteToolStore(this.remoteToolStore,n).withTool(new r.as(async e=>this.createQuestion(e,t))).build()}catch(s){let e={type:"error",message:s instanceof Error?s.message:"Failed to build agent"};try{await this.sessionStore.addEvent(t,e)}catch{}throw this.emit(t,e),s}finally{this.builder?.withRemoteToolStore(this.remoteToolStore,this.defaultRemoteToolsProjectId)}this.activeAgent=o,this.activeRunSessionId=t,this.activeRun=o.run(e,t,s);let a=!1;try{for await(let e of this.activeRun)await this.sessionStore.addEvent(t,e),"error"===e.type?(a=!0,await this.sessionStore.update(t,{status:"failed"})):"done"!==e.type||a||(e.finalText.trim()&&await this.sessionStore.addMessage(t,{role:"assistant",content:e.finalText}),await this.sessionStore.update(t,{status:"completed"})),this.emit(t,e)}catch(s){a=!0;let e={type:"error",message:s instanceof Error?s.message:"Agent run failed"};try{await this.sessionStore.addEvent(t,e),await this.sessionStore.update(t,{status:"failed"})}catch{}this.emit(t,e)}finally{this.activeRunSessionId===t&&(this.activeAgent=null,this.activeRunSessionId=null),this.activeRun=null}try{let e=await this.sessionStore.get(t),s=(e?.messages??[]).filter(e=>"user"===e.role),r=this.projectMessagesFromEvents(e?.events??[]);await this.sessionStore.replaceMessages(t,[...s,...r])}catch{}}createQuestion(e,t){let s=crypto.randomUUID();return this.emit(t,{type:"ask_user",questionId:s,question:e.question,options:e.options,multiSelect:e.multiSelect}),new Promise((e,t)=>{let r=setTimeout(()=>{this.pendingQuestions.has(s)&&(this.pendingQuestions.delete(s),t(Error("Question timed out after 5 minutes")))},3e5);this.pendingQuestions.set(s,{resolve:e,reject:t,timer:r})})}answerQuestion(e,t,s){let r=this.pendingQuestions.get(e);return!!r&&(clearTimeout(r.timer),this.pendingQuestions.delete(e),r.resolve({answer:t,selectedIndices:s}),!0)}async steer(e,t){return await this.sessionStore.addMessage(t,{role:"user",content:e,name:"__steer__"}),this.activeRunSessionId===t&&!!this.activeAgent&&(this.emit(t,{type:"thinking",message:`User added: ${e.slice(0,60)}`}),!0)}abort(){this.activeAgent?.abort()}}let n=globalThis,a=n.__agentHost??new i;n.__agentHost=a},785:(e,t,s)=>{s.d(t,{k:()=>n});var r=s(1041),o=s(9411);let i=(0,o.resolve)((0,o.dirname)((0,r.fileURLToPath)("file:///Users/caoqu/team-agent/customer-agent/packages/server/lib/server-data-dir.ts")),"..");function n(){return function(e=process.env,t=i){return(0,o.resolve)(e.AGENT_DATA_DIR?.trim()||t)}()}}};var t=require("../../../../webpack-runtime.js");t.C(e);var s=e=>t(t.s=e),r=t.X(0,[375,703,322],()=>s(6304));module.exports=r})();
@@ -0,0 +1 @@
1
+ "use strict";(()=>{var e={};e.id=159,e.ids=[159],e.modules={5890:e=>{e.exports=require("better-sqlite3")},399:e=>{e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},517:e=>{e.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},9801:e=>{e.exports=require("os")},7718:e=>{e.exports=require("node:child_process")},6005:e=>{e.exports=require("node:crypto")},5673:e=>{e.exports=require("node:events")},7561:e=>{e.exports=require("node:fs")},3977:e=>{e.exports=require("node:fs/promises")},8849:e=>{e.exports=require("node:http")},2286:e=>{e.exports=require("node:https")},612:e=>{e.exports=require("node:os")},9411:e=>{e.exports=require("node:path")},1747:e=>{e.exports=require("node:readline")},1041:e=>{e.exports=require("node:url")},1850:(e,t,s)=>{s.r(t),s.d(t,{originalPathname:()=>g,patchFetch:()=>m,requestAsyncStorage:()=>c,routeModule:()=>d,serverHooks:()=>p,staticGenerationAsyncStorage:()=>h});var o={};s.r(o),s.d(o,{GET:()=>u});var r=s(7786),i=s(5042),n=s(2184),a=s(1890),l=s(7186);async function u(){return a.NextResponse.json({...l.f.getModelConfig(),buildId:l.f.getWebAppBuildId()})}let d=new r.AppRouteRouteModule({definition:{kind:i.x.APP_ROUTE,page:"/api/agent/model/route",pathname:"/api/agent/model",filename:"route",bundlePath:"app/api/agent/model/route"},resolvedPagePath:"/Users/caoqu/team-agent/customer-agent/packages/server/app/api/agent/model/route.ts",nextConfigOutput:"standalone",userland:o}),{requestAsyncStorage:c,staticGenerationAsyncStorage:h,serverHooks:p}=d,g="/api/agent/model/route";function m(){return(0,n.patchFetch)({serverHooks:p,staticGenerationAsyncStorage:h})}},7186:(e,t,s)=>{s.d(t,{f:()=>a});var o=s(1322),r=s(785);class i{constructor(){this.baseDir=(0,r.k)(),this.builder=null,this.sessionStore=new o.m6(this.baseDir),this.projectStore=new o.XW(this.baseDir),this.remoteToolStore=new o.rt((0,o.N8)(this.baseDir).db),this.defaultRemoteToolsProjectId=process.env.AGENT_PROJECT_ID??"default",this.activeRun=null,this.activeAgent=null,this.activeRunSessionId=null,this.subscribers=new Map,this.recentEvents=new Map,this.eventCounters=new Map,this.pendingQuestions=new Map;let e=process.env.AGENT_API_KEY,t=process.env.AGENT_MODEL_PROVIDER||"openai",s=process.env.AGENT_MODEL_ID||"gpt-4o",i=process.env.AGENT_BASE_URL||void 0,n=new o.Y4().withSessionStore(this.sessionStore);n.withRemoteToolStore(this.remoteToolStore,this.defaultRemoteToolsProjectId),e&&n.withModel(t,{apiKey:e,modelId:s,baseUrl:i}),this.builder=n}getBuilder(){return this.builder||(this.builder=new o.Y4),this.builder}setBuilder(e){e.withRemoteToolStore(this.remoteToolStore,this.defaultRemoteToolsProjectId),this.builder=e}getSessionStore(){return this.sessionStore}getModelConfig(){return{provider:process.env.AGENT_MODEL_PROVIDER||"openai",modelId:process.env.AGENT_MODEL_ID||"gpt-4o",baseUrl:process.env.AGENT_BASE_URL||""}}getWebAppBuildId(){return globalThis.__webAppBuildId??""}registerRemoteTools(e,t){return this.remoteToolStore.upsertTools(e,t)}getRemoteToolStore(){return this.remoteToolStore}async createSession(e,t=""){let s=new Date().toISOString();return t&&!await this.projectStore.get(t)&&await this.projectStore.create({id:t,name:t,description:"",created:s,updated:s}),this.sessionStore.create({id:crypto.randomUUID(),projectId:t,title:e,status:"idle",messages:[],events:[],created:s,updated:s,metadata:{}})}getLatestEventId(e){return this.eventCounters.get(e)??0}subscribe(e,t,s=-1){for(let o of this.recentEvents.get(e)??[])if(!(o.id<=s))try{t(o.event,o.id)}catch{}let o=this.subscribers.get(e)??new Set;return o.add(t),this.subscribers.set(e,o),()=>{o.delete(t),0===o.size&&this.subscribers.delete(e)}}emit(e,t){let s=(this.eventCounters.get(e)??0)+1;this.eventCounters.set(e,s);let o=this.recentEvents.get(e);for(let r of(o&&(o.push({id:s,event:t}),o.length>500&&o.splice(0,o.length-500)),this.subscribers.get(e)??[]))try{r(t,s)}catch{}}projectMessagesFromEvents(e){let t=[],s=null;for(let o of e){if("text_chunk"===o.type){s||(s={role:"assistant",content:""},t.push(s)),s.content+=o.text;continue}if("tool_call"===o.type){s&&!s.toolCalls?s.toolCalls=[o.toolCall]:t.push({role:"assistant",content:"",toolCalls:[o.toolCall]}),s=null;continue}if("tool_result"===o.type){t.push({role:"tool",content:o.result.content,toolCallId:o.result.toolCallId});continue}if("ask_user"===o.type){t.push({role:"assistant",content:""}),s=null;continue}"done"===o.type&&(s?s.content=o.finalText||s.content:o.finalText?.trim()&&t.push({role:"assistant",content:o.finalText}),s=null)}return t}async run(e,t,s){let r;let i=await this.sessionStore.get(t);await this.sessionStore.addMessage(t,{role:"user",content:e}),this.eventCounters.set(t,0),this.recentEvents.set(t,[]);let n=i?.projectId||this.defaultRemoteToolsProjectId;try{r=await this.getBuilder().withRemoteToolStore(this.remoteToolStore,n).withTool(new o.as(async e=>this.createQuestion(e,t))).build()}catch(s){let e={type:"error",message:s instanceof Error?s.message:"Failed to build agent"};try{await this.sessionStore.addEvent(t,e)}catch{}throw this.emit(t,e),s}finally{this.builder?.withRemoteToolStore(this.remoteToolStore,this.defaultRemoteToolsProjectId)}this.activeAgent=r,this.activeRunSessionId=t,this.activeRun=r.run(e,t,s);let a=!1;try{for await(let e of this.activeRun)await this.sessionStore.addEvent(t,e),"error"===e.type?(a=!0,await this.sessionStore.update(t,{status:"failed"})):"done"!==e.type||a||(e.finalText.trim()&&await this.sessionStore.addMessage(t,{role:"assistant",content:e.finalText}),await this.sessionStore.update(t,{status:"completed"})),this.emit(t,e)}catch(s){a=!0;let e={type:"error",message:s instanceof Error?s.message:"Agent run failed"};try{await this.sessionStore.addEvent(t,e),await this.sessionStore.update(t,{status:"failed"})}catch{}this.emit(t,e)}finally{this.activeRunSessionId===t&&(this.activeAgent=null,this.activeRunSessionId=null),this.activeRun=null}try{let e=await this.sessionStore.get(t),s=(e?.messages??[]).filter(e=>"user"===e.role),o=this.projectMessagesFromEvents(e?.events??[]);await this.sessionStore.replaceMessages(t,[...s,...o])}catch{}}createQuestion(e,t){let s=crypto.randomUUID();return this.emit(t,{type:"ask_user",questionId:s,question:e.question,options:e.options,multiSelect:e.multiSelect}),new Promise((e,t)=>{let o=setTimeout(()=>{this.pendingQuestions.has(s)&&(this.pendingQuestions.delete(s),t(Error("Question timed out after 5 minutes")))},3e5);this.pendingQuestions.set(s,{resolve:e,reject:t,timer:o})})}answerQuestion(e,t,s){let o=this.pendingQuestions.get(e);return!!o&&(clearTimeout(o.timer),this.pendingQuestions.delete(e),o.resolve({answer:t,selectedIndices:s}),!0)}async steer(e,t){return await this.sessionStore.addMessage(t,{role:"user",content:e,name:"__steer__"}),this.activeRunSessionId===t&&!!this.activeAgent&&(this.emit(t,{type:"thinking",message:`User added: ${e.slice(0,60)}`}),!0)}abort(){this.activeAgent?.abort()}}let n=globalThis,a=n.__agentHost??new i;n.__agentHost=a},785:(e,t,s)=>{s.d(t,{k:()=>n});var o=s(1041),r=s(9411);let i=(0,r.resolve)((0,r.dirname)((0,o.fileURLToPath)("file:///Users/caoqu/team-agent/customer-agent/packages/server/lib/server-data-dir.ts")),"..");function n(){return function(e=process.env,t=i){return(0,r.resolve)(e.AGENT_DATA_DIR?.trim()||t)}()}}};var t=require("../../../../webpack-runtime.js");t.C(e);var s=e=>t(t.s=e),o=t.X(0,[375,703,322],()=>s(1850));module.exports=o})();
@@ -0,0 +1 @@
1
+ {"version":1,"files":["../../../../../../node_modules/better-sqlite3","../../../../../../node_modules/next","../../../../../../package.json","../../../../../package.json","../../../../chunks/322.js","../../../../chunks/375.js","../../../../chunks/703.js","../../../../webpack-runtime.js"]}
@@ -0,0 +1 @@
1
+ {"provider":"openai","modelId":"my/gpt-5.6-luna","baseUrl":"http://localhost:20128/v1","buildId":""}
@@ -0,0 +1 @@
1
+ {"status":200,"headers":{"content-type":"application/json","x-next-cache-tags":"_N_T_/layout,_N_T_/api/layout,_N_T_/api/agent/layout,_N_T_/api/agent/model/layout,_N_T_/api/agent/model/route,_N_T_/api/agent/model"}}