From 8282c984b3311657082b52595e6bfc385248a48c Mon Sep 17 00:00:00 2001 From: DaniAkash Date: Fri, 12 Jun 2026 16:29:12 +0530 Subject: [PATCH 01/19] feat(agent-mcp-interface): bootstrap package skeleton First slice of the new BrowserOS v2 backend, per the architecture plan. packages/browseros-agent/apps/agent-mcp-interface/ package.json hono dep only; @browseros/agent-mcp-interface tsconfig.json extends monorepo root, composite + emit decls biome.json extends "//", noConsole/noProcessEnv on by default src/ shared/port.ts PROD_API_PORT = 9200 (distinct from 9000/9100/9300) lib/logger.ts Structured JSON to stderr, pino-shaped fields lib/errors.ts HttpError; { error: string } JSON shape env.ts Single chokepoint for process.env reads local-server-url.ts Write-once-after-bind module singleton routes/system.ts /system/health, /system/version, /system/url server.ts Chained .route('/') composition; exports type AppType = typeof routes for the future agent-mcp-ui hono-rpc client main.ts Bun.serve on 127.0.0.1:PROD_API_PORT; sets localServerUrl + logs the bound URL Wiring: packages/browseros-agent/tsconfig.json references += this package packages/browseros-agent/.fallowrc.json entry += src/main.ts Verified: bun run --filter @browseros/agent-mcp-interface typecheck clean bunx biome check apps/agent-mcp-interface/ clean bunx fallow check no new findings bun src/main.ts + curl /system/{health,version,url} ok byok ai-sdk path and the existing apps/server / apps/agent packages are not touched. --- packages/browseros-agent/.fallowrc.json | 1 + .../apps/agent-mcp-interface/biome.json | 54 +++++++++++++++ .../apps/agent-mcp-interface/package.json | 27 ++++++++ .../apps/agent-mcp-interface/src/env.ts | 26 ++++++++ .../agent-mcp-interface/src/lib/errors.ts | 22 +++++++ .../agent-mcp-interface/src/lib/logger.ts | 42 ++++++++++++ .../src/local-server-url.ts | 30 +++++++++ .../apps/agent-mcp-interface/src/main.ts | 43 ++++++++++++ .../agent-mcp-interface/src/routes/system.ts | 18 +++++ .../apps/agent-mcp-interface/src/server.ts | 66 +++++++++++++++++++ .../agent-mcp-interface/src/shared/port.ts | 20 ++++++ .../apps/agent-mcp-interface/tsconfig.json | 13 ++++ packages/browseros-agent/bun.lock | 17 +++++ packages/browseros-agent/tsconfig.json | 5 +- 14 files changed, 383 insertions(+), 1 deletion(-) create mode 100644 packages/browseros-agent/apps/agent-mcp-interface/biome.json create mode 100644 packages/browseros-agent/apps/agent-mcp-interface/package.json create mode 100644 packages/browseros-agent/apps/agent-mcp-interface/src/env.ts create mode 100644 packages/browseros-agent/apps/agent-mcp-interface/src/lib/errors.ts create mode 100644 packages/browseros-agent/apps/agent-mcp-interface/src/lib/logger.ts create mode 100644 packages/browseros-agent/apps/agent-mcp-interface/src/local-server-url.ts create mode 100644 packages/browseros-agent/apps/agent-mcp-interface/src/main.ts create mode 100644 packages/browseros-agent/apps/agent-mcp-interface/src/routes/system.ts create mode 100644 packages/browseros-agent/apps/agent-mcp-interface/src/server.ts create mode 100644 packages/browseros-agent/apps/agent-mcp-interface/src/shared/port.ts create mode 100644 packages/browseros-agent/apps/agent-mcp-interface/tsconfig.json diff --git a/packages/browseros-agent/.fallowrc.json b/packages/browseros-agent/.fallowrc.json index 58440f1564..0580471ab1 100644 --- a/packages/browseros-agent/.fallowrc.json +++ b/packages/browseros-agent/.fallowrc.json @@ -2,6 +2,7 @@ "$schema": "https://raw.githubusercontent.com/fallow-rs/fallow/main/schema.json", "entry": [ "apps/server/src/index.ts", + "apps/agent-mcp-interface/src/main.ts", "apps/agent/entrypoints/app/main.tsx", "apps/agent/entrypoints/sidepanel/main.tsx", "apps/agent/entrypoints/background/index.ts", diff --git a/packages/browseros-agent/apps/agent-mcp-interface/biome.json b/packages/browseros-agent/apps/agent-mcp-interface/biome.json new file mode 100644 index 0000000000..90a2b9e213 --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-interface/biome.json @@ -0,0 +1,54 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.4.8/schema.json", + "root": false, + "extends": "//", + "vcs": { + "enabled": true, + "clientKind": "git", + "useIgnoreFile": true + }, + "files": { + "ignoreUnknown": false + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 2 + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "correctness": { + "noUnusedImports": "error", + "noUnusedVariables": "error", + "noPrivateImports": { + "level": "error", + "options": { + "defaultVisibility": "package" + } + } + }, + "suspicious": { + "noConsole": "error" + }, + "style": { + "noProcessEnv": "error" + } + } + }, + "javascript": { + "formatter": { + "quoteStyle": "single", + "semicolons": "asNeeded" + } + }, + "assist": { + "enabled": true, + "actions": { + "source": { + "organizeImports": "on" + } + } + } +} diff --git a/packages/browseros-agent/apps/agent-mcp-interface/package.json b/packages/browseros-agent/apps/agent-mcp-interface/package.json new file mode 100644 index 0000000000..a416ed0ded --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-interface/package.json @@ -0,0 +1,27 @@ +{ + "name": "@browseros/agent-mcp-interface", + "type": "module", + "private": true, + "version": "0.0.1", + "description": "Hono backend exposing the BrowserOS v2 agent surface: typed JSON API + per-agent MCP route mux. File-based config under /mcp-interface/.", + "exports": { + "./server": { + "types": "./src/server.ts", + "default": null + } + }, + "scripts": { + "start": "bun --watch src/main.ts", + "start:ci": "bun src/main.ts", + "typecheck": "tsc --noEmit", + "lint": "bunx biome check", + "lint:fix": "bunx biome check --write --unsafe" + }, + "dependencies": { + "hono": "^4.12.3" + }, + "devDependencies": { + "typescript": "^5.9.2", + "@types/bun": "^1.3.5" + } +} diff --git a/packages/browseros-agent/apps/agent-mcp-interface/src/env.ts b/packages/browseros-agent/apps/agent-mcp-interface/src/env.ts new file mode 100644 index 0000000000..079b78de1d --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-interface/src/env.ts @@ -0,0 +1,26 @@ +/** + * @license + * Copyright 2025 BrowserOS + * SPDX-License-Identifier: AGPL-3.0-or-later + * + * Single chokepoint for env reads. Centralising here keeps the rest + * of the source free of process.env access and lets biome's + * noProcessEnv rule stay on at error level for every other file. + */ + +import { PROD_API_PORT } from './shared/port' + +function readPort(): number { + // biome-ignore lint/style/noProcessEnv: env.ts is the sanctioned env-reader for the package + const raw = process.env.BROWSEROS_AGENT_MCP_INTERFACE_PORT + if (!raw) return PROD_API_PORT + const parsed = Number(raw) + if (!Number.isInteger(parsed) || parsed < 0 || parsed > 65535) { + return PROD_API_PORT + } + return parsed +} + +export const env = { + port: readPort(), +} diff --git a/packages/browseros-agent/apps/agent-mcp-interface/src/lib/errors.ts b/packages/browseros-agent/apps/agent-mcp-interface/src/lib/errors.ts new file mode 100644 index 0000000000..71c9d89feb --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-interface/src/lib/errors.ts @@ -0,0 +1,22 @@ +/** + * @license + * Copyright 2025 BrowserOS + * SPDX-License-Identifier: AGPL-3.0-or-later + * + * Server-side error types and the JSON shape the routes return on + * failure. The future UI consumes these via parseResponse: every + * non-OK response carries `{ error: string }` and the client throws + * a typed ApiError with `.status` and `.body` attached. Discriminated + * `{ success: false }` unions are deliberately avoided so callers can + * always trust the happy-path return type. + */ + +export class HttpError extends Error { + readonly status: number + + constructor(status: number, message: string) { + super(message) + this.status = status + this.name = 'HttpError' + } +} diff --git a/packages/browseros-agent/apps/agent-mcp-interface/src/lib/logger.ts b/packages/browseros-agent/apps/agent-mcp-interface/src/lib/logger.ts new file mode 100644 index 0000000000..30c171ae0d --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-interface/src/lib/logger.ts @@ -0,0 +1,42 @@ +/** + * @license + * Copyright 2025 BrowserOS + * SPDX-License-Identifier: AGPL-3.0-or-later + * + * Structured JSON logger. Writes one event per line to stderr so + * downstream log shippers can `tail -F` without competing with + * stdout traffic. The shape matches @browseros/server's pino output + * (level, time, msg, plus arbitrary structured fields) so existing + * log views render both producers identically. + */ + +type LogLevel = 'debug' | 'info' | 'warn' | 'error' + +const LEVEL_PRIORITY: Record = { + debug: 20, + info: 30, + warn: 40, + error: 50, +} + +function write(level: LogLevel, msg: string, fields?: Record) { + const event = { + level: LEVEL_PRIORITY[level], + time: Date.now(), + msg, + ...fields, + } + // biome-ignore lint/suspicious/noConsole: logger is the sanctioned console wrapper for the package + console.error(JSON.stringify(event)) +} + +export const logger = { + debug: (msg: string, fields?: Record) => + write('debug', msg, fields), + info: (msg: string, fields?: Record) => + write('info', msg, fields), + warn: (msg: string, fields?: Record) => + write('warn', msg, fields), + error: (msg: string, fields?: Record) => + write('error', msg, fields), +} diff --git a/packages/browseros-agent/apps/agent-mcp-interface/src/local-server-url.ts b/packages/browseros-agent/apps/agent-mcp-interface/src/local-server-url.ts new file mode 100644 index 0000000000..c4741b313d --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-interface/src/local-server-url.ts @@ -0,0 +1,30 @@ +/** + * @license + * Copyright 2025 BrowserOS + * SPDX-License-Identifier: AGPL-3.0-or-later + * + * Module-local singleton holding the URL the Hono server bound to. + * Set once by main.ts after Bun.serve resolves; read by anything that + * needs to compose URLs reachable from inside the same process (e.g. + * the future per-agent MCP route mux will embed this in mcpServers + * configs handed to spawned host agents). + * + * Plain mutable string rather than a hook/store because writer and + * reader live in the same Bun process and the value is written + * exactly once at boot. Mirrors the agent-company idiom. + */ + +let localServerUrl: string | null = null + +export function setLocalServerUrl(url: string): void { + localServerUrl = url +} + +/** + * Returns null when the server has not bound yet. Callers that + * depend on the URL should treat null as "not ready"; the boot path + * always sets it before any route handler executes. + */ +export function getLocalServerUrl(): string | null { + return localServerUrl +} diff --git a/packages/browseros-agent/apps/agent-mcp-interface/src/main.ts b/packages/browseros-agent/apps/agent-mcp-interface/src/main.ts new file mode 100644 index 0000000000..644895129d --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-interface/src/main.ts @@ -0,0 +1,43 @@ +#!/usr/bin/env bun +/** + * @license + * Copyright 2025 BrowserOS + * SPDX-License-Identifier: AGPL-3.0-or-later + * + * Bun entry point for the agent-mcp-interface server. + * + * Binds Hono on 127.0.0.1 — same posture as @browseros/server. The + * loopback restriction is what lets us run with wildcard CORS and + * accept `null` Origin requests from the future WXT extension + * loading via chrome-extension://. No external network reachability. + * + * The agent-mcp-ui extension reads PROD_API_PORT off the shared port + * constant; in dev it can pick up an `?apiUrl=` override published + * by whichever launcher started this process. + */ + +if (typeof Bun === 'undefined') { + // biome-ignore lint/suspicious/noConsole: pre-logger bootstrap notice + console.error( + 'agent-mcp-interface requires the Bun runtime. Install Bun (https://bun.sh) and re-run with `bun src/main.ts`.', + ) + process.exit(1) +} + +import { env } from './env' +import { logger } from './lib/logger' +import { setLocalServerUrl } from './local-server-url' +import server from './server' + +function start(): void { + const httpServer = Bun.serve({ + hostname: '127.0.0.1', + port: env.port, + fetch: server.fetch, + }) + const url = `http://${httpServer.hostname}:${httpServer.port}` + setLocalServerUrl(url) + logger.info('agent-mcp-interface listening', { url }) +} + +start() diff --git a/packages/browseros-agent/apps/agent-mcp-interface/src/routes/system.ts b/packages/browseros-agent/apps/agent-mcp-interface/src/routes/system.ts new file mode 100644 index 0000000000..4d822b5929 --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-interface/src/routes/system.ts @@ -0,0 +1,18 @@ +/** + * @license + * Copyright 2025 BrowserOS + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +import { Hono } from 'hono' +// Package version is read off the bundled package.json. resolveJsonModule +// + bun's loader resolve this without a build step. +import pkg from '../../package.json' with { type: 'json' } +import { getLocalServerUrl } from '../local-server-url' + +export const systemRoute = new Hono() + .get('/system/health', (c) => c.json({ status: 'ok' as const })) + .get('/system/version', (c) => + c.json({ name: pkg.name, version: pkg.version }), + ) + .get('/system/url', (c) => c.json({ url: getLocalServerUrl() })) diff --git a/packages/browseros-agent/apps/agent-mcp-interface/src/server.ts b/packages/browseros-agent/apps/agent-mcp-interface/src/server.ts new file mode 100644 index 0000000000..47ad763579 --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-interface/src/server.ts @@ -0,0 +1,66 @@ +/** + * @license + * Copyright 2025 BrowserOS + * SPDX-License-Identifier: AGPL-3.0-or-later + * + * Hono application composition. The chained `.route('/', xxxRoute)` + * calls give us a `routes` reference whose inferred type captures + * every endpoint's input / output shape; we re-export that as + * `AppType` so the future agent-mcp-ui can build a fully typed + * hono-rpc client with `hc(baseUrl)`. + * + * Mirrors browseros-ai/agent-company's apps/desktop/src/main/server.ts + * pattern, adapted for Bun + a loopback-only bind. + */ + +import { Hono } from 'hono' +import { cors } from 'hono/cors' +import { HttpError } from './lib/errors' +import { logger } from './lib/logger' +import { systemRoute } from './routes/system' + +// Telemetry capture is injectable so the server module stays usable +// from the bun-test runner without pulling Sentry into the import +// graph. main.ts can wire a real capture; tests get the no-op. +export type RouteErrorHandler = ( + err: unknown, + path: string, + method: string, +) => void + +let captureRouteError: RouteErrorHandler = () => undefined + +export function setRouteErrorHandler(fn: RouteErrorHandler): void { + captureRouteError = fn +} + +const app = new Hono() + +// Loopback-only bind (see main.ts) makes wildcard CORS safe and +// dodges the `null` Origin a chrome-extension:// page sends when +// fetching from `http://127.0.0.1:`. +app.use('*', cors({ origin: '*' })) + +// Catch-all for genuinely unexpected errors. Routes today resolve +// their own expected failures (404s, validation) inline and return +// structured 4xx JSON. Anything that escapes that lands here, gets +// reported via the injected capture, and turns into a structured 5xx +// JSON body. Mirrors agent-company's app.onError shape. +app.onError((err, c) => { + captureRouteError(err, c.req.path, c.req.method) + if (err instanceof HttpError) { + return c.json({ error: err.message }, err.status as 400 | 404 | 409 | 500) + } + const message = err instanceof Error ? err.message : 'internal error' + logger.error('Unhandled route error', { + path: c.req.path, + method: c.req.method, + error: message, + }) + return c.json({ error: message }, 500) +}) + +const routes = app.route('/', systemRoute) + +export type AppType = typeof routes +export default routes diff --git a/packages/browseros-agent/apps/agent-mcp-interface/src/shared/port.ts b/packages/browseros-agent/apps/agent-mcp-interface/src/shared/port.ts new file mode 100644 index 0000000000..675606dc79 --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-interface/src/shared/port.ts @@ -0,0 +1,20 @@ +/** + * @license + * Copyright 2025 BrowserOS + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +/** + * Production API port for the agent-mcp-interface server. + * + * Read by: + * - src/main.ts when binding the Hono server + * - src/env.ts as the fallback when no PORT override is set + * - the future agent-mcp-ui WXT extension when no `?apiUrl=` query is + * present (typically packaged builds loading via chrome-extension://) + * + * Distinct from @browseros/server (9100) so the two can run side by + * side. Existing BrowserOS port allocations (per + * apps/server/.env.example): CDP=9000, server=9100, extension=9300. + */ +export const PROD_API_PORT = 9200 diff --git a/packages/browseros-agent/apps/agent-mcp-interface/tsconfig.json b/packages/browseros-agent/apps/agent-mcp-interface/tsconfig.json new file mode 100644 index 0000000000..92ce49f5c7 --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-interface/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "composite": true, + "declaration": true, + "declarationMap": true, + "resolveJsonModule": true, + "types": ["bun"] + }, + "include": ["src/**/*", "package.json"], + "exclude": ["node_modules", "dist/**/*"] +} diff --git a/packages/browseros-agent/bun.lock b/packages/browseros-agent/bun.lock index 9a3b02a088..1a7b4e246f 100644 --- a/packages/browseros-agent/bun.lock +++ b/packages/browseros-agent/bun.lock @@ -115,6 +115,17 @@ "wxt": "^0.20.18", }, }, + "apps/agent-mcp-interface": { + "name": "@browseros/agent-mcp-interface", + "version": "0.0.1", + "dependencies": { + "hono": "^4.12.3", + }, + "devDependencies": { + "@types/bun": "^1.3.5", + "typescript": "^5.9.2", + }, + }, "apps/eval": { "name": "@browseros/eval", "version": "0.1.0", @@ -422,6 +433,8 @@ "@browseros/agent": ["@browseros/agent@workspace:apps/agent"], + "@browseros/agent-mcp-interface": ["@browseros/agent-mcp-interface@workspace:apps/agent-mcp-interface"], + "@browseros/build-tools": ["@browseros/build-tools@workspace:packages/build-tools"], "@browseros/cdp-protocol": ["@browseros/cdp-protocol@workspace:packages/cdp-protocol"], @@ -3966,6 +3979,8 @@ "@browseros/agent/@types/bun": ["@types/bun@1.3.14", "", { "dependencies": { "bun-types": "1.3.14" } }, "sha512-h1hFqFVcvAvD9j9K7ZW7vd82aSA+rTdznZa+5bwvCwqSB1jmmfLcbIWhOLx1/+boy/xmjgCs/OMUL8hRJSmnPw=="], + "@browseros/agent-mcp-interface/@types/bun": ["@types/bun@1.3.14", "", { "dependencies": { "bun-types": "1.3.14" } }, "sha512-h1hFqFVcvAvD9j9K7ZW7vd82aSA+rTdznZa+5bwvCwqSB1jmmfLcbIWhOLx1/+boy/xmjgCs/OMUL8hRJSmnPw=="], + "@browseros/build-tools/@aws-sdk/client-s3": ["@aws-sdk/client-s3@3.1014.0", "", { "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "^3.973.23", "@aws-sdk/credential-provider-node": "^3.972.24", "@aws-sdk/middleware-bucket-endpoint": "^3.972.8", "@aws-sdk/middleware-expect-continue": "^3.972.8", "@aws-sdk/middleware-flexible-checksums": "^3.974.3", "@aws-sdk/middleware-host-header": "^3.972.8", "@aws-sdk/middleware-location-constraint": "^3.972.8", "@aws-sdk/middleware-logger": "^3.972.8", "@aws-sdk/middleware-recursion-detection": "^3.972.8", "@aws-sdk/middleware-sdk-s3": "^3.972.23", "@aws-sdk/middleware-ssec": "^3.972.8", "@aws-sdk/middleware-user-agent": "^3.972.24", "@aws-sdk/region-config-resolver": "^3.972.9", "@aws-sdk/signature-v4-multi-region": "^3.996.11", "@aws-sdk/types": "^3.973.6", "@aws-sdk/util-endpoints": "^3.996.5", "@aws-sdk/util-user-agent-browser": "^3.972.8", "@aws-sdk/util-user-agent-node": "^3.973.10", "@smithy/config-resolver": "^4.4.13", "@smithy/core": "^3.23.12", "@smithy/eventstream-serde-browser": "^4.2.12", "@smithy/eventstream-serde-config-resolver": "^4.3.12", "@smithy/eventstream-serde-node": "^4.2.12", "@smithy/fetch-http-handler": "^5.3.15", "@smithy/hash-blob-browser": "^4.2.13", "@smithy/hash-node": "^4.2.12", "@smithy/hash-stream-node": "^4.2.12", "@smithy/invalid-dependency": "^4.2.12", "@smithy/md5-js": "^4.2.12", "@smithy/middleware-content-length": "^4.2.12", "@smithy/middleware-endpoint": "^4.4.27", "@smithy/middleware-retry": "^4.4.44", "@smithy/middleware-serde": "^4.2.15", "@smithy/middleware-stack": "^4.2.12", "@smithy/node-config-provider": "^4.3.12", "@smithy/node-http-handler": "^4.5.0", "@smithy/protocol-http": "^5.3.12", "@smithy/smithy-client": "^4.12.7", "@smithy/types": "^4.13.1", "@smithy/url-parser": "^4.2.12", "@smithy/util-base64": "^4.3.2", "@smithy/util-body-length-browser": "^4.2.2", "@smithy/util-body-length-node": "^4.2.3", "@smithy/util-defaults-mode-browser": "^4.3.43", "@smithy/util-defaults-mode-node": "^4.2.47", "@smithy/util-endpoints": "^3.3.3", "@smithy/util-middleware": "^4.2.12", "@smithy/util-retry": "^4.2.12", "@smithy/util-stream": "^4.5.20", "@smithy/util-utf8": "^4.2.2", "@smithy/util-waiter": "^4.2.13", "tslib": "^2.6.2" } }, "sha512-0XLrOT4Cm3NEhhiME7l/8LbTXS4KdsbR4dSrY207KNKTcHLLTZ9EXt4ZpgnTfLvWQF3pGP2us4Zi1fYLo0N+Ow=="], "@browseros/eval/@aws-sdk/client-s3": ["@aws-sdk/client-s3@3.1014.0", "", { "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "^3.973.23", "@aws-sdk/credential-provider-node": "^3.972.24", "@aws-sdk/middleware-bucket-endpoint": "^3.972.8", "@aws-sdk/middleware-expect-continue": "^3.972.8", "@aws-sdk/middleware-flexible-checksums": "^3.974.3", "@aws-sdk/middleware-host-header": "^3.972.8", "@aws-sdk/middleware-location-constraint": "^3.972.8", "@aws-sdk/middleware-logger": "^3.972.8", "@aws-sdk/middleware-recursion-detection": "^3.972.8", "@aws-sdk/middleware-sdk-s3": "^3.972.23", "@aws-sdk/middleware-ssec": "^3.972.8", "@aws-sdk/middleware-user-agent": "^3.972.24", "@aws-sdk/region-config-resolver": "^3.972.9", "@aws-sdk/signature-v4-multi-region": "^3.996.11", "@aws-sdk/types": "^3.973.6", "@aws-sdk/util-endpoints": "^3.996.5", "@aws-sdk/util-user-agent-browser": "^3.972.8", "@aws-sdk/util-user-agent-node": "^3.973.10", "@smithy/config-resolver": "^4.4.13", "@smithy/core": "^3.23.12", "@smithy/eventstream-serde-browser": "^4.2.12", "@smithy/eventstream-serde-config-resolver": "^4.3.12", "@smithy/eventstream-serde-node": "^4.2.12", "@smithy/fetch-http-handler": "^5.3.15", "@smithy/hash-blob-browser": "^4.2.13", "@smithy/hash-node": "^4.2.12", "@smithy/hash-stream-node": "^4.2.12", "@smithy/invalid-dependency": "^4.2.12", "@smithy/md5-js": "^4.2.12", "@smithy/middleware-content-length": "^4.2.12", "@smithy/middleware-endpoint": "^4.4.27", "@smithy/middleware-retry": "^4.4.44", "@smithy/middleware-serde": "^4.2.15", "@smithy/middleware-stack": "^4.2.12", "@smithy/node-config-provider": "^4.3.12", "@smithy/node-http-handler": "^4.5.0", "@smithy/protocol-http": "^5.3.12", "@smithy/smithy-client": "^4.12.7", "@smithy/types": "^4.13.1", "@smithy/url-parser": "^4.2.12", "@smithy/util-base64": "^4.3.2", "@smithy/util-body-length-browser": "^4.2.2", "@smithy/util-body-length-node": "^4.2.3", "@smithy/util-defaults-mode-browser": "^4.3.43", "@smithy/util-defaults-mode-node": "^4.2.47", "@smithy/util-endpoints": "^3.3.3", "@smithy/util-middleware": "^4.2.12", "@smithy/util-retry": "^4.2.12", "@smithy/util-stream": "^4.5.20", "@smithy/util-utf8": "^4.2.2", "@smithy/util-waiter": "^4.2.13", "tslib": "^2.6.2" } }, "sha512-0XLrOT4Cm3NEhhiME7l/8LbTXS4KdsbR4dSrY207KNKTcHLLTZ9EXt4ZpgnTfLvWQF3pGP2us4Zi1fYLo0N+Ow=="], @@ -4466,6 +4481,8 @@ "@aws-crypto/util/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="], + "@browseros/agent-mcp-interface/@types/bun/bun-types": ["bun-types@1.3.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-4N0ig0fEomHt5R0KCFWjovxow98rIoRwKolrYdCcknNwMekCXRnWEUvgu5soYV8QXtVsrUD8B95MBOZGPvr6KQ=="], + "@browseros/agent/@types/bun/bun-types": ["bun-types@1.3.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-4N0ig0fEomHt5R0KCFWjovxow98rIoRwKolrYdCcknNwMekCXRnWEUvgu5soYV8QXtVsrUD8B95MBOZGPvr6KQ=="], "@browseros/build-tools/@aws-sdk/client-s3/@aws-sdk/core": ["@aws-sdk/core@3.973.23", "", { "dependencies": { "@aws-sdk/types": "^3.973.6", "@aws-sdk/xml-builder": "^3.972.15", "@smithy/core": "^3.23.12", "@smithy/node-config-provider": "^4.3.12", "@smithy/property-provider": "^4.2.12", "@smithy/protocol-http": "^5.3.12", "@smithy/signature-v4": "^5.3.12", "@smithy/smithy-client": "^4.12.7", "@smithy/types": "^4.13.1", "@smithy/util-base64": "^4.3.2", "@smithy/util-middleware": "^4.2.12", "@smithy/util-utf8": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-aoJncvD1XvloZ9JLnKqTRL9dBy+Szkryoag9VT+V1TqsuUgIxV9cnBVM/hrDi2vE8bDqLiDR8nirdRcCdtJu0w=="], diff --git a/packages/browseros-agent/tsconfig.json b/packages/browseros-agent/tsconfig.json index f15038f264..954352c785 100644 --- a/packages/browseros-agent/tsconfig.json +++ b/packages/browseros-agent/tsconfig.json @@ -25,7 +25,10 @@ "declaration": true, "declarationMap": true }, - "references": [{ "path": "./apps/server" }], + "references": [ + { "path": "./apps/server" }, + { "path": "./apps/agent-mcp-interface" } + ], "include": [], "exclude": ["node_modules", "dist", "build", "*.config.js"] } From 4ea6fcd62d62c824c7a26d3abab10375c3bd0013 Mon Sep 17 00:00:00 2001 From: DaniAkash Date: Fri, 12 Jun 2026 16:38:18 +0530 Subject: [PATCH 02/19] chore: minor edits --- .../apps/agent-mcp-interface/biome.json | 39 ------------------- .../src/local-server-url.ts | 2 +- .../apps/agent-mcp-interface/src/server.ts | 6 +-- 3 files changed, 4 insertions(+), 43 deletions(-) diff --git a/packages/browseros-agent/apps/agent-mcp-interface/biome.json b/packages/browseros-agent/apps/agent-mcp-interface/biome.json index 90a2b9e213..941e6653d2 100644 --- a/packages/browseros-agent/apps/agent-mcp-interface/biome.json +++ b/packages/browseros-agent/apps/agent-mcp-interface/biome.json @@ -2,33 +2,8 @@ "$schema": "https://biomejs.dev/schemas/2.4.8/schema.json", "root": false, "extends": "//", - "vcs": { - "enabled": true, - "clientKind": "git", - "useIgnoreFile": true - }, - "files": { - "ignoreUnknown": false - }, - "formatter": { - "enabled": true, - "indentStyle": "space", - "indentWidth": 2 - }, "linter": { - "enabled": true, "rules": { - "recommended": true, - "correctness": { - "noUnusedImports": "error", - "noUnusedVariables": "error", - "noPrivateImports": { - "level": "error", - "options": { - "defaultVisibility": "package" - } - } - }, "suspicious": { "noConsole": "error" }, @@ -36,19 +11,5 @@ "noProcessEnv": "error" } } - }, - "javascript": { - "formatter": { - "quoteStyle": "single", - "semicolons": "asNeeded" - } - }, - "assist": { - "enabled": true, - "actions": { - "source": { - "organizeImports": "on" - } - } } } diff --git a/packages/browseros-agent/apps/agent-mcp-interface/src/local-server-url.ts b/packages/browseros-agent/apps/agent-mcp-interface/src/local-server-url.ts index c4741b313d..476c96afd5 100644 --- a/packages/browseros-agent/apps/agent-mcp-interface/src/local-server-url.ts +++ b/packages/browseros-agent/apps/agent-mcp-interface/src/local-server-url.ts @@ -11,7 +11,7 @@ * * Plain mutable string rather than a hook/store because writer and * reader live in the same Bun process and the value is written - * exactly once at boot. Mirrors the agent-company idiom. + * exactly once at boot. */ let localServerUrl: string | null = null diff --git a/packages/browseros-agent/apps/agent-mcp-interface/src/server.ts b/packages/browseros-agent/apps/agent-mcp-interface/src/server.ts index 47ad763579..02dd71bd48 100644 --- a/packages/browseros-agent/apps/agent-mcp-interface/src/server.ts +++ b/packages/browseros-agent/apps/agent-mcp-interface/src/server.ts @@ -9,8 +9,8 @@ * `AppType` so the future agent-mcp-ui can build a fully typed * hono-rpc client with `hc(baseUrl)`. * - * Mirrors browseros-ai/agent-company's apps/desktop/src/main/server.ts - * pattern, adapted for Bun + a loopback-only bind. + * Bun + loopback-only bind; the chain shape is the standard hono-rpc + * recipe. */ import { Hono } from 'hono' @@ -45,7 +45,7 @@ app.use('*', cors({ origin: '*' })) // their own expected failures (404s, validation) inline and return // structured 4xx JSON. Anything that escapes that lands here, gets // reported via the injected capture, and turns into a structured 5xx -// JSON body. Mirrors agent-company's app.onError shape. +// JSON body. app.onError((err, c) => { captureRouteError(err, c.req.path, c.req.method) if (err instanceof HttpError) { From 02390dca173fbb9253534b1868fa64f6540a6286 Mon Sep 17 00:00:00 2001 From: DaniAkash Date: Fri, 12 Jun 2026 16:40:39 +0530 Subject: [PATCH 03/19] chore(agent-mcp-interface): scope fallow config to the package Pulls the agent-mcp-interface entry back out of the monorepo-wide packages/browseros-agent/.fallowrc.json and gives the package its own .fallowrc.json. Running `bun run fallow` from inside the package now analyses just this package against its single entry (src/main.ts); running fallow from the agent root no longer drags this package in. Also adds a `fallow` script to the package.json so the command is reachable via `bun run --filter @browseros/agent-mcp-interface fallow`. --- packages/browseros-agent/.fallowrc.json | 1 - .../browseros-agent/apps/agent-mcp-interface/.fallowrc.json | 5 +++++ .../browseros-agent/apps/agent-mcp-interface/package.json | 3 ++- 3 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 packages/browseros-agent/apps/agent-mcp-interface/.fallowrc.json diff --git a/packages/browseros-agent/.fallowrc.json b/packages/browseros-agent/.fallowrc.json index 0580471ab1..58440f1564 100644 --- a/packages/browseros-agent/.fallowrc.json +++ b/packages/browseros-agent/.fallowrc.json @@ -2,7 +2,6 @@ "$schema": "https://raw.githubusercontent.com/fallow-rs/fallow/main/schema.json", "entry": [ "apps/server/src/index.ts", - "apps/agent-mcp-interface/src/main.ts", "apps/agent/entrypoints/app/main.tsx", "apps/agent/entrypoints/sidepanel/main.tsx", "apps/agent/entrypoints/background/index.ts", diff --git a/packages/browseros-agent/apps/agent-mcp-interface/.fallowrc.json b/packages/browseros-agent/apps/agent-mcp-interface/.fallowrc.json new file mode 100644 index 0000000000..b23f0dc131 --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-interface/.fallowrc.json @@ -0,0 +1,5 @@ +{ + "$schema": "https://raw.githubusercontent.com/fallow-rs/fallow/main/schema.json", + "entry": ["src/main.ts"], + "ignorePatterns": ["**/*.d.ts", "**/dist/**", "**/node_modules/**"] +} diff --git a/packages/browseros-agent/apps/agent-mcp-interface/package.json b/packages/browseros-agent/apps/agent-mcp-interface/package.json index a416ed0ded..9eb4ca8d9c 100644 --- a/packages/browseros-agent/apps/agent-mcp-interface/package.json +++ b/packages/browseros-agent/apps/agent-mcp-interface/package.json @@ -15,7 +15,8 @@ "start:ci": "bun src/main.ts", "typecheck": "tsc --noEmit", "lint": "bunx biome check", - "lint:fix": "bunx biome check --write --unsafe" + "lint:fix": "bunx biome check --write --unsafe", + "fallow": "bunx fallow check" }, "dependencies": { "hono": "^4.12.3" From a6809f5f846f9af301041a6b87182b0578392619 Mon Sep 17 00:00:00 2001 From: DaniAkash Date: Fri, 12 Jun 2026 16:41:13 +0530 Subject: [PATCH 04/19] Revert "chore(agent-mcp-interface): scope fallow config to the package" This reverts commit 02390dca173fbb9253534b1868fa64f6540a6286. --- packages/browseros-agent/.fallowrc.json | 1 + .../browseros-agent/apps/agent-mcp-interface/.fallowrc.json | 5 ----- .../browseros-agent/apps/agent-mcp-interface/package.json | 3 +-- 3 files changed, 2 insertions(+), 7 deletions(-) delete mode 100644 packages/browseros-agent/apps/agent-mcp-interface/.fallowrc.json diff --git a/packages/browseros-agent/.fallowrc.json b/packages/browseros-agent/.fallowrc.json index 58440f1564..0580471ab1 100644 --- a/packages/browseros-agent/.fallowrc.json +++ b/packages/browseros-agent/.fallowrc.json @@ -2,6 +2,7 @@ "$schema": "https://raw.githubusercontent.com/fallow-rs/fallow/main/schema.json", "entry": [ "apps/server/src/index.ts", + "apps/agent-mcp-interface/src/main.ts", "apps/agent/entrypoints/app/main.tsx", "apps/agent/entrypoints/sidepanel/main.tsx", "apps/agent/entrypoints/background/index.ts", diff --git a/packages/browseros-agent/apps/agent-mcp-interface/.fallowrc.json b/packages/browseros-agent/apps/agent-mcp-interface/.fallowrc.json deleted file mode 100644 index b23f0dc131..0000000000 --- a/packages/browseros-agent/apps/agent-mcp-interface/.fallowrc.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/fallow-rs/fallow/main/schema.json", - "entry": ["src/main.ts"], - "ignorePatterns": ["**/*.d.ts", "**/dist/**", "**/node_modules/**"] -} diff --git a/packages/browseros-agent/apps/agent-mcp-interface/package.json b/packages/browseros-agent/apps/agent-mcp-interface/package.json index 9eb4ca8d9c..a416ed0ded 100644 --- a/packages/browseros-agent/apps/agent-mcp-interface/package.json +++ b/packages/browseros-agent/apps/agent-mcp-interface/package.json @@ -15,8 +15,7 @@ "start:ci": "bun src/main.ts", "typecheck": "tsc --noEmit", "lint": "bunx biome check", - "lint:fix": "bunx biome check --write --unsafe", - "fallow": "bunx fallow check" + "lint:fix": "bunx biome check --write --unsafe" }, "dependencies": { "hono": "^4.12.3" From 71e854deac0b58d5b84c5e7a3c4e3d704a2deb44 Mon Sep 17 00:00:00 2001 From: DaniAkash Date: Fri, 12 Jun 2026 17:06:00 +0530 Subject: [PATCH 05/19] feat(agent-mcp-ui): bootstrap WXT extension surface Second package of the BrowserOS v2 split. WXT extension that targets the new-tab page and (eventually) the side panel + content overlays. First slice proves the full pipe: React + shadcn (base-vega) renders, TanStack Router resolves routes, TanStack Query + react-query-kit hooks fetch through a typed hono-rpc client, and the runtime closes the loop against the agent-mcp-interface server bound on the same machine. packages/browseros-agent/apps/agent-mcp-ui/ package.json WXT, React 19, Tailwind 4, TanStack Router 1.x, TanStack Query 5, react-query-kit, @base-ui/react, @tabler/icons-react, @browseros/agent-mcp-interface workspace dep (type-only AppType + the PROD_API_PORT constant) tsconfig.json extends .wxt/tsconfig.json, jsx react-jsx, types chrome + bun, paths @/* -> ./* biome.json extends "//", enables tailwindDirectives, ignores routeTree.gen.ts / .wxt / .output / dist, relaxes lint inside components/ui + ai-elements wxt.config.ts @wxt-dev/module-react, manifest with chrome_url_overrides.newtab + 5 permissions, Vite plugins: tanstackRouter (enforce: 'pre', autoCodeSplitting off for now) + tailwindcss components.json shadcn base-vega style, neutral, tabler icons entrypoints/app/ index.html + main.tsx (QueryClientProvider + RouterProvider) + styles.css (Tailwind 4 @theme inline tokens) lib/utils.ts cn() helper (clsx + tailwind-merge) components/ui/ button.tsx, card.tsx, badge.tsx via shadcn CLI modules/api/ client.ts hc(baseUrl) + lazy Proxy that re- resolves the URL on each property access queryClient.ts retry: 1, staleTime: 30_000 parseResponse.ts ApiError thrower with .status + .body system.hooks.ts First react-query-kit hooks against the /system/{health,version,url} endpoints routes/ __root.tsx + index.tsx (file-based routing) routeTree.gen.ts Generated by tanstackRouter plugin screens/cockpit/ Minimal Cockpit.tsx that calls useSystemHealth + useSystemVersion, renders shadcn Card + Badge, shows the interface server's name + version on success and a copy-pasteable hint on failure Also exposes shared/port from @browseros/agent-mcp-interface as a real runtime export so the UI can dial in to PROD_API_PORT. The server type export stays type-only ("default": null). Verified: bun run --filter @browseros/agent-mcp-interface typecheck clean bun run --filter @browseros/agent-mcp-ui typecheck clean bunx biome check (both packages) clean bunx wxt build (chrome-mv3 production) clean bun src/main.ts + curl /system/{health,version} ok --- .../apps/agent-mcp-interface/package.json | 4 + .../apps/agent-mcp-ui/.wxt/tsconfig.json | 28 +++ .../apps/agent-mcp-ui/.wxt/types/globals.d.ts | 15 ++ .../apps/agent-mcp-ui/.wxt/types/i18n.d.ts | 81 +++++++++ .../.wxt/types/imports-module.d.ts | 21 +++ .../apps/agent-mcp-ui/.wxt/types/imports.d.ts | 58 +++++++ .../apps/agent-mcp-ui/.wxt/types/paths.d.ts | 14 ++ .../apps/agent-mcp-ui/.wxt/wxt.d.ts | 8 + .../apps/agent-mcp-ui/biome.json | 29 ++++ .../apps/agent-mcp-ui/components.json | 25 +++ .../apps/agent-mcp-ui/components/ui/badge.tsx | 52 ++++++ .../agent-mcp-ui/components/ui/button.tsx | 58 +++++++ .../apps/agent-mcp-ui/components/ui/card.tsx | 103 +++++++++++ .../agent-mcp-ui/entrypoints/app/index.html | 12 ++ .../agent-mcp-ui/entrypoints/app/main.tsx | 26 +++ .../agent-mcp-ui/entrypoints/app/styles.css | 49 ++++++ .../apps/agent-mcp-ui/lib/utils.ts | 11 ++ .../apps/agent-mcp-ui/modules/api/client.ts | 83 +++++++++ .../agent-mcp-ui/modules/api/parseResponse.ts | 38 ++++ .../agent-mcp-ui/modules/api/queryClient.ts | 10 ++ .../agent-mcp-ui/modules/api/system.hooks.ts | 32 ++++ .../apps/agent-mcp-ui/package.json | 44 +++++ .../apps/agent-mcp-ui/routeTree.gen.ts | 59 +++++++ .../apps/agent-mcp-ui/routes/__root.tsx | 5 + .../apps/agent-mcp-ui/routes/index.tsx | 6 + .../agent-mcp-ui/screens/cockpit/Cockpit.tsx | 75 ++++++++ .../apps/agent-mcp-ui/tsconfig.json | 11 ++ .../apps/agent-mcp-ui/wxt.config.ts | 43 +++++ packages/browseros-agent/bun.lock | 163 +++++++++++++++--- 29 files changed, 1140 insertions(+), 23 deletions(-) create mode 100644 packages/browseros-agent/apps/agent-mcp-ui/.wxt/tsconfig.json create mode 100644 packages/browseros-agent/apps/agent-mcp-ui/.wxt/types/globals.d.ts create mode 100644 packages/browseros-agent/apps/agent-mcp-ui/.wxt/types/i18n.d.ts create mode 100644 packages/browseros-agent/apps/agent-mcp-ui/.wxt/types/imports-module.d.ts create mode 100644 packages/browseros-agent/apps/agent-mcp-ui/.wxt/types/imports.d.ts create mode 100644 packages/browseros-agent/apps/agent-mcp-ui/.wxt/types/paths.d.ts create mode 100644 packages/browseros-agent/apps/agent-mcp-ui/.wxt/wxt.d.ts create mode 100644 packages/browseros-agent/apps/agent-mcp-ui/biome.json create mode 100644 packages/browseros-agent/apps/agent-mcp-ui/components.json create mode 100644 packages/browseros-agent/apps/agent-mcp-ui/components/ui/badge.tsx create mode 100644 packages/browseros-agent/apps/agent-mcp-ui/components/ui/button.tsx create mode 100644 packages/browseros-agent/apps/agent-mcp-ui/components/ui/card.tsx create mode 100644 packages/browseros-agent/apps/agent-mcp-ui/entrypoints/app/index.html create mode 100644 packages/browseros-agent/apps/agent-mcp-ui/entrypoints/app/main.tsx create mode 100644 packages/browseros-agent/apps/agent-mcp-ui/entrypoints/app/styles.css create mode 100644 packages/browseros-agent/apps/agent-mcp-ui/lib/utils.ts create mode 100644 packages/browseros-agent/apps/agent-mcp-ui/modules/api/client.ts create mode 100644 packages/browseros-agent/apps/agent-mcp-ui/modules/api/parseResponse.ts create mode 100644 packages/browseros-agent/apps/agent-mcp-ui/modules/api/queryClient.ts create mode 100644 packages/browseros-agent/apps/agent-mcp-ui/modules/api/system.hooks.ts create mode 100644 packages/browseros-agent/apps/agent-mcp-ui/package.json create mode 100644 packages/browseros-agent/apps/agent-mcp-ui/routeTree.gen.ts create mode 100644 packages/browseros-agent/apps/agent-mcp-ui/routes/__root.tsx create mode 100644 packages/browseros-agent/apps/agent-mcp-ui/routes/index.tsx create mode 100644 packages/browseros-agent/apps/agent-mcp-ui/screens/cockpit/Cockpit.tsx create mode 100644 packages/browseros-agent/apps/agent-mcp-ui/tsconfig.json create mode 100644 packages/browseros-agent/apps/agent-mcp-ui/wxt.config.ts diff --git a/packages/browseros-agent/apps/agent-mcp-interface/package.json b/packages/browseros-agent/apps/agent-mcp-interface/package.json index a416ed0ded..5e5669af1e 100644 --- a/packages/browseros-agent/apps/agent-mcp-interface/package.json +++ b/packages/browseros-agent/apps/agent-mcp-interface/package.json @@ -8,6 +8,10 @@ "./server": { "types": "./src/server.ts", "default": null + }, + "./shared/port": { + "types": "./src/shared/port.ts", + "default": "./src/shared/port.ts" } }, "scripts": { diff --git a/packages/browseros-agent/apps/agent-mcp-ui/.wxt/tsconfig.json b/packages/browseros-agent/apps/agent-mcp-ui/.wxt/tsconfig.json new file mode 100644 index 0000000000..17f9a3fd4f --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-ui/.wxt/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "Bundler", + "noEmit": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "strict": true, + "skipLibCheck": true, + "paths": { + "@": [".."], + "@/*": ["../*"], + "~": [".."], + "~/*": ["../*"], + "@@": [".."], + "@@/*": ["../*"], + "~~": [".."], + "~~/*": ["../*"] + } + }, + "include": [ + "../**/*", + "./wxt.d.ts" + ], + "exclude": ["../dist"] +} \ No newline at end of file diff --git a/packages/browseros-agent/apps/agent-mcp-ui/.wxt/types/globals.d.ts b/packages/browseros-agent/apps/agent-mcp-ui/.wxt/types/globals.d.ts new file mode 100644 index 0000000000..b8aa6c7230 --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-ui/.wxt/types/globals.d.ts @@ -0,0 +1,15 @@ +// Generated by wxt +interface ImportMetaEnv { + readonly MANIFEST_VERSION: 2 | 3; + readonly BROWSER: string; + readonly CHROME: boolean; + readonly FIREFOX: boolean; + readonly SAFARI: boolean; + readonly EDGE: boolean; + readonly OPERA: boolean; + readonly COMMAND: "build" | "serve"; + readonly ENTRYPOINT: string; +} +interface ImportMeta { + readonly env: ImportMetaEnv +} diff --git a/packages/browseros-agent/apps/agent-mcp-ui/.wxt/types/i18n.d.ts b/packages/browseros-agent/apps/agent-mcp-ui/.wxt/types/i18n.d.ts new file mode 100644 index 0000000000..0a0577a435 --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-ui/.wxt/types/i18n.d.ts @@ -0,0 +1,81 @@ +// Generated by wxt +import "wxt/browser"; + +declare module "wxt/browser" { + /** + * See https://developer.chrome.com/docs/extensions/reference/i18n/#method-getMessage + */ + interface GetMessageOptions { + /** + * See https://developer.chrome.com/docs/extensions/reference/i18n/#method-getMessage + */ + escapeLt?: boolean + } + + export interface WxtI18n extends I18n.Static { + /** + * The extension or app ID; you might use this string to construct URLs for resources inside the extension. Even unlocalized extensions can use this message. + * Note: You can't use this message in a manifest file. + * + * "" + */ + getMessage( + messageName: "@@extension_id", + substitutions?: string | string[], + options?: GetMessageOptions, + ): string; + /** + * "" + */ + getMessage( + messageName: "@@ui_locale", + substitutions?: string | string[], + options?: GetMessageOptions, + ): string; + /** + * The text direction for the current locale, either "ltr" for left-to-right languages such as English or "rtl" for right-to-left languages such as Japanese. + * + * "" + */ + getMessage( + messageName: "@@bidi_dir", + substitutions?: string | string[], + options?: GetMessageOptions, + ): string; + /** + * If the @@bidi_dir is "ltr", then this is "rtl"; otherwise, it's "ltr". + * + * "" + */ + getMessage( + messageName: "@@bidi_reversed_dir", + substitutions?: string | string[], + options?: GetMessageOptions, + ): string; + /** + * If the @@bidi_dir is "ltr", then this is "left"; otherwise, it's "right". + * + * "" + */ + getMessage( + messageName: "@@bidi_start_edge", + substitutions?: string | string[], + options?: GetMessageOptions, + ): string; + /** + * If the @@bidi_dir is "ltr", then this is "right"; otherwise, it's "left". + * + * "" + */ + getMessage( + messageName: "@@bidi_end_edge", + substitutions?: string | string[], + options?: GetMessageOptions, + ): string; + getMessage( + messageName: "@@extension_id" | "@@ui_locale" | "@@bidi_dir" | "@@bidi_reversed_dir" | "@@bidi_start_edge" | "@@bidi_end_edge", + substitutions?: string | string[], + options?: GetMessageOptions, + ): string; + } +} diff --git a/packages/browseros-agent/apps/agent-mcp-ui/.wxt/types/imports-module.d.ts b/packages/browseros-agent/apps/agent-mcp-ui/.wxt/types/imports-module.d.ts new file mode 100644 index 0000000000..21d878dea2 --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-ui/.wxt/types/imports-module.d.ts @@ -0,0 +1,21 @@ +// Generated by wxt +// Types for the #import virtual module +declare module '#imports' { + export { browser, Browser } from 'wxt/browser'; + export { storage, StorageArea, WxtStorage, WxtStorageItem, StorageItemKey, StorageAreaChanges, MigrationError } from 'wxt/utils/storage'; + export { getAppConfig, useAppConfig } from 'wxt/utils/app-config'; + export { ContentScriptContext, WxtWindowEventMap } from 'wxt/utils/content-script-context'; + export { createIframeUi, IframeContentScriptUi, IframeContentScriptUiOptions } from 'wxt/utils/content-script-ui/iframe'; + export { createIntegratedUi, IntegratedContentScriptUi, IntegratedContentScriptUiOptions } from 'wxt/utils/content-script-ui/integrated'; + export { createShadowRootUi, ShadowRootContentScriptUi, ShadowRootContentScriptUiOptions } from 'wxt/utils/content-script-ui/shadow-root'; + export { ContentScriptUi, ContentScriptUiOptions, ContentScriptOverlayAlignment, ContentScriptAppendMode, ContentScriptInlinePositioningOptions, ContentScriptOverlayPositioningOptions, ContentScriptModalPositioningOptions, ContentScriptPositioningOptions, ContentScriptAnchoredOptions, AutoMountOptions, StopAutoMount, AutoMount } from 'wxt/utils/content-script-ui/types'; + export { defineAppConfig, WxtAppConfig } from 'wxt/utils/define-app-config'; + export { defineBackground } from 'wxt/utils/define-background'; + export { defineContentScript } from 'wxt/utils/define-content-script'; + export { defineUnlistedScript } from 'wxt/utils/define-unlisted-script'; + export { defineWxtPlugin } from 'wxt/utils/define-wxt-plugin'; + export { injectScript, ScriptPublicPath, InjectScriptOptions } from 'wxt/utils/inject-script'; + export { InvalidMatchPattern, MatchPattern } from 'wxt/utils/match-patterns'; + export { useState, useCallback, useMemo, useEffect, useRef, useContext, useReducer } from 'react'; + export { fakeBrowser } from 'wxt/testing'; +} diff --git a/packages/browseros-agent/apps/agent-mcp-ui/.wxt/types/imports.d.ts b/packages/browseros-agent/apps/agent-mcp-ui/.wxt/types/imports.d.ts new file mode 100644 index 0000000000..37bbde98d6 --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-ui/.wxt/types/imports.d.ts @@ -0,0 +1,58 @@ +// Generated by wxt +export {} +declare global { + const ContentScriptContext: typeof import('wxt/utils/content-script-context').ContentScriptContext + const InvalidMatchPattern: typeof import('wxt/utils/match-patterns').InvalidMatchPattern + const MatchPattern: typeof import('wxt/utils/match-patterns').MatchPattern + const browser: typeof import('wxt/browser').browser + const createIframeUi: typeof import('wxt/utils/content-script-ui/iframe').createIframeUi + const createIntegratedUi: typeof import('wxt/utils/content-script-ui/integrated').createIntegratedUi + const createShadowRootUi: typeof import('wxt/utils/content-script-ui/shadow-root').createShadowRootUi + const defineAppConfig: typeof import('wxt/utils/define-app-config').defineAppConfig + const defineBackground: typeof import('wxt/utils/define-background').defineBackground + const defineContentScript: typeof import('wxt/utils/define-content-script').defineContentScript + const defineUnlistedScript: typeof import('wxt/utils/define-unlisted-script').defineUnlistedScript + const defineWxtPlugin: typeof import('wxt/utils/define-wxt-plugin').defineWxtPlugin + const fakeBrowser: typeof import('wxt/testing').fakeBrowser + const getAppConfig: typeof import('wxt/utils/app-config').getAppConfig + const injectScript: typeof import('wxt/utils/inject-script').injectScript + const storage: typeof import('wxt/utils/storage').storage + const useAppConfig: typeof import('wxt/utils/app-config').useAppConfig + const useCallback: typeof import('react').useCallback + const useContext: typeof import('react').useContext + const useEffect: typeof import('react').useEffect + const useMemo: typeof import('react').useMemo + const useReducer: typeof import('react').useReducer + const useRef: typeof import('react').useRef + const useState: typeof import('react').useState +} +// for type re-export +declare global { + // @ts-ignore + export type { Browser } from 'wxt/browser' + import('wxt/browser') + // @ts-ignore + export type { StorageArea, WxtStorage, WxtStorageItem, StorageItemKey, StorageAreaChanges, MigrationError } from 'wxt/utils/storage' + import('wxt/utils/storage') + // @ts-ignore + export type { WxtWindowEventMap } from 'wxt/utils/content-script-context' + import('wxt/utils/content-script-context') + // @ts-ignore + export type { IframeContentScriptUi, IframeContentScriptUiOptions } from 'wxt/utils/content-script-ui/iframe' + import('wxt/utils/content-script-ui/iframe') + // @ts-ignore + export type { IntegratedContentScriptUi, IntegratedContentScriptUiOptions } from 'wxt/utils/content-script-ui/integrated' + import('wxt/utils/content-script-ui/integrated') + // @ts-ignore + export type { ShadowRootContentScriptUi, ShadowRootContentScriptUiOptions } from 'wxt/utils/content-script-ui/shadow-root' + import('wxt/utils/content-script-ui/shadow-root') + // @ts-ignore + export type { ContentScriptUi, ContentScriptUiOptions, ContentScriptOverlayAlignment, ContentScriptAppendMode, ContentScriptInlinePositioningOptions, ContentScriptOverlayPositioningOptions, ContentScriptModalPositioningOptions, ContentScriptPositioningOptions, ContentScriptAnchoredOptions, AutoMountOptions, StopAutoMount, AutoMount } from 'wxt/utils/content-script-ui/types' + import('wxt/utils/content-script-ui/types') + // @ts-ignore + export type { WxtAppConfig } from 'wxt/utils/define-app-config' + import('wxt/utils/define-app-config') + // @ts-ignore + export type { ScriptPublicPath, InjectScriptOptions } from 'wxt/utils/inject-script' + import('wxt/utils/inject-script') +} diff --git a/packages/browseros-agent/apps/agent-mcp-ui/.wxt/types/paths.d.ts b/packages/browseros-agent/apps/agent-mcp-ui/.wxt/types/paths.d.ts new file mode 100644 index 0000000000..8481e9f05f --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-ui/.wxt/types/paths.d.ts @@ -0,0 +1,14 @@ +// Generated by wxt +import "wxt/browser"; + +declare module "wxt/browser" { + export type PublicPath = + | "" + | "/" + | "/app.html" + type HtmlPublicPath = Extract + export interface WxtRuntime { + getURL(path: PublicPath): string; + getURL(path: `${HtmlPublicPath}${string}`): string; + } +} diff --git a/packages/browseros-agent/apps/agent-mcp-ui/.wxt/wxt.d.ts b/packages/browseros-agent/apps/agent-mcp-ui/.wxt/wxt.d.ts new file mode 100644 index 0000000000..2342522e94 --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-ui/.wxt/wxt.d.ts @@ -0,0 +1,8 @@ +// Generated by wxt +/// +/// +/// +/// +/// +/// +/// diff --git a/packages/browseros-agent/apps/agent-mcp-ui/biome.json b/packages/browseros-agent/apps/agent-mcp-ui/biome.json new file mode 100644 index 0000000000..b9849692a9 --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-ui/biome.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.4.8/schema.json", + "root": false, + "extends": "//", + "files": { + "includes": ["**", "!routeTree.gen.ts", "!.wxt", "!.output", "!dist"] + }, + "css": { + "parser": { + "tailwindDirectives": true + } + }, + "overrides": [ + { + "includes": ["components/ui/**", "components/ai-elements/**"], + "linter": { + "rules": { + "correctness": { + "noUnusedImports": "off", + "noUnusedVariables": "off" + }, + "nursery": { + "useSortedClasses": "off" + } + } + } + } + ] +} diff --git a/packages/browseros-agent/apps/agent-mcp-ui/components.json b/packages/browseros-agent/apps/agent-mcp-ui/components.json new file mode 100644 index 0000000000..2c636ea4a6 --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-ui/components.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "base-vega", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "", + "css": "entrypoints/app/styles.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "iconLibrary": "tabler", + "rtl": false, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "menuColor": "default-translucent", + "menuAccent": "subtle", + "registries": {} +} diff --git a/packages/browseros-agent/apps/agent-mcp-ui/components/ui/badge.tsx b/packages/browseros-agent/apps/agent-mcp-ui/components/ui/badge.tsx new file mode 100644 index 0000000000..83b3ed7d7d --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-ui/components/ui/badge.tsx @@ -0,0 +1,52 @@ +import { mergeProps } from '@base-ui/react/merge-props' +import { useRender } from '@base-ui/react/use-render' +import { cva, type VariantProps } from 'class-variance-authority' + +import { cn } from '@/lib/utils' + +const badgeVariants = cva( + 'group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!', + { + variants: { + variant: { + default: 'bg-primary text-primary-foreground [a]:hover:bg-primary/80', + secondary: + 'bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80', + destructive: + 'bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20', + outline: + 'border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground', + ghost: + 'hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50', + link: 'text-primary underline-offset-4 hover:underline', + }, + }, + defaultVariants: { + variant: 'default', + }, + }, +) + +function Badge({ + className, + variant = 'default', + render, + ...props +}: useRender.ComponentProps<'span'> & VariantProps) { + return useRender({ + defaultTagName: 'span', + props: mergeProps<'span'>( + { + className: cn(badgeVariants({ variant }), className), + }, + props, + ), + render, + state: { + slot: 'badge', + variant, + }, + }) +} + +export { Badge, badgeVariants } diff --git a/packages/browseros-agent/apps/agent-mcp-ui/components/ui/button.tsx b/packages/browseros-agent/apps/agent-mcp-ui/components/ui/button.tsx new file mode 100644 index 0000000000..9a2980e617 --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-ui/components/ui/button.tsx @@ -0,0 +1,58 @@ +import { Button as ButtonPrimitive } from '@base-ui/react/button' +import { cva, type VariantProps } from 'class-variance-authority' + +import { cn } from '@/lib/utils' + +const buttonVariants = cva( + "group/button inline-flex shrink-0 items-center justify-center rounded-md border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", + { + variants: { + variant: { + default: 'bg-primary text-primary-foreground hover:bg-primary/80', + outline: + 'border-border bg-background shadow-xs hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50', + secondary: + 'bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground', + ghost: + 'hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50', + destructive: + 'bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40', + link: 'text-primary underline-offset-4 hover:underline', + }, + size: { + default: + 'h-9 gap-1.5 px-2.5 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2', + xs: "h-6 gap-1 rounded-[min(var(--radius-md),8px)] px-2 text-xs in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3", + sm: 'h-8 gap-1 rounded-[min(var(--radius-md),10px)] px-2.5 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5', + lg: 'h-10 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2', + icon: 'size-9', + 'icon-xs': + "size-6 rounded-[min(var(--radius-md),8px)] in-data-[slot=button-group]:rounded-md [&_svg:not([class*='size-'])]:size-3", + 'icon-sm': + 'size-8 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-md', + 'icon-lg': 'size-10', + }, + }, + defaultVariants: { + variant: 'default', + size: 'default', + }, + }, +) + +function Button({ + className, + variant = 'default', + size = 'default', + ...props +}: ButtonPrimitive.Props & VariantProps) { + return ( + + ) +} + +export { Button, buttonVariants } diff --git a/packages/browseros-agent/apps/agent-mcp-ui/components/ui/card.tsx b/packages/browseros-agent/apps/agent-mcp-ui/components/ui/card.tsx new file mode 100644 index 0000000000..4478c9d787 --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-ui/components/ui/card.tsx @@ -0,0 +1,103 @@ +import type * as React from 'react' + +import { cn } from '@/lib/utils' + +function Card({ + className, + size = 'default', + ...props +}: React.ComponentProps<'div'> & { size?: 'default' | 'sm' }) { + return ( +
img:first-child]:pt-0 data-[size=sm]:[--card-spacing:--spacing(4)] *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl', + className, + )} + {...props} + /> + ) +} + +function CardHeader({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
+ ) +} + +function CardTitle({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
+ ) +} + +function CardDescription({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
+ ) +} + +function CardAction({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
+ ) +} + +function CardContent({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
+ ) +} + +function CardFooter({ className, ...props }: React.ComponentProps<'div'>) { + return ( +
+ ) +} + +export { + Card, + CardAction, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} diff --git a/packages/browseros-agent/apps/agent-mcp-ui/entrypoints/app/index.html b/packages/browseros-agent/apps/agent-mcp-ui/entrypoints/app/index.html new file mode 100644 index 0000000000..30bdfddbb7 --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-ui/entrypoints/app/index.html @@ -0,0 +1,12 @@ + + + + + + BrowserOS Agents + + +
+ + + diff --git a/packages/browseros-agent/apps/agent-mcp-ui/entrypoints/app/main.tsx b/packages/browseros-agent/apps/agent-mcp-ui/entrypoints/app/main.tsx new file mode 100644 index 0000000000..821e10d409 --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-ui/entrypoints/app/main.tsx @@ -0,0 +1,26 @@ +import { QueryClientProvider } from '@tanstack/react-query' +import { createRouter, RouterProvider } from '@tanstack/react-router' +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import { queryClient } from '@/modules/api/queryClient' +import { routeTree } from '../../routeTree.gen' +import './styles.css' + +const router = createRouter({ routeTree }) + +declare module '@tanstack/react-router' { + interface Register { + router: typeof router + } +} + +const root = document.getElementById('root') +if (!root) throw new Error('Root element not found') + +createRoot(root).render( + + + + + , +) diff --git a/packages/browseros-agent/apps/agent-mcp-ui/entrypoints/app/styles.css b/packages/browseros-agent/apps/agent-mcp-ui/entrypoints/app/styles.css new file mode 100644 index 0000000000..924353dacd --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-ui/entrypoints/app/styles.css @@ -0,0 +1,49 @@ +@import "tailwindcss"; + +@theme inline { + --color-background: hsl(0 0% 100%); + --color-foreground: hsl(0 0% 8%); + --color-muted: hsl(0 0% 96%); + --color-muted-foreground: hsl(0 0% 45%); + --color-border: hsl(0 0% 90%); + --color-card: hsl(0 0% 100%); + --color-card-foreground: hsl(0 0% 8%); + --color-primary: hsl(0 0% 8%); + --color-primary-foreground: hsl(0 0% 98%); + --color-secondary: hsl(0 0% 96%); + --color-secondary-foreground: hsl(0 0% 8%); + --color-accent: hsl(20 90% 56%); + --color-accent-foreground: hsl(0 0% 100%); + --color-destructive: hsl(0 84% 60%); + --color-destructive-foreground: hsl(0 0% 98%); + --color-ring: hsl(0 0% 8%); +} + +@media (prefers-color-scheme: dark) { + @theme inline { + --color-background: hsl(0 0% 7%); + --color-foreground: hsl(0 0% 96%); + --color-muted: hsl(0 0% 12%); + --color-muted-foreground: hsl(0 0% 64%); + --color-border: hsl(0 0% 18%); + --color-card: hsl(0 0% 9%); + --color-card-foreground: hsl(0 0% 96%); + --color-primary: hsl(0 0% 96%); + --color-primary-foreground: hsl(0 0% 8%); + --color-secondary: hsl(0 0% 14%); + --color-secondary-foreground: hsl(0 0% 96%); + } +} + +html, +body, +#root { + height: 100%; + margin: 0; +} + +body { + background-color: var(--color-background); + color: var(--color-foreground); + font-family: system-ui, -apple-system, "Segoe UI", sans-serif; +} diff --git a/packages/browseros-agent/apps/agent-mcp-ui/lib/utils.ts b/packages/browseros-agent/apps/agent-mcp-ui/lib/utils.ts new file mode 100644 index 0000000000..4bc8d0c4ee --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-ui/lib/utils.ts @@ -0,0 +1,11 @@ +import { type ClassValue, clsx } from 'clsx' +import { twMerge } from 'tailwind-merge' + +/** + * Tailwind class-merge helper. shadcn primitives expect this exact + * signature at `@/lib/utils`; the alias is wired in tsconfig + the + * shadcn CLI uses it when generating new components. + */ +export function cn(...inputs: ClassValue[]): string { + return twMerge(clsx(inputs)) +} diff --git a/packages/browseros-agent/apps/agent-mcp-ui/modules/api/client.ts b/packages/browseros-agent/apps/agent-mcp-ui/modules/api/client.ts new file mode 100644 index 0000000000..ca7fd12829 --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-ui/modules/api/client.ts @@ -0,0 +1,83 @@ +/** + * @license + * Copyright 2025 BrowserOS + * SPDX-License-Identifier: AGPL-3.0-or-later + * + * hono-rpc client factory + lazy Proxy. + * + * AppType is imported as a type-only symbol from + * @browseros/agent-mcp-interface/server. That export field has + * `"default": null` so a runtime import would fail at build time; + * we only get the type at compile time, the runtime calls go over + * HTTP loopback to whichever port the interface server bound to. + * + * Resolution order for the base URL: + * 1. ?apiUrl=… on window.location (dev launcher publishes this) + * 2. sessionStorage cache of (1) + * 3. PROD_API_PORT constant on 127.0.0.1 + * + * The lazy Proxy is what lets us re-resolve the base URL after the + * dev launcher hot-swaps it without breaking hc's path chaining + * (hc returns its own Proxy; ours just forwards each property read). + */ + +import type { AppType } from '@browseros/agent-mcp-interface/server' +import { PROD_API_PORT } from '@browseros/agent-mcp-interface/shared/port' +import { hc } from 'hono/client' + +const API_URL_STORAGE_KEY = 'browseros.agent-mcp-ui.apiUrl' + +function isLoopbackUrl(value: string | null | undefined): value is string { + return !!value && value.startsWith('http://127.0.0.1:') +} + +function resolveApiBaseUrl(): string { + const fallback = `http://127.0.0.1:${PROD_API_PORT}` + if (typeof window === 'undefined') return fallback + + const fromQuery = new URLSearchParams(window.location.search).get('apiUrl') + if (isLoopbackUrl(fromQuery)) { + try { + window.sessionStorage.setItem(API_URL_STORAGE_KEY, fromQuery) + } catch { + // sessionStorage can refuse writes in sandboxed contexts; the + // resolved URL still serves this session. + } + return fromQuery + } + + try { + const stored = window.sessionStorage.getItem(API_URL_STORAGE_KEY) + if (isLoopbackUrl(stored)) return stored + } catch { + // see above + } + + return fallback +} + +type ApiClient = ReturnType> + +let cachedBase: string | null = null +let cachedClient: ApiClient | null = null + +function getApiClient(): ApiClient { + const base = resolveApiBaseUrl() + if (base !== cachedBase || !cachedClient) { + cachedBase = base + cachedClient = hc(base) + } + return cachedClient +} + +// Lazy Proxy: every property access (`api.system.health.$get`) goes +// through the freshly resolved baseUrl rather than a snapshot +// captured at module load. hc itself returns a Proxy, so we forward +// to it without a receiver override (passing an empty target would +// break hc's path chaining). +export const api = new Proxy({} as ApiClient, { + get(_target, prop) { + const client = getApiClient() as unknown as Record + return client[prop] + }, +}) diff --git a/packages/browseros-agent/apps/agent-mcp-ui/modules/api/parseResponse.ts b/packages/browseros-agent/apps/agent-mcp-ui/modules/api/parseResponse.ts new file mode 100644 index 0000000000..b2225b292c --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-ui/modules/api/parseResponse.ts @@ -0,0 +1,38 @@ +/** + * Throws a structured ApiError on non-OK responses so React Query + * treats the request as failed. The error carries the status code + * and parsed body so toasts / screen-level fallbacks can branch on + * shape without re-reading the response. + */ +type ApiError = Error & { + status: number + body: unknown +} + +export async function parseResponse(response: Response): Promise { + if (response.ok) { + return (await response.json()) as T + } + let body: unknown + try { + body = await response.json() + } catch { + body = await response.text().catch(() => '') + } + const err = new Error(extractMessage(body, response.status)) as ApiError + err.status = response.status + err.body = body + throw err +} + +function extractMessage(body: unknown, status: number): string { + if ( + body && + typeof body === 'object' && + 'error' in body && + typeof (body as { error: unknown }).error === 'string' + ) { + return (body as { error: string }).error + } + return `Request failed with status ${status}` +} diff --git a/packages/browseros-agent/apps/agent-mcp-ui/modules/api/queryClient.ts b/packages/browseros-agent/apps/agent-mcp-ui/modules/api/queryClient.ts new file mode 100644 index 0000000000..5e3e9e4df8 --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-ui/modules/api/queryClient.ts @@ -0,0 +1,10 @@ +import { QueryClient } from '@tanstack/react-query' + +export const queryClient = new QueryClient({ + defaultOptions: { + queries: { + retry: 1, + staleTime: 30_000, + }, + }, +}) diff --git a/packages/browseros-agent/apps/agent-mcp-ui/modules/api/system.hooks.ts b/packages/browseros-agent/apps/agent-mcp-ui/modules/api/system.hooks.ts new file mode 100644 index 0000000000..d1e5547124 --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-ui/modules/api/system.hooks.ts @@ -0,0 +1,32 @@ +import type { InferResponseType } from 'hono/client' +import { createQuery } from 'react-query-kit' +import { api } from './client' +import { parseResponse } from './parseResponse' + +// Destructured typed endpoints. The `$get` / `$post` accessors hc +// exposes for each route preserve the inferred request / response +// shape, which `InferResponseType` and `InferRequestType` unwrap. +const $health = api.system.health.$get +const $version = api.system.version.$get +const $url = api.system.url.$get + +export type SystemHealth = InferResponseType +export type SystemVersion = InferResponseType +export type SystemUrl = InferResponseType + +export const useSystemHealth = createQuery({ + queryKey: ['system', 'health'], + fetcher: () => $health().then(parseResponse), +}) + +export const useSystemVersion = createQuery({ + queryKey: ['system', 'version'], + fetcher: () => $version().then(parseResponse), +}) + +export const useSystemUrl = createQuery({ + queryKey: ['system', 'url'], + fetcher: () => $url().then(parseResponse), + staleTime: 0, + refetchOnMount: 'always', +}) diff --git a/packages/browseros-agent/apps/agent-mcp-ui/package.json b/packages/browseros-agent/apps/agent-mcp-ui/package.json new file mode 100644 index 0000000000..c990861c0c --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-ui/package.json @@ -0,0 +1,44 @@ +{ + "name": "@browseros/agent-mcp-ui", + "type": "module", + "private": true, + "version": "0.0.1", + "description": "WXT extension surface for the BrowserOS v2 agent cockpit. React + shadcn (base-vega). Talks to @browseros/agent-mcp-interface over hono-rpc.", + "scripts": { + "dev": "wxt", + "build": "wxt build", + "build:dev": "wxt build --mode development", + "zip": "wxt zip", + "compile": "wxt prepare && tsc --noEmit", + "typecheck": "wxt prepare && tsc --noEmit", + "lint": "bunx biome check", + "lint:fix": "bunx biome check --write --unsafe" + }, + "dependencies": { + "@base-ui/react": "^1.0.0-beta.6", + "@browseros/agent-mcp-interface": "*", + "@radix-ui/react-slot": "^1.2.4", + "@tabler/icons-react": "^3.34.1", + "@tanstack/react-query": "^5.95.2", + "@tanstack/react-router": "^1.131.41", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "hono": "^4.12.3", + "react": "^19.1.1", + "react-dom": "^19.1.1", + "react-query-kit": "^3.3.1", + "tailwind-merge": "^3.4.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.1.17", + "@tanstack/router-plugin": "^1.131.41", + "@types/chrome": "^0.1.28", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@wxt-dev/module-react": "^1.1.5", + "tailwindcss": "^4.1.17", + "typescript": "^5.9.2", + "vite": "^7.3.1", + "wxt": "^0.20.18" + } +} diff --git a/packages/browseros-agent/apps/agent-mcp-ui/routeTree.gen.ts b/packages/browseros-agent/apps/agent-mcp-ui/routeTree.gen.ts new file mode 100644 index 0000000000..d204c269b3 --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-ui/routeTree.gen.ts @@ -0,0 +1,59 @@ +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file was automatically generated by TanStack Router. +// You should NOT make any changes in this file as it will be overwritten. +// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. + +import { Route as rootRouteImport } from './routes/__root' +import { Route as IndexRouteImport } from './routes/index' + +const IndexRoute = IndexRouteImport.update({ + id: '/', + path: '/', + getParentRoute: () => rootRouteImport, +} as any) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute +} +export interface FileRoutesByTo { + '/': typeof IndexRoute +} +export interface FileRoutesById { + __root__: typeof rootRouteImport + '/': typeof IndexRoute +} +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: '/' + fileRoutesByTo: FileRoutesByTo + to: '/' + id: '__root__' | '/' + fileRoutesById: FileRoutesById +} +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute +} + +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof IndexRouteImport + parentRoute: typeof rootRouteImport + } + } +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, +} +export const routeTree = rootRouteImport + ._addFileChildren(rootRouteChildren) + ._addFileTypes() diff --git a/packages/browseros-agent/apps/agent-mcp-ui/routes/__root.tsx b/packages/browseros-agent/apps/agent-mcp-ui/routes/__root.tsx new file mode 100644 index 0000000000..f463b796b4 --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-ui/routes/__root.tsx @@ -0,0 +1,5 @@ +import { createRootRoute, Outlet } from '@tanstack/react-router' + +export const Route = createRootRoute({ + component: () => , +}) diff --git a/packages/browseros-agent/apps/agent-mcp-ui/routes/index.tsx b/packages/browseros-agent/apps/agent-mcp-ui/routes/index.tsx new file mode 100644 index 0000000000..99726b08a6 --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-ui/routes/index.tsx @@ -0,0 +1,6 @@ +import { createFileRoute } from '@tanstack/react-router' +import { Cockpit } from '@/screens/cockpit/Cockpit' + +export const Route = createFileRoute('/')({ + component: Cockpit, +}) diff --git a/packages/browseros-agent/apps/agent-mcp-ui/screens/cockpit/Cockpit.tsx b/packages/browseros-agent/apps/agent-mcp-ui/screens/cockpit/Cockpit.tsx new file mode 100644 index 0000000000..2b437d385d --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-ui/screens/cockpit/Cockpit.tsx @@ -0,0 +1,75 @@ +import { IconActivity, IconServer } from '@tabler/icons-react' +import { Badge } from '@/components/ui/badge' +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from '@/components/ui/card' +import { useSystemHealth, useSystemVersion } from '@/modules/api/system.hooks' + +export function Cockpit() { + const health = useSystemHealth() + const version = useSystemVersion() + + const healthLabel = health.isLoading + ? 'checking…' + : health.error + ? 'unreachable' + : (health.data?.status ?? 'unknown') + + return ( +
+
+

+ BrowserOS Agents +

+

+ Cockpit bootstrap — verifying the UI talks to the agent-mcp-interface + server over hono-rpc. +

+
+ + + +
+ + + Interface server + + + + {healthLabel} + +
+ + Connection probe against{' '} + /system/health and{' '} + /system/version. + +
+ + {version.data && ( +
+ name + {version.data.name} + + v{version.data.version} + +
+ )} + {version.error && ( +

+ Could not reach the interface server. Start it with{' '} + + bun run --filter @browseros/agent-mcp-interface start + + . +

+ )} +
+
+
+ ) +} diff --git a/packages/browseros-agent/apps/agent-mcp-ui/tsconfig.json b/packages/browseros-agent/apps/agent-mcp-ui/tsconfig.json new file mode 100644 index 0000000000..f64cae6d24 --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-ui/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "./.wxt/tsconfig.json", + "compilerOptions": { + "types": ["chrome", "bun"], + "allowImportingTsExtensions": true, + "jsx": "react-jsx", + "paths": { + "@/*": ["./*"] + } + } +} diff --git a/packages/browseros-agent/apps/agent-mcp-ui/wxt.config.ts b/packages/browseros-agent/apps/agent-mcp-ui/wxt.config.ts new file mode 100644 index 0000000000..d0b50fd036 --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-ui/wxt.config.ts @@ -0,0 +1,43 @@ +import tailwindcss from '@tailwindcss/vite' +import { tanstackRouter } from '@tanstack/router-plugin/vite' +import type { Plugin } from 'vite' +import { defineConfig } from 'wxt' + +// WXT's module-react auto-injects @vitejs/plugin-react. The router +// plugin checks plugin order in its configResolved hook and refuses +// to run if the React plugin lands before it. autoCodeSplitting is +// the sub-plugin enforcing that check; turning it off keeps the +// route-tree generator (the part we actually need at this stage) +// while sidestepping the order constraint. Code splitting can be +// reinstated later by replacing the WXT module-react with a manual +// @vitejs/plugin-react placement after the router plugin. +function prependRouterPlugin(): Plugin[] { + const plugins = tanstackRouter({ + target: 'react', + routesDirectory: './routes', + generatedRouteTree: './routeTree.gen.ts', + autoCodeSplitting: false, + }) + const asArray = Array.isArray(plugins) ? plugins : [plugins] + return asArray.map((p) => ({ ...p, enforce: 'pre' as const })) +} + +// Mounts the React-only build pipeline (Vite + @vitejs/plugin-react) +// and reserves the cockpit at chrome_url_overrides.newtab so the +// extension takes over the new-tab page once installed. +export default defineConfig({ + outDir: 'dist', + modules: ['@wxt-dev/module-react'], + manifest: { + name: 'BrowserOS Agents', + permissions: ['storage', 'tabs', 'tabGroups', 'sidePanel', 'notifications'], + host_permissions: ['http://127.0.0.1/*'], + chrome_url_overrides: { newtab: 'app.html' }, + action: { + default_title: 'BrowserOS Agents', + }, + }, + vite: () => ({ + plugins: [...prependRouterPlugin(), tailwindcss()], + }), +}) diff --git a/packages/browseros-agent/bun.lock b/packages/browseros-agent/bun.lock index 1a7b4e246f..f01e9c41fb 100644 --- a/packages/browseros-agent/bun.lock +++ b/packages/browseros-agent/bun.lock @@ -126,6 +126,37 @@ "typescript": "^5.9.2", }, }, + "apps/agent-mcp-ui": { + "name": "@browseros/agent-mcp-ui", + "version": "0.0.1", + "dependencies": { + "@base-ui/react": "^1.0.0-beta.6", + "@browseros/agent-mcp-interface": "*", + "@radix-ui/react-slot": "^1.2.4", + "@tabler/icons-react": "^3.34.1", + "@tanstack/react-query": "^5.95.2", + "@tanstack/react-router": "^1.131.41", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "hono": "^4.12.3", + "react": "^19.1.1", + "react-dom": "^19.1.1", + "react-query-kit": "^3.3.1", + "tailwind-merge": "^3.4.0", + }, + "devDependencies": { + "@tailwindcss/vite": "^4.1.17", + "@tanstack/router-plugin": "^1.131.41", + "@types/chrome": "^0.1.28", + "@types/react": "^19.1.12", + "@types/react-dom": "^19.1.9", + "@wxt-dev/module-react": "^1.1.5", + "tailwindcss": "^4.1.17", + "typescript": "^5.9.2", + "vite": "^7.3.1", + "wxt": "^0.20.18", + }, + }, "apps/eval": { "name": "@browseros/eval", "version": "0.1.0", @@ -403,6 +434,10 @@ "@babel/types": ["@babel/types@7.28.6", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg=="], + "@base-ui/react": ["@base-ui/react@1.5.0", "", { "dependencies": { "@babel/runtime": "^7.29.2", "@base-ui/utils": "0.2.9", "@floating-ui/react-dom": "^2.1.8", "@floating-ui/utils": "^0.2.11", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "@date-fns/tz": "^1.2.0", "@types/react": "^17 || ^18 || ^19", "date-fns": "^4.0.0", "react": "^17 || ^18 || ^19", "react-dom": "^17 || ^18 || ^19" }, "optionalPeers": ["@date-fns/tz", "@types/react", "date-fns"] }, "sha512-z1gSAlced1yY+iM+mHDEtIkD8UI3Ebs52MuBPxvV6f5hRutk+xvCH/wuB7hDqDzK9JG5FoMz5nhrqtSs1wjt1A=="], + + "@base-ui/utils": ["@base-ui/utils@0.2.9", "", { "dependencies": { "@babel/runtime": "^7.29.2", "@floating-ui/utils": "^0.2.11", "reselect": "^5.1.1", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "@types/react": "^17 || ^18 || ^19", "react": "^17 || ^18 || ^19", "react-dom": "^17 || ^18 || ^19" }, "optionalPeers": ["@types/react"] }, "sha512-x/PDDCYzoqPpjrdyb3VcyylTI2IjUXEtYDGi5foh7KsnmNJIIaVwA2GLgDH1dps1GgXiJbA60hM+AyuTfQzIvw=="], + "@better-auth/core": ["@better-auth/core@1.4.17", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "zod": "^4.3.5" }, "peerDependencies": { "@better-auth/utils": "0.3.0", "@better-fetch/fetch": "1.1.21", "better-call": "1.1.8", "jose": "^6.1.0", "kysely": "^0.28.5", "nanostores": "^1.0.1" } }, "sha512-WSaEQDdUO6B1CzAmissN6j0lx9fM9lcslEYzlApB5UzFaBeAOHNUONTdglSyUs6/idiZBoRvt0t/qMXCgIU8ug=="], "@better-auth/telemetry": ["@better-auth/telemetry@1.4.17", "", { "dependencies": { "@better-auth/utils": "0.3.0", "@better-fetch/fetch": "1.1.21" }, "peerDependencies": { "@better-auth/core": "1.4.17" } }, "sha512-R1BC4e/bNjQbXu7lG6ubpgmsPj7IMqky5DvMlzAtnAJWJhh99pMh/n6w5gOHa0cqDZgEAuj75IPTxv+q3YiInA=="], @@ -435,6 +470,8 @@ "@browseros/agent-mcp-interface": ["@browseros/agent-mcp-interface@workspace:apps/agent-mcp-interface"], + "@browseros/agent-mcp-ui": ["@browseros/agent-mcp-ui@workspace:apps/agent-mcp-ui"], + "@browseros/build-tools": ["@browseros/build-tools@workspace:packages/build-tools"], "@browseros/cdp-protocol": ["@browseros/cdp-protocol@workspace:packages/cdp-protocol"], @@ -657,15 +694,15 @@ "@fastify/busboy": ["@fastify/busboy@3.2.0", "", {}, "sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA=="], - "@floating-ui/core": ["@floating-ui/core@1.7.3", "", { "dependencies": { "@floating-ui/utils": "^0.2.10" } }, "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w=="], + "@floating-ui/core": ["@floating-ui/core@1.7.5", "", { "dependencies": { "@floating-ui/utils": "^0.2.11" } }, "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ=="], - "@floating-ui/dom": ["@floating-ui/dom@1.7.4", "", { "dependencies": { "@floating-ui/core": "^1.7.3", "@floating-ui/utils": "^0.2.10" } }, "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA=="], + "@floating-ui/dom": ["@floating-ui/dom@1.7.6", "", { "dependencies": { "@floating-ui/core": "^1.7.5", "@floating-ui/utils": "^0.2.11" } }, "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ=="], "@floating-ui/react": ["@floating-ui/react@0.27.16", "", { "dependencies": { "@floating-ui/react-dom": "^2.1.6", "@floating-ui/utils": "^0.2.10", "tabbable": "^6.0.0" }, "peerDependencies": { "react": ">=17.0.0", "react-dom": ">=17.0.0" } }, "sha512-9O8N4SeG2z++TSM8QA/KTeKFBVCNEz/AGS7gWPJf6KFRzmRWixFRnCnkPHRDwSVZW6QPDO6uT0P2SpWNKCc9/g=="], - "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.6", "", { "dependencies": { "@floating-ui/dom": "^1.7.4" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw=="], + "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.8", "", { "dependencies": { "@floating-ui/dom": "^1.7.6" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A=="], - "@floating-ui/utils": ["@floating-ui/utils@0.2.10", "", {}, "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ=="], + "@floating-ui/utils": ["@floating-ui/utils@0.2.11", "", {}, "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg=="], "@gerrit0/mini-shiki": ["@gerrit0/mini-shiki@3.21.0", "", { "dependencies": { "@shikijs/engine-oniguruma": "^3.21.0", "@shikijs/langs": "^3.21.0", "@shikijs/themes": "^3.21.0", "@shikijs/types": "^3.21.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-9PrsT5DjZA+w3lur/aOIx3FlDeHdyCEFlv9U+fmsVyjPZh61G5SYURQ/1ebe2U63KbDmI2V8IhIUegWb8hjOyg=="], @@ -1505,6 +1542,10 @@ "@stitches/react": ["@stitches/react@1.2.8", "", { "peerDependencies": { "react": ">= 16.3.0" } }, "sha512-9g9dWI4gsSVe8bNLlb+lMkBYsnIKCZTmvqvDG+Avnn69XfmHZKiaMrx7cgTaddq7aTPPmXiTsbFcUy0xgI4+wA=="], + "@tabler/icons": ["@tabler/icons@3.44.0", "", {}, "sha512-Wn0AOZG9sg0L+bjfMqq4eNhC6pQjIrk94LvvWYNYkY8KH8wC3YILRzQlrnVJc4FUeMxH/AK97QsYCX35H3LndA=="], + + "@tabler/icons-react": ["@tabler/icons-react@3.44.0", "", { "dependencies": { "@tabler/icons": "3.44.0" }, "peerDependencies": { "react": ">= 16" } }, "sha512-8+rvzBbVm/1Z3sG3x7GUNAaxIKxwgz8xaMhRs23nrCnMTKRFAhEC+82zAIFeAA0seXdrAGX5HFCkaLpGK2rVHg=="], + "@tailwindcss/node": ["@tailwindcss/node@4.1.18", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "enhanced-resolve": "^5.18.3", "jiti": "^2.6.1", "lightningcss": "1.30.2", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.1.18" } }, "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ=="], "@tailwindcss/oxide": ["@tailwindcss/oxide@4.1.18", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.1.18", "@tailwindcss/oxide-darwin-arm64": "4.1.18", "@tailwindcss/oxide-darwin-x64": "4.1.18", "@tailwindcss/oxide-freebsd-x64": "4.1.18", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", "@tailwindcss/oxide-linux-x64-musl": "4.1.18", "@tailwindcss/oxide-wasm32-wasi": "4.1.18", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" } }, "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A=="], @@ -1537,6 +1578,8 @@ "@tailwindcss/vite": ["@tailwindcss/vite@4.1.18", "", { "dependencies": { "@tailwindcss/node": "4.1.18", "@tailwindcss/oxide": "4.1.18", "tailwindcss": "4.1.18" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7" } }, "sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA=="], + "@tanstack/history": ["@tanstack/history@1.162.0", "", {}, "sha512-79pf/RkhteYZTRgcR4F9kbk84P2N8rugQJswxfIqovlbRiT3yI7eBE+5QorIrZaOKktsgzRlXh1l/du/xpl4iA=="], + "@tanstack/query-async-storage-persister": ["@tanstack/query-async-storage-persister@5.99.0", "", { "dependencies": { "@tanstack/query-core": "5.99.0", "@tanstack/query-persist-client-core": "5.99.0" } }, "sha512-RUG++yZf8RoRK1Yz83WHHYJ6EF8DqKIF/UNNUUDEw/cY9SLKhAeEd4a0+kDzNRdb4RGXXeF5UIuzoEFJ7elLwQ=="], "@tanstack/query-core": ["@tanstack/query-core@5.99.0", "", {}, "sha512-3Jv3WQG0BCcH7G+7lf/bP8QyBfJOXeY+T08Rin3GZ1bshvwlbPt7NrDHMEzGdKIOmOzvIQmxjk28YEQX60k7pQ=="], @@ -1547,6 +1590,22 @@ "@tanstack/react-query-persist-client": ["@tanstack/react-query-persist-client@5.99.0", "", { "dependencies": { "@tanstack/query-persist-client-core": "5.99.0" }, "peerDependencies": { "@tanstack/react-query": "^5.99.0", "react": "^18 || ^19" } }, "sha512-A3TTaaYZOy6dFUNJj3r10rwmUBWaXqc2N71a7jzpFXilYAYWLKJf9ivT5n5bhXsJnSkdvv1RLifUg/GdvDGaDw=="], + "@tanstack/react-router": ["@tanstack/react-router@1.170.15", "", { "dependencies": { "@tanstack/history": "1.162.0", "@tanstack/react-store": "^0.9.3", "@tanstack/router-core": "1.171.13", "isbot": "^5.1.22" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-GawYz7HEjj8rTUUDoT/SemDEVm63pZUO+2mOcXHY9Jl3EwMS5gFBnPu/2UvcrwRm1jN1k79fokc0d4aFmrLatg=="], + + "@tanstack/react-store": ["@tanstack/react-store@0.9.3", "", { "dependencies": { "@tanstack/store": "0.9.3", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-y2iHd/N9OkoQbFJLUX1T9vbc2O9tjH0pQRgTcx1/Nz4IlwLvkgpuglXUx+mXt0g5ZDFrEeDnONPqkbfxXJKwRg=="], + + "@tanstack/router-core": ["@tanstack/router-core@1.171.13", "", { "dependencies": { "@tanstack/history": "1.162.0", "cookie-es": "^3.0.0", "seroval": "^1.5.4", "seroval-plugins": "^1.5.4" } }, "sha512-+NOwEj1kO/6IGmpHRIZHasYxYWpyBQGNIZAST9aNrk9Q3YlU9SgqVnl1pbLa9qAKfeNdXQIRve0RQb/0kyDeDA=="], + + "@tanstack/router-generator": ["@tanstack/router-generator@1.167.17", "", { "dependencies": { "@babel/types": "^7.28.5", "@tanstack/router-core": "1.171.13", "@tanstack/router-utils": "1.162.2", "@tanstack/virtual-file-routes": "1.162.0", "jiti": "^2.7.0", "magic-string": "^0.30.21", "prettier": "^3.5.0", "zod": "^4.4.3" } }, "sha512-xtB9tB2Ws0tWR6Pi7nc3Qk9IYgoh1mQCKWjHqIl9tf6BNUpKoqniJoPAQ4+LGrK8FeZYU0o0p/qlZEyj9FAulA=="], + + "@tanstack/router-plugin": ["@tanstack/router-plugin@1.168.18", "", { "dependencies": { "@babel/core": "^7.28.5", "@babel/template": "^7.27.2", "@babel/types": "^7.28.5", "@tanstack/router-core": "1.171.13", "@tanstack/router-generator": "1.167.17", "@tanstack/router-utils": "1.162.2", "chokidar": "^5.0.0", "unplugin": "^3.0.0", "zod": "^4.4.3" }, "peerDependencies": { "@rsbuild/core": ">=1.0.2 || ^2.0.0", "@tanstack/react-router": "^1.170.15", "vite": ">=5.0.0 || >=6.0.0 || >=7.0.0 || >=8.0.0", "vite-plugin-solid": "^2.11.10 || ^3.0.0-0", "webpack": ">=5.92.0" }, "optionalPeers": ["@rsbuild/core", "@tanstack/react-router", "vite", "vite-plugin-solid", "webpack"] }, "sha512-MofS28/axfnfnhOD2RSgJEaU882aX5RsAzhGz5Vc4XhAmvCjy919u9JrNs4QsTWFbTD1P7IJ8WFlFVsrg0pStg=="], + + "@tanstack/router-utils": ["@tanstack/router-utils@1.162.2", "", { "dependencies": { "@babel/generator": "^7.28.5", "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", "ansis": "^4.1.0", "babel-dead-code-elimination": "^1.0.12", "diff": "^8.0.2", "pathe": "^2.0.3", "tinyglobby": "^0.2.15" } }, "sha512-hTWqJtqIFFdvuCl8WXNyrodp2L9zo2G37xKRrcVmVRWpAB2h+U1LuRAfS4tsFTiWOIoE/B+WDVFB8JpoEdw6jQ=="], + + "@tanstack/store": ["@tanstack/store@0.9.3", "", {}, "sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw=="], + + "@tanstack/virtual-file-routes": ["@tanstack/virtual-file-routes@1.162.0", "", {}, "sha512-uhOeFyxLcU41HzvrxsGpiWdcMbScY1EDgbZ5K7DVRMYInbLYWAC0EA/kx9wXAoSM8q82bUG2hRl8+EAjE6XAbA=="], + "@theguild/federation-composition": ["@theguild/federation-composition@0.21.3", "", { "dependencies": { "constant-case": "^3.0.4", "debug": "4.4.3", "json5": "^2.2.3", "lodash.sortby": "^4.7.0" }, "peerDependencies": { "graphql": "^16.0.0" } }, "sha512-+LlHTa4UbRpZBog3ggAxjYIFvdfH3UMvvBUptur19TMWkqU4+n3GmN+mDjejU+dyBXIG27c25RsiQP1HyvM99g=="], "@tokenizer/token": ["@tokenizer/token@0.3.0", "", {}, "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="], @@ -1789,6 +1848,8 @@ "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "ansis": ["ansis@4.3.1", "", {}, "sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA=="], + "antd": ["antd@5.29.3", "", { "dependencies": { "@ant-design/colors": "^7.2.1", "@ant-design/cssinjs": "^1.23.0", "@ant-design/cssinjs-utils": "^1.1.3", "@ant-design/fast-color": "^2.0.6", "@ant-design/icons": "^5.6.1", "@ant-design/react-slick": "~1.1.2", "@babel/runtime": "^7.26.0", "@rc-component/color-picker": "~2.0.1", "@rc-component/mutate-observer": "^1.1.0", "@rc-component/qrcode": "~1.1.0", "@rc-component/tour": "~1.15.1", "@rc-component/trigger": "^2.3.0", "classnames": "^2.5.1", "copy-to-clipboard": "^3.3.3", "dayjs": "^1.11.11", "rc-cascader": "~3.34.0", "rc-checkbox": "~3.5.0", "rc-collapse": "~3.9.0", "rc-dialog": "~9.6.0", "rc-drawer": "~7.3.0", "rc-dropdown": "~4.2.1", "rc-field-form": "~2.7.1", "rc-image": "~7.12.0", "rc-input": "~1.8.0", "rc-input-number": "~9.5.0", "rc-mentions": "~2.20.0", "rc-menu": "~9.16.1", "rc-motion": "^2.9.5", "rc-notification": "~5.6.4", "rc-pagination": "~5.1.0", "rc-picker": "~4.11.3", "rc-progress": "~4.0.0", "rc-rate": "~2.13.1", "rc-resize-observer": "^1.4.3", "rc-segmented": "~2.7.0", "rc-select": "~14.16.8", "rc-slider": "~11.1.9", "rc-steps": "~6.0.1", "rc-switch": "~4.1.0", "rc-table": "~7.54.0", "rc-tabs": "~15.7.0", "rc-textarea": "~1.10.2", "rc-tooltip": "~6.4.0", "rc-tree": "~5.13.1", "rc-tree-select": "~5.27.0", "rc-upload": "~4.11.0", "rc-util": "^5.44.4", "scroll-into-view-if-needed": "^3.1.0", "throttle-debounce": "^5.0.2" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-3DdbGCa9tWAJGcCJ6rzR8EJFsv2CtyEbkVabZE14pfgUHfCicWCj0/QzQVLDYg8CPfQk9BH7fHCoTXHTy7MP/A=="], "antd-style": ["antd-style@3.7.1", "", { "dependencies": { "@ant-design/cssinjs": "^1.21.1", "@babel/runtime": "^7.24.1", "@emotion/cache": "^11.11.0", "@emotion/css": "^11.11.2", "@emotion/react": "^11.11.4", "@emotion/serialize": "^1.1.3", "@emotion/utils": "^1.2.1", "use-merge-value": "^1.2.0" }, "peerDependencies": { "antd": ">=5.8.1", "react": ">=18" } }, "sha512-CQOfddVp4aOvBfCepa+Kj2e7ap+2XBINg1Kn2osdE3oQvrD7KJu/K0sfnLcFLkgCJygbxmuazYdWLKb+drPDYA=="], @@ -1835,6 +1896,8 @@ "b4a": ["b4a@1.7.3", "", { "peerDependencies": { "react-native-b4a": "*" }, "optionalPeers": ["react-native-b4a"] }, "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q=="], + "babel-dead-code-elimination": ["babel-dead-code-elimination@1.0.12", "", { "dependencies": { "@babel/core": "^7.23.7", "@babel/parser": "^7.23.6", "@babel/traverse": "^7.23.7", "@babel/types": "^7.23.6" } }, "sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig=="], + "babel-plugin-macros": ["babel-plugin-macros@3.1.0", "", { "dependencies": { "@babel/runtime": "^7.12.5", "cosmiconfig": "^7.0.0", "resolve": "^1.19.0" } }, "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg=="], "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], @@ -2023,6 +2086,8 @@ "cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="], + "cookie-es": ["cookie-es@3.1.1", "", {}, "sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg=="], + "cookie-signature": ["cookie-signature@1.2.2", "", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="], "copy-to-clipboard": ["copy-to-clipboard@3.3.3", "", { "dependencies": { "toggle-selection": "^1.0.6" } }, "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA=="], @@ -2661,6 +2726,8 @@ "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + "isbot": ["isbot@5.1.42", "", {}, "sha512-/SXsVh7KpPRISrD4ffrGSxnTLlUBzEQUfWIusaJPrpJ93FW1P0YEZri5vAUkFsA0m2HRUhQRQadk2wJ+EeKowQ=="], + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], "isobject": ["isobject@3.0.1", "", {}, "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg=="], @@ -2823,7 +2890,7 @@ "lower-case-first": ["lower-case-first@2.0.2", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg=="], - "lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="], + "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], "lucide-react": ["lucide-react@0.562.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-82hOAu7y0dbVuFfmO4bYF1XEwYk/mEbM5E+b1jgci/udUBEE/R7LF5Ip0CCEmXe8AybRM8L+04eP+LGZeDvkiw=="], @@ -3183,7 +3250,7 @@ "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], "pino": ["pino@9.14.0", "", { "dependencies": { "@pinojs/redact": "^0.4.0", "atomic-sleep": "^1.0.0", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^2.0.0", "pino-std-serializers": "^7.0.0", "process-warning": "^5.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", "sonic-boom": "^4.0.1", "thread-stream": "^3.0.0" }, "bin": { "pino": "bin.js" } }, "sha512-8OEwKp5juEvb/MjpIc4hjqfgCNysrS94RIOMXYvpYCdm/jglrKEiAYmiumbmGhCvs+IcInsphYDFwqrjr7398w=="], @@ -3227,6 +3294,8 @@ "preact": ["preact@10.28.2", "", {}, "sha512-lbteaWGzGHdlIuiJ0l2Jq454m6kcpI1zNje6d8MlGAFlYvP2GO4ibnat7P74Esfz4sPTdM6UxtTwh/d3pwM9JA=="], + "prettier": ["prettier@3.8.4", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-N2MylSdi48+5N/6S5j+maeHbUSIzzZ5uOcX5Hm4QpV8Dkb1HFjfAKTKX6yNPJQD9AhcT3ifHNB66tWTTJDi11Q=="], + "prismjs": ["prismjs@1.30.0", "", {}, "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw=="], "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="], @@ -3391,6 +3460,8 @@ "react-merge-refs": ["react-merge-refs@3.0.2", "", { "peerDependencies": { "react": ">=16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["react"] }, "sha512-MSZAfwFfdbEvwkKWP5EI5chuLYnNUxNS7vyS0i1Jp+wtd8J4Ga2ddzhaE68aMol2Z4vCnRM/oGOo1a3V75UPlw=="], + "react-query-kit": ["react-query-kit@3.3.4", "", { "peerDependencies": { "@tanstack/react-query": "^4 || ^5" }, "optionalPeers": ["@tanstack/react-query"] }, "sha512-YzKjMT7d5WdSg9aem8inWeQfQOhsbEXTwzSd3NxHCwoMqnwU06kaqxjHL6Jn++vyqQTl50lL7PaPXEZ8WXdsig=="], + "react-refresh": ["react-refresh@0.18.0", "", {}, "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw=="], "react-remove-scroll": ["react-remove-scroll@2.7.2", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q=="], @@ -3481,6 +3552,8 @@ "require-in-the-middle": ["require-in-the-middle@8.0.1", "", { "dependencies": { "debug": "^4.3.5", "module-details-from-path": "^1.0.3" } }, "sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ=="], + "reselect": ["reselect@5.2.0", "", {}, "sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw=="], + "resize-observer-polyfill": ["resize-observer-polyfill@1.5.1", "", {}, "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="], "resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="], @@ -3531,7 +3604,7 @@ "secure-json-parse": ["secure-json-parse@4.1.0", "", {}, "sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA=="], - "semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], + "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "semver-compare": ["semver-compare@1.0.0", "", {}, "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow=="], @@ -3541,6 +3614,10 @@ "serialize-error": ["serialize-error@11.0.3", "", { "dependencies": { "type-fest": "^2.12.2" } }, "sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g=="], + "seroval": ["seroval@1.5.4", "", {}, "sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw=="], + + "seroval-plugins": ["seroval-plugins@1.5.4", "", { "peerDependencies": { "seroval": "^1.0" } }, "sha512-S0xQPhUTefAhNvNWFg0c1J8qJArHt5KdtJ/cFAofo06KD1MVSeFWyl4iiu+ApDIuw0WhjpOfCdgConOfAnLgkw=="], + "serve-static": ["serve-static@2.2.1", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw=="], "set-cookie-parser": ["set-cookie-parser@2.7.2", "", {}, "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw=="], @@ -3957,6 +4034,8 @@ "@aklinker1/rollup-plugin-visualizer/open": ["open@8.4.2", "", { "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" } }, "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ=="], + "@aklinker1/rollup-plugin-visualizer/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "@ant-design/cssinjs-utils/@ant-design/cssinjs": ["@ant-design/cssinjs@1.24.0", "", { "dependencies": { "@babel/runtime": "^7.11.1", "@emotion/hash": "^0.8.0", "@emotion/unitless": "^0.7.5", "classnames": "^2.3.1", "csstype": "^3.1.3", "rc-util": "^5.35.0", "stylis": "^4.3.4" }, "peerDependencies": { "react": ">=16.0.0", "react-dom": ">=16.0.0" } }, "sha512-K4cYrJBsgvL+IoozUXYjbT6LHHNt+19a9zkvpBPxLjFHas1UpPM2A5MlhROb0BT8N8WoavM5VsP9MeSeNK/3mg=="], "@aws-crypto/crc32/@aws-sdk/types": ["@aws-sdk/types@3.972.0", "", { "dependencies": { "@smithy/types": "^4.12.0", "tslib": "^2.6.2" } }, "sha512-U7xBIbLSetONxb2bNzHyDgND3oKGoIfmknrEVnoEU4GUSs+0augUOIn9DIWGUO2ETcRFdsRUnmx9KhPT9Ojbug=="], @@ -3969,11 +4048,9 @@ "@aws-crypto/util/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], - "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - - "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + "@base-ui/react/@babel/runtime": ["@babel/runtime@7.29.7", "", {}, "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw=="], - "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + "@base-ui/utils/@babel/runtime": ["@babel/runtime@7.29.7", "", {}, "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw=="], "@better-auth/core/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], @@ -4021,6 +4098,10 @@ "@esbuild-kit/core-utils/esbuild": ["esbuild@0.18.20", "", { "optionalDependencies": { "@esbuild/android-arm": "0.18.20", "@esbuild/android-arm64": "0.18.20", "@esbuild/android-x64": "0.18.20", "@esbuild/darwin-arm64": "0.18.20", "@esbuild/darwin-x64": "0.18.20", "@esbuild/freebsd-arm64": "0.18.20", "@esbuild/freebsd-x64": "0.18.20", "@esbuild/linux-arm": "0.18.20", "@esbuild/linux-arm64": "0.18.20", "@esbuild/linux-ia32": "0.18.20", "@esbuild/linux-loong64": "0.18.20", "@esbuild/linux-mips64el": "0.18.20", "@esbuild/linux-ppc64": "0.18.20", "@esbuild/linux-riscv64": "0.18.20", "@esbuild/linux-s390x": "0.18.20", "@esbuild/linux-x64": "0.18.20", "@esbuild/netbsd-x64": "0.18.20", "@esbuild/openbsd-x64": "0.18.20", "@esbuild/sunos-x64": "0.18.20", "@esbuild/win32-arm64": "0.18.20", "@esbuild/win32-ia32": "0.18.20", "@esbuild/win32-x64": "0.18.20" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA=="], + "@floating-ui/react/@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.6", "", { "dependencies": { "@floating-ui/dom": "^1.7.4" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw=="], + + "@floating-ui/react/@floating-ui/utils": ["@floating-ui/utils@0.2.10", "", {}, "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ=="], + "@graphql-codegen/add/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], "@graphql-codegen/client-preset/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], @@ -4175,12 +4256,12 @@ "@opentelemetry/sql-common/@opentelemetry/core": ["@opentelemetry/core@2.4.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-KtcyFHssTn5ZgDu6SXmUznS80OFs/wN7y6MyFRRcKU6TOw8hNcGxKvt8hsdaLJfhzUszNSjURetq5Qpkad14Gw=="], - "@parcel/watcher/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], - "@pnpm/network.ca-file/graceful-fs": ["graceful-fs@4.2.10", "", {}, "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="], "@prisma/instrumentation/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.207.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.207.0", "import-in-the-middle": "^2.0.0", "require-in-the-middle": "^8.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-y6eeli9+TLKnznrR8AZlQMSJT7wILpXH+6EYq5Vf/4Ao+huI7EedxQHwRgVUOMLFbe7VFDvHJrX9/f4lcwnJsA=="], + "@puppeteer/browsers/semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], + "@radix-ui/react-alert-dialog/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], "@radix-ui/react-collection/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], @@ -4193,6 +4274,8 @@ "@radix-ui/react-popover/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], + "@radix-ui/react-popper/@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.6", "", { "dependencies": { "@floating-ui/dom": "^1.7.4" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw=="], + "@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], "@radix-ui/react-progress/@radix-ui/react-context": ["@radix-ui/react-context@1.1.3", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw=="], @@ -4233,6 +4316,20 @@ "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "@tanstack/router-generator/@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="], + + "@tanstack/router-generator/jiti": ["jiti@2.7.0", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="], + + "@tanstack/router-plugin/@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="], + + "@tanstack/router-plugin/unplugin": ["unplugin@3.0.0", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "picomatch": "^4.0.3", "webpack-virtual-modules": "^0.6.2" } }, "sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg=="], + + "@tanstack/router-utils/@babel/parser": ["@babel/parser@7.29.0", "", { "dependencies": { "@babel/types": "^7.29.0" }, "bin": "./bin/babel-parser.js" }, "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww=="], + + "@tanstack/router-utils/@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="], + + "@tanstack/router-utils/diff": ["diff@8.0.4", "", {}, "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw=="], + "acpx/@agentclientprotocol/sdk": ["@agentclientprotocol/sdk@0.22.1", "", { "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-DfqXtl/8gO9NImq094MTaCXEU2vkhh6v7q/kT+9UjZxUqj8hYaya2OjLVIqn16MzNHcXEpShTR2RIauLSYeDQQ=="], "acpx/commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="], @@ -4245,6 +4342,12 @@ "antd-style/@ant-design/cssinjs": ["@ant-design/cssinjs@1.24.0", "", { "dependencies": { "@babel/runtime": "^7.11.1", "@emotion/hash": "^0.8.0", "@emotion/unitless": "^0.7.5", "classnames": "^2.3.1", "csstype": "^3.1.3", "rc-util": "^5.35.0", "stylis": "^4.3.4" }, "peerDependencies": { "react": ">=16.0.0", "react-dom": ">=16.0.0" } }, "sha512-K4cYrJBsgvL+IoozUXYjbT6LHHNt+19a9zkvpBPxLjFHas1UpPM2A5MlhROb0BT8N8WoavM5VsP9MeSeNK/3mg=="], + "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "babel-dead-code-elimination/@babel/parser": ["@babel/parser@7.29.0", "", { "dependencies": { "@babel/types": "^7.29.0" }, "bin": "./bin/babel-parser.js" }, "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww=="], + + "babel-dead-code-elimination/@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="], + "babel-plugin-macros/cosmiconfig": ["cosmiconfig@7.1.0", "", { "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", "parse-json": "^5.0.0", "path-type": "^4.0.0", "yaml": "^1.10.0" } }, "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA=="], "better-auth/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], @@ -4293,8 +4396,6 @@ "extend-shallow/is-extendable": ["is-extendable@0.1.1", "", {}, "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="], - "fdir/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], - "form-data/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], "fx-runner/commander": ["commander@2.9.0", "", { "dependencies": { "graceful-readlink": ">= 1.0.0" } }, "sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A=="], @@ -4337,6 +4438,8 @@ "mermaid/uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="], + "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "mlly/pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], "multimatch/array-union": ["array-union@3.0.1", "", {}, "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw=="], @@ -4345,6 +4448,8 @@ "node-notifier/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + "node-notifier/semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], + "node-notifier/uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], "nypm/citty": ["citty@0.2.0", "", {}, "sha512-8csy5IBFI2ex2hTVpaHN2j+LNE199AgiI7y4dMintrr8i0lQiFn+0AWMZrWdHKIgMOer65f8IThysYhoReqjWA=="], @@ -4361,6 +4466,8 @@ "pac-proxy-agent/https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], + "package-json/semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], + "parse-bmfont-xml/xml2js": ["xml2js@0.5.0", "", { "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" } }, "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA=="], "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], @@ -4381,6 +4488,8 @@ "proxy-agent/https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], + "proxy-agent/lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="], + "publish-browser-extension/listr2": ["listr2@8.3.3", "", { "dependencies": { "cli-truncate": "^4.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^6.1.0", "rfdc": "^1.4.1", "wrap-ansi": "^9.0.0" } }, "sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ=="], "publish-browser-extension/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], @@ -4423,23 +4532,17 @@ "terser/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], - "tinyglobby/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], - - "unimport/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], - "unimport/unplugin": ["unplugin@2.3.11", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "acorn": "^8.15.0", "picomatch": "^4.0.3", "webpack-virtual-modules": "^0.6.2" } }, "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww=="], "unixify/normalize-path": ["normalize-path@2.1.1", "", { "dependencies": { "remove-trailing-separator": "^1.0.1" } }, "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w=="], "unplugin/chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], - "unplugin-utils/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], - "update-notifier/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], - "uvu/kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="], + "update-notifier/semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], - "vite/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + "uvu/kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="], "web-ext-run/@babel/runtime": ["@babel/runtime@7.28.2", "", {}, "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA=="], @@ -4721,6 +4824,8 @@ "@esbuild-kit/core-utils/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.18.20", "", { "os": "win32", "cpu": "x64" }, "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ=="], + "@floating-ui/react/@floating-ui/react-dom/@floating-ui/dom": ["@floating-ui/dom@1.7.4", "", { "dependencies": { "@floating-ui/core": "^1.7.3", "@floating-ui/utils": "^0.2.10" } }, "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA=="], + "@inquirer/core/wrap-ansi/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], @@ -4733,6 +4838,10 @@ "@prisma/instrumentation/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.207.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-lAb0jQRVyleQQGiuuvCOTDVspc14nx6XJjP4FspJ1sNARo3Regq4ZZbrc3rN4b1TYSuUCvgH+UXUPug4SLOqEQ=="], + "@radix-ui/react-popper/@floating-ui/react-dom/@floating-ui/dom": ["@floating-ui/dom@1.7.4", "", { "dependencies": { "@floating-ui/core": "^1.7.3", "@floating-ui/utils": "^0.2.10" } }, "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA=="], + + "@tanstack/router-plugin/unplugin/webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="], + "acpx/tsx/esbuild": ["esbuild@0.28.0", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.0", "@esbuild/android-arm": "0.28.0", "@esbuild/android-arm64": "0.28.0", "@esbuild/android-x64": "0.28.0", "@esbuild/darwin-arm64": "0.28.0", "@esbuild/darwin-x64": "0.28.0", "@esbuild/freebsd-arm64": "0.28.0", "@esbuild/freebsd-x64": "0.28.0", "@esbuild/linux-arm": "0.28.0", "@esbuild/linux-arm64": "0.28.0", "@esbuild/linux-ia32": "0.28.0", "@esbuild/linux-loong64": "0.28.0", "@esbuild/linux-mips64el": "0.28.0", "@esbuild/linux-ppc64": "0.28.0", "@esbuild/linux-riscv64": "0.28.0", "@esbuild/linux-s390x": "0.28.0", "@esbuild/linux-x64": "0.28.0", "@esbuild/netbsd-arm64": "0.28.0", "@esbuild/netbsd-x64": "0.28.0", "@esbuild/openbsd-arm64": "0.28.0", "@esbuild/openbsd-x64": "0.28.0", "@esbuild/openharmony-arm64": "0.28.0", "@esbuild/sunos-x64": "0.28.0", "@esbuild/win32-arm64": "0.28.0", "@esbuild/win32-ia32": "0.28.0", "@esbuild/win32-x64": "0.28.0" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw=="], "babel-plugin-macros/cosmiconfig/yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="], @@ -4985,8 +5094,14 @@ "@browseros/eval/@aws-sdk/client-s3/@smithy/util-waiter/@smithy/abort-controller": ["@smithy/abort-controller@4.2.12", "", { "dependencies": { "@smithy/types": "^4.13.1", "tslib": "^2.6.2" } }, "sha512-xolrFw6b+2iYGl6EcOL7IJY71vvyZ0DJ3mcKtpykqPe2uscwtzDZJa1uVQXyP7w9Dd+kGwYnPbMsJrGISKiY/Q=="], + "@floating-ui/react/@floating-ui/react-dom/@floating-ui/dom/@floating-ui/core": ["@floating-ui/core@1.7.3", "", { "dependencies": { "@floating-ui/utils": "^0.2.10" } }, "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w=="], + "@inquirer/core/wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "@radix-ui/react-popper/@floating-ui/react-dom/@floating-ui/dom/@floating-ui/core": ["@floating-ui/core@1.7.3", "", { "dependencies": { "@floating-ui/utils": "^0.2.10" } }, "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w=="], + + "@radix-ui/react-popper/@floating-ui/react-dom/@floating-ui/dom/@floating-ui/utils": ["@floating-ui/utils@0.2.10", "", {}, "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ=="], + "acpx/tsx/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.28.0", "", { "os": "aix", "cpu": "ppc64" }, "sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA=="], "acpx/tsx/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.28.0", "", { "os": "android", "cpu": "arm" }, "sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ=="], @@ -5057,6 +5172,8 @@ "readable-web-to-node-stream/readable-stream/string_decoder/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + "unplugin/chokidar/readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "wxt/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], "@browseros/build-tools/@aws-sdk/client-s3/@aws-sdk/core/@aws-sdk/xml-builder/fast-xml-parser": ["fast-xml-parser@5.5.8", "", { "dependencies": { "fast-xml-builder": "^1.1.4", "path-expression-matcher": "^1.2.0", "strnum": "^2.2.0" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-Z7Fh2nVQSb2d+poDViM063ix2ZGt9jmY1nWhPfHBOK2Hgnb/OW3P4Et3P/81SEej0J7QbWtJqxO05h8QYfK7LQ=="], From 6f62d4681fc252284594682abb3b8964d180f5f8 Mon Sep 17 00:00:00 2001 From: DaniAkash Date: Fri, 12 Jun 2026 17:18:32 +0530 Subject: [PATCH 06/19] refactor(agent-mcp-ui): swap TanStack Router for react-router v7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The existing apps/agent extension routes with react-router v7 + HashRouter. agent-mcp-ui was deviating from that for no real reason — TanStack Router's typed loaders aren't exercised at the bootstrap stage, and the plugin-order collision with WXT's module-react had already forced autoCodeSplitting off. Matching the in-repo precedent removes the codegen step, drops two deps, simplifies wxt.config.ts, and shaves ~48 kB off the production bundle (384 → 336 kB). Changes: package.json -@tanstack/react-router, -@tanstack/router-plugin +react-router ^7.12.0 wxt.config.ts Drop prependRouterPlugin helper + the enforce:'pre' workaround. Plugins now: [tailwindcss()]. Module-react injects @vitejs/plugin-react as before. routes/ Deleted. __root.tsx, index.tsx, routeTree.gen.ts gone. entrypoints/app/App.tsx New. Code-based HashRouter + Routes + Route, matching apps/agent's pattern. entrypoints/app/main.tsx Drops createRouter + RouterProvider + module augmentation; renders inside QueryClientProvider + StrictMode. biome.json Drops the !routeTree.gen.ts ignore. Verified: bun install clean bun run --filter @browseros/agent-mcp-ui typecheck clean bunx biome check clean bunx wxt build clean, 336 kB bun src/main.ts + curl /system/{health,version} ok --- .../apps/agent-mcp-ui/biome.json | 2 +- .../apps/agent-mcp-ui/entrypoints/app/App.tsx | 15 +++ .../agent-mcp-ui/entrypoints/app/main.tsx | 13 +-- .../apps/agent-mcp-ui/package.json | 4 +- .../apps/agent-mcp-ui/routeTree.gen.ts | 59 ----------- .../apps/agent-mcp-ui/routes/__root.tsx | 5 - .../apps/agent-mcp-ui/routes/index.tsx | 6 -- .../apps/agent-mcp-ui/wxt.config.ts | 28 +----- packages/browseros-agent/bun.lock | 98 +++++-------------- 9 files changed, 45 insertions(+), 185 deletions(-) create mode 100644 packages/browseros-agent/apps/agent-mcp-ui/entrypoints/app/App.tsx delete mode 100644 packages/browseros-agent/apps/agent-mcp-ui/routeTree.gen.ts delete mode 100644 packages/browseros-agent/apps/agent-mcp-ui/routes/__root.tsx delete mode 100644 packages/browseros-agent/apps/agent-mcp-ui/routes/index.tsx diff --git a/packages/browseros-agent/apps/agent-mcp-ui/biome.json b/packages/browseros-agent/apps/agent-mcp-ui/biome.json index b9849692a9..9785d76bcb 100644 --- a/packages/browseros-agent/apps/agent-mcp-ui/biome.json +++ b/packages/browseros-agent/apps/agent-mcp-ui/biome.json @@ -3,7 +3,7 @@ "root": false, "extends": "//", "files": { - "includes": ["**", "!routeTree.gen.ts", "!.wxt", "!.output", "!dist"] + "includes": ["**", "!.wxt", "!.output", "!dist"] }, "css": { "parser": { diff --git a/packages/browseros-agent/apps/agent-mcp-ui/entrypoints/app/App.tsx b/packages/browseros-agent/apps/agent-mcp-ui/entrypoints/app/App.tsx new file mode 100644 index 0000000000..8e97d96ad3 --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-ui/entrypoints/app/App.tsx @@ -0,0 +1,15 @@ +import { HashRouter, Route, Routes } from 'react-router' +import { Cockpit } from '@/screens/cockpit/Cockpit' + +// HashRouter so the extension behaves identically under +// `chrome-extension://...#/` regardless of how it was +// loaded — matches the existing agent extension's routing posture. +export function App() { + return ( + + + } /> + + + ) +} diff --git a/packages/browseros-agent/apps/agent-mcp-ui/entrypoints/app/main.tsx b/packages/browseros-agent/apps/agent-mcp-ui/entrypoints/app/main.tsx index 821e10d409..fae0d1bc2a 100644 --- a/packages/browseros-agent/apps/agent-mcp-ui/entrypoints/app/main.tsx +++ b/packages/browseros-agent/apps/agent-mcp-ui/entrypoints/app/main.tsx @@ -1,26 +1,17 @@ import { QueryClientProvider } from '@tanstack/react-query' -import { createRouter, RouterProvider } from '@tanstack/react-router' import { StrictMode } from 'react' import { createRoot } from 'react-dom/client' import { queryClient } from '@/modules/api/queryClient' -import { routeTree } from '../../routeTree.gen' +import { App } from './App' import './styles.css' -const router = createRouter({ routeTree }) - -declare module '@tanstack/react-router' { - interface Register { - router: typeof router - } -} - const root = document.getElementById('root') if (!root) throw new Error('Root element not found') createRoot(root).render( - + , ) diff --git a/packages/browseros-agent/apps/agent-mcp-ui/package.json b/packages/browseros-agent/apps/agent-mcp-ui/package.json index c990861c0c..1d378b67c6 100644 --- a/packages/browseros-agent/apps/agent-mcp-ui/package.json +++ b/packages/browseros-agent/apps/agent-mcp-ui/package.json @@ -20,25 +20,23 @@ "@radix-ui/react-slot": "^1.2.4", "@tabler/icons-react": "^3.34.1", "@tanstack/react-query": "^5.95.2", - "@tanstack/react-router": "^1.131.41", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "hono": "^4.12.3", "react": "^19.1.1", "react-dom": "^19.1.1", "react-query-kit": "^3.3.1", + "react-router": "^7.12.0", "tailwind-merge": "^3.4.0" }, "devDependencies": { "@tailwindcss/vite": "^4.1.17", - "@tanstack/router-plugin": "^1.131.41", "@types/chrome": "^0.1.28", "@types/react": "^19.1.12", "@types/react-dom": "^19.1.9", "@wxt-dev/module-react": "^1.1.5", "tailwindcss": "^4.1.17", "typescript": "^5.9.2", - "vite": "^7.3.1", "wxt": "^0.20.18" } } diff --git a/packages/browseros-agent/apps/agent-mcp-ui/routeTree.gen.ts b/packages/browseros-agent/apps/agent-mcp-ui/routeTree.gen.ts deleted file mode 100644 index d204c269b3..0000000000 --- a/packages/browseros-agent/apps/agent-mcp-ui/routeTree.gen.ts +++ /dev/null @@ -1,59 +0,0 @@ -/* eslint-disable */ - -// @ts-nocheck - -// noinspection JSUnusedGlobalSymbols - -// This file was automatically generated by TanStack Router. -// You should NOT make any changes in this file as it will be overwritten. -// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. - -import { Route as rootRouteImport } from './routes/__root' -import { Route as IndexRouteImport } from './routes/index' - -const IndexRoute = IndexRouteImport.update({ - id: '/', - path: '/', - getParentRoute: () => rootRouteImport, -} as any) - -export interface FileRoutesByFullPath { - '/': typeof IndexRoute -} -export interface FileRoutesByTo { - '/': typeof IndexRoute -} -export interface FileRoutesById { - __root__: typeof rootRouteImport - '/': typeof IndexRoute -} -export interface FileRouteTypes { - fileRoutesByFullPath: FileRoutesByFullPath - fullPaths: '/' - fileRoutesByTo: FileRoutesByTo - to: '/' - id: '__root__' | '/' - fileRoutesById: FileRoutesById -} -export interface RootRouteChildren { - IndexRoute: typeof IndexRoute -} - -declare module '@tanstack/react-router' { - interface FileRoutesByPath { - '/': { - id: '/' - path: '/' - fullPath: '/' - preLoaderRoute: typeof IndexRouteImport - parentRoute: typeof rootRouteImport - } - } -} - -const rootRouteChildren: RootRouteChildren = { - IndexRoute: IndexRoute, -} -export const routeTree = rootRouteImport - ._addFileChildren(rootRouteChildren) - ._addFileTypes() diff --git a/packages/browseros-agent/apps/agent-mcp-ui/routes/__root.tsx b/packages/browseros-agent/apps/agent-mcp-ui/routes/__root.tsx deleted file mode 100644 index f463b796b4..0000000000 --- a/packages/browseros-agent/apps/agent-mcp-ui/routes/__root.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { createRootRoute, Outlet } from '@tanstack/react-router' - -export const Route = createRootRoute({ - component: () => , -}) diff --git a/packages/browseros-agent/apps/agent-mcp-ui/routes/index.tsx b/packages/browseros-agent/apps/agent-mcp-ui/routes/index.tsx deleted file mode 100644 index 99726b08a6..0000000000 --- a/packages/browseros-agent/apps/agent-mcp-ui/routes/index.tsx +++ /dev/null @@ -1,6 +0,0 @@ -import { createFileRoute } from '@tanstack/react-router' -import { Cockpit } from '@/screens/cockpit/Cockpit' - -export const Route = createFileRoute('/')({ - component: Cockpit, -}) diff --git a/packages/browseros-agent/apps/agent-mcp-ui/wxt.config.ts b/packages/browseros-agent/apps/agent-mcp-ui/wxt.config.ts index d0b50fd036..67e34d7e4a 100644 --- a/packages/browseros-agent/apps/agent-mcp-ui/wxt.config.ts +++ b/packages/browseros-agent/apps/agent-mcp-ui/wxt.config.ts @@ -1,30 +1,10 @@ import tailwindcss from '@tailwindcss/vite' -import { tanstackRouter } from '@tanstack/router-plugin/vite' -import type { Plugin } from 'vite' import { defineConfig } from 'wxt' -// WXT's module-react auto-injects @vitejs/plugin-react. The router -// plugin checks plugin order in its configResolved hook and refuses -// to run if the React plugin lands before it. autoCodeSplitting is -// the sub-plugin enforcing that check; turning it off keeps the -// route-tree generator (the part we actually need at this stage) -// while sidestepping the order constraint. Code splitting can be -// reinstated later by replacing the WXT module-react with a manual -// @vitejs/plugin-react placement after the router plugin. -function prependRouterPlugin(): Plugin[] { - const plugins = tanstackRouter({ - target: 'react', - routesDirectory: './routes', - generatedRouteTree: './routeTree.gen.ts', - autoCodeSplitting: false, - }) - const asArray = Array.isArray(plugins) ? plugins : [plugins] - return asArray.map((p) => ({ ...p, enforce: 'pre' as const })) -} - // Mounts the React-only build pipeline (Vite + @vitejs/plugin-react) -// and reserves the cockpit at chrome_url_overrides.newtab so the -// extension takes over the new-tab page once installed. +// via @wxt-dev/module-react and reserves the cockpit at +// chrome_url_overrides.newtab so the extension takes over the +// new-tab page once installed. export default defineConfig({ outDir: 'dist', modules: ['@wxt-dev/module-react'], @@ -38,6 +18,6 @@ export default defineConfig({ }, }, vite: () => ({ - plugins: [...prependRouterPlugin(), tailwindcss()], + plugins: [tailwindcss()], }), }) diff --git a/packages/browseros-agent/bun.lock b/packages/browseros-agent/bun.lock index f01e9c41fb..956f154fa0 100644 --- a/packages/browseros-agent/bun.lock +++ b/packages/browseros-agent/bun.lock @@ -135,25 +135,23 @@ "@radix-ui/react-slot": "^1.2.4", "@tabler/icons-react": "^3.34.1", "@tanstack/react-query": "^5.95.2", - "@tanstack/react-router": "^1.131.41", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "hono": "^4.12.3", "react": "^19.1.1", "react-dom": "^19.1.1", "react-query-kit": "^3.3.1", + "react-router": "^7.12.0", "tailwind-merge": "^3.4.0", }, "devDependencies": { "@tailwindcss/vite": "^4.1.17", - "@tanstack/router-plugin": "^1.131.41", "@types/chrome": "^0.1.28", "@types/react": "^19.1.12", "@types/react-dom": "^19.1.9", "@wxt-dev/module-react": "^1.1.5", "tailwindcss": "^4.1.17", "typescript": "^5.9.2", - "vite": "^7.3.1", "wxt": "^0.20.18", }, }, @@ -1578,8 +1576,6 @@ "@tailwindcss/vite": ["@tailwindcss/vite@4.1.18", "", { "dependencies": { "@tailwindcss/node": "4.1.18", "@tailwindcss/oxide": "4.1.18", "tailwindcss": "4.1.18" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7" } }, "sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA=="], - "@tanstack/history": ["@tanstack/history@1.162.0", "", {}, "sha512-79pf/RkhteYZTRgcR4F9kbk84P2N8rugQJswxfIqovlbRiT3yI7eBE+5QorIrZaOKktsgzRlXh1l/du/xpl4iA=="], - "@tanstack/query-async-storage-persister": ["@tanstack/query-async-storage-persister@5.99.0", "", { "dependencies": { "@tanstack/query-core": "5.99.0", "@tanstack/query-persist-client-core": "5.99.0" } }, "sha512-RUG++yZf8RoRK1Yz83WHHYJ6EF8DqKIF/UNNUUDEw/cY9SLKhAeEd4a0+kDzNRdb4RGXXeF5UIuzoEFJ7elLwQ=="], "@tanstack/query-core": ["@tanstack/query-core@5.99.0", "", {}, "sha512-3Jv3WQG0BCcH7G+7lf/bP8QyBfJOXeY+T08Rin3GZ1bshvwlbPt7NrDHMEzGdKIOmOzvIQmxjk28YEQX60k7pQ=="], @@ -1590,22 +1586,6 @@ "@tanstack/react-query-persist-client": ["@tanstack/react-query-persist-client@5.99.0", "", { "dependencies": { "@tanstack/query-persist-client-core": "5.99.0" }, "peerDependencies": { "@tanstack/react-query": "^5.99.0", "react": "^18 || ^19" } }, "sha512-A3TTaaYZOy6dFUNJj3r10rwmUBWaXqc2N71a7jzpFXilYAYWLKJf9ivT5n5bhXsJnSkdvv1RLifUg/GdvDGaDw=="], - "@tanstack/react-router": ["@tanstack/react-router@1.170.15", "", { "dependencies": { "@tanstack/history": "1.162.0", "@tanstack/react-store": "^0.9.3", "@tanstack/router-core": "1.171.13", "isbot": "^5.1.22" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-GawYz7HEjj8rTUUDoT/SemDEVm63pZUO+2mOcXHY9Jl3EwMS5gFBnPu/2UvcrwRm1jN1k79fokc0d4aFmrLatg=="], - - "@tanstack/react-store": ["@tanstack/react-store@0.9.3", "", { "dependencies": { "@tanstack/store": "0.9.3", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-y2iHd/N9OkoQbFJLUX1T9vbc2O9tjH0pQRgTcx1/Nz4IlwLvkgpuglXUx+mXt0g5ZDFrEeDnONPqkbfxXJKwRg=="], - - "@tanstack/router-core": ["@tanstack/router-core@1.171.13", "", { "dependencies": { "@tanstack/history": "1.162.0", "cookie-es": "^3.0.0", "seroval": "^1.5.4", "seroval-plugins": "^1.5.4" } }, "sha512-+NOwEj1kO/6IGmpHRIZHasYxYWpyBQGNIZAST9aNrk9Q3YlU9SgqVnl1pbLa9qAKfeNdXQIRve0RQb/0kyDeDA=="], - - "@tanstack/router-generator": ["@tanstack/router-generator@1.167.17", "", { "dependencies": { "@babel/types": "^7.28.5", "@tanstack/router-core": "1.171.13", "@tanstack/router-utils": "1.162.2", "@tanstack/virtual-file-routes": "1.162.0", "jiti": "^2.7.0", "magic-string": "^0.30.21", "prettier": "^3.5.0", "zod": "^4.4.3" } }, "sha512-xtB9tB2Ws0tWR6Pi7nc3Qk9IYgoh1mQCKWjHqIl9tf6BNUpKoqniJoPAQ4+LGrK8FeZYU0o0p/qlZEyj9FAulA=="], - - "@tanstack/router-plugin": ["@tanstack/router-plugin@1.168.18", "", { "dependencies": { "@babel/core": "^7.28.5", "@babel/template": "^7.27.2", "@babel/types": "^7.28.5", "@tanstack/router-core": "1.171.13", "@tanstack/router-generator": "1.167.17", "@tanstack/router-utils": "1.162.2", "chokidar": "^5.0.0", "unplugin": "^3.0.0", "zod": "^4.4.3" }, "peerDependencies": { "@rsbuild/core": ">=1.0.2 || ^2.0.0", "@tanstack/react-router": "^1.170.15", "vite": ">=5.0.0 || >=6.0.0 || >=7.0.0 || >=8.0.0", "vite-plugin-solid": "^2.11.10 || ^3.0.0-0", "webpack": ">=5.92.0" }, "optionalPeers": ["@rsbuild/core", "@tanstack/react-router", "vite", "vite-plugin-solid", "webpack"] }, "sha512-MofS28/axfnfnhOD2RSgJEaU882aX5RsAzhGz5Vc4XhAmvCjy919u9JrNs4QsTWFbTD1P7IJ8WFlFVsrg0pStg=="], - - "@tanstack/router-utils": ["@tanstack/router-utils@1.162.2", "", { "dependencies": { "@babel/generator": "^7.28.5", "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", "ansis": "^4.1.0", "babel-dead-code-elimination": "^1.0.12", "diff": "^8.0.2", "pathe": "^2.0.3", "tinyglobby": "^0.2.15" } }, "sha512-hTWqJtqIFFdvuCl8WXNyrodp2L9zo2G37xKRrcVmVRWpAB2h+U1LuRAfS4tsFTiWOIoE/B+WDVFB8JpoEdw6jQ=="], - - "@tanstack/store": ["@tanstack/store@0.9.3", "", {}, "sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw=="], - - "@tanstack/virtual-file-routes": ["@tanstack/virtual-file-routes@1.162.0", "", {}, "sha512-uhOeFyxLcU41HzvrxsGpiWdcMbScY1EDgbZ5K7DVRMYInbLYWAC0EA/kx9wXAoSM8q82bUG2hRl8+EAjE6XAbA=="], - "@theguild/federation-composition": ["@theguild/federation-composition@0.21.3", "", { "dependencies": { "constant-case": "^3.0.4", "debug": "4.4.3", "json5": "^2.2.3", "lodash.sortby": "^4.7.0" }, "peerDependencies": { "graphql": "^16.0.0" } }, "sha512-+LlHTa4UbRpZBog3ggAxjYIFvdfH3UMvvBUptur19TMWkqU4+n3GmN+mDjejU+dyBXIG27c25RsiQP1HyvM99g=="], "@tokenizer/token": ["@tokenizer/token@0.3.0", "", {}, "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="], @@ -1848,8 +1828,6 @@ "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "ansis": ["ansis@4.3.1", "", {}, "sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA=="], - "antd": ["antd@5.29.3", "", { "dependencies": { "@ant-design/colors": "^7.2.1", "@ant-design/cssinjs": "^1.23.0", "@ant-design/cssinjs-utils": "^1.1.3", "@ant-design/fast-color": "^2.0.6", "@ant-design/icons": "^5.6.1", "@ant-design/react-slick": "~1.1.2", "@babel/runtime": "^7.26.0", "@rc-component/color-picker": "~2.0.1", "@rc-component/mutate-observer": "^1.1.0", "@rc-component/qrcode": "~1.1.0", "@rc-component/tour": "~1.15.1", "@rc-component/trigger": "^2.3.0", "classnames": "^2.5.1", "copy-to-clipboard": "^3.3.3", "dayjs": "^1.11.11", "rc-cascader": "~3.34.0", "rc-checkbox": "~3.5.0", "rc-collapse": "~3.9.0", "rc-dialog": "~9.6.0", "rc-drawer": "~7.3.0", "rc-dropdown": "~4.2.1", "rc-field-form": "~2.7.1", "rc-image": "~7.12.0", "rc-input": "~1.8.0", "rc-input-number": "~9.5.0", "rc-mentions": "~2.20.0", "rc-menu": "~9.16.1", "rc-motion": "^2.9.5", "rc-notification": "~5.6.4", "rc-pagination": "~5.1.0", "rc-picker": "~4.11.3", "rc-progress": "~4.0.0", "rc-rate": "~2.13.1", "rc-resize-observer": "^1.4.3", "rc-segmented": "~2.7.0", "rc-select": "~14.16.8", "rc-slider": "~11.1.9", "rc-steps": "~6.0.1", "rc-switch": "~4.1.0", "rc-table": "~7.54.0", "rc-tabs": "~15.7.0", "rc-textarea": "~1.10.2", "rc-tooltip": "~6.4.0", "rc-tree": "~5.13.1", "rc-tree-select": "~5.27.0", "rc-upload": "~4.11.0", "rc-util": "^5.44.4", "scroll-into-view-if-needed": "^3.1.0", "throttle-debounce": "^5.0.2" }, "peerDependencies": { "react": ">=16.9.0", "react-dom": ">=16.9.0" } }, "sha512-3DdbGCa9tWAJGcCJ6rzR8EJFsv2CtyEbkVabZE14pfgUHfCicWCj0/QzQVLDYg8CPfQk9BH7fHCoTXHTy7MP/A=="], "antd-style": ["antd-style@3.7.1", "", { "dependencies": { "@ant-design/cssinjs": "^1.21.1", "@babel/runtime": "^7.24.1", "@emotion/cache": "^11.11.0", "@emotion/css": "^11.11.2", "@emotion/react": "^11.11.4", "@emotion/serialize": "^1.1.3", "@emotion/utils": "^1.2.1", "use-merge-value": "^1.2.0" }, "peerDependencies": { "antd": ">=5.8.1", "react": ">=18" } }, "sha512-CQOfddVp4aOvBfCepa+Kj2e7ap+2XBINg1Kn2osdE3oQvrD7KJu/K0sfnLcFLkgCJygbxmuazYdWLKb+drPDYA=="], @@ -1896,8 +1874,6 @@ "b4a": ["b4a@1.7.3", "", { "peerDependencies": { "react-native-b4a": "*" }, "optionalPeers": ["react-native-b4a"] }, "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q=="], - "babel-dead-code-elimination": ["babel-dead-code-elimination@1.0.12", "", { "dependencies": { "@babel/core": "^7.23.7", "@babel/parser": "^7.23.6", "@babel/traverse": "^7.23.7", "@babel/types": "^7.23.6" } }, "sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig=="], - "babel-plugin-macros": ["babel-plugin-macros@3.1.0", "", { "dependencies": { "@babel/runtime": "^7.12.5", "cosmiconfig": "^7.0.0", "resolve": "^1.19.0" } }, "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg=="], "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], @@ -2086,8 +2062,6 @@ "cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="], - "cookie-es": ["cookie-es@3.1.1", "", {}, "sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg=="], - "cookie-signature": ["cookie-signature@1.2.2", "", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="], "copy-to-clipboard": ["copy-to-clipboard@3.3.3", "", { "dependencies": { "toggle-selection": "^1.0.6" } }, "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA=="], @@ -2726,8 +2700,6 @@ "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], - "isbot": ["isbot@5.1.42", "", {}, "sha512-/SXsVh7KpPRISrD4ffrGSxnTLlUBzEQUfWIusaJPrpJ93FW1P0YEZri5vAUkFsA0m2HRUhQRQadk2wJ+EeKowQ=="], - "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], "isobject": ["isobject@3.0.1", "", {}, "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg=="], @@ -2890,7 +2862,7 @@ "lower-case-first": ["lower-case-first@2.0.2", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg=="], - "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + "lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="], "lucide-react": ["lucide-react@0.562.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-82hOAu7y0dbVuFfmO4bYF1XEwYk/mEbM5E+b1jgci/udUBEE/R7LF5Ip0CCEmXe8AybRM8L+04eP+LGZeDvkiw=="], @@ -3250,7 +3222,7 @@ "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], "pino": ["pino@9.14.0", "", { "dependencies": { "@pinojs/redact": "^0.4.0", "atomic-sleep": "^1.0.0", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^2.0.0", "pino-std-serializers": "^7.0.0", "process-warning": "^5.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", "sonic-boom": "^4.0.1", "thread-stream": "^3.0.0" }, "bin": { "pino": "bin.js" } }, "sha512-8OEwKp5juEvb/MjpIc4hjqfgCNysrS94RIOMXYvpYCdm/jglrKEiAYmiumbmGhCvs+IcInsphYDFwqrjr7398w=="], @@ -3294,8 +3266,6 @@ "preact": ["preact@10.28.2", "", {}, "sha512-lbteaWGzGHdlIuiJ0l2Jq454m6kcpI1zNje6d8MlGAFlYvP2GO4ibnat7P74Esfz4sPTdM6UxtTwh/d3pwM9JA=="], - "prettier": ["prettier@3.8.4", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-N2MylSdi48+5N/6S5j+maeHbUSIzzZ5uOcX5Hm4QpV8Dkb1HFjfAKTKX6yNPJQD9AhcT3ifHNB66tWTTJDi11Q=="], - "prismjs": ["prismjs@1.30.0", "", {}, "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw=="], "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="], @@ -3604,7 +3574,7 @@ "secure-json-parse": ["secure-json-parse@4.1.0", "", {}, "sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA=="], - "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + "semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], "semver-compare": ["semver-compare@1.0.0", "", {}, "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow=="], @@ -3614,10 +3584,6 @@ "serialize-error": ["serialize-error@11.0.3", "", { "dependencies": { "type-fest": "^2.12.2" } }, "sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g=="], - "seroval": ["seroval@1.5.4", "", {}, "sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw=="], - - "seroval-plugins": ["seroval-plugins@1.5.4", "", { "peerDependencies": { "seroval": "^1.0" } }, "sha512-S0xQPhUTefAhNvNWFg0c1J8qJArHt5KdtJ/cFAofo06KD1MVSeFWyl4iiu+ApDIuw0WhjpOfCdgConOfAnLgkw=="], - "serve-static": ["serve-static@2.2.1", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw=="], "set-cookie-parser": ["set-cookie-parser@2.7.2", "", {}, "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw=="], @@ -4034,8 +4000,6 @@ "@aklinker1/rollup-plugin-visualizer/open": ["open@8.4.2", "", { "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" } }, "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ=="], - "@aklinker1/rollup-plugin-visualizer/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - "@ant-design/cssinjs-utils/@ant-design/cssinjs": ["@ant-design/cssinjs@1.24.0", "", { "dependencies": { "@babel/runtime": "^7.11.1", "@emotion/hash": "^0.8.0", "@emotion/unitless": "^0.7.5", "classnames": "^2.3.1", "csstype": "^3.1.3", "rc-util": "^5.35.0", "stylis": "^4.3.4" }, "peerDependencies": { "react": ">=16.0.0", "react-dom": ">=16.0.0" } }, "sha512-K4cYrJBsgvL+IoozUXYjbT6LHHNt+19a9zkvpBPxLjFHas1UpPM2A5MlhROb0BT8N8WoavM5VsP9MeSeNK/3mg=="], "@aws-crypto/crc32/@aws-sdk/types": ["@aws-sdk/types@3.972.0", "", { "dependencies": { "@smithy/types": "^4.12.0", "tslib": "^2.6.2" } }, "sha512-U7xBIbLSetONxb2bNzHyDgND3oKGoIfmknrEVnoEU4GUSs+0augUOIn9DIWGUO2ETcRFdsRUnmx9KhPT9Ojbug=="], @@ -4048,6 +4012,12 @@ "@aws-crypto/util/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], + "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + + "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + "@base-ui/react/@babel/runtime": ["@babel/runtime@7.29.7", "", {}, "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw=="], "@base-ui/utils/@babel/runtime": ["@babel/runtime@7.29.7", "", {}, "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw=="], @@ -4256,12 +4226,12 @@ "@opentelemetry/sql-common/@opentelemetry/core": ["@opentelemetry/core@2.4.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-KtcyFHssTn5ZgDu6SXmUznS80OFs/wN7y6MyFRRcKU6TOw8hNcGxKvt8hsdaLJfhzUszNSjURetq5Qpkad14Gw=="], + "@parcel/watcher/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + "@pnpm/network.ca-file/graceful-fs": ["graceful-fs@4.2.10", "", {}, "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="], "@prisma/instrumentation/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.207.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.207.0", "import-in-the-middle": "^2.0.0", "require-in-the-middle": "^8.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-y6eeli9+TLKnznrR8AZlQMSJT7wILpXH+6EYq5Vf/4Ao+huI7EedxQHwRgVUOMLFbe7VFDvHJrX9/f4lcwnJsA=="], - "@puppeteer/browsers/semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], - "@radix-ui/react-alert-dialog/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], "@radix-ui/react-collection/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], @@ -4316,20 +4286,6 @@ "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@tanstack/router-generator/@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="], - - "@tanstack/router-generator/jiti": ["jiti@2.7.0", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="], - - "@tanstack/router-plugin/@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="], - - "@tanstack/router-plugin/unplugin": ["unplugin@3.0.0", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "picomatch": "^4.0.3", "webpack-virtual-modules": "^0.6.2" } }, "sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg=="], - - "@tanstack/router-utils/@babel/parser": ["@babel/parser@7.29.0", "", { "dependencies": { "@babel/types": "^7.29.0" }, "bin": "./bin/babel-parser.js" }, "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww=="], - - "@tanstack/router-utils/@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="], - - "@tanstack/router-utils/diff": ["diff@8.0.4", "", {}, "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw=="], - "acpx/@agentclientprotocol/sdk": ["@agentclientprotocol/sdk@0.22.1", "", { "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-DfqXtl/8gO9NImq094MTaCXEU2vkhh6v7q/kT+9UjZxUqj8hYaya2OjLVIqn16MzNHcXEpShTR2RIauLSYeDQQ=="], "acpx/commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="], @@ -4342,12 +4298,6 @@ "antd-style/@ant-design/cssinjs": ["@ant-design/cssinjs@1.24.0", "", { "dependencies": { "@babel/runtime": "^7.11.1", "@emotion/hash": "^0.8.0", "@emotion/unitless": "^0.7.5", "classnames": "^2.3.1", "csstype": "^3.1.3", "rc-util": "^5.35.0", "stylis": "^4.3.4" }, "peerDependencies": { "react": ">=16.0.0", "react-dom": ">=16.0.0" } }, "sha512-K4cYrJBsgvL+IoozUXYjbT6LHHNt+19a9zkvpBPxLjFHas1UpPM2A5MlhROb0BT8N8WoavM5VsP9MeSeNK/3mg=="], - "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - - "babel-dead-code-elimination/@babel/parser": ["@babel/parser@7.29.0", "", { "dependencies": { "@babel/types": "^7.29.0" }, "bin": "./bin/babel-parser.js" }, "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww=="], - - "babel-dead-code-elimination/@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="], - "babel-plugin-macros/cosmiconfig": ["cosmiconfig@7.1.0", "", { "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", "parse-json": "^5.0.0", "path-type": "^4.0.0", "yaml": "^1.10.0" } }, "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA=="], "better-auth/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], @@ -4396,6 +4346,8 @@ "extend-shallow/is-extendable": ["is-extendable@0.1.1", "", {}, "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="], + "fdir/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + "form-data/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], "fx-runner/commander": ["commander@2.9.0", "", { "dependencies": { "graceful-readlink": ">= 1.0.0" } }, "sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A=="], @@ -4438,8 +4390,6 @@ "mermaid/uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="], - "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - "mlly/pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], "multimatch/array-union": ["array-union@3.0.1", "", {}, "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw=="], @@ -4448,8 +4398,6 @@ "node-notifier/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], - "node-notifier/semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], - "node-notifier/uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], "nypm/citty": ["citty@0.2.0", "", {}, "sha512-8csy5IBFI2ex2hTVpaHN2j+LNE199AgiI7y4dMintrr8i0lQiFn+0AWMZrWdHKIgMOer65f8IThysYhoReqjWA=="], @@ -4466,8 +4414,6 @@ "pac-proxy-agent/https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], - "package-json/semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], - "parse-bmfont-xml/xml2js": ["xml2js@0.5.0", "", { "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" } }, "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA=="], "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], @@ -4488,8 +4434,6 @@ "proxy-agent/https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], - "proxy-agent/lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="], - "publish-browser-extension/listr2": ["listr2@8.3.3", "", { "dependencies": { "cli-truncate": "^4.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^6.1.0", "rfdc": "^1.4.1", "wrap-ansi": "^9.0.0" } }, "sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ=="], "publish-browser-extension/zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], @@ -4532,18 +4476,24 @@ "terser/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + "tinyglobby/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + + "unimport/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + "unimport/unplugin": ["unplugin@2.3.11", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "acorn": "^8.15.0", "picomatch": "^4.0.3", "webpack-virtual-modules": "^0.6.2" } }, "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww=="], "unixify/normalize-path": ["normalize-path@2.1.1", "", { "dependencies": { "remove-trailing-separator": "^1.0.1" } }, "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w=="], "unplugin/chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], - "update-notifier/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], + "unplugin-utils/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], - "update-notifier/semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], + "update-notifier/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], "uvu/kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="], + "vite/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + "web-ext-run/@babel/runtime": ["@babel/runtime@7.28.2", "", {}, "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA=="], "web-ext-run/debounce": ["debounce@1.2.1", "", {}, "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug=="], @@ -4840,8 +4790,6 @@ "@radix-ui/react-popper/@floating-ui/react-dom/@floating-ui/dom": ["@floating-ui/dom@1.7.4", "", { "dependencies": { "@floating-ui/core": "^1.7.3", "@floating-ui/utils": "^0.2.10" } }, "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA=="], - "@tanstack/router-plugin/unplugin/webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="], - "acpx/tsx/esbuild": ["esbuild@0.28.0", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.0", "@esbuild/android-arm": "0.28.0", "@esbuild/android-arm64": "0.28.0", "@esbuild/android-x64": "0.28.0", "@esbuild/darwin-arm64": "0.28.0", "@esbuild/darwin-x64": "0.28.0", "@esbuild/freebsd-arm64": "0.28.0", "@esbuild/freebsd-x64": "0.28.0", "@esbuild/linux-arm": "0.28.0", "@esbuild/linux-arm64": "0.28.0", "@esbuild/linux-ia32": "0.28.0", "@esbuild/linux-loong64": "0.28.0", "@esbuild/linux-mips64el": "0.28.0", "@esbuild/linux-ppc64": "0.28.0", "@esbuild/linux-riscv64": "0.28.0", "@esbuild/linux-s390x": "0.28.0", "@esbuild/linux-x64": "0.28.0", "@esbuild/netbsd-arm64": "0.28.0", "@esbuild/netbsd-x64": "0.28.0", "@esbuild/openbsd-arm64": "0.28.0", "@esbuild/openbsd-x64": "0.28.0", "@esbuild/openharmony-arm64": "0.28.0", "@esbuild/sunos-x64": "0.28.0", "@esbuild/win32-arm64": "0.28.0", "@esbuild/win32-ia32": "0.28.0", "@esbuild/win32-x64": "0.28.0" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw=="], "babel-plugin-macros/cosmiconfig/yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="], @@ -5172,8 +5120,6 @@ "readable-web-to-node-stream/readable-stream/string_decoder/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], - "unplugin/chokidar/readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - "wxt/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], "@browseros/build-tools/@aws-sdk/client-s3/@aws-sdk/core/@aws-sdk/xml-builder/fast-xml-parser": ["fast-xml-parser@5.5.8", "", { "dependencies": { "fast-xml-builder": "^1.1.4", "path-expression-matcher": "^1.2.0", "strnum": "^2.2.0" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-Z7Fh2nVQSb2d+poDViM063ix2ZGt9jmY1nWhPfHBOK2Hgnb/OW3P4Et3P/81SEej0J7QbWtJqxO05h8QYfK7LQ=="], From f251067077d56a3b3dc6c215fa731f24fdb02b0b Mon Sep 17 00:00:00 2001 From: DaniAkash Date: Fri, 12 Jun 2026 17:25:07 +0530 Subject: [PATCH 07/19] feat(agent-mcp-ui): wire wxt dev launch into BrowserOS Chromium MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mirrors the existing apps/agent launch shape so `bun run dev` boots BrowserOS with this extension installed instead of stock Chromium. web-ext.config.ts defineWebExtConfig with BrowserOS binary path, dev-sane chromiumArgs (--use-mock-keychain, --disable-browseros-server, --disable-browseros-extensions, --browseros-dock-icon=dev), and a worktree+package-scoped Chromium profile under /tmp/browseros-dev--. Profile dir distinct from apps/agent's so the two dev runs never share state. BROWSEROS_CDP_PORT / BROWSEROS_SERVER_PORT / BROWSEROS_EXTENSION_PORT / BROWSEROS_USER_DATA_DIR / BROWSEROS_BINARY env overrides supported with the same names the agent extension already uses. .env.example Documents the env vars; copy to .env.development to enable them. Every entry is optional. package.json dev → bun --env-file=.env.development wxt build:dev → same, for the development-mode build Verified: bun --print 'await import("./web-ext.config.ts").then(m => m.default)' resolves the BrowserOS binary path + the per-worktree+package profile dir bunx wxt prepare clean bun run typecheck clean bunx biome check clean bunx wxt build clean, 336 kB --- .../apps/agent-mcp-ui/.env.example | 23 +++++ .../apps/agent-mcp-ui/package.json | 4 +- .../apps/agent-mcp-ui/web-ext.config.ts | 83 +++++++++++++++++++ 3 files changed, 108 insertions(+), 2 deletions(-) create mode 100644 packages/browseros-agent/apps/agent-mcp-ui/.env.example create mode 100644 packages/browseros-agent/apps/agent-mcp-ui/web-ext.config.ts diff --git a/packages/browseros-agent/apps/agent-mcp-ui/.env.example b/packages/browseros-agent/apps/agent-mcp-ui/.env.example new file mode 100644 index 0000000000..307287f7b0 --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-ui/.env.example @@ -0,0 +1,23 @@ +# Copy to .env.development locally; bun --env-file=.env.development +# loads these before wxt launches the browser. None are required — +# every entry has a sensible default in web-ext.config.ts. + +# Path to a BrowserOS Chromium binary. Default targets the canonical +# macOS install. +# BROWSEROS_BINARY="/Applications/BrowserOS.app/Contents/MacOS/BrowserOS" + +# Override the Chromium user data directory. Defaults to a per-package +# per-worktree dir under /tmp so dev runs don't share state with the +# agent extension or with other worktrees. +# BROWSEROS_USER_DATA_DIR="/tmp/my-browseros-dev" + +# When set, forwarded to Chromium as --remote-debugging-port. +# BROWSEROS_CDP_PORT="9000" + +# When set, forwarded as --browseros-mcp-port, --browseros-server-port, +# and --browseros-proxy-port. Points BrowserOS at a sibling agent +# server (the existing apps/server). Leave unset if you don't need it. +# BROWSEROS_SERVER_PORT="9100" + +# When set, forwarded as --browseros-extension-port. +# BROWSEROS_EXTENSION_PORT="9300" diff --git a/packages/browseros-agent/apps/agent-mcp-ui/package.json b/packages/browseros-agent/apps/agent-mcp-ui/package.json index 1d378b67c6..36d6742a74 100644 --- a/packages/browseros-agent/apps/agent-mcp-ui/package.json +++ b/packages/browseros-agent/apps/agent-mcp-ui/package.json @@ -5,9 +5,9 @@ "version": "0.0.1", "description": "WXT extension surface for the BrowserOS v2 agent cockpit. React + shadcn (base-vega). Talks to @browseros/agent-mcp-interface over hono-rpc.", "scripts": { - "dev": "wxt", + "dev": "bun --env-file=.env.development wxt", "build": "wxt build", - "build:dev": "wxt build --mode development", + "build:dev": "bun --env-file=.env.development wxt build --mode development", "zip": "wxt zip", "compile": "wxt prepare && tsc --noEmit", "typecheck": "wxt prepare && tsc --noEmit", diff --git a/packages/browseros-agent/apps/agent-mcp-ui/web-ext.config.ts b/packages/browseros-agent/apps/agent-mcp-ui/web-ext.config.ts new file mode 100644 index 0000000000..f38eacfb45 --- /dev/null +++ b/packages/browseros-agent/apps/agent-mcp-ui/web-ext.config.ts @@ -0,0 +1,83 @@ +import { createHash } from 'node:crypto' +import { mkdirSync } from 'node:fs' +import { tmpdir } from 'node:os' +import { basename, dirname, join, resolve } from 'node:path' +import { fileURLToPath } from 'node:url' +import { defineWebExtConfig } from 'wxt' + +const env = process.env +const configDir = dirname(fileURLToPath(import.meta.url)) + +/** + * Returns a worktree+package-scoped Chromium profile so two dev runs + * never share state (this extension vs the agent extension; one + * worktree vs another with the same basename). + * + * Label = worktree dir basename (eg. feat-foo-bar) + * Key = 8-char sha256 of this package's directory + * Result: /tmp/browseros-dev-