diff --git a/.source/browser.ts b/.source/browser.ts index 11f0eef61a..c3bc050c5b 100644 --- a/.source/browser.ts +++ b/.source/browser.ts @@ -7,6 +7,6 @@ const create = browser(); const browserCollections = { - docs: create.doc("docs", {"architecture/ARCHITECTURE.md": () => import("../docs/architecture/ARCHITECTURE.md?collection=docs"), "architecture/AUTHZ_GUIDE.md": () => import("../docs/architecture/AUTHZ_GUIDE.md?collection=docs"), "architecture/CODEBASE_DOCUMENTATION.md": () => import("../docs/architecture/CODEBASE_DOCUMENTATION.md?collection=docs"), "architecture/REPOSITORY_MAP.md": () => import("../docs/architecture/REPOSITORY_MAP.md?collection=docs"), "architecture/RESILIENCE_GUIDE.md": () => import("../docs/architecture/RESILIENCE_GUIDE.md?collection=docs"), "compression/COMPRESSION_ENGINES.md": () => import("../docs/compression/COMPRESSION_ENGINES.md?collection=docs"), "compression/COMPRESSION_GUIDE.md": () => import("../docs/compression/COMPRESSION_GUIDE.md?collection=docs"), "compression/COMPRESSION_LANGUAGE_PACKS.md": () => import("../docs/compression/COMPRESSION_LANGUAGE_PACKS.md?collection=docs"), "compression/COMPRESSION_RULES_FORMAT.md": () => import("../docs/compression/COMPRESSION_RULES_FORMAT.md?collection=docs"), "compression/RTK_COMPRESSION.md": () => import("../docs/compression/RTK_COMPRESSION.md?collection=docs"), "guides/DOCKER_GUIDE.md": () => import("../docs/guides/DOCKER_GUIDE.md?collection=docs"), "guides/ELECTRON_GUIDE.md": () => import("../docs/guides/ELECTRON_GUIDE.md?collection=docs"), "guides/FEATURES.md": () => import("../docs/guides/FEATURES.md?collection=docs"), "guides/I18N.md": () => import("../docs/guides/I18N.md?collection=docs"), "guides/KIRO_SETUP.md": () => import("../docs/guides/KIRO_SETUP.md?collection=docs"), "guides/PWA_GUIDE.md": () => import("../docs/guides/PWA_GUIDE.md?collection=docs"), "guides/SETUP_GUIDE.md": () => import("../docs/guides/SETUP_GUIDE.md?collection=docs"), "guides/TERMUX_GUIDE.md": () => import("../docs/guides/TERMUX_GUIDE.md?collection=docs"), "guides/TROUBLESHOOTING.md": () => import("../docs/guides/TROUBLESHOOTING.md?collection=docs"), "guides/UNINSTALL.md": () => import("../docs/guides/UNINSTALL.md?collection=docs"), "guides/USER_GUIDE.md": () => import("../docs/guides/USER_GUIDE.md?collection=docs"), "frameworks/A2A-SERVER.md": () => import("../docs/frameworks/A2A-SERVER.md?collection=docs"), "frameworks/AGENT_PROTOCOLS_GUIDE.md": () => import("../docs/frameworks/AGENT_PROTOCOLS_GUIDE.md?collection=docs"), "frameworks/CLOUD_AGENT.md": () => import("../docs/frameworks/CLOUD_AGENT.md?collection=docs"), "frameworks/EMBEDDED-SERVICES.md": () => import("../docs/frameworks/EMBEDDED-SERVICES.md?collection=docs"), "frameworks/EVALS.md": () => import("../docs/frameworks/EVALS.md?collection=docs"), "frameworks/GAMIFICATION.md": () => import("../docs/frameworks/GAMIFICATION.md?collection=docs"), "frameworks/MCP-SERVER.md": () => import("../docs/frameworks/MCP-SERVER.md?collection=docs"), "frameworks/MEMORY.md": () => import("../docs/frameworks/MEMORY.md?collection=docs"), "frameworks/OPENCODE.md": () => import("../docs/frameworks/OPENCODE.md?collection=docs"), "frameworks/SKILLS.md": () => import("../docs/frameworks/SKILLS.md?collection=docs"), "frameworks/WEBHOOKS.md": () => import("../docs/frameworks/WEBHOOKS.md?collection=docs"), "ops/COVERAGE_PLAN.md": () => import("../docs/ops/COVERAGE_PLAN.md?collection=docs"), "ops/E2E_DASHBOARD_SHAKEDOWN_v3.8.0.md": () => import("../docs/ops/E2E_DASHBOARD_SHAKEDOWN_v3.8.0.md?collection=docs"), "ops/FLY_IO_DEPLOYMENT_GUIDE.md": () => import("../docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md?collection=docs"), "ops/PROXY_GUIDE.md": () => import("../docs/ops/PROXY_GUIDE.md?collection=docs"), "ops/RELEASE_CHECKLIST.md": () => import("../docs/ops/RELEASE_CHECKLIST.md?collection=docs"), "ops/SQLITE_RUNTIME.md": () => import("../docs/ops/SQLITE_RUNTIME.md?collection=docs"), "ops/TUNNELS_GUIDE.md": () => import("../docs/ops/TUNNELS_GUIDE.md?collection=docs"), "ops/VM_DEPLOYMENT_GUIDE.md": () => import("../docs/ops/VM_DEPLOYMENT_GUIDE.md?collection=docs"), "reference/API_REFERENCE.md": () => import("../docs/reference/API_REFERENCE.md?collection=docs"), "reference/CLI-TOOLS.md": () => import("../docs/reference/CLI-TOOLS.md?collection=docs"), "reference/ENVIRONMENT.md": () => import("../docs/reference/ENVIRONMENT.md?collection=docs"), "reference/FREE_TIERS.md": () => import("../docs/reference/FREE_TIERS.md?collection=docs"), "reference/PROVIDER_REFERENCE.md": () => import("../docs/reference/PROVIDER_REFERENCE.md?collection=docs"), "routing/AUTO-COMBO.md": () => import("../docs/routing/AUTO-COMBO.md?collection=docs"), "routing/REASONING_REPLAY.md": () => import("../docs/routing/REASONING_REPLAY.md?collection=docs"), "security/CLI_TOKEN.md": () => import("../docs/security/CLI_TOKEN.md?collection=docs"), "security/CLI_TOKEN_AUTH.md": () => import("../docs/security/CLI_TOKEN_AUTH.md?collection=docs"), "security/COMPLIANCE.md": () => import("../docs/security/COMPLIANCE.md?collection=docs"), "security/ERROR_SANITIZATION.md": () => import("../docs/security/ERROR_SANITIZATION.md?collection=docs"), "security/GUARDRAILS.md": () => import("../docs/security/GUARDRAILS.md?collection=docs"), "security/PUBLIC_CREDS.md": () => import("../docs/security/PUBLIC_CREDS.md?collection=docs"), "security/ROUTE_GUARD_TIERS.md": () => import("../docs/security/ROUTE_GUARD_TIERS.md?collection=docs"), "security/STEALTH_GUIDE.md": () => import("../docs/security/STEALTH_GUIDE.md?collection=docs"), }), + docs: create.doc("docs", {"architecture/ARCHITECTURE.md": () => import("../docs/architecture/ARCHITECTURE.md?collection=docs"), "architecture/AUTHZ_GUIDE.md": () => import("../docs/architecture/AUTHZ_GUIDE.md?collection=docs"), "architecture/CODEBASE_DOCUMENTATION.md": () => import("../docs/architecture/CODEBASE_DOCUMENTATION.md?collection=docs"), "architecture/REPOSITORY_MAP.md": () => import("../docs/architecture/REPOSITORY_MAP.md?collection=docs"), "architecture/RESILIENCE_GUIDE.md": () => import("../docs/architecture/RESILIENCE_GUIDE.md?collection=docs"), "compression/COMPRESSION_ENGINES.md": () => import("../docs/compression/COMPRESSION_ENGINES.md?collection=docs"), "compression/COMPRESSION_GUIDE.md": () => import("../docs/compression/COMPRESSION_GUIDE.md?collection=docs"), "compression/COMPRESSION_LANGUAGE_PACKS.md": () => import("../docs/compression/COMPRESSION_LANGUAGE_PACKS.md?collection=docs"), "compression/COMPRESSION_RULES_FORMAT.md": () => import("../docs/compression/COMPRESSION_RULES_FORMAT.md?collection=docs"), "compression/RTK_COMPRESSION.md": () => import("../docs/compression/RTK_COMPRESSION.md?collection=docs"), "frameworks/A2A-SERVER.md": () => import("../docs/frameworks/A2A-SERVER.md?collection=docs"), "frameworks/AGENT_PROTOCOLS_GUIDE.md": () => import("../docs/frameworks/AGENT_PROTOCOLS_GUIDE.md?collection=docs"), "frameworks/CLOUD_AGENT.md": () => import("../docs/frameworks/CLOUD_AGENT.md?collection=docs"), "frameworks/EMBEDDED-SERVICES.md": () => import("../docs/frameworks/EMBEDDED-SERVICES.md?collection=docs"), "frameworks/EVALS.md": () => import("../docs/frameworks/EVALS.md?collection=docs"), "frameworks/GAMIFICATION.md": () => import("../docs/frameworks/GAMIFICATION.md?collection=docs"), "frameworks/MCP-SERVER.md": () => import("../docs/frameworks/MCP-SERVER.md?collection=docs"), "frameworks/MEMORY.md": () => import("../docs/frameworks/MEMORY.md?collection=docs"), "frameworks/OPENCODE.md": () => import("../docs/frameworks/OPENCODE.md?collection=docs"), "frameworks/SKILLS.md": () => import("../docs/frameworks/SKILLS.md?collection=docs"), "frameworks/WEBHOOKS.md": () => import("../docs/frameworks/WEBHOOKS.md?collection=docs"), "guides/DOCKER_GUIDE.md": () => import("../docs/guides/DOCKER_GUIDE.md?collection=docs"), "guides/ELECTRON_GUIDE.md": () => import("../docs/guides/ELECTRON_GUIDE.md?collection=docs"), "guides/FEATURES.md": () => import("../docs/guides/FEATURES.md?collection=docs"), "guides/I18N.md": () => import("../docs/guides/I18N.md?collection=docs"), "guides/KIRO_SETUP.md": () => import("../docs/guides/KIRO_SETUP.md?collection=docs"), "guides/PWA_GUIDE.md": () => import("../docs/guides/PWA_GUIDE.md?collection=docs"), "guides/SETUP_GUIDE.md": () => import("../docs/guides/SETUP_GUIDE.md?collection=docs"), "guides/TERMUX_GUIDE.md": () => import("../docs/guides/TERMUX_GUIDE.md?collection=docs"), "guides/TROUBLESHOOTING.md": () => import("../docs/guides/TROUBLESHOOTING.md?collection=docs"), "guides/UNINSTALL.md": () => import("../docs/guides/UNINSTALL.md?collection=docs"), "guides/USER_GUIDE.md": () => import("../docs/guides/USER_GUIDE.md?collection=docs"), "ops/COVERAGE_PLAN.md": () => import("../docs/ops/COVERAGE_PLAN.md?collection=docs"), "ops/E2E_DASHBOARD_SHAKEDOWN_v3.8.0.md": () => import("../docs/ops/E2E_DASHBOARD_SHAKEDOWN_v3.8.0.md?collection=docs"), "ops/FLY_IO_DEPLOYMENT_GUIDE.md": () => import("../docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md?collection=docs"), "ops/PROXY_GUIDE.md": () => import("../docs/ops/PROXY_GUIDE.md?collection=docs"), "ops/RELEASE_CHECKLIST.md": () => import("../docs/ops/RELEASE_CHECKLIST.md?collection=docs"), "ops/SQLITE_RUNTIME.md": () => import("../docs/ops/SQLITE_RUNTIME.md?collection=docs"), "ops/TUNNELS_GUIDE.md": () => import("../docs/ops/TUNNELS_GUIDE.md?collection=docs"), "ops/VM_DEPLOYMENT_GUIDE.md": () => import("../docs/ops/VM_DEPLOYMENT_GUIDE.md?collection=docs"), "reference/API_REFERENCE.md": () => import("../docs/reference/API_REFERENCE.md?collection=docs"), "reference/CLI-TOOLS.md": () => import("../docs/reference/CLI-TOOLS.md?collection=docs"), "reference/ENVIRONMENT.md": () => import("../docs/reference/ENVIRONMENT.md?collection=docs"), "reference/FREE_TIERS.md": () => import("../docs/reference/FREE_TIERS.md?collection=docs"), "reference/PROVIDER_REFERENCE.md": () => import("../docs/reference/PROVIDER_REFERENCE.md?collection=docs"), "routing/AUTO-COMBO.md": () => import("../docs/routing/AUTO-COMBO.md?collection=docs"), "routing/REASONING_REPLAY.md": () => import("../docs/routing/REASONING_REPLAY.md?collection=docs"), "security/CLI_TOKEN.md": () => import("../docs/security/CLI_TOKEN.md?collection=docs"), "security/CLI_TOKEN_AUTH.md": () => import("../docs/security/CLI_TOKEN_AUTH.md?collection=docs"), "security/COMPLIANCE.md": () => import("../docs/security/COMPLIANCE.md?collection=docs"), "security/ERROR_SANITIZATION.md": () => import("../docs/security/ERROR_SANITIZATION.md?collection=docs"), "security/GUARDRAILS.md": () => import("../docs/security/GUARDRAILS.md?collection=docs"), "security/PUBLIC_CREDS.md": () => import("../docs/security/PUBLIC_CREDS.md?collection=docs"), "security/ROUTE_GUARD_TIERS.md": () => import("../docs/security/ROUTE_GUARD_TIERS.md?collection=docs"), "security/STEALTH_GUIDE.md": () => import("../docs/security/STEALTH_GUIDE.md?collection=docs"), }), }; export default browserCollections; \ No newline at end of file diff --git a/.source/server.ts b/.source/server.ts index 923e119f5a..ea427fcb51 100644 --- a/.source/server.ts +++ b/.source/server.ts @@ -32,28 +32,28 @@ import * as __fd_glob_35 from "../docs/ops/PROXY_GUIDE.md?collection=docs" import * as __fd_glob_34 from "../docs/ops/FLY_IO_DEPLOYMENT_GUIDE.md?collection=docs" import * as __fd_glob_33 from "../docs/ops/E2E_DASHBOARD_SHAKEDOWN_v3.8.0.md?collection=docs" import * as __fd_glob_32 from "../docs/ops/COVERAGE_PLAN.md?collection=docs" -import * as __fd_glob_31 from "../docs/frameworks/WEBHOOKS.md?collection=docs" -import * as __fd_glob_30 from "../docs/frameworks/SKILLS.md?collection=docs" -import * as __fd_glob_29 from "../docs/frameworks/OPENCODE.md?collection=docs" -import * as __fd_glob_28 from "../docs/frameworks/MEMORY.md?collection=docs" -import * as __fd_glob_27 from "../docs/frameworks/MCP-SERVER.md?collection=docs" -import * as __fd_glob_26 from "../docs/frameworks/GAMIFICATION.md?collection=docs" -import * as __fd_glob_25 from "../docs/frameworks/EVALS.md?collection=docs" -import * as __fd_glob_24 from "../docs/frameworks/EMBEDDED-SERVICES.md?collection=docs" -import * as __fd_glob_23 from "../docs/frameworks/CLOUD_AGENT.md?collection=docs" -import * as __fd_glob_22 from "../docs/frameworks/AGENT_PROTOCOLS_GUIDE.md?collection=docs" -import * as __fd_glob_21 from "../docs/frameworks/A2A-SERVER.md?collection=docs" -import * as __fd_glob_20 from "../docs/guides/USER_GUIDE.md?collection=docs" -import * as __fd_glob_19 from "../docs/guides/UNINSTALL.md?collection=docs" -import * as __fd_glob_18 from "../docs/guides/TROUBLESHOOTING.md?collection=docs" -import * as __fd_glob_17 from "../docs/guides/TERMUX_GUIDE.md?collection=docs" -import * as __fd_glob_16 from "../docs/guides/SETUP_GUIDE.md?collection=docs" -import * as __fd_glob_15 from "../docs/guides/PWA_GUIDE.md?collection=docs" -import * as __fd_glob_14 from "../docs/guides/KIRO_SETUP.md?collection=docs" -import * as __fd_glob_13 from "../docs/guides/I18N.md?collection=docs" -import * as __fd_glob_12 from "../docs/guides/FEATURES.md?collection=docs" -import * as __fd_glob_11 from "../docs/guides/ELECTRON_GUIDE.md?collection=docs" -import * as __fd_glob_10 from "../docs/guides/DOCKER_GUIDE.md?collection=docs" +import * as __fd_glob_31 from "../docs/guides/USER_GUIDE.md?collection=docs" +import * as __fd_glob_30 from "../docs/guides/UNINSTALL.md?collection=docs" +import * as __fd_glob_29 from "../docs/guides/TROUBLESHOOTING.md?collection=docs" +import * as __fd_glob_28 from "../docs/guides/TERMUX_GUIDE.md?collection=docs" +import * as __fd_glob_27 from "../docs/guides/SETUP_GUIDE.md?collection=docs" +import * as __fd_glob_26 from "../docs/guides/PWA_GUIDE.md?collection=docs" +import * as __fd_glob_25 from "../docs/guides/KIRO_SETUP.md?collection=docs" +import * as __fd_glob_24 from "../docs/guides/I18N.md?collection=docs" +import * as __fd_glob_23 from "../docs/guides/FEATURES.md?collection=docs" +import * as __fd_glob_22 from "../docs/guides/ELECTRON_GUIDE.md?collection=docs" +import * as __fd_glob_21 from "../docs/guides/DOCKER_GUIDE.md?collection=docs" +import * as __fd_glob_20 from "../docs/frameworks/WEBHOOKS.md?collection=docs" +import * as __fd_glob_19 from "../docs/frameworks/SKILLS.md?collection=docs" +import * as __fd_glob_18 from "../docs/frameworks/OPENCODE.md?collection=docs" +import * as __fd_glob_17 from "../docs/frameworks/MEMORY.md?collection=docs" +import * as __fd_glob_16 from "../docs/frameworks/MCP-SERVER.md?collection=docs" +import * as __fd_glob_15 from "../docs/frameworks/GAMIFICATION.md?collection=docs" +import * as __fd_glob_14 from "../docs/frameworks/EVALS.md?collection=docs" +import * as __fd_glob_13 from "../docs/frameworks/EMBEDDED-SERVICES.md?collection=docs" +import * as __fd_glob_12 from "../docs/frameworks/CLOUD_AGENT.md?collection=docs" +import * as __fd_glob_11 from "../docs/frameworks/AGENT_PROTOCOLS_GUIDE.md?collection=docs" +import * as __fd_glob_10 from "../docs/frameworks/A2A-SERVER.md?collection=docs" import * as __fd_glob_9 from "../docs/compression/RTK_COMPRESSION.md?collection=docs" import * as __fd_glob_8 from "../docs/compression/COMPRESSION_RULES_FORMAT.md?collection=docs" import * as __fd_glob_7 from "../docs/compression/COMPRESSION_LANGUAGE_PACKS.md?collection=docs" @@ -72,4 +72,4 @@ const create = server({"doc":{"passthroughs":["extractedReferences"]}}); -export const docs = await create.docs("docs", "docs", {"meta.json": __fd_glob_55, "architecture/meta.json": __fd_glob_56, "compression/meta.json": __fd_glob_57, "frameworks/meta.json": __fd_glob_58, "guides/meta.json": __fd_glob_59, "ops/meta.json": __fd_glob_60, "reference/meta.json": __fd_glob_61, "reference/openapi.yaml": __fd_glob_62, "routing/meta.json": __fd_glob_63, "security/meta.json": __fd_glob_64, }, {"architecture/ARCHITECTURE.md": __fd_glob_0, "architecture/AUTHZ_GUIDE.md": __fd_glob_1, "architecture/CODEBASE_DOCUMENTATION.md": __fd_glob_2, "architecture/REPOSITORY_MAP.md": __fd_glob_3, "architecture/RESILIENCE_GUIDE.md": __fd_glob_4, "compression/COMPRESSION_ENGINES.md": __fd_glob_5, "compression/COMPRESSION_GUIDE.md": __fd_glob_6, "compression/COMPRESSION_LANGUAGE_PACKS.md": __fd_glob_7, "compression/COMPRESSION_RULES_FORMAT.md": __fd_glob_8, "compression/RTK_COMPRESSION.md": __fd_glob_9, "guides/DOCKER_GUIDE.md": __fd_glob_10, "guides/ELECTRON_GUIDE.md": __fd_glob_11, "guides/FEATURES.md": __fd_glob_12, "guides/I18N.md": __fd_glob_13, "guides/KIRO_SETUP.md": __fd_glob_14, "guides/PWA_GUIDE.md": __fd_glob_15, "guides/SETUP_GUIDE.md": __fd_glob_16, "guides/TERMUX_GUIDE.md": __fd_glob_17, "guides/TROUBLESHOOTING.md": __fd_glob_18, "guides/UNINSTALL.md": __fd_glob_19, "guides/USER_GUIDE.md": __fd_glob_20, "frameworks/A2A-SERVER.md": __fd_glob_21, "frameworks/AGENT_PROTOCOLS_GUIDE.md": __fd_glob_22, "frameworks/CLOUD_AGENT.md": __fd_glob_23, "frameworks/EMBEDDED-SERVICES.md": __fd_glob_24, "frameworks/EVALS.md": __fd_glob_25, "frameworks/GAMIFICATION.md": __fd_glob_26, "frameworks/MCP-SERVER.md": __fd_glob_27, "frameworks/MEMORY.md": __fd_glob_28, "frameworks/OPENCODE.md": __fd_glob_29, "frameworks/SKILLS.md": __fd_glob_30, "frameworks/WEBHOOKS.md": __fd_glob_31, "ops/COVERAGE_PLAN.md": __fd_glob_32, "ops/E2E_DASHBOARD_SHAKEDOWN_v3.8.0.md": __fd_glob_33, "ops/FLY_IO_DEPLOYMENT_GUIDE.md": __fd_glob_34, "ops/PROXY_GUIDE.md": __fd_glob_35, "ops/RELEASE_CHECKLIST.md": __fd_glob_36, "ops/SQLITE_RUNTIME.md": __fd_glob_37, "ops/TUNNELS_GUIDE.md": __fd_glob_38, "ops/VM_DEPLOYMENT_GUIDE.md": __fd_glob_39, "reference/API_REFERENCE.md": __fd_glob_40, "reference/CLI-TOOLS.md": __fd_glob_41, "reference/ENVIRONMENT.md": __fd_glob_42, "reference/FREE_TIERS.md": __fd_glob_43, "reference/PROVIDER_REFERENCE.md": __fd_glob_44, "routing/AUTO-COMBO.md": __fd_glob_45, "routing/REASONING_REPLAY.md": __fd_glob_46, "security/CLI_TOKEN.md": __fd_glob_47, "security/CLI_TOKEN_AUTH.md": __fd_glob_48, "security/COMPLIANCE.md": __fd_glob_49, "security/ERROR_SANITIZATION.md": __fd_glob_50, "security/GUARDRAILS.md": __fd_glob_51, "security/PUBLIC_CREDS.md": __fd_glob_52, "security/ROUTE_GUARD_TIERS.md": __fd_glob_53, "security/STEALTH_GUIDE.md": __fd_glob_54, }); \ No newline at end of file +export const docs = await create.docs("docs", "docs", {"meta.json": __fd_glob_55, "architecture/meta.json": __fd_glob_56, "compression/meta.json": __fd_glob_57, "frameworks/meta.json": __fd_glob_58, "guides/meta.json": __fd_glob_59, "ops/meta.json": __fd_glob_60, "reference/meta.json": __fd_glob_61, "reference/openapi.yaml": __fd_glob_62, "routing/meta.json": __fd_glob_63, "security/meta.json": __fd_glob_64, }, {"architecture/ARCHITECTURE.md": __fd_glob_0, "architecture/AUTHZ_GUIDE.md": __fd_glob_1, "architecture/CODEBASE_DOCUMENTATION.md": __fd_glob_2, "architecture/REPOSITORY_MAP.md": __fd_glob_3, "architecture/RESILIENCE_GUIDE.md": __fd_glob_4, "compression/COMPRESSION_ENGINES.md": __fd_glob_5, "compression/COMPRESSION_GUIDE.md": __fd_glob_6, "compression/COMPRESSION_LANGUAGE_PACKS.md": __fd_glob_7, "compression/COMPRESSION_RULES_FORMAT.md": __fd_glob_8, "compression/RTK_COMPRESSION.md": __fd_glob_9, "frameworks/A2A-SERVER.md": __fd_glob_10, "frameworks/AGENT_PROTOCOLS_GUIDE.md": __fd_glob_11, "frameworks/CLOUD_AGENT.md": __fd_glob_12, "frameworks/EMBEDDED-SERVICES.md": __fd_glob_13, "frameworks/EVALS.md": __fd_glob_14, "frameworks/GAMIFICATION.md": __fd_glob_15, "frameworks/MCP-SERVER.md": __fd_glob_16, "frameworks/MEMORY.md": __fd_glob_17, "frameworks/OPENCODE.md": __fd_glob_18, "frameworks/SKILLS.md": __fd_glob_19, "frameworks/WEBHOOKS.md": __fd_glob_20, "guides/DOCKER_GUIDE.md": __fd_glob_21, "guides/ELECTRON_GUIDE.md": __fd_glob_22, "guides/FEATURES.md": __fd_glob_23, "guides/I18N.md": __fd_glob_24, "guides/KIRO_SETUP.md": __fd_glob_25, "guides/PWA_GUIDE.md": __fd_glob_26, "guides/SETUP_GUIDE.md": __fd_glob_27, "guides/TERMUX_GUIDE.md": __fd_glob_28, "guides/TROUBLESHOOTING.md": __fd_glob_29, "guides/UNINSTALL.md": __fd_glob_30, "guides/USER_GUIDE.md": __fd_glob_31, "ops/COVERAGE_PLAN.md": __fd_glob_32, "ops/E2E_DASHBOARD_SHAKEDOWN_v3.8.0.md": __fd_glob_33, "ops/FLY_IO_DEPLOYMENT_GUIDE.md": __fd_glob_34, "ops/PROXY_GUIDE.md": __fd_glob_35, "ops/RELEASE_CHECKLIST.md": __fd_glob_36, "ops/SQLITE_RUNTIME.md": __fd_glob_37, "ops/TUNNELS_GUIDE.md": __fd_glob_38, "ops/VM_DEPLOYMENT_GUIDE.md": __fd_glob_39, "reference/API_REFERENCE.md": __fd_glob_40, "reference/CLI-TOOLS.md": __fd_glob_41, "reference/ENVIRONMENT.md": __fd_glob_42, "reference/FREE_TIERS.md": __fd_glob_43, "reference/PROVIDER_REFERENCE.md": __fd_glob_44, "routing/AUTO-COMBO.md": __fd_glob_45, "routing/REASONING_REPLAY.md": __fd_glob_46, "security/CLI_TOKEN.md": __fd_glob_47, "security/CLI_TOKEN_AUTH.md": __fd_glob_48, "security/COMPLIANCE.md": __fd_glob_49, "security/ERROR_SANITIZATION.md": __fd_glob_50, "security/GUARDRAILS.md": __fd_glob_51, "security/PUBLIC_CREDS.md": __fd_glob_52, "security/ROUTE_GUARD_TIERS.md": __fd_glob_53, "security/STEALTH_GUIDE.md": __fd_glob_54, }); \ No newline at end of file diff --git a/src/app/(dashboard)/dashboard/system/mitm-proxy/page.tsx b/src/app/(dashboard)/dashboard/system/mitm-proxy/page.tsx index e617659751..b59c55710f 100644 --- a/src/app/(dashboard)/dashboard/system/mitm-proxy/page.tsx +++ b/src/app/(dashboard)/dashboard/system/mitm-proxy/page.tsx @@ -1,6 +1,9 @@ import { redirect } from "next/navigation"; +/** + * MITM Proxy page — moved to AgentBridge (plan 11). + * Redirects to the new location at /dashboard/tools/agent-bridge. + */ export default function MitmProxyPage() { - // MITM Proxy será movido para Tools/AgentBridge (plano 11) - redirect("/dashboard/system/proxy"); + redirect("/dashboard/tools/agent-bridge"); } diff --git a/src/app/(dashboard)/dashboard/tools/agent-bridge/AgentBridgePageClient.tsx b/src/app/(dashboard)/dashboard/tools/agent-bridge/AgentBridgePageClient.tsx new file mode 100644 index 0000000000..91184a9b8e --- /dev/null +++ b/src/app/(dashboard)/dashboard/tools/agent-bridge/AgentBridgePageClient.tsx @@ -0,0 +1,236 @@ +"use client"; + +import { useCallback, useState } from "react"; +import { useTranslations } from "next-intl"; +import Link from "next/link"; +import { RiskNoticeBanner } from "./components/RiskNoticeBanner"; +import { AgentBridgeServerCard } from "./components/AgentBridgeServerCard"; +import { AgentList } from "./components/AgentList"; +import { EmptyStateNoProviders } from "./components/EmptyStateNoProviders"; +import { useAgentBridgeState } from "./hooks/useAgentBridgeState"; +import type { MitmTarget } from "@/mitm/types"; +import type { MappingRow } from "./components/ModelMappingTable"; + +// ── Types ──────────────────────────────────────────────────────────────────── + +export interface AgentStateEntry { + agent_id: string; + dns_enabled: boolean; + cert_trusted: boolean; + setup_completed: boolean; + last_started_at: string | null; + last_error: string | null; +} + +export interface AgentBridgeServerState { + running: boolean; + port: number; + certTrusted: boolean; + upstreamCa: string | null; + lastStartedAt: string | null; + activeConns: number; + interceptedCount: number; +} + +export type AgentMappingsMap = Record; + +export interface AgentBridgePageData { + serverState: AgentBridgeServerState; + agentStates: AgentStateEntry[]; + bypassPatterns: string[]; + mappings: AgentMappingsMap; +} + +interface AgentBridgePageClientProps { + initialData: AgentBridgePageData; + targets: MitmTarget[]; + hasProviders: boolean; +} + +// ── Component ──────────────────────────────────────────────────────────────── + +export default function AgentBridgePageClient({ + initialData, + targets, + hasProviders, +}: AgentBridgePageClientProps) { + const t = useTranslations("agentBridge"); + const { data, refresh } = useAgentBridgeState({ initialData }); + const [actionError, setActionError] = useState(null); + + // ── Server actions ──────────────────────────────────────────────────────── + + const handleServerAction = useCallback( + async (action: "start" | "stop" | "restart" | "trust-cert" | "regenerate-cert") => { + setActionError(null); + try { + const res = await fetch("/api/tools/agent-bridge/server", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ action }), + }); + if (!res.ok) { + const err = (await res.json().catch(() => ({ error: { message: `HTTP ${res.status}` } }))) as { + error?: { message?: string }; + }; + throw new Error(err.error?.message ?? `HTTP ${res.status}`); + } + await refresh(); + } catch (err) { + setActionError(err instanceof Error ? err.message : "Unknown error"); + } + }, + [refresh] + ); + + // ── Upstream CA ─────────────────────────────────────────────────────────── + + const handleUpstreamCaSave = useCallback(async (path: string) => { + setActionError(null); + try { + const res = await fetch("/api/tools/agent-bridge/upstream-ca", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ path }), + }); + if (!res.ok) throw new Error(`HTTP ${res.status}`); + await refresh(); + } catch (err) { + setActionError(err instanceof Error ? err.message : "Unknown error"); + } + }, [refresh]); + + // ── Bypass list ─────────────────────────────────────────────────────────── + + const handleBypassSave = useCallback(async (patterns: string[]) => { + setActionError(null); + try { + const res = await fetch("/api/tools/agent-bridge/bypass", { + method: "PUT", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ patterns }), + }); + if (!res.ok) throw new Error(`HTTP ${res.status}`); + await refresh(); + } catch (err) { + setActionError(err instanceof Error ? err.message : "Unknown error"); + } + }, [refresh]); + + // ── DNS toggle ──────────────────────────────────────────────────────────── + + const handleDnsToggle = useCallback( + async (agentId: string, enabled: boolean) => { + setActionError(null); + try { + const res = await fetch(`/api/tools/agent-bridge/agents/${agentId}/dns`, { + method: "PUT", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ enabled }), + }); + if (!res.ok) throw new Error(`HTTP ${res.status}`); + await refresh(); + } catch (err) { + setActionError(err instanceof Error ? err.message : "Unknown error"); + } + }, + [refresh] + ); + + // ── Mappings save ───────────────────────────────────────────────────────── + + const handleMappingsSave = useCallback( + async (agentId: string, mappings: MappingRow[]) => { + setActionError(null); + try { + const res = await fetch(`/api/tools/agent-bridge/agents/${agentId}/mappings`, { + method: "PUT", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ mappings }), + }); + if (!res.ok) throw new Error(`HTTP ${res.status}`); + await refresh(); + } catch (err) { + setActionError(err instanceof Error ? err.message : "Unknown error"); + } + }, + [refresh] + ); + + // ── Render ──────────────────────────────────────────────────────────────── + + return ( +
+ {/* Risk banner */} + + + {/* Error alert */} + {actionError && ( +
+ error + {actionError} + +
+ )} + + {/* Empty state: no providers */} + {!hasProviders ? ( + + ) : ( + <> + {/* Server card */} + + + {/* Agent list */} + + + {/* Quick links */} +
+

+ {t("quickLinks") || "Quick links"} +

+
+ + dns + {t("quickLinkProviders") || "Configure providers"} + + + network_check + {t("quickLinkInspector") || "View traffic in Traffic Inspector"} + +
+
+ + )} +
+ ); +} diff --git a/src/app/(dashboard)/dashboard/tools/agent-bridge/components/AgentBridgeServerCard.tsx b/src/app/(dashboard)/dashboard/tools/agent-bridge/components/AgentBridgeServerCard.tsx new file mode 100644 index 0000000000..be1c75a7c3 --- /dev/null +++ b/src/app/(dashboard)/dashboard/tools/agent-bridge/components/AgentBridgeServerCard.tsx @@ -0,0 +1,195 @@ +"use client"; + +import { useState } from "react"; +import { useTranslations } from "next-intl"; +import { CertStatusIcon } from "./shared/CertStatusIcon"; +import { UpstreamCaField } from "./UpstreamCaField"; +import { BypassListEditor } from "./BypassListEditor"; +import type { AgentBridgeServerState } from "../AgentBridgePageClient"; + +interface AgentBridgeServerCardProps { + serverState: AgentBridgeServerState; + onAction: (action: "start" | "stop" | "restart" | "trust-cert" | "regenerate-cert") => Promise; + onUpstreamCaSave: (path: string) => Promise; + onBypassSave: (patterns: string[]) => Promise; + bypassPatterns: string[]; +} + +/** + * Global server card — status + action buttons + CA field + bypass list. + * Matches plan 11 §3 AgentBridge Server layout. + */ +export function AgentBridgeServerCard({ + serverState, + onAction, + onUpstreamCaSave, + onBypassSave, + bypassPatterns, +}: AgentBridgeServerCardProps) { + const t = useTranslations("agentBridge"); + const [loading, setLoading] = useState(null); + const [expanded, setExpanded] = useState(false); + const [upstreamCa, setUpstreamCa] = useState(serverState.upstreamCa ?? ""); + + const runAction = async (action: "start" | "stop" | "restart" | "trust-cert" | "regenerate-cert") => { + setLoading(action); + try { + await onAction(action); + } finally { + setLoading(null); + } + }; + + const isRunning = serverState.running; + + return ( +
+ {/* Header row */} +
+
+
+ link +
+
+

+ {t("serverCardTitle") || "AgentBridge Server"} + + + {isRunning ? t("statusRunning") || "Running" : t("statusStopped") || "Stopped"} + +

+
+ + {t("serverPort") || "Port"}: {serverState.port ?? 443} + + + {serverState.activeConns !== undefined && ( + + {t("serverConns") || "Connections"}: {serverState.activeConns} + + )} + {serverState.interceptedCount !== undefined && ( + + {t("serverIntercepted") || "Intercepted"}: {serverState.interceptedCount.toLocaleString()} + + )} + {serverState.lastStartedAt && ( + + {t("serverLastStarted") || "Last started"}:{" "} + {new Date(serverState.lastStartedAt).toLocaleTimeString()} + + )} +
+
+
+ + +
+ + {/* Action buttons */} +
+ + + + + + + + + + download + {t("downloadCert") || "Download Cert"} + + + +
+ + {/* Expanded: CA + Bypass */} + {expanded && ( +
+ +
+

+ {t("bypassSectionTitle") || "Bypass List"} +

+

+ {t("bypassSectionDesc") || + "Hosts matching these patterns are tunneled directly (no TLS decryption). Defaults include banks, .gov, and corporate SSO."} +

+ +
+
+ )} +
+ ); +} diff --git a/src/app/(dashboard)/dashboard/tools/agent-bridge/components/AgentCard.tsx b/src/app/(dashboard)/dashboard/tools/agent-bridge/components/AgentCard.tsx new file mode 100644 index 0000000000..d924ba1b2b --- /dev/null +++ b/src/app/(dashboard)/dashboard/tools/agent-bridge/components/AgentCard.tsx @@ -0,0 +1,232 @@ +"use client"; + +import { useState } from "react"; +import { useTranslations } from "next-intl"; +import { AgentIcon } from "./shared/AgentIcon"; +import { DnsStatusBadge } from "./shared/DnsStatusBadge"; +import { ModelMappingTable } from "./ModelMappingTable"; +import { SetupWizard } from "./SetupWizard"; +import type { MitmTarget } from "@/mitm/types"; +import type { AgentStateEntry } from "../AgentBridgePageClient"; +import type { MappingRow } from "./ModelMappingTable"; + +interface AgentCardProps { + target: MitmTarget; + agentState: AgentStateEntry | undefined; + serverRunning: boolean; + mappings: MappingRow[]; + onDnsToggle: (agentId: string, enabled: boolean) => Promise; + onMappingsSave: (agentId: string, mappings: MappingRow[]) => Promise; +} + +/** + * Expandable card for a single IDE agent. + */ +export function AgentCard({ + target, + agentState, + serverRunning, + mappings, + onDnsToggle, + onMappingsSave, +}: AgentCardProps) { + const t = useTranslations("agentBridge"); + const [expanded, setExpanded] = useState(false); + const [wizardOpen, setWizardOpen] = useState(false); + const [dnsLoading, setDnsLoading] = useState(false); + + const dnsEnabled = agentState?.dns_enabled ?? false; + const setupCompleted = agentState?.setup_completed ?? false; + const certTrusted = agentState?.cert_trusted ?? false; + const isInvestigating = target.viability === "investigating"; + + const getStatusBadge = () => { + if (isInvestigating) { + return ( + + search + {t("statusInvestigating") || "Investigating"} + + ); + } + if (setupCompleted && dnsEnabled) { + return ( + + + {t("statusActive") || "Active"} + + ); + } + if (!setupCompleted) { + return ( + + settings + {t("statusSetupRequired") || "Setup required"} + + ); + } + return ( + + warning + {t("statusDnsOff") || "DNS off"} + + ); + }; + + const handleDnsToggle = async () => { + setDnsLoading(true); + try { + await onDnsToggle(target.id, !dnsEnabled); + } finally { + setDnsLoading(false); + } + }; + + return ( + <> +
+ {/* Card header */} + + + {/* Expanded content */} + {expanded && ( +
+ {/* Hosts */} +
+

+ {t("agentHosts") || "Intercepted hosts"} +

+
+ {target.hosts.map((h) => ( + + {h} + + ))} +
+
+ + {/* Cert status */} +
+ + {certTrusted ? "verified_user" : "lock_open"} + + {certTrusted + ? t("certTrusted") || "Certificate trusted" + : t("certNotTrusted") || "Certificate not trusted"} +
+ + {/* Investigating notice */} + {isInvestigating && ( +
+

+ {t("investigatingNotice") || + "This agent is under investigation. Hosts and API surface are still being confirmed. Setup will be available once the upstream API is documented."} +

+
+ )} + + {/* Model mappings */} + {!isInvestigating && ( +
+

+ {t("modelMappingsLabel") || "Model mappings"} +

+ +
+ )} + + {/* Action buttons */} +
+ {!isInvestigating && ( + + )} + + {!isInvestigating && ( + + )} + + + network_check + {t("viewTraffic") || "View traffic"} + +
+
+ )} +
+ + {wizardOpen && ( + setWizardOpen(false)} + onDnsToggle={onDnsToggle} + /> + )} + + ); +} diff --git a/src/app/(dashboard)/dashboard/tools/agent-bridge/components/AgentList.tsx b/src/app/(dashboard)/dashboard/tools/agent-bridge/components/AgentList.tsx new file mode 100644 index 0000000000..d2f97e9bf0 --- /dev/null +++ b/src/app/(dashboard)/dashboard/tools/agent-bridge/components/AgentList.tsx @@ -0,0 +1,142 @@ +"use client"; + +import { useState } from "react"; +import { useTranslations } from "next-intl"; +import { AgentCard } from "./AgentCard"; +import type { MitmTarget } from "@/mitm/types"; +import type { AgentStateEntry, AgentMappingsMap } from "../AgentBridgePageClient"; +import type { MappingRow } from "./ModelMappingTable"; + +interface AgentListProps { + targets: MitmTarget[]; + agentStates: AgentStateEntry[]; + serverRunning: boolean; + mappingsMap: AgentMappingsMap; + onDnsToggle: (agentId: string, enabled: boolean) => Promise; + onMappingsSave: (agentId: string, mappings: MappingRow[]) => Promise; +} + +type SetupFilter = "all" | "active" | "setup-required" | "investigating"; + +/** + * Grid of agent cards with filter + search controls. + * Matches plan 11 §3 IDE Agents section. + */ +export function AgentList({ + targets, + agentStates, + serverRunning, + mappingsMap, + onDnsToggle, + onMappingsSave, +}: AgentListProps) { + const t = useTranslations("agentBridge"); + const [filter, setFilter] = useState("all"); + const [search, setSearch] = useState(""); + + const stateByAgent = Object.fromEntries(agentStates.map((s) => [s.agent_id, s])); + + const filtered = targets.filter((target) => { + // Search filter + if (search) { + const q = search.toLowerCase(); + if ( + !target.name.toLowerCase().includes(q) && + !target.id.toLowerCase().includes(q) && + !target.hosts.some((h) => h.toLowerCase().includes(q)) + ) { + return false; + } + } + + const state = stateByAgent[target.id]; + + // Setup status filter + if (filter === "active") { + return state?.dns_enabled && state?.setup_completed; + } + if (filter === "setup-required") { + return !state?.setup_completed && target.viability !== "investigating"; + } + if (filter === "investigating") { + return target.viability === "investigating"; + } + + return true; + }); + + const filterOptions: { id: SetupFilter; label: string }[] = [ + { id: "all", label: t("filterAll") || "All" }, + { id: "active", label: t("filterActive") || "Active" }, + { id: "setup-required", label: t("filterSetupRequired") || "Setup required" }, + { id: "investigating", label: t("filterInvestigating") || "Investigating" }, + ]; + + return ( +
+ {/* Controls */} +
+

+ {t("agentListTitle") || "IDE Agents"}{" "} + ({targets.length}) +

+ + {/* Filter buttons */} +
+ {filterOptions.map((opt) => ( + + ))} +
+ + {/* Search */} +
+ + search + + setSearch(e.target.value)} + /> +
+
+ + {/* Grid */} +
+ {filtered.length === 0 ? ( +
+ + search_off + +

{t("noAgentsMatch") || "No agents match the current filter"}

+
+ ) : ( + filtered.map((target) => ( + + )) + )} +
+
+ ); +} diff --git a/src/app/(dashboard)/dashboard/tools/agent-bridge/components/BypassListEditor.tsx b/src/app/(dashboard)/dashboard/tools/agent-bridge/components/BypassListEditor.tsx new file mode 100644 index 0000000000..61db7b78fa --- /dev/null +++ b/src/app/(dashboard)/dashboard/tools/agent-bridge/components/BypassListEditor.tsx @@ -0,0 +1,82 @@ +"use client"; + +import { useState } from "react"; +import { useTranslations } from "next-intl"; + +const DEFAULT_BYPASS_PATTERNS = [ + "*.bank.*", + "*.gov.*", + "*.okta.com", + "*.auth0.com", +]; + +interface BypassListEditorProps { + patterns: string[]; + onSave: (patterns: string[]) => Promise; +} + +/** + * Textarea / chip editor for user-defined bypass patterns. + * Shows read-only defaults + editable user list. + */ +export function BypassListEditor({ patterns, onSave }: BypassListEditorProps) { + const t = useTranslations("agentBridge"); + const [userInput, setUserInput] = useState(patterns.join("\n")); + const [saving, setSaving] = useState(false); + + const handleSave = async () => { + setSaving(true); + try { + const parsed = userInput + .split("\n") + .map((l) => l.trim()) + .filter(Boolean); + await onSave(parsed); + } finally { + setSaving(false); + } + }; + + return ( +
+
+

+ {t("bypassDefaultsLabel") || "Default bypass patterns (read-only)"} +

+
+ {DEFAULT_BYPASS_PATTERNS.map((p) => ( + + {p} + + ))} +
+
+ +
+ +