From c6464633e9aeedf2bf26592aa9e8578f202f97c5 Mon Sep 17 00:00:00 2001 From: DaniAkash Date: Fri, 12 Jun 2026 16:53:37 +0530 Subject: [PATCH 1/2] chore(agent): trim mcp-manager dead exports and unused devDeps MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Drives the browseros-agent fallow report from 17 issues down to 4 (the residual 4 are all in the remote-hermes surface added by #1174 and out of scope here). mcp-manager: - Slim the public barrel to the 7 symbols real consumers import (routes, main, the two reconcile/service test files). Drop the re-exports of BROWSEROS_MCP_SERVER_NAME, BROWSEROS_MCP_STDIO_SERVER_NAME, getMcpManager, ReconcileUrlInput, InstallAgentResult, McpAgentId, McpAgentRow, ReconcileResult, UninstallAgentResult — all of which are only used by sibling files inside mcp-manager/ itself. - Narrow BROWSEROS_SERVER_NAMES and planFor in service.ts to module-private (used only inside service.ts). This also resolves the AgentServerPlan private-type-leak since planFor becomes private. - Drop the dangling McpAgentIdentifier type alias (zero consumers). UI: - Export IntegrationsSectionProps so the exported IntegrationsSection no longer references a private type. - Narrow AGENT_PRESENTATION in integrations-section.helpers.ts to module-private (used only by presentationFor() in the same file). Deps: - Remove dotenv and picocolors from devDependencies — neither is imported anywhere in the package (dotenv is even explicitly documented as not needed in the agent README). --- .../screens/mcp-settings/IntegrationsSection.tsx | 2 +- .../mcp-settings/integrations-section.helpers.ts | 2 +- .../apps/server/src/lib/mcp-manager/index.ts | 12 +----------- .../apps/server/src/lib/mcp-manager/service.ts | 7 ++----- packages/browseros-agent/bun.lock | 10 +++++----- packages/browseros-agent/package.json | 2 -- 6 files changed, 10 insertions(+), 25 deletions(-) diff --git a/packages/browseros-agent/apps/agent/screens/mcp-settings/IntegrationsSection.tsx b/packages/browseros-agent/apps/agent/screens/mcp-settings/IntegrationsSection.tsx index afc49a7a46..c9627ff48f 100644 --- a/packages/browseros-agent/apps/agent/screens/mcp-settings/IntegrationsSection.tsx +++ b/packages/browseros-agent/apps/agent/screens/mcp-settings/IntegrationsSection.tsx @@ -16,7 +16,7 @@ import { } from './integrations-section.hooks' import { QuickSetupSection } from './QuickSetupSection' -interface IntegrationsSectionProps { +export interface IntegrationsSectionProps { serverUrl: string | null } diff --git a/packages/browseros-agent/apps/agent/screens/mcp-settings/integrations-section.helpers.ts b/packages/browseros-agent/apps/agent/screens/mcp-settings/integrations-section.helpers.ts index 0595e903a8..dc731abbf1 100644 --- a/packages/browseros-agent/apps/agent/screens/mcp-settings/integrations-section.helpers.ts +++ b/packages/browseros-agent/apps/agent/screens/mcp-settings/integrations-section.helpers.ts @@ -24,7 +24,7 @@ export interface AgentPresentation { mark: FC> } -export const AGENT_PRESENTATION: Record = { +const AGENT_PRESENTATION: Record = { 'claude-code': { label: 'Claude Code', installUrl: 'https://claude.ai/code', diff --git a/packages/browseros-agent/apps/server/src/lib/mcp-manager/index.ts b/packages/browseros-agent/apps/server/src/lib/mcp-manager/index.ts index 2d78165fe6..6fd8dc8e03 100644 --- a/packages/browseros-agent/apps/server/src/lib/mcp-manager/index.ts +++ b/packages/browseros-agent/apps/server/src/lib/mcp-manager/index.ts @@ -5,23 +5,13 @@ */ export { - BROWSEROS_MCP_SERVER_NAME, - BROWSEROS_MCP_STDIO_SERVER_NAME, - getMcpManager, resetMcpManagerForTesting, setMcpManagerForTesting, } from './manager' -export { type ReconcileUrlInput, reconcileUrl } from './reconcile' +export { reconcileUrl } from './reconcile' export { humaniseInstallError, installInto, listAgents, uninstallFrom, } from './service' -export type { - InstallAgentResult, - McpAgentId, - McpAgentRow, - ReconcileResult, - UninstallAgentResult, -} from './types' diff --git a/packages/browseros-agent/apps/server/src/lib/mcp-manager/service.ts b/packages/browseros-agent/apps/server/src/lib/mcp-manager/service.ts index afacd7de2b..6132f1bca7 100644 --- a/packages/browseros-agent/apps/server/src/lib/mcp-manager/service.ts +++ b/packages/browseros-agent/apps/server/src/lib/mcp-manager/service.ts @@ -25,7 +25,6 @@ import { } from './manager' import type { InstallAgentResult, - McpAgentId, McpAgentRow, UninstallAgentResult, } from './types' @@ -52,7 +51,7 @@ const STDIO_ONLY_AGENTS: ReadonlySet = new Set(['codex']) * The two server-names BrowserOS manages in the manifest. Iterating * both is what `listAgents` + `reconcileUrl` need to do. */ -export const BROWSEROS_SERVER_NAMES: readonly string[] = [ +const BROWSEROS_SERVER_NAMES: readonly string[] = [ BROWSEROS_MCP_SERVER_NAME, BROWSEROS_MCP_STDIO_SERVER_NAME, ] @@ -63,7 +62,7 @@ interface AgentServerPlan { } /** Pick the server name + spec a given agent should be linked under. */ -export function planFor(agentId: string, currentUrl: string): AgentServerPlan { +function planFor(agentId: string, currentUrl: string): AgentServerPlan { if (STDIO_ONLY_AGENTS.has(agentId)) { const spec: McpStdioSpec = { transport: 'stdio', @@ -181,5 +180,3 @@ export function humaniseInstallError(err: unknown): { const message = err instanceof Error ? err.message : String(err) return { message, status: 500 } } - -export type McpAgentIdentifier = McpAgentId diff --git a/packages/browseros-agent/bun.lock b/packages/browseros-agent/bun.lock index d60756d614..58b30bf1f9 100644 --- a/packages/browseros-agent/bun.lock +++ b/packages/browseros-agent/bun.lock @@ -12,10 +12,8 @@ "@types/node": "^24.3.3", "@typescript/native-preview": "^7.0.0-dev.20260319.1", "commander": "^14.0.1", - "dotenv": "^17.2.3", "fallow": "^2.85.0", "lefthook": "^2.0.12", - "picocolors": "^1.1.1", "typedoc": "^0.28.15", "typescript": "^5.9.2", }, @@ -2186,7 +2184,7 @@ "dot-prop": ["dot-prop@9.0.0", "", { "dependencies": { "type-fest": "^4.18.2" } }, "sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ=="], - "dotenv": ["dotenv@17.2.3", "", {}, "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w=="], + "dotenv": ["dotenv@17.3.1", "", {}, "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA=="], "dotenv-expand": ["dotenv-expand@12.0.3", "", { "dependencies": { "dotenv": "^16.4.5" } }, "sha512-uc47g4b+4k/M/SeaW1y4OApx+mtLWl92l5LMPP0GNXctZqELk+YGgOPIIC5elYmUH4OuoK3JLhuRUYegeySiFA=="], @@ -4252,6 +4250,8 @@ "boxen/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], + "c12/dotenv": ["dotenv@17.2.3", "", {}, "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w=="], + "c12/perfect-debounce": ["perfect-debounce@2.0.0", "", {}, "sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow=="], "chrome-launcher/escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], @@ -4378,6 +4378,8 @@ "proxy-agent/https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], + "publish-browser-extension/dotenv": ["dotenv@17.2.3", "", {}, "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w=="], + "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=="], @@ -4456,8 +4458,6 @@ "wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "wxt/dotenv": ["dotenv@17.3.1", "", {}, "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA=="], - "wxt/minimatch": ["minimatch@10.2.4", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg=="], "zod-from-json-schema/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], diff --git a/packages/browseros-agent/package.json b/packages/browseros-agent/package.json index e0234e376b..b51f1620e6 100644 --- a/packages/browseros-agent/package.json +++ b/packages/browseros-agent/package.json @@ -61,10 +61,8 @@ "@types/node": "^24.3.3", "@typescript/native-preview": "^7.0.0-dev.20260319.1", "commander": "^14.0.1", - "dotenv": "^17.2.3", "fallow": "^2.85.0", "lefthook": "^2.0.12", - "picocolors": "^1.1.1", "typedoc": "^0.28.15", "typescript": "^5.9.2" }, From 9489fe7b1da414a77f1b12e6e9754a53d4a460ae Mon Sep 17 00:00:00 2001 From: DaniAkash Date: Fri, 12 Jun 2026 17:06:17 +0530 Subject: [PATCH 2/2] chore(agent): restore dotenv/picocolors, fix remaining fallow findings, gate CI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Restoring the two devDeps that were wrongly dropped (build-script tests on CI failed: `Cannot find package 'picocolors' / 'dotenv'`). Both are actually consumed by `scripts/build/{server,cli}.ts` and `scripts/build/log.ts`, but those entry points are outside fallow's discovery (the package.json script paths use parent-directory traversal that fallow skips). Listing both in `.fallowrc.json` `ignoreDependencies` matches the existing convention used for `pino-pretty`. Fixes the 4 remaining fallow findings introduced by #1174 so the new CI gate can be green from day one: - Export `RemoteHermesBootPillProps` (purely additive — resolves the private-type-leak on `RemoteHermesBootPill`, and incidentally surfaces the embedded `RemoteHermesVmStatus` as part of its public shape). - Export `SocketState` in `ws-bridge.ts` (purely additive — resolves the private-type-leak on the diagnostic-exposed `snapshot()` method). - Annotate the orphan `PostTurnResult` with `// fallow-ignore-next-line unused-type` so it stays available for follow-up wiring without blocking CI. Adds a `runner / Fallow` job to `.github/workflows/code-quality.yml` parallel to Biome and Typecheck. Same shape: checkout → setup-bun → `bun ci` → `bun fallow`. PRs that touch `packages/browseros-agent/**` now gate on the dead-code report. --- .github/workflows/code-quality.yml | 23 +++++++++++++++++++ packages/browseros-agent/.fallowrc.json | 2 ++ .../sidepanel/index/RemoteHermesBootPill.tsx | 2 +- .../remote-hermes/remote-hermes-client.ts | 1 + .../lib/clients/remote-hermes/ws-bridge.ts | 2 +- packages/browseros-agent/bun.lock | 2 ++ packages/browseros-agent/package.json | 2 ++ 7 files changed, 32 insertions(+), 2 deletions(-) diff --git a/.github/workflows/code-quality.yml b/.github/workflows/code-quality.yml index 9d885a53a4..a16cd6fff0 100644 --- a/.github/workflows/code-quality.yml +++ b/.github/workflows/code-quality.yml @@ -59,3 +59,26 @@ jobs: - name: Run Typecheck run: bun run typecheck + + fallow: + name: runner / Fallow + runs-on: ubuntu-latest + defaults: + run: + working-directory: packages/browseros-agent + permissions: + contents: read + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + persist-credentials: false + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + + - name: Install dependencies + run: bun ci + + - name: Run Fallow + run: bun fallow diff --git a/packages/browseros-agent/.fallowrc.json b/packages/browseros-agent/.fallowrc.json index 58440f1564..b2cf347974 100644 --- a/packages/browseros-agent/.fallowrc.json +++ b/packages/browseros-agent/.fallowrc.json @@ -20,6 +20,8 @@ "tw-animate-css", "@tailwindcss/typography", "pino-pretty", + "dotenv", + "picocolors", "@browseros/cdp-protocol", "@graphql-typed-document-node/core" ], diff --git a/packages/browseros-agent/apps/agent/screens/sidepanel/index/RemoteHermesBootPill.tsx b/packages/browseros-agent/apps/agent/screens/sidepanel/index/RemoteHermesBootPill.tsx index 4f1efd7f8a..eb142aa1be 100644 --- a/packages/browseros-agent/apps/agent/screens/sidepanel/index/RemoteHermesBootPill.tsx +++ b/packages/browseros-agent/apps/agent/screens/sidepanel/index/RemoteHermesBootPill.tsx @@ -6,7 +6,7 @@ export interface RemoteHermesVmStatus { progress?: string } -interface RemoteHermesBootPillProps { +export interface RemoteHermesBootPillProps { vm: RemoteHermesVmStatus } diff --git a/packages/browseros-agent/apps/server/src/lib/clients/remote-hermes/remote-hermes-client.ts b/packages/browseros-agent/apps/server/src/lib/clients/remote-hermes/remote-hermes-client.ts index dd5847e64f..5b86dc74fa 100644 --- a/packages/browseros-agent/apps/server/src/lib/clients/remote-hermes/remote-hermes-client.ts +++ b/packages/browseros-agent/apps/server/src/lib/clients/remote-hermes/remote-hermes-client.ts @@ -39,6 +39,7 @@ export interface PostTurnInput { modelId?: string | null } +// fallow-ignore-next-line unused-type export interface PostTurnResult { taskId: string } diff --git a/packages/browseros-agent/apps/server/src/lib/clients/remote-hermes/ws-bridge.ts b/packages/browseros-agent/apps/server/src/lib/clients/remote-hermes/ws-bridge.ts index a12a57a9f2..582cd45615 100644 --- a/packages/browseros-agent/apps/server/src/lib/clients/remote-hermes/ws-bridge.ts +++ b/packages/browseros-agent/apps/server/src/lib/clients/remote-hermes/ws-bridge.ts @@ -36,7 +36,7 @@ export interface WsBridgeDeps { resolveLocalMcpUrl(server: string): string | null } -type SocketState = 'closed' | 'connecting' | 'open' +export type SocketState = 'closed' | 'connecting' | 'open' const MODULE = 'remote-hermes' diff --git a/packages/browseros-agent/bun.lock b/packages/browseros-agent/bun.lock index 58b30bf1f9..5625899e7b 100644 --- a/packages/browseros-agent/bun.lock +++ b/packages/browseros-agent/bun.lock @@ -12,8 +12,10 @@ "@types/node": "^24.3.3", "@typescript/native-preview": "^7.0.0-dev.20260319.1", "commander": "^14.0.1", + "dotenv": "^17.2.3", "fallow": "^2.85.0", "lefthook": "^2.0.12", + "picocolors": "^1.1.1", "typedoc": "^0.28.15", "typescript": "^5.9.2", }, diff --git a/packages/browseros-agent/package.json b/packages/browseros-agent/package.json index b51f1620e6..e0234e376b 100644 --- a/packages/browseros-agent/package.json +++ b/packages/browseros-agent/package.json @@ -61,8 +61,10 @@ "@types/node": "^24.3.3", "@typescript/native-preview": "^7.0.0-dev.20260319.1", "commander": "^14.0.1", + "dotenv": "^17.2.3", "fallow": "^2.85.0", "lefthook": "^2.0.12", + "picocolors": "^1.1.1", "typedoc": "^0.28.15", "typescript": "^5.9.2" },