github Go analyzed 96f5929

labtether/labtether

github

LabTether

maintainer
labtether
license
Apache-2.0
first seen
2026-07-22
last seen
2026-09-03
releases · 30d
0
short id

Drift inferred · capture-to-capture

No drift recorded — single capability capture; advisories appear once its surface changes.

capabilities 32 tools
transport http counts 32 tools · 0 res · 0 prompts permission surface via code analysis

tools

  • alerts_acknowledge
  • alerts_list
  • asset_reboot
  • asset_shutdown
  • asset_wake
  • assets_get
  • assets_list
  • connectors_health
  • credentials_list
  • docker_container_logs
  • docker_container_restart
  • docker_container_stats
  • docker_containers
  • docker_hosts
  • exec
  • exec_multi
  • files_list
  • files_read
  • groups_list
  • metrics_overview
  • saved_actions_list
  • schedules_list
  • services_list
  • services_restart
  • system_disks
  • system_network
  • system_packages
  • system_processes
  • topology_edges
  • updates_list_plans
  • webhooks_list
  • whoami
code evidence vv1.4.0 · github-tarball
evidence-backed findings quoted directly from the published source artifact — not inferred

code files: 2428

filesystem 6

  • fs (weak) labtether-labtether-96f5929/web/console/app/[locale]/(console)/nodes/[id]/__tests__/productionRouteIntegration.test.ts :1 import { readFileSync } from "node:fs";
  • fs (weak) labtether-labtether-96f5929/web/console/app/[locale]/(console)/settings/components/__tests__/backupRouteIntegration.test.ts :1 import { readFileSync } from "node:fs";
  • fs (weak) labtether-labtether-96f5929/web/console/app/api/__tests__/proxyOriginCoverage.test.ts :3 import fs from "node:fs";
  • fs labtether-labtether-96f5929/web/console/lib/backend.ts :1 import { readFileSync } from "node:fs";
  • fs (weak) labtether-labtether-96f5929/web/console/scripts/start-playwright-https.mjs :2 import { existsSync, mkdirSync, readFileSync } from "node:fs";
  • fs (weak) labtether-labtether-96f5929/web/console/scripts/test-runtime-proxy-standalone.mjs :3 import { existsSync } from "node:fs";

shell / exec 4

  • shell (weak) labtether-labtether-96f5929/scripts/lib/http-redirect.test.js :2 const { spawnSync } = require("node:child_process");
  • shell (weak) labtether-labtether-96f5929/web/console/scripts/console-runtime.mjs :1 import { spawn } from "node:child_process";
  • shell (weak) labtether-labtether-96f5929/web/console/scripts/start-playwright-https.mjs :1 import { spawn } from "node:child_process";
  • shell (weak) labtether-labtether-96f5929/web/console/scripts/test-runtime-proxy-standalone.mjs :1 import { spawn } from "node:child_process";

