{
  "repo": "tidbcloud/ffs",
  "binary": "ffs-client",
  "binary_path": "cmd/ffs-client/main.go",
  "surface_kind": "mixed_service",
  "type": "service",
  "services": [
    {
      "name": "ClientLifecycle",
      "methods": [
        {
          "name": "RemoveMount",
          "name_key": "ClientLifecycle.RemoveMount",
          "input": "ClientOptions",
          "output": "void",
          "type": "local"
        },
        {
          "name": "MustMount",
          "name_key": "ClientLifecycle.MustMount",
          "input": "ClientOptions",
          "output": "Server",
          "type": "local"
        },
        {
          "name": "ListenForUnmount",
          "name_key": "ClientLifecycle.ListenForUnmount",
          "input": "os.Signal",
          "output": "void",
          "type": "local"
        },
        {
          "name": "Stop",
          "name_key": "ClientLifecycle.Stop",
          "input": "context.Context",
          "output": "void",
          "type": "local"
        }
      ]
    },
    {
      "name": "FUSEDirectoryService",
      "methods": [
        {
          "name": "Readdir",
          "name_key": "FUSEDirectoryService.Readdir",
          "input": "context.Context",
          "output": "DirStream, Errno",
          "type": "fuse"
        },
        {
          "name": "Mknod",
          "name_key": "FUSEDirectoryService.Mknod",
          "input": "context.Context, name, mode, dev",
          "output": "Inode, Errno",
          "type": "fuse"
        },
        {
          "name": "Mkdir",
          "name_key": "FUSEDirectoryService.Mkdir",
          "input": "context.Context, name, mode",
          "output": "Inode, Errno",
          "type": "fuse"
        },
        {
          "name": "Rmdir",
          "name_key": "FUSEDirectoryService.Rmdir",
          "input": "context.Context, name",
          "output": "Errno",
          "type": "fuse"
        },
        {
          "name": "Lookup",
          "name_key": "FUSEDirectoryService.Lookup",
          "input": "context.Context, name",
          "output": "Inode, Errno",
          "type": "fuse"
        },
        {
          "name": "Create",
          "name_key": "FUSEDirectoryService.Create",
          "input": "context.Context, name, flags, mode",
          "output": "Inode, FileHandle, Flags, Errno",
          "type": "fuse"
        },
        {
          "name": "Rename",
          "name_key": "FUSEDirectoryService.Rename",
          "input": "context.Context, name, newParent, newName, flags",
          "output": "Errno",
          "type": "fuse"
        },
        {
          "name": "Link",
          "name_key": "FUSEDirectoryService.Link",
          "input": "context.Context, target, name",
          "output": "Inode, Errno",
          "type": "fuse"
        },
        {
          "name": "Symlink",
          "name_key": "FUSEDirectoryService.Symlink",
          "input": "context.Context, target, name",
          "output": "Inode, Errno",
          "type": "fuse"
        },
        {
          "name": "Unlink",
          "name_key": "FUSEDirectoryService.Unlink",
          "input": "context.Context, name",
          "output": "Errno",
          "type": "fuse"
        },
        {
          "name": "Statfs",
          "name_key": "FUSEDirectoryService.Statfs",
          "input": "context.Context",
          "output": "StatfsOut, Errno",
          "type": "fuse"
        }
      ]
    },
    {
      "name": "FUSEFileService",
      "methods": [
        {
          "name": "Open",
          "name_key": "FUSEFileService.Open",
          "input": "context.Context, flags",
          "output": "FileHandle, Flags, Errno",
          "type": "fuse"
        },
        {
          "name": "Read",
          "name_key": "FUSEFileService.Read",
          "input": "context.Context, FileHandle, dest, off",
          "output": "ReadResult, Errno",
          "type": "fuse"
        },
        {
          "name": "Write",
          "name_key": "FUSEFileService.Write",
          "input": "context.Context, FileHandle, buf, off",
          "output": "uint32, Errno",
          "type": "fuse"
        },
        {
          "name": "Flush",
          "name_key": "FUSEFileService.Flush",
          "input": "context.Context, FileHandle",
          "output": "Errno",
          "type": "fuse"
        },
        {
          "name": "Fsync",
          "name_key": "FUSEFileService.Fsync",
          "input": "context.Context, FileHandle, flags",
          "output": "Errno",
          "type": "fuse"
        },
        {
          "name": "Release",
          "name_key": "FUSEFileService.Release",
          "input": "context.Context, FileHandle",
          "output": "Errno",
          "type": "fuse"
        },
        {
          "name": "Setattr",
          "name_key": "FUSEFileService.Setattr",
          "input": "context.Context, FileHandle, SetAttrIn",
          "output": "Errno",
          "type": "fuse"
        },
        {
          "name": "Getattr",
          "name_key": "FUSEFileService.Getattr",
          "input": "context.Context, FileHandle",
          "output": "AttrOut, Errno",
          "type": "fuse"
        },
        {
          "name": "Readlink",
          "name_key": "FUSEFileService.Readlink",
          "input": "context.Context",
          "output": "[]byte, Errno",
          "type": "fuse"
        },
        {
          "name": "Access",
          "name_key": "FUSEFileService.Access",
          "input": "context.Context, mask",
          "output": "Errno",
          "type": "fuse"
        },
        {
          "name": "Allocate",
          "name_key": "FUSEFileService.Allocate",
          "input": "context.Context, FileHandle, off, size, mode",
          "output": "Errno",
          "type": "fuse"
        }
      ]
    }
  ],
  "extensions": {
    "notes": [
      "FUSE client for mounting FFS volumes and proxying filesystem operations to realm servers.",
      "This binary is a FUSE client, not a gRPC server.",
      "Bootstrap logic depends on universe-server, zone-server, and realm-server before mounting.",
      "Filesystem methods proxy to RealmService or RealmControlService methods, with conditional merged-mode fanout."
    ]
  }
}