network 220

  • net (weak) labtether-labtether-96f5929/scripts/lib/http-redirect.js :3 const http = require("http");
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/api-docs/page.tsx :347 fetch("/api/v2/openapi.json", { cache: "no-store" })
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/files/fileConnectionsClient.ts :124 const response = await fetch(connectionURL(""), { cache: "no-store" });
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/files/fileOpsClient.ts :118 return fetch(`/api/file-connections/${encodeURIComponent(source.connectionId)}/download?${params.toString()}`, {
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/files/fileTransferClient.ts :58 const response = await fetch(transferURL(""), {
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/groups/page.tsx :60 const response = await fetch(
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/groups/useGroupMutationActions.ts :38 const response = await fetch("/api/groups", {
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/layout.tsx :69 fetch("/api/terminal/snippets", { cache: "no-store" })
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/nodes/[id]/NodeEditModal.tsx :53 const res = await fetch(`/api/assets/${encodeURIComponent(asset.id)}`, {
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/nodes/[id]/PBSBackupCoverageCard.tsx :36 const response = await fetch(`/api/pbs/assets/${encodeURIComponent(assetId)}/groups`, {
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/nodes/[id]/PBSDatastoreDrilldown.tsx :49 fetch(`/api/pbs/assets/${encodeURIComponent(assetId)}/groups`, { cache: "no-store" })
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/nodes/[id]/PBSVerificationCard.tsx :48 const response = await fetch(
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/nodes/[id]/ProxmoxTasksSection.tsx :60 const response = await fetch(`/api/proxmox/tasks/${encodeURIComponent(taskNode)}/${encodeURIComponent(taskUpid)}/log${collectorQuery}`, { signal: AbortSignal.timeout(15_000) });
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/nodes/[id]/clusterTopologyGuestLinkingApi.ts :26 const response = await fetch(`/api/assets/${encodeURIComponent(guestID)}/dependencies?limit=200`, {
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/nodes/[id]/pbs/PBSBackupGroupsTab.tsx :97 fetch(`/api/pbs/assets/${encodeURIComponent(assetId)}/groups`, { cache: "no-store" })
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/nodes/[id]/pbs/PBSSnapshotsTab.tsx :74 const response = await fetch(
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/nodes/[id]/pbs/PBSTasksTab.tsx :86 fetch(`/api/pbs/tasks/${encodeURIComponent(node)}/${encodeURIComponent(upid)}/status${query}`, {
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/nodes/[id]/pbs/usePBSData.ts :16 const response = await fetch(path, { cache: "no-store" });
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/nodes/[id]/portainer/usePortainerData.ts :37 const response = await fetch(path, { cache: "no-store" });
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/nodes/[id]/proxmox/useProxmoxData.ts :10 const response = await fetch(path, { cache: "no-store" });
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/nodes/[id]/truenas/TrueNASDisksTab.tsx :53 const res = await fetch(
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/nodes/[id]/truenas/TrueNASEventsTab.tsx :28 const res = await fetch(
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/nodes/[id]/truenas/useTrueNASData.ts :16 const response = await fetch(path, { cache: "no-store" });
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/nodes/[id]/useAgentDeviceName.ts :43 const response = await fetch(`/api/assets/${encodeURIComponent(nodeId)}`, {
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/nodes/[id]/useAgentSettingsActions.ts :52 const response = await fetch(`/api/agents/${encodeURIComponent(nodeId)}/settings`, {
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/nodes/[id]/useAgentSettingsData.ts :27 fetch(`/api/agents/${encodeURIComponent(nodeId)}/settings`, { cache: "no-store" }),
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/nodes/[id]/useDesktopSessionControls.ts :239 const response = await fetch(
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/nodes/[id]/useDeviceCapabilities.ts :65 const response = await window.fetch(url, { cache: "no-store", signal: ctrl.signal });
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/nodes/[id]/useNodeActionsData.ts :30 const res = await fetch(`/api/actions/runs?${params.toString()}`, {
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/nodes/[id]/useNodeDeleteFlow.ts :43 const res = await fetch(`/api/assets/${encodeURIComponent(nodeId)}`, { method: "DELETE" });
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/nodes/[id]/useNodeLogsData.ts :36 const res = await fetch(`/api/logs/query?${params.toString()}`, {
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/nodes/[id]/useNodeProxmoxData.ts :67 const response = await fetch(
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/nodes/[id]/useNodeTelemetryData.ts :23 const res = await fetch(
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/nodes/[id]/useProtocolConfigs.ts :56 const res = await fetch(`/api/assets/${encodeURIComponent(assetId)}/protocols`, {
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/nodes/[id]/useStorageOperationsActions.ts :53 const res = await fetch(
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/nodes/[id]/useStorageOperationsData.ts :51 const res = await fetch(
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/nodes/nodesPageComponents.tsx :45 const res = await fetch("/api/agents/pending", {
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/nodes/page.tsx :56 const res = await fetch("/api/assets?resolve_composites=true", { cache: "no-store" });
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/nodes/useHierarchyManagement.ts :19 const response = await fetch("/api/groups", {
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/recordings/page.tsx :24 fetch("/api/recordings", { cache: "no-store" })
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/remote-view/RemoteViewSession.tsx :262 ? await fetch(
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/remote-view/remoteBookmarksClient.ts :44 const res = await fetch(url, init);
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/services/config/GroupingMergeTab.tsx :146 const res = await fetch("/api/services/web/grouping-settings", {
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/services/page.tsx :180 await fetch(`/api/services/web/grouping-suggestions/${encodeURIComponent(suggestion.id)}/accept`, { method: "POST" });
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/services/useServiceEditModalActions.ts :31 const response = await fetch(`/api/services/web/overrides?${params}`, {
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/services/useServiceIconLibrary.ts :27 fetch("/service-icons/index.json")
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/settings/components/AboutCard.tsx :31 fetch("/api/version")
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/settings/components/AccountSecurityCard.tsx :56 const response = await fetch("/api/auth/me/password", {
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/settings/components/CredentialProfilesCard.tsx :51 const response = await fetch(`/api/settings/credentials${path}`, init);
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/settings/components/DangerZoneCard.tsx :36 const res = await fetch("/api/admin/reset", {
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/settings/components/ManagedDatabaseCard.tsx :38 fetch("/api/settings/managed-database", { cache: "no-store" })
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/settings/components/McpConnectionCard.tsx :79 const res = await fetch("/api/settings/enrollment", { cache: "no-store", signal: AbortSignal.timeout(10_000) });
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/settings/components/PrometheusExportCard.tsx :91 const res = await fetch("/api/settings/runtime", { cache: "no-store" });
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/settings/components/SSHHubKeyCard.tsx :39 const response = await fetch("/api/settings/ssh-hub-key", {
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/settings/components/TLSManagementCard.tsx :96 const response = await fetch("/api/settings/tls", { cache: "no-store" });
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/settings/components/TLSStatusCard.tsx :36 fetch("/api/v1/tls/info")
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/settings/components/TailscaleServeCard.tsx :156 const response = await fetch("/api/settings/tailscale/serve", {
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/settings/components/UserAccessCard.tsx :59 const response = await fetch("/api/auth/users", { cache: "no-store" });
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/topology/TopologyInbox.tsx :42 const res = await fetch("/api/topology/unsorted");
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/topology/useAssetDependencies.ts :90 const response = await fetch(`/api/edges?${params.toString()}`, {
  • net labtether-labtether-96f5929/web/console/app/[locale]/(console)/topology/useTopologyData.ts :41 const res = await fetch(API_BASE, { signal: ac.signal });
  • net labtether-labtether-96f5929/web/console/app/[locale]/login/page.tsx :58 const response = await fetch("/api/auth/bootstrap/status", {
  • net labtether-labtether-96f5929/web/console/app/[locale]/setup/page.tsx :75 const response = await fetch("/api/auth/bootstrap/status", {
  • net labtether-labtether-96f5929/web/console/app/api/actions/execute/route.ts :26 const response = await fetch(`${base.api}/actions/execute`, {
  • net labtether-labtether-96f5929/web/console/app/api/actions/runs/route.ts :18 const response = await fetch(backendURL.toString(), {
  • net labtether-labtether-96f5929/web/console/app/api/admin/reset/route.ts :23 const response = await fetch(`${base.api}/admin/reset`, {
  • net labtether-labtether-96f5929/web/console/app/api/agents/[id]/settings/history/route.ts :13 const response = await fetch(`${base.api}/api/v1/agents/${encodeURIComponent(id)}/settings/history`, {
  • net labtether-labtether-96f5929/web/console/app/api/agents/[id]/settings/reset/route.ts :24 const response = await fetch(`${base.api}/api/v1/agents/${encodeURIComponent(id)}/settings/reset`, {
  • net labtether-labtether-96f5929/web/console/app/api/agents/[id]/settings/route.ts :14 const response = await fetch(`${base.api}/api/v1/agents/${encodeURIComponent(id)}/settings`, {
  • net (weak) labtether-labtether-96f5929/web/console/app/api/agents/[id]/settings/test-docker/route.ts :24 const response = await fetch(`${base.api}/api/v1/agents/${encodeURIComponent(id)}/settings/test-docker`, {
  • net labtether-labtether-96f5929/web/console/app/api/agents/[id]/settings/update-agent/route.ts :24 const response = await fetch(`${base.api}/api/v1/agents/${encodeURIComponent(id)}/settings/update-agent`, {
  • net labtether-labtether-96f5929/web/console/app/api/agents/approve/route.ts :14 const response = await fetch(`${base.api}/api/v1/agents/approve`, {
  • net labtether-labtether-96f5929/web/console/app/api/agents/connected/route.ts :8 const response = await fetch(`${base.api}/agents/connected`, {
  • net labtether-labtether-96f5929/web/console/app/api/agents/pending/route.ts :20 const response = await fetch(`${base.api}/api/v1/agents/pending`, {
  • net labtether-labtether-96f5929/web/console/app/api/agents/reject/route.ts :14 const response = await fetch(`${base.api}/api/v1/agents/reject`, {
  • net labtether-labtether-96f5929/web/console/app/api/alerts/instances/route.ts :16 const response = await fetch(backendURL.toString(), { cache: "no-store", headers: authHeaders });
  • net labtether-labtether-96f5929/web/console/app/api/alerts/routes/[routeId]/route.ts :17 const response = await fetch(backendPath(base.api, routeId), { cache: "no-store", headers: authHeaders });
  • net labtether-labtether-96f5929/web/console/app/api/alerts/routes/route.ts :17 const response = await fetch(backendURL.toString(), { cache: "no-store", headers: authHeaders });
  • net labtether-labtether-96f5929/web/console/app/api/alerts/rules/[ruleId]/route.ts :16 const response = await fetch(`${base.api}/alerts/rules/${encodeURIComponent(ruleId)}`, {
  • net labtether-labtether-96f5929/web/console/app/api/alerts/rules/route.ts :16 const response = await fetch(backendURL.toString(), { cache: "no-store", headers: authHeaders });
  • net labtether-labtether-96f5929/web/console/app/api/alerts/silences/[silenceId]/route.ts :16 const response = await fetch(`${base.api}/alerts/silences/${encodeURIComponent(silenceId)}`, {
  • net labtether-labtether-96f5929/web/console/app/api/alerts/silences/route.ts :16 const response = await fetch(backendURL.toString(), { cache: "no-store", headers: authHeaders });
  • net labtether-labtether-96f5929/web/console/app/api/alerts/templates/route.ts :10 const response = await fetch(`${base.api}/alerts/templates`, {
  • net labtether-labtether-96f5929/web/console/app/api/assets/[id]/dependencies/[depId]/route.ts :19 const response = await fetch(
  • net labtether-labtether-96f5929/web/console/app/api/assets/[id]/dependencies/route.ts :21 const response = await fetch(backendURL.toString(), {
  • net labtether-labtether-96f5929/web/console/app/api/assets/[id]/desktop/credentials/retrieve/route.ts :13 const res = await fetch(
  • net labtether-labtether-96f5929/web/console/app/api/assets/[id]/desktop/credentials/route.ts :9 const res = await fetch(
  • net labtether-labtether-96f5929/web/console/app/api/assets/[id]/protocols/[protocol]/route.ts :20 const response = await fetch(
  • net (weak) labtether-labtether-96f5929/web/console/app/api/assets/[id]/protocols/[protocol]/test/route.ts :20 const response = await fetch(
  • net labtether-labtether-96f5929/web/console/app/api/assets/[id]/protocols/route.ts :15 const response = await fetch(`${base.api}/assets/${encodeURIComponent(id)}/protocols`, {
  • net labtether-labtether-96f5929/web/console/app/api/assets/[id]/protocols/ssh/push-hub-key/route.ts :20 const response = await fetch(
  • net labtether-labtether-96f5929/web/console/app/api/assets/[id]/route.ts :15 const res = await fetch(`${base.api}/assets/${encodeURIComponent(id)}`, {
  • net labtether-labtether-96f5929/web/console/app/api/assets/manual/route.ts :15 const response = await fetch(`${base.api}/assets/manual`, {
  • net labtether-labtether-96f5929/web/console/app/api/assets/route.ts :26 const res = await fetch(assetsURL.toString(), {
  • net labtether-labtether-96f5929/web/console/app/api/auth/2fa/recovery-codes/route.ts :15 const response = await fetch(`${base.api}/auth/2fa/recovery-codes`, {
  • net labtether-labtether-96f5929/web/console/app/api/auth/2fa/route.ts :15 const response = await fetch(`${base.api}/auth/2fa`, {
  • net labtether-labtether-96f5929/web/console/app/api/auth/2fa/setup/route.ts :14 const response = await fetch(`${base.api}/auth/2fa/setup`, {
  • net labtether-labtether-96f5929/web/console/app/api/auth/2fa/verify/route.ts :15 const response = await fetch(`${base.api}/auth/2fa/verify`, {
  • net labtether-labtether-96f5929/web/console/app/api/auth/bootstrap/route.ts :29 const response = await fetch(`${base.api}/auth/bootstrap`, {
  • net labtether-labtether-96f5929/web/console/app/api/auth/bootstrap/status/route.ts :10 const response = await fetch(`${base.api}/auth/bootstrap/status`, {
  • net labtether-labtether-96f5929/web/console/app/api/auth/login/2fa/route.ts :47 const response = await fetch(`${base.api}/auth/login/2fa`, {
  • net labtether-labtether-96f5929/web/console/app/api/auth/login/route.ts :42 const response = await fetch(`${base.api}/auth/login`, {
  • net labtether-labtether-96f5929/web/console/app/api/auth/logout/route.ts :16 const response = await fetch(`${base.api}/auth/logout`, {
  • net labtether-labtether-96f5929/web/console/app/api/auth/me/password/route.ts :38 const response = await fetch(`${base.api}/auth/me/password`, {
  • net labtether-labtether-96f5929/web/console/app/api/auth/me/route.ts :11 const response = await fetch(`${base.api}/auth/me`, {
  • net labtether-labtether-96f5929/web/console/app/api/auth/oidc/callback/route.ts :23 const response = await fetch(`${base.api}/auth/oidc/callback`, {
  • net labtether-labtether-96f5929/web/console/app/api/auth/oidc/start/route.ts :17 const response = await fetch(`${base.api}/auth/oidc/start`, {
  • net labtether-labtether-96f5929/web/console/app/api/auth/providers/route.ts :9 const response = await fetch(`${base.api}/auth/providers`, {
  • net labtether-labtether-96f5929/web/console/app/api/auth/users/[id]/route.ts :27 const response = await fetch(`${base.api}/auth/users/${encodeURIComponent(id)}`, {
  • net labtether-labtether-96f5929/web/console/app/api/auth/users/[id]/sessions/route.ts :21 const response = await fetch(`${base.api}/auth/users/${encodeURIComponent(id)}/sessions`, {
  • net labtether-labtether-96f5929/web/console/app/api/auth/users/route.ts :13 const response = await fetch(`${base.api}/auth/users`, {
  • net labtether-labtether-96f5929/web/console/app/api/connectors/[connectorId]/actions/route.ts :24 const response = await fetch(backendURL.toString(), {
  • net labtether-labtether-96f5929/web/console/app/api/cron/[assetId]/route.ts :18 const res = await fetch(url, { headers, cache: "no-store" });
  • net labtether-labtether-96f5929/web/console/app/api/demo/session/route.ts :9 const response = await fetch(`${base.api}/api/demo/session`, {
  • net labtether-labtether-96f5929/web/console/app/api/dependencies/batch/route.ts :16 const response = await fetch(backendURL.toString(), {
  • net labtether-labtether-96f5929/web/console/app/api/desktop/session/[id]/route.ts :43 const response = await fetch(
  • net labtether-labtether-96f5929/web/console/app/api/desktop/session/route.ts :330 const response = await fetch(`${base.api}/desktop/sessions`, {
  • net labtether-labtether-96f5929/web/console/app/api/desktop/spice-ticket/route.ts :39 const response = await fetch(
  • net labtether-labtether-96f5929/web/console/app/api/desktop/stream-ticket/route.ts :36 const response = await fetch(
  • net labtether-labtether-96f5929/web/console/app/api/disks/[assetId]/route.ts :18 const res = await fetch(url, { headers, cache: "no-store" });
  • net labtether-labtether-96f5929/web/console/app/api/displays/[id]/route.ts :26 const response = await fetch(
  • net labtether-labtether-96f5929/web/console/app/api/docker/containers/[id]/[sub]/route.ts :28 const response = await fetch(backendURL, {
  • net labtether-labtether-96f5929/web/console/app/api/docker/containers/[id]/route.ts :20 const response = await fetch(`${base.api}/api/v1/docker/containers/${containerID}`, {
  • net labtether-labtether-96f5929/web/console/app/api/docker/hosts/[id]/[sub]/route.ts :23 const response = await fetch(`${base.api}/api/v1/docker/hosts/${hostID}/${subPath}`, {
  • net labtether-labtether-96f5929/web/console/app/api/docker/hosts/[id]/route.ts :20 const response = await fetch(`${base.api}/api/v1/docker/hosts/${hostID}`, {
  • net labtether-labtether-96f5929/web/console/app/api/docker/hosts/route.ts :12 const response = await fetch(`${base.api}/api/v1/docker/hosts`, {
  • net labtether-labtether-96f5929/web/console/app/api/docker/stacks/[id]/action/route.ts :32 const response = await fetch(`${base.api}/api/v1/docker/stacks/${stackID}/action`, {
  • net labtether-labtether-96f5929/web/console/app/api/edges/[id]/route.ts :24 const response = await fetch(`${base.api}/edges/${encodeURIComponent(id)}`, {
  • net labtether-labtether-96f5929/web/console/app/api/edges/ancestors/route.ts :22 const response = await fetch(backendURL.toString(), {
  • net labtether-labtether-96f5929/web/console/app/api/edges/route.ts :23 const response = await fetch(backendURL.toString(), {
  • net labtether-labtether-96f5929/web/console/app/api/edges/tree/route.ts :22 const response = await fetch(backendURL.toString(), {
  • net labtether-labtether-96f5929/web/console/app/api/file-connections/[[...path]]/route.ts :41 const response = await fetch(url, fetchOptions);
  • net labtether-labtether-96f5929/web/console/app/api/file-transfers/[[...path]]/route.ts :41 const response = await fetch(url, fetchOptions);
  • net labtether-labtether-96f5929/web/console/app/api/groups/[groupId]/maintenance-windows/[windowId]/route.ts :61 const response = await fetch(
  • net labtether-labtether-96f5929/web/console/app/api/groups/[groupId]/maintenance-windows/route.ts :24 const response = await fetch(backendURL.toString(), {
  • net labtether-labtether-96f5929/web/console/app/api/groups/[groupId]/move/route.ts :64 return await fetch(new URL(path, `${origin}/`).toString(), init);
  • net labtether-labtether-96f5929/web/console/app/api/groups/[groupId]/route.ts :121 return await fetch(new URL(path, `${origin}/`).toString(), init);
  • net labtether-labtether-96f5929/web/console/app/api/groups/[groupId]/timeline/route.ts :23 const response = await fetch(backendURL.toString(), {
  • net labtether-labtether-96f5929/web/console/app/api/groups/reliability/route.ts :18 const response = await fetch(backendURL.toString(), {
  • net labtether-labtether-96f5929/web/console/app/api/groups/route.ts :83 return await fetch(backendURL.toString(), init);
  • net labtether-labtether-96f5929/web/console/app/api/health/route.ts :7 const res = await fetch(`${api}/healthz`, { cache: "no-store" });
  • net labtether-labtether-96f5929/web/console/app/api/incidents/[id]/events/route.ts :11 const response = await fetch(`${base.api}/incidents/${encodeURIComponent(id)}/events`, { cache: "no-store", headers: authHeaders });
  • net labtether-labtether-96f5929/web/console/app/api/incidents/[id]/route.ts :16 const response = await fetch(`${base.api}/incidents/${encodeURIComponent(id)}`, { cache: "no-store", headers: authHeaders });
  • net labtether-labtether-96f5929/web/console/app/api/incidents/route.ts :20 const response = await fetch(backendURL.toString(), { cache: "no-store", headers: authHeaders });
  • net labtether-labtether-96f5929/web/console/app/api/links/suggestions/[id]/route.ts :21 const response = await fetch(
  • net labtether-labtether-96f5929/web/console/app/api/links/suggestions/route.ts :10 const response = await fetch(`${base.api}/links/suggestions`, {
  • net labtether-labtether-96f5929/web/console/app/api/logs/journal/[assetId]/route.ts :23 const response = await fetch(backendURL.toString(), {
  • net labtether-labtether-96f5929/web/console/app/api/logs/query/route.ts :19 const response = await fetch(backendURL.toString(), {
  • net labtether-labtether-96f5929/web/console/app/api/logs/sources/route.ts :22 const response = await fetch(backendURL.toString(), {
  • net labtether-labtether-96f5929/web/console/app/api/metrics/assets/[assetId]/route.ts :29 const response = await fetch(backendURL.toString(), {
  • net labtether-labtether-96f5929/web/console/app/api/network/[assetId]/[action]/route.ts :24 const response = await fetch(url, {
  • net labtether-labtether-96f5929/web/console/app/api/network/[assetId]/route.ts :18 const res = await fetch(url, { headers, cache: "no-store" });
  • net labtether-labtether-96f5929/web/console/app/api/notifications/channels/[channelId]/route.ts :22 const response = await fetch(backendPath(base.api, channelId), { cache: "no-store", headers: authHeaders });
  • net (weak) labtether-labtether-96f5929/web/console/app/api/notifications/channels/[channelId]/test/route.ts :20 const response = await fetch(
  • net labtether-labtether-96f5929/web/console/app/api/notifications/channels/route.ts :22 const response = await fetch(backendURL.toString(), { cache: "no-store", headers: authHeaders });
  • net labtether-labtether-96f5929/web/console/app/api/notifications/history/route.ts :19 const response = await fetch(backendURL.toString(), { cache: "no-store", headers: authHeaders });
  • net labtether-labtether-96f5929/web/console/app/api/packages/[assetId]/[action]/route.ts :24 const response = await fetch(url, {
  • net labtether-labtether-96f5929/web/console/app/api/packages/[assetId]/route.ts :18 const res = await fetch(url, { headers, cache: "no-store" });
  • net labtether-labtether-96f5929/web/console/app/api/pbs/assets/[assetId]/capabilities/route.ts :20 const response = await fetch(`${base.api}/pbs/assets/${assetID}/capabilities`, {
  • net labtether-labtether-96f5929/web/console/app/api/pbs/assets/[assetId]/certificates/route.ts :19 const response = await fetch(`${base.api}/pbs/assets/${assetID}/certificates`, {
  • net labtether-labtether-96f5929/web/console/app/api/pbs/assets/[assetId]/datastores/[storeName]/gc/route.ts :25 const response = await fetch(`${base.api}/pbs/assets/${assetID}/datastores/${storeID}/gc`, {
  • net labtether-labtether-96f5929/web/console/app/api/pbs/assets/[assetId]/datastores/[storeName]/maintenance-disable/route.ts :25 const response = await fetch(
  • net labtether-labtether-96f5929/web/console/app/api/pbs/assets/[assetId]/datastores/[storeName]/maintenance-enable/route.ts :25 const response = await fetch(
  • net labtether-labtether-96f5929/web/console/app/api/pbs/assets/[assetId]/datastores/[storeName]/verify/route.ts :25 const response = await fetch(`${base.api}/pbs/assets/${assetID}/datastores/${storeID}/verify`, {
  • net labtether-labtether-96f5929/web/console/app/api/pbs/assets/[assetId]/details/route.ts :20 const response = await fetch(`${base.api}/pbs/assets/${assetID}/details`, {
  • net labtether-labtether-96f5929/web/console/app/api/pbs/assets/[assetId]/groups/forget/route.ts :52 const response = await fetch(upstreamURL, {
  • net labtether-labtether-96f5929/web/console/app/api/pbs/assets/[assetId]/groups/route.ts :20 const response = await fetch(`${base.api}/pbs/assets/${assetID}/groups`, {
  • net labtether-labtether-96f5929/web/console/app/api/pbs/assets/[assetId]/prune-jobs/[jobId]/route.ts :25 const response = await fetch(`${base.api}/pbs/assets/${assetID}/prune-jobs/${jobID}`, {
  • net labtether-labtether-96f5929/web/console/app/api/pbs/assets/[assetId]/prune-jobs/[jobId]/run/route.ts :25 const response = await fetch(`${base.api}/pbs/assets/${assetID}/prune-jobs/${jobID}/run`, {
  • net labtether-labtether-96f5929/web/console/app/api/pbs/assets/[assetId]/prune-jobs/[jobId]/simulate/route.ts :25 const response = await fetch(`${base.api}/pbs/assets/${assetID}/prune-jobs/${jobID}/simulate`, {
  • net labtether-labtether-96f5929/web/console/app/api/pbs/assets/[assetId]/prune-jobs/route.ts :19 const response = await fetch(`${base.api}/pbs/assets/${assetID}/prune-jobs`, {
  • net labtether-labtether-96f5929/web/console/app/api/pbs/assets/[assetId]/snapshots/forget/route.ts :53 const response = await fetch(upstreamURL, {
  • net labtether-labtether-96f5929/web/console/app/api/pbs/assets/[assetId]/snapshots/route.ts :28 const response = await fetch(
  • net labtether-labtether-96f5929/web/console/app/api/pbs/assets/[assetId]/snapshots/verify/route.ts :35 const response = await fetch(upstreamURL, {
  • net labtether-labtether-96f5929/web/console/app/api/pbs/assets/[assetId]/sync-jobs/[jobId]/route.ts :25 const response = await fetch(`${base.api}/pbs/assets/${assetID}/sync-jobs/${jobID}`, {
  • net labtether-labtether-96f5929/web/console/app/api/pbs/assets/[assetId]/sync-jobs/[jobId]/run/route.ts :25 const response = await fetch(`${base.api}/pbs/assets/${assetID}/sync-jobs/${jobID}/run`, {
  • net labtether-labtether-96f5929/web/console/app/api/pbs/assets/[assetId]/sync-jobs/route.ts :19 const response = await fetch(`${base.api}/pbs/assets/${assetID}/sync-jobs`, {
  • net labtether-labtether-96f5929/web/console/app/api/pbs/assets/[assetId]/traffic-control/[ruleName]/route.ts :25 const response = await fetch(`${base.api}/pbs/assets/${assetID}/traffic-control/${ruleID}`, {
  • net labtether-labtether-96f5929/web/console/app/api/pbs/assets/[assetId]/traffic-control/route.ts :19 const response = await fetch(`${base.api}/pbs/assets/${assetID}/traffic-control`, {
  • net labtether-labtether-96f5929/web/console/app/api/pbs/assets/[assetId]/verification/route.ts :20 const response = await fetch(`${base.api}/pbs/assets/${assetID}/verification`, {
  • net labtether-labtether-96f5929/web/console/app/api/pbs/assets/[assetId]/verify-jobs/[jobId]/route.ts :25 const response = await fetch(`${base.api}/pbs/assets/${assetID}/verify-jobs/${jobID}`, {
  • net labtether-labtether-96f5929/web/console/app/api/pbs/assets/[assetId]/verify-jobs/[jobId]/run/route.ts :25 const response = await fetch(`${base.api}/pbs/assets/${assetID}/verify-jobs/${jobID}/run`, {
  • net labtether-labtether-96f5929/web/console/app/api/pbs/assets/[assetId]/verify-jobs/route.ts :19 const response = await fetch(`${base.api}/pbs/assets/${assetID}/verify-jobs`, {
  • net labtether-labtether-96f5929/web/console/app/api/pbs/tasks/[node]/[upid]/log/route.ts :31 const response = await fetch(
  • net labtether-labtether-96f5929/web/console/app/api/pbs/tasks/[node]/[upid]/status/route.ts :27 const response = await fetch(
  • net labtether-labtether-96f5929/web/console/app/api/pbs/tasks/[node]/[upid]/stop/route.ts :32 const response = await fetch(
  • net labtether-labtether-96f5929/web/console/app/api/portainer/assets/[assetId]/[...path]/route.ts :73 const response = await fetch(
  • net labtether-labtether-96f5929/web/console/app/api/portainer/assets/[assetId]/capabilities/route.ts :20 const response = await fetch(`${base.api}/portainer/assets/${assetID}/capabilities`, {
  • net labtether-labtether-96f5929/web/console/app/api/portainer/endpoints/route.ts :12 const response = await fetch(`${base.api}/portainer/endpoints`, {
  • net labtether-labtether-96f5929/web/console/app/api/processes/[assetId]/route.ts :21 const res = await fetch(url, { headers, cache: "no-store" });
  • net labtether-labtether-96f5929/web/console/app/api/proxmox/assets/[assetId]/capabilities/route.ts :20 const response = await fetch(`${base.api}/proxmox/assets/${assetID}/capabilities`, {
  • net labtether-labtether-96f5929/web/console/app/api/proxmox/assets/[assetId]/details/route.ts :20 const response = await fetch(`${base.api}/proxmox/assets/${assetID}/details`, {
  • net labtether-labtether-96f5929/web/console/app/api/proxmox/assets/[assetId]/metrics/route.ts :29 const response = await fetch(
  • net labtether-labtether-96f5929/web/console/app/api/proxmox/assets/[assetId]/storage/insights/route.ts :24 const response = await fetch(`${base.api}/proxmox/assets/${assetID}/storage/insights?${query.toString()}`, {
  • net labtether-labtether-96f5929/web/console/app/api/proxmox/cluster/status/route.ts :19 const response = await fetch(`${base.api}/proxmox/cluster/status${querySuffix}`, {
  • net labtether-labtether-96f5929/web/console/app/api/proxmox/nodes/[node]/certificates/route.ts :31 const response = await fetch(
  • net labtether-labtether-96f5929/web/console/app/api/proxmox/nodes/[node]/network/route.ts :30 const response = await fetch(
  • net labtether-labtether-96f5929/web/console/app/api/proxmox/nodes/[node]/replication/route.ts :31 const response = await fetch(
  • net labtether-labtether-96f5929/web/console/app/api/proxmox/nodes/[node]/syslog/route.ts :32 const response = await fetch(
  • net labtether-labtether-96f5929/web/console/app/api/proxmox/nodes/[node]/updates/route.ts :31 const response = await fetch(
  • net labtether-labtether-96f5929/web/console/app/api/proxmox/tasks/[node]/[upid]/log/route.ts :27 const response = await fetch(
  • net labtether-labtether-96f5929/web/console/app/api/proxmox/tasks/[node]/[upid]/stop/route.ts :32 const response = await fetch(
  • net labtether-labtether-96f5929/web/console/app/api/queue/dead-letters/route.ts :12 const response = await fetch(backendURL, {
  • net labtether-labtether-96f5929/web/console/app/api/recordings/[sessionId]/route.ts :31 const response = await fetch(
  • net (weak) labtether-labtether-96f5929/web/console/app/api/settings/docker/test/route.ts :18 const response = await fetch(`${base.api}/connectors/docker/test`, {
  • net (weak) labtether-labtether-96f5929/web/console/app/api/settings/homeassistant/test/route.ts :33 const response = await fetch(`${base.api}/connectors/homeassistant/test`, {
  • net (weak) labtether-labtether-96f5929/web/console/app/api/settings/pbs/test/route.ts :35 const response = await fetch(`${base.api}/connectors/pbs/test`, {
  • net (weak) labtether-labtether-96f5929/web/console/app/api/settings/portainer/test/route.ts :40 const response = await fetch(`${base.api}/connectors/portainer/test`, {
  • net (weak) labtether-labtether-96f5929/web/console/app/api/settings/prometheus/test-connection/route.ts :69 const response = await fetch(`${base.api}/settings/prometheus/test-connection`, {
  • net (weak) labtether-labtether-96f5929/web/console/app/api/settings/proxmox/test/route.ts :40 const response = await fetch(`${base.api}/connectors/proxmox/test`, {
  • net (weak) labtether-labtether-96f5929/web/console/app/api/settings/truenas/test/route.ts :34 const response = await fetch(`${base.api}/connectors/truenas/test`, {
  • net (weak) labtether-labtether-96f5929/web/console/app/api/truenas/assets/[assetId]/disks/[diskName]/smart-test/route.ts :26 const response = await fetch(
  • net (weak) labtether-labtether-96f5929/web/console/e2e/desktop-remote-view.spec.ts :1427 const response = await fetch("/api/v1/nodes/agent-host-1/clipboard/get", {
  • net (weak) labtether-labtether-96f5929/web/console/e2e/resilience.spec.ts :162 const response = await request.fetch(call.path, {
  • net (weak) labtether-labtether-96f5929/web/console/e2e/topology.spec.ts :358 const result = await fetch(`/api/assets/${encodeURIComponent(nextAssetID)}`, {
  • net (weak) labtether-labtether-96f5929/web/console/scripts/__tests__/runtime-proxy.test.mjs :1 import { createServer } from "node:http";
  • net (weak) labtether-labtether-96f5929/web/console/scripts/console-ingress.mjs :1 import { createServer, createConnection } from "node:net";
  • net (weak) labtether-labtether-96f5929/web/console/scripts/runtime-proxy.mjs :1 import { createServer as createHttpServer, request as createHttpRequest } from "node:http";
  • net (weak) labtether-labtether-96f5929/web/console/scripts/start-playwright-https.mjs :3 import { createServer as createHttpsServer } from "node:https";
  • net (weak) labtether-labtether-96f5929/web/console/scripts/test-runtime-proxy-standalone.mjs :4 import { createServer } from "node:http";

secrets 1

  • secrets labtether-labtether-96f5929/web/console/lib/backend.ts :305 const token = process.env.LABTETHER_API_TOKEN?.trim() || readServiceToken();

tool registrations 32

  • whoami labtether-labtether-96f5929/internal/mcpserver/server.go :113
  • assets_list labtether-labtether-96f5929/internal/mcpserver/server.go :120
  • assets_get labtether-labtether-96f5929/internal/mcpserver/server.go :129
  • exec labtether-labtether-96f5929/internal/mcpserver/server.go :137
  • exec_multi labtether-labtether-96f5929/internal/mcpserver/server.go :147
  • services_list labtether-labtether-96f5929/internal/mcpserver/server.go :159
  • services_restart labtether-labtether-96f5929/internal/mcpserver/server.go :167
  • files_list labtether-labtether-96f5929/internal/mcpserver/server.go :178
  • files_read labtether-labtether-96f5929/internal/mcpserver/server.go :187
  • docker_hosts labtether-labtether-96f5929/internal/mcpserver/server.go :198
  • docker_containers labtether-labtether-96f5929/internal/mcpserver/server.go :205
  • docker_container_restart labtether-labtether-96f5929/internal/mcpserver/server.go :213
  • system_processes labtether-labtether-96f5929/internal/mcpserver/server.go :223
  • system_network labtether-labtether-96f5929/internal/mcpserver/server.go :231
  • system_disks labtether-labtether-96f5929/internal/mcpserver/server.go :239
  • system_packages labtether-labtether-96f5929/internal/mcpserver/server.go :247
  • alerts_list labtether-labtether-96f5929/internal/mcpserver/server.go :257
  • alerts_acknowledge labtether-labtether-96f5929/internal/mcpserver/server.go :264
  • asset_reboot labtether-labtether-96f5929/internal/mcpserver/server.go :274
  • asset_shutdown labtether-labtether-96f5929/internal/mcpserver/server.go :282
  • asset_wake labtether-labtether-96f5929/internal/mcpserver/server.go :290
  • groups_list labtether-labtether-96f5929/internal/mcpserver/server.go :300
  • metrics_overview labtether-labtether-96f5929/internal/mcpserver/server.go :309
  • schedules_list labtether-labtether-96f5929/internal/mcpserver/server.go :318
  • webhooks_list labtether-labtether-96f5929/internal/mcpserver/server.go :325
  • saved_actions_list labtether-labtether-96f5929/internal/mcpserver/server.go :332
  • credentials_list labtether-labtether-96f5929/internal/mcpserver/server.go :339
  • topology_edges labtether-labtether-96f5929/internal/mcpserver/server.go :346
  • updates_list_plans labtether-labtether-96f5929/internal/mcpserver/server.go :354
  • connectors_health labtether-labtether-96f5929/internal/mcpserver/server.go :363
  • docker_container_logs labtether-labtether-96f5929/internal/mcpserver/server.go :370
  • docker_container_stats labtether-labtether-96f5929/internal/mcpserver/server.go :380

install hooks 1

  • postinstall labtether-labtether-96f5929/web/console/package.json :19 sh scripts/patch-novnc.sh

declared dependencies 84

  • github.com/mark3labs/mcp-go@v0.58.0
  • @dagrejs/dagre@^3.1.1
  • @novnc/novnc@^1.7.0
  • @radix-ui/react-dialog@^1.1.23
  • @radix-ui/react-dropdown-menu@^2.1.24
  • @radix-ui/react-popover@^1.1.23
  • @radix-ui/react-tooltip@^1.2.16
  • @spice-project/spice-html5@^0.2.1
  • @tailwindcss/postcss@^4.3.3
  • @xterm/addon-fit@^0.11.0
  • @xterm/addon-search@^0.16.0
  • @xterm/addon-unicode11@^0.9.0
  • @xterm/addon-web-links@^0.12.0
  • @xterm/xterm@^6.0.0
  • @xyflow/react@^12.11.5
  • cmdk@^1.1.1
  • guacamole-common-js@^1.5.0
  • lucide-react@^1.34.0
  • next@^16.3.3
  • next-intl@^4.13.7
  • qrcode@^1.5.4
  • react@^19.2.8
  • react-dom@^19.2.8
  • react-resizable-panels@^4.12.3
  • tailwindcss@^4.2.1
  • @playwright/test@^1.62.1
  • @types/dagre@^0.7.54
  • @types/node@^25.9.1
  • @types/qrcode@^1.5.6
  • @types/react@^19.2.18
  • @types/react-dom@^19.2.5
  • @typescript-eslint/parser@^8.68.0
  • @vitejs/plugin-react@^6.1.0
  • eslint@^10.9.1
  • eslint-plugin-react-hooks@^7.1.1
  • jsdom@^29.1.1
  • typescript@^6.0.3
  • vitest@^4.1.11
  • github.com/cloudsoda/go-smb2@v0.0.0-20260701064823-d8c5600d73b8
  • github.com/coreos/go-oidc/v3@v3.20.0
  • github.com/creack/pty@v1.1.24
  • github.com/golang/snappy@v1.0.0
  • github.com/gorilla/websocket@v1.5.3
  • github.com/jackc/pgx/v5@v5.10.0
  • github.com/jlaffaye/ftp@v0.2.4
  • github.com/labtether/protocol@v1.6.5
  • github.com/pkg/sftp@v1.13.11
  • github.com/pquerna/otp@v1.5.0
  • github.com/prometheus/client_golang@v1.24.1
  • github.com/prometheus/client_model@v0.6.2
  • github.com/robfig/cron/v3@v3.0.1
  • github.com/studio-b12/gowebdav@v0.13.0
  • golang.org/x/crypto@v0.56.0
  • golang.org/x/oauth2@v0.36.0
  • golang.org/x/sync@v0.22.0
  • golang.org/x/sys@v0.47.0
  • google.golang.org/protobuf@v1.36.12
  • github.com/beorn7/perks@v1.0.1
  • github.com/boombuler/barcode@v1.0.1-0.20190219062509-6c824513bacc
  • github.com/cespare/xxhash/v2@v2.3.0
  • github.com/cloudsoda/sddl@v0.0.0-20250224235906-926454e91efc
  • github.com/geoffgarside/ber@v1.1.0
  • github.com/go-jose/go-jose/v4@v4.1.4
  • github.com/google/jsonschema-go@v0.4.2
  • github.com/google/uuid@v1.6.0
  • github.com/hashicorp/go-uuid@v1.0.3
  • github.com/jackc/pgpassfile@v1.0.0
  • github.com/jackc/pgservicefile@v0.0.0-20240606120523-5a60cdf6a761
  • github.com/jackc/puddle/v2@v2.2.2
  • github.com/jcmturner/aescts/v2@v2.0.0
  • github.com/jcmturner/dnsutils/v2@v2.0.0
  • github.com/jcmturner/gofork@v1.7.6
  • github.com/jcmturner/goidentity/v6@v6.0.1
  • github.com/jcmturner/gokrb5/v8@v8.4.4
  • github.com/jcmturner/rpc/v2@v2.0.3
  • github.com/kr/fs@v0.1.0
  • github.com/munnerz/goautoneg@v0.0.0-20191010083416-a7dc8b61c822
  • github.com/prometheus/common@v0.70.1
  • github.com/prometheus/procfs@v0.21.1
  • github.com/santhosh-tekuri/jsonschema/v6@v6.0.2
  • github.com/spf13/cast@v1.7.1
  • github.com/yosida95/uritemplate/v3@v3.0.2
  • golang.org/x/net@v0.57.0
  • golang.org/x/text@v0.41.0

perm:untrusted 1

  • untrusted (weak) labtether-labtether-96f5929/web/console/scripts/__tests__/runtime-proxy.test.mjs :250 fetch(`http://127.0.0.1:${proxyPort}/ws/agent`).then((response) => response.text()),

transport_posture 1

  • network-listening, binds all interfaces, no auth detected labtether-labtether-96f5929/scripts/lib/http-redirect.js :40 }).listen(httpPort, "0.0.0.0", () => {